支付完成後,微信會把相關支付結果及使用者資訊通過資料流的形式發送給商戶,商戶需要接收處理,并按文檔規範傳回應答,官方說明如下:

編碼思路:通過流擷取微信官方傳過來的資料,再根據官方提示進行驗簽以及業務校驗
代碼如下:此代碼僅供思路參考,具體需因個人不同的業務稍作修改
/**
* 傳回成功xml
*/
private String resSuccessXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
/**
* 傳回失敗xml
*/
private String resFailXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[封包為空]]></return_msg></xml>";
/**
* 微信支付回報
*
* @param request
* @throws Exception
*/
@RequestMapping(value = "notifyWxPay", method = RequestMethod.POST)
public String notifyWxPay(HttpServletRequest request) throws Exception {
MyConfig config = new MyConfig();
WXPay wxpay = new WXPay(config);
InputStream inputStream = request.getInputStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
String resultxml = new String(outputStream.toByteArray(), "utf-8");
Map<String, String> notifyMap = WXPayUtil.xmlToMap(resultxml);
System.out.println("回調Map:" + notifyMap);
outputStream.close();
inputStream.close();
// 簽名正确,進行處理
if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {
//支付成功
if ("SUCCESS".equals(notifyMap.get("return_code")) && "SUCCESS".equals(notifyMap.get("result_code"))) {
//校驗訂單号是否存在
if ("此處為自己的業務代碼") {
System.err.println("微信支付結果通知訂單号不存在");
return resFailXml;
}
//判斷微信支付重複回調,如果是處理過的業務直接傳回success
if ("此處為自己的業務代碼") {
//已處理過業務,直接傳回成功
System.out.println("已處理過業務,直接傳回成功");
return resSuccessXml;
}
//校驗傳回的訂單金額是否與商戶側的訂單金額一緻,防止資料洩漏導緻出現“假通知”,造成資金損失
if ("此處為自己的業務代碼") {
System.out.println("微信支付結果通知金額與訂單金額不比對");
return resFailXml;
}
//...
//處理業務
//...
} else {
System.out.println("沒有處理微信回調業務,微信交易狀态:" + notifyMap.get("err_code") + notifyMap);
}
return resSuccessXml;
} else {
// 簽名錯誤,如果資料裡沒有sign字段,也認為是簽名錯誤
System.out.println("簽名錯誤,可能存在篡改資料風險!");
return resFailXml;
}
}
代碼中的 MyConfig 類以及 WXPay 類都是微信官方提供的SDK類,SDK下載下傳位址:點選此處跳轉
如調用wxpay.isPayResultNotifySignatureValid 方法驗簽時傳回簽名錯誤,可檢視我另一篇文章:
微信支付結果通知簽名錯誤問題分析與解決辦法
SDK的MyConfig類初始化失敗時,可檢視:微信支付 java_sdk MyConfig類編譯錯誤解決辦法