1. 程式人生 > >java後臺實現支付寶對賬功能

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步之後,我們就可以下載每日賬單檔案了

我下載下來是這樣的,上個圖:


解壓之後:


開啟excel(彙總)

是這樣的:


至此,我們已經拿到了支付寶提供的每日賬單檔案,接下來才是重頭戲,目前還沒有確定選擇哪種方案進行自動對賬

確定之後,會把過程也補上。