java微信退款(支援部分退款)
阿新 • • 發佈:2019-01-10
這裡介紹兩種退款方式:已封裝和未封裝兩種形式
一、未封裝
放到resource中即可,在編譯的時候保證能將它編譯到class中,下面會說到
證書還有一點要注意,如果你放到resource中了但是不好使,具體報什麼錯忘了,需要加上支援:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> <!-- 過濾字尾為pem、pfx的證書檔案 --> <nonFilteredFileExtensions> <nonFilteredFileExtension>pem</nonFilteredFileExtension> <nonFilteredFileExtension>pfx</nonFilteredFileExtension> <nonFilteredFileExtension>p12</nonFilteredFileExtension> </nonFilteredFileExtensions> </configuration> </plugin>
工具類都是全的,只需要小改一下自己的東西就可以實現了,目錄如下:
裡面有詳細的說明,需要改動的是RefundUtil和ClientCustomSSL,其他不用動
RefundUtil
做過支付才做退款對吧, 所以我不多說了,上面的內容都改成自己平臺的appid和金鑰,具體在哪找自己百度
ClientCustomSSL
這個類需要指定證書,上面說過了,而
String path=this.getClass().getClassLoader().getResource("/").getPath();
就是獲取證書的路徑,自己可以編譯一下看是不是在那個資料夾下,如果在就對了,如果不在,那肯定不行(這裡我們採用的相對路徑,這樣放到哪裡都不會錯也不用改)
ok了,沒什麼了,預設讀取證書密碼退款就可以了
這是呼叫的程式碼:
RefundUtil refundUtil = new RefundUtil(); Map<String, String> map = refundUtil.wechatRefund(transaction_id, total_fee, refund_fee, request); log.info("返回map集合:" + map); String result_code = map.get("result_code"); log.info("result_code退款狀態:" + result_code); if (result_code.equals("SUCCESS")) {
成功後處理自己業務邏輯
退款成功返回map形式:以上面的形式取出要用的就可以
{
refund_id=50000105282018010,
refund_fee=9900,
coupon_refund_fee=0,
refund_channel=,
return_msg=OK,
appid=wxdlsfjldk,
nonce_str=FCAvhi2VeL0kYYn2,
out_trade_no=20183242336,
out_refund_no=3133e760-ccb9-4345-9466-ab2b68be,
transaction_id=42002343452454243231346161,
coupon_refund_count=0,
sign=BE4CCE8009E6A5CC32342342391B,
result_code=SUCCESS,
mch_id=134234234,
total_fee=9900,
return_code=SUCCESS,
cash_refund_fee=9900,
cash_fee=9900
}
二、未封裝(ijpay的封裝方式)
@ResponseBody
@RequestMapping(value ="/refund.do",method = {RequestMethod.POST,RequestMethod.GET})
public String refund(){
String certPath=this.getClass().getClassLoader().getResource("/").getPath()+"apiclient_cert.p12";
System.out.println("certPath:"+certPath);
String transaction_id = null;
String out_trade_no = "";
if (StrKit.isBlank(out_trade_no) && StrKit.isBlank(transaction_id)) {
System.out.println("transactionId、out_trade_no二選一");
return null;
}
Map<String, String> params = new HashMap<String, String>();
params.put("appid", appID);
params.put("mch_id", mchID);
params.put("nonce_str", System.currentTimeMillis()+"");
if (StrKit.notBlank(transaction_id)) {
params.put("transaction_id", transaction_id);
}else {
params.put("out_trade_no", out_trade_no);
}
params.put("out_refund_no", System.currentTimeMillis()+"");
params.put("total_fee", "100");
params.put("refund_fee", "90");
params.put("sign", PaymentKit.createSign(params, partnerKey));
String refund = WxPayApi.orderRefund(false, params , certPath, mchID);
System.out.println("refund:"+refund);
return refund;
}
已測試,很簡單,相信聰明的你一看就懂了