在上一篇讲述了如何进行小程序支付。当手机端完成支付完成后,微信会把相关支付结果及用户信息通过数据流的形式发送给商户,商户需要接收处理。下面就来说一下如何去处理。
注意事项:
- 同样的通知可能会多次发送给商户系统。
- 如果微信收到商户的应答不符合规范或超时,微信会判定本次通知失败,重新发送通知,直到成功为止在通知一直不成功的情况下,微信总共会发起多次通知,通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m),但微信不保证通知最终一定能成功。
- 在订单状态不明或者没有收到微信支付结果通知的情况下需要主动去查询订单API后续会写。
- notify_url是你当时支付的参数里的notify_url,必须是外网才行。本地调试的话使用natapp,把内网映射成外网就OK啦。
java后台思路:
- 接收微信发回来的xml数据
- 返回结果sign进行验证
- 对金额进行验证(微信的返回结果里有total_fee这个参数,单位是分需要和你自己的数据库的订单金额进行比较)
- 对订单状态进行判断如果是待付款状态就进行修改订单的操作,反之就同步返回给微信成功参数
//成功参数
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>
具体解决:
1.controller接收微信发回来的xml数据
@RequestMapping(value = "/wxPayNotify",method = {RequestMethod.POST,RequestMethod.GET})
public CommonResult wxNotify(HttpServletRequest httpServletRequest) {
String strXml = WxUtil.readData(httpServletRequest);
}
//readData具体代码
public static String readData(HttpServletRequest request) {
BufferedReader br = null;
try {
StringBuilder result = new StringBuilder();
br = request.getReader();
for (String line; (line = br.readLine()) != null; ) {
if (result.length() > 0) {
result.append("\n");
}
result.append(line);
}
return result.toString();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.拿到xmlstr的数据后进行解析
1.使用hutool的XmlUtil转换成map
Map<String, Object> result = XmlUtil.xmlToMap(strXml);
2.对两个状态判断return_code、result_code 就不写啦😁 err_code_des是具体错误信息
3.验签 对map里的字段进行加密。然后把你加密的sign和微信段返回的sign进行比较(需要把result里的sign先取出来然后在remove掉因为进行加密的时候不要这个字段)sortMap这个方法在支付里有写到感兴趣的就去看一下
String resultSign = result.get("sign").toString();
result.remove("sign");
//转换成key=value&key1=value1 末尾在拼接一个商户key
String urlMap = WxUtil.sortMap(convert, "你的商户key");
//进行加密(hutool里的SecureUtil)
String sign = SecureUtil.md5(urlMap).toUpperCase();
//验签
if(resultSign.equals(sign)){
//验签通过
}
4.对金额进行验证
Order order = orderService.getOrderById("");
int totalFee = Integer.parseInt(result.get(“total_fee”).toString());
int orderFee =order.getMoney();
if(orderFee == totalFee ){
}
5.比较你的订单状态(修改了订单状态返回成功,已经修改了订单状态也返回成功告诉微信不要在来啦)
int status = order.getStatus();
if("你的订单状态是待付款状态"){
//修改订单状态
return "<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>";
}
if("你的订单状态已经修改过"){
return "<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>";
}