java对接微信支付:JSAPI支付成功之“微信回调”

承接上一篇微信支付,现在简单说一下 微信支付回调

一、支付回调

当用户支付成功之后,支付平台会向我们指定的服务器接口发送请求传递订单支付状态数据

二、微信回调地址问题

1.本地/上线测试

如果你是再本地进行测试,那就需要使用内网穿透工具(NATAPP-内网穿透 基于ngrok的国内高速内网映射工具),得到的地址要外网能访问到,具体使用直接点击到官网有文档介绍,就不在这里多说了。

上线测试就自己改到相应的环境地址。

微信回调地址 示例:

v3PayNotifyUrl:  https://***.mynatapp.cc/jsapiPay/payNotify   # 微信回调地址

2.控制器调用接口(代码)

代码如下:

@PostMapping("/payNotify")
public void payNotify(HttpServletRequest request, HttpServletResponse response) throws Exception{
    //获取报文
    String body = getRequestBody(request);
    //随机串
    String nonceStr = request.getHeader("Wechatpay-Nonce");

    //微信传递过来的签名
    String signature = request.getHeader("Wechatpay-Signature");

    //证书序列号(微信平台)
    String serialNo = request.getHeader("Wechatpay-Serial");

    //时间戳
    String timestamp = request.getHeader("Wechatpay-Timestamp");

    InputStream is = null;
    try {
        is = request.getInputStream();
        // 构造 RequestParam
        RequestParam requestParam = new RequestParam.Builder()
                .serialNumber(serialNo)
                .nonce(nonceStr)
                .signature(signature)
                .timestamp(timestamp)
                .body(body)
                .build();
        // 如果已经初始化了 RSAAutoCertificateConfig,可以直接使用  config
        // 初始化 NotificationParser
        NotificationParser parser = new NotificationParser(config);
        // 验签、解密并转换成 Transaction
        Transaction transaction = parser.parse(requestParam, Transaction.class);
        //记录日志信息
        Transaction.TradeStateEnum state = transaction.getTradeState();
        String openid = transaction.getPayer().getOpenid();
        if (!StringUtils.equals("SUCCESS", state.toString())) {
            log.error("微信回调失败,JsapiPayController.payNotify.transaction:{}",transaction.toString());
            //通知微信回调失败
            response.getWriter().write("<xml><return_code><![CDATA[FAIL]]></return_code></xml>");
        }
        //TODO------
       //根据自己的需求处理相应的业务逻辑,异步

       
        //通知微信回调成功
        response.getWriter().write("<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>");
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        is.close();
    }
}




/**
     * 读取请求数据流
     * @param request
     * @return
     */
    private String getRequestBody(HttpServletRequest request) {
        StringBuffer sb = new StringBuffer();
        try (ServletInputStream inputStream = request.getInputStream();
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        ) {
            String line;

            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } catch (IOException e) {
            log.error("读取数据流异常:{}", e);
        }
        return sb.toString();
    }

总结

回调的基本上官方文档都有说,其他的就不多说了,基本上就是处理自己的业务逻辑问题。

猜你喜欢

转载自blog.csdn.net/m0_57007247/article/details/131640950