支付宝沙箱环境对接-下卷

文章介绍了如何在支付宝沙箱环境中配置异步通知接口,强调了因同步返回的不可靠性而依赖异步通知的重要性。作者推荐使用NATAPP进行内网穿透,并详细说明了设置过程。在后端,创建了一个用于接收异步通知的接口,实现了验签功能以确保消息的安全性。验签成功后返回success,防止支付宝重复发送通知导致业务混乱。
摘要由CSDN通过智能技术生成

        接着上一篇文章沙箱环境对接-上卷用沙箱提供的 账号密码完成支付后,支付宝会主动去回调两个通知接口,这两个接口都是我们自己在后端准备,用来接收支付宝的同步通知和异步通知。

        这里,我只做简单的异步通知接口搭建,具体缘由引用官方文档的一句话:“由于同步返回的不可靠性,支付结果必须以异步通知或查询接口返回为准,不能依赖同步跳转”。
        在搭建接口前,需要先准备一个内网穿透工具,这里推荐: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";  以此告知支付宝我们成功接收到 异步通知,否则 支付宝会进入重试机制,多次发送,造成业务混乱。
        使用穿透工具时,注意修改外露端口为后端端口,且重启穿透后需重新修改  回调地址

        

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值