背景
微信支付API升级到V3版本后,提供了更安全,更方便的调用。对于很多新人,不知道如何下手, 计划写几篇文章,给新手一一解惑。 代码示例,后端为JAVA, 前端为uniApp。
疑问:JAVA后台如何回复微信V3支付的通知
看上图,步骤15 用户支付成功后,商户可接收到微信支付支付结果通知支付结果通知API。
通知规则
用户支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理该消息,并返回应答。
对后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。(通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m)
通知报文
支付结果通知是以POST 方法访问商户设置的通知url,通知的数据以JSON 格式通过请求主体(BODY)传输。通知的数据包括了加密的支付结果详情。
回复的内容
商户根据自身的业务逻辑,安装指定格式回复给微信支付系统。
接收成功:HTTP应答状态码需返回200或204,无需返回应答报文。
接收失败:HTTP应答状态码需返回5XX或4XX,同时需返回应答报文,格式如下:
参数名 | 变量 | 类型 | 必填 | 描述 |
---|---|---|---|---|
返回状态码 | code | string[1,32] | 是 | 错误码,SUCCESS为清算机构接收成功,其他错误码为失败。示例值:FAIL |
返回信息 | message | string[1,64] | 是 | 返回信息,如非空,为错误原因。示例值:失败 |
参考代码
@RestController
public class WxPayController {
@Resource
private WxPayService wxPayService;
/**
* 微信支付平台回调
* @param request
* @param response
* @throws Exception
*/
@PostMapping("/wxpay/notifyWxPay")
public Map<String, String> notifyWxPay(HttpServletRequest request, HttpServletResponse response) throws Exception {
//初始化map,给微信响应用
Map<String, String> retMap = new HashMap<>(2);
Result ret = wxPayService.procWxPayNotify(request,response);
if (ret.isSuccess()) {
retMap.put("code", "SUCCESS");
retMap.put("message", "成功");
response.setStatus(HttpStatus.OK.value());
}else {
retMap.put("code", ret.getCode());
retMap.put("message", ret.getMsg());
response.setStatus(Integer.parseInt(ret.getCode()));
}
return retMap;
}
}
实际上就是给微信平台回复了一个MAP对象。
参考文章
-
https://pay.weixin.qq.com/docs/merchant/development/interface-rules/introduction.html
关于微信支付的介绍 -
https://pay.weixin.qq.com/docs/merchant/development/practices/notification-considerations.html
回调通知注意事项 -
https://pay.weixin.qq.com/docs/merchant/development/practices/callback-and-query-order.html
支付回调和查单实现指引 -
https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_5.shtml
支付通知API