WeChatミニプログラム開発:WeChat支払い返金機能と返金コールバック実装【WxPayRefundV3版 完全なコード例付き】

以前にWeChat支払い機能について詳細な記事を執筆しました:WeChat支払い

weixin-java-payのjarパッケージを使用し、設定手順はWeChat支払いと同様です。上記の記事をご参照ください。 返金機能ではWxPayServiceクラスのrefundV3メソッドを使用します。このメソッドを使用するには、WeChat支払い設定に加えて、apiclient_key.pem証明書ファイル、apiclient_cert.pem証明書ファイル、apiV3秘密鍵値の設定が必要です。

一、返金機能

1、API証明書をダウンロードし、プログラムの指定位置に配置

指示に従ってダウンロード後、解凍すると以下の内容が含まれており、これをプログラムのresourceディレクトリに配置します

プログラム内の配置パスは以下の通りです:

2、yml設定ファイルで定義

wechat:
  appid: 
  secret: 
  # 商户(マーチャント)
  mchId: 
  # 秘钥(秘密鍵)
  mchKey: 
  apiV3Key: 
  # p12証明書の場所、絶対パスを指定するか、クラスパス(classpath:で始まる)を指定できます
  keyPath: classpath:apiclient_cert.p12
  privateKeyPath: classpath:apiclient_key.pem
  privateCertPath: classpath:apiclient_cert.pem
  #JSAPI--公式アカウント支払い    NATIVE--ネイティブスキャンコード支払い   APP--アプリ支払い
  tradeType: JSAPI
  notifyUrl: 	#支払いコールバックメソッドアドレス
  refundNotifyUrl:   #返金コールバックメソッドアドレス

3、既存のWxPropertiesとWxConfigでWxPayService設定の内容に新しい項目を追加します。 WxProperties:

WxConfig:【setNotifyUrlのアドレスは支払いコールバックのアドレスです】

4、返金メソッドの定義と呼び出し

 /**
     * WeChat支払い返金
     * @param orderNo
     * @param amount
     * @return
     */
    public Result<WxPayRefundV3Result> processRefund(String orderNo,Integer amount){
        Result<WxPayRefundV3Result> res = new Result<WxPayRefundV3Result>();
        //WeChat支払い-返金申請リクエストパラメータ
        WxPayRefundV3Request request = new WxPayRefundV3Request();
        WxPayRefundV3Request.Amount am = new WxPayRefundV3Request.Amount();
        am.setTotal(amount);//元の注文金額
        //返金通貨
        am.setCurrency("CNY");
        //返金金額 単位は分
        am.setRefund(amount);
        //金額情報
        request.setAmount(am);
        //transaction_id:WeChat支払い注文番号
        request.setTransactionId(orderNo);
        //商户注文番号
        request.setOutRefundNo("refund_"+orderNo);
        request.setNotifyUrl(this.wxPayService.getConfig().getRefundNotifyUrl()); //コールバックアドレスを設定
        WxPayRefundV3Result result;
        try {
            //WeChat V3返金APIを呼び出す
            result = wxPayService.refundV3(request);
            String status = result.getStatus();
            switch (status) {
                case "SUCCESS":
                    res.success("返金成功");
                    break;
                case "CLOSED":
                    res.success("返金クローズ");
                    break;
                case "PROCESSING":
                    res.success("返金処理中");
                    break;
                case "ABNORMAL":
                    res.success("返金異常");
                    break;
                default:
                    res.error("受付失敗");
                    break;
            }
            res.setResult(result);
        } catch (Exception e) {
            e.printStackTrace();
            res.error("返金申請失敗、"+e.getMessage());
        }
        return res;
    }

Controller層での呼び出し:

二、コールバックメソッド

返金メソッド呼び出し時にこの行で返金コールバックメソッドのアドレスを設定しています;

 request.setNotifyUrl(this.wxPayService.getConfig().getRefundNotifyUrl());//コールバックアドレス

支払いコールバックと返金コールバックの両方とも、アクセスアドレスをパブリックネットワークにマッピングして初めてテストと使用が可能です。

コールバックメソッドは以下の通りです: Controller:

 /**
     * WeChat返金結果コールバック
     * @param
     * @throws Exception
     */
    @PostMapping("/refundCallback")
    void refundCallback(@RequestBody String xmlData) throws Exception{
        wxPayOrderService.handleRefundCallback(xmlData);
    }


実装層のコード:

 /**
     * WeChat返金結果コールバック
     * @param xmlData
     * @throws Exception
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void handleRefundCallback(@RequestBody String xmlData) throws Exception {
        //SignatureHeader signatureHeader = this.getSignatureHeader(timestamp, nonce, serial, signature);
       final WxPayRefundNotifyV3Result callbackResult = this.wxPayService.parseRefundNotifyV3Result(xmlData,null);
        if (null != callbackResult && callbackResult.getResult().getRefundStatus().equals("SUCCESS")) {
           System.out.println("WeChat返金結果コールバック結果==============>:" + callbackResult.getResult());//TODO 削除
              //ロジックコード、WeChat支払い注文ステータスの変更およびその他の操作
            }
        }
    }

wxPayService.parseRefundNotifyV3Resultメソッドを使用します。ソースコードはご自身でご確認ください。

記:当初、返金には以下のrefundメソッドを使用していました:

支払いでも同じバージョンを使用していたため、同じものを使用しましたが、アクセスアドレス作成時にエラーが発生しました。エラーメッセージに基づいてプログラムを確認しましたが問題は見つからず、そのままv3バージョンを使用しました。

タグ: WeChatミニプログラム WeChat支払い 返金機能 WxPayRefundV3 Java

8月21日 01:31 投稿