Java-Docking mit WeChat-Zahlung: „WeChat-Rückruf“ für erfolgreiche JSAPI-Zahlung

Lassen Sie uns in Fortsetzung des vorherigen Artikels zur WeChat-Zahlung kurz über den WeChat-Zahlungsrückruf sprechen.

1. Zahlungsrückruf

Wenn der Benutzer erfolgreich bezahlt, sendet die Zahlungsplattform eine Anfrage an unsere festgelegte Serverschnittstelle, um die Zahlungsstatusdaten der Bestellung zu übermitteln.

2. Problem mit der WeChat-Rückrufadresse

1. Lokale/Online-Tests

Wenn Sie lokal testen, müssen Sie das Intranet-Penetrationstool ( NATAPP - Intranet Penetration Inland High-Speed-Intranet-Mapping-Tool basierend auf NGROK ) verwenden. Die erhaltene Adresse muss über das externe Netzwerk zugänglich sein. Für eine spezifische Verwendung klicken Sie direkt auf The Die offizielle Website verfügt über Dokumentation, daher werde ich hier nicht auf Details eingehen.

Wenn Sie online testen, ändern Sie diese selbst in die entsprechende Umgebungsadresse.

Beispiel für eine WeChat-Rückrufadresse:

v3PayNotifyUrl: https://***.mynatapp.cc/jsapiPay/payNotify # WeChat-Rückrufadresse

2. Controller-Aufrufschnittstelle (Code)

Code wie folgt anzeigen:

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

Zusammenfassen

Rückrufe werden grundsätzlich in den offiziellen Dokumenten erwähnt, und ich werde nicht weiter darauf eingehen. Im Grunde geht es nur darum, sich mit den eigenen Problemen der Geschäftslogik zu befassen.

Supongo que te gusta

Origin blog.csdn.net/m0_57007247/article/details/131640950
Recomendado
Clasificación