java后台实现支付宝对账功能

完成支付宝支付、查询的接口之后,我们应该还需要定时与支付宝进行对账,以确保商户系统的订单信息是正确的,想知道支付宝支付、查询接口实现过程的亲们,可移步到上一篇有详细过程。

现在我们来讲一下支付宝对账的功能,关于与支付宝交互的关键代码,其实支付宝的API已经讲得很清楚,如果亲们想直接看支付宝API,点击 支付宝对账API ,当然我在文章也会进行说明解释。

实现支付宝自动对账功能

先看一下商户系统和支付宝的大概交互过程:

所谓对账,其实就是调用支付宝查询接口,跟上一篇的查询接口不同的是,上一篇的查询接口是针对特定的一个订单,通过订单号或者支付宝交易号去查询这一笔订单的信息,而对账,我们需要获取一个时间段的所有订单信息,因此,我们自然而已的去看支付宝提供的SDK是否有提供该接口给我们,经过查看支付宝API,我们发现确实我们所需要的接口:alipay.data.dataservice.bill.downloadurl.query。废话不多说,先上我实现的代码

1.先是调用支付宝的对账查询接口,获取账单文件下载地址URL,关于一些支付宝的公共参数,在上一篇我已经封装好,下面代码是针对对账的实现过程,传入关键的2个业务参数.公共参数支付宝SDK已经封装好。

第一个参数,账单类型(字符串类型,trade或者signcustomer,具体含义见支付宝API

第二个参数,获取时间段(字符串类型,(2018-03-15)需要下载的账单日期,最晚是当期日期的前一天

	/**
	 * 实现支付宝对账
	 * @param request 
	 * @return response
	 */
	@Override
	public void alipayBill() {
		logger.info("==================向支付宝发起对账请求");
		// 获取支付宝支付的配置信息
		ValueOperations<String, Object> valueOps = redisTemplate.opsForValue();
		Payment alipayment = (Payment) valueOps.get("alipayment");
		if (alipayment == null) {
			alipayment = alipayMentOrderRepository.getPayment(1, 1);
		}
		
		try {
		//实例化客户端(参数:网关地址、商户appid、商户私钥、格式、编码、支付宝公钥、加密类型)
                AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, alipayment.getAppid(), 
        		AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, 
        		AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);
		AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest();//创建API对应的request类
		request.setBizContent("{" +
		"\"bill_type\":\"trade\"," +
		"\"bill_date\":\"2018-03-14\"}"); //设置业务参数
		AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request);
		
		String billDownloadUrl=response.getBillDownloadUrl();
		logger.info("==================支付宝返回文件下载地址:"+billDownloadUrl);
		this.downBill(billDownloadUrl); //调用下载文件方法
		
		} catch (AlipayApiException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}//通过alipayClient调用API,获得对应的response类
		
		//根据response中的结果继续业务逻辑处理
		
	}

2.获取到支付宝返回的订单文件下载地址之后,我们直接把它下载到本地,下载的代码如下:

 /**
	 * 下载账单文件:
	 * @param request 
	 * @return response
	 */
	public String downBill(String billDownloadUrl){
		long filename=new Date().getTime();
		//指定希望保存的文件路径
		String filePath = "G:/alipay/billfile/fund_bill_"+filename+".zip";
		URL url = null;
		HttpURLConnection httpUrlConnection = null;
		InputStream fis = null;
		FileOutputStream fos = null;
		try {
		    url = new URL(billDownloadUrl);
		    httpUrlConnection = (HttpURLConnection) url.openConnection();
		    httpUrlConnection.setConnectTimeout(5 * 1000);
		    httpUrlConnection.setDoInput(true);
		    httpUrlConnection.setDoOutput(true);
		    httpUrlConnection.setUseCaches(false);
		    httpUrlConnection.setRequestMethod("GET");
		    httpUrlConnection.setRequestProperty("Charsert", "UTF-8");
		    httpUrlConnection.connect();
		    fis = httpUrlConnection.getInputStream();
		    byte[] temp = new byte[1024];
		    int b;
		    fos = new FileOutputStream(new File(filePath));
		    while ((b = fis.read(temp)) != -1) {
		        fos.write(temp, 0, b);
		        fos.flush();
		    }
		} catch (MalformedURLException e) {
		    e.printStackTrace();
		} catch (IOException e) {
		    e.printStackTrace();
		} finally {
		    try {
		        if(fis!=null) fis.close();
		        if(fos!=null) fos.close();
		        if(httpUrlConnection!=null) httpUrlConnection.disconnect();
		    } catch (IOException e) {
		        e.printStackTrace();
		    }
		}
		return null;
	}

以上就是与支付宝交互的过程,支付宝API上也能找到这些代码,完成以上2步之后,我们就可以下载每日账单文件了

我下载下来是这样的,上个图:

扫描二维码关注公众号,回复: 1929540 查看本文章


解压之后:


打开excel(汇总)

是这样的:


至此,我们已经拿到了支付宝提供的每日账单文件,接下来才是重头戏,目前还没有确定选择哪种方案进行自动对账

确定之后,会把过程也补上。

猜你喜欢

转载自blog.csdn.net/ouyzc/article/details/79568611