接着上一篇文章沙箱环境对接-上卷,用沙箱提供的 账号密码完成支付后,支付宝会主动去回调两个通知接口,这两个接口都是我们自己在后端准备,用来接收支付宝的同步通知和异步通知。
这里,我只做简单的异步通知接口搭建,具体缘由引用官方文档的一句话:“由于同步返回的不可靠性,支付结果必须以异步通知或查询接口返回为准,不能依赖同步跳转”。
在搭建接口前,需要先准备一个内网穿透工具,这里推荐:NATAPP-内网穿透 基于ngrok的国内高速内网映射工具,不要问为什么!!!问就是不要钱。
去官网注册,并下载工具包。然后建一个免费的通道,并将端口改成自己项目后端使用的端口。我使用的8080,所以我改成了8080。在新建通道的旁边可以看到一个设置按钮,点了改就完事。
这里有个 authtoken 参数,复制下来,下边要用。
单独建个文件夹,存英文取名,将安装包解压出来。重点来了,新建一个txt文档,改名为:config.ini (后缀名一定要改)将刚刚复制进去,象下边这样,然后保存即可。
将软件启动后可以看到下边的界面
将这个路径保存起来,后边支付宝的配置参数就改成这个:
# 异步回调地址 必须外网能够访问(这里需要配置内网穿透),当支付成功后会调用该API notify_url: http://mh8szu.natappfree.cc/alipay/notify 这里后边多出来的后缀就是准备的 后端访问接口 /alipay/notify,专门用来接收异步通知。 我这里简写了一个后端接收异步通知的接口,代码如下:
@PostMapping("/notify")
public String payNotify() throws AlipayApiException {
System.out.println("==============88888888============");
// 拿到当前 请求 spring有方法
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// 获取订单状态
String trade_status = request.getParameter("trade_status");
if ("TRADE_SUCCESS".equals(trade_status)) {// 交易状态 为 支付完成
// Enumeration<String> names = request.getParameterNames();
// System.out.println(names);
// 准备验签
HashMap<String, String> paramsMap = new HashMap<>();
Set<String> keySet = request.getParameterMap().keySet();
for (String name : keySet) {
// 将所有数据取出 装入paramsMap验签
paramsMap.put(name, request.getParameter(name));
}
// 开始验签
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, alipayConfig.ALIPAY_PUBLIC_KEY, alipayConfig.CHARSET, alipayConfig.SIGNTYPE); //调用SDK验证签名
if (signVerified) {
System.out.println("验签成功=====================");
// TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
return "success";
} else {
System.out.println("失败了=====================");
//参考文献
//https://opendocs.alipay.com/open/270/105899?pathHash=d57664bf&ref=api
// TODO 验签失败则记录异常日志,并在response中返回failure.
return "failure";
}
}
return "failure";
}
支付宝回调接口后,可以通过获取请求对象,进而 获取 订单状态 。根据订单状态,判断是否需要继续进行相关业务。如果订单状态是 支付完成(详细的状态关键字可参考官网https://opendocs.alipay.com/open/270/105902?pathHash=d5cd617e),则需要进行验签,从而保证消息可靠性(安全)。官网有验签方式,大体就是两步:
1:将参数尽数取出,然后存入map
2:将map放入验签方法并传入其他必要参数,验签通过则可继续业务。
注意:
在回调接口中需要返回字符串:return "success"; 以此告知支付宝我们成功接收到 异步通知,否则 支付宝会进入重试机制,多次发送,造成业务混乱。
使用穿透工具时,注意修改外露端口为后端端口,且重启穿透后需重新修改 回调地址