Docking Java avec paiement WeChat : "Rappel WeChat" pour un paiement JSAPI réussi

Dans la continuité de l'article précédent sur le paiement WeChat, parlons brièvement du rappel de paiement WeChat.

1. Rappel de paiement

Lorsque l'utilisateur paie avec succès, la plateforme de paiement enverra une demande à notre interface de serveur désignée pour fournir les données sur l'état de paiement de la commande.

2. Problème d'adresse de rappel WeChat

1. Tests locaux/en ligne

Si vous testez localement, vous devez utiliser l'outil de pénétration intranet ( NATAPP - outil de cartographie intranet domestique à haut débit de pénétration intranet basé sur ngrok ). L'adresse obtenue doit être accessible depuis le réseau externe. Pour une utilisation spécifique, cliquez directement sur Le le site officiel contient de la documentation, je n'entrerai donc pas dans les détails ici.

Lors du test en ligne, remplacez-le vous-même par l'adresse de l'environnement correspondante.

Exemple d'adresse de rappel WeChat :

v3PayNotifyUrl : https://***.mynatapp.cc/jsapiPay/payNotify # Adresse de rappel WeChat

2. Interface d'appel du contrôleur (code)

le code s'affiche comme ci-dessous :

@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();
    }

Résumer

Les rappels sont essentiellement mentionnés dans les documents officiels, et je n'entrerai pas dans les détails. En gros, il s'agit simplement de gérer vos propres problèmes de logique métier.

Je suppose que tu aimes

Origine blog.csdn.net/m0_57007247/article/details/131640950
conseillé
Classement