以前に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バージョンを使用しました。