WeChat 支払いに関する前回の記事に引き続き、WeChat 支払いコールバックについて簡単に説明します。
1. 支払いコールバック
ユーザーが正常に支払いを行うと、支払いプラットフォームは注文の支払いステータス データを配信するために、指定されたサーバー インターフェイスにリクエストを送信します。
2. WeChat コールバック アドレスの問題
1. ローカル/オンラインテスト
ローカルでテストしている場合は、イントラネット ペネトレーション ツール ( NATAPP - イントラネット ペネトレーション ngrok に基づく国内高速イントラネット マッピング ツール)を使用する必要があります。取得したアドレスは、外部ネットワークからアクセスできる必要があります。具体的な使用方法については、直接クリックして、公式サイトにはドキュメントがあるので、ここでは詳しく説明しません。
オンラインでテストする場合は、ご自身で対応する環境アドレスに変更してください。
WeChat コールバック アドレスの例:
v3PayNotifyUrl: https://***.mynatapp.cc/jsapiPay/payNotify # WeChat コールバック アドレス
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();
}
要約する
コールバックについては基本的に公式ドキュメントで説明されているので、これ以上は説明しませんが、基本的には独自のビジネス ロジックの問題に対処するだけです。