帶你實現(xiàn)支付寶/微信金額原路返回(格式修改版)

公司首個外包項目的退換貨流程的退款操作是走原路返回的寂纪,而我有幸負(fù)責(zé)這個功能模塊開發(fā)湃番,在實踐中總結(jié)了一些經(jīng)驗夭织,特此分享出來。
一牵辣、支付寶退款摔癣。
支付寶提供了有密以及普通退款接口奴饮,兩者的區(qū)別就是前者不需要申請即時到賬支付而后者需要纬向,本文使用了有密退款接口;支付寶四要素:PID(合作者id)戴卜,private_key(私鑰逾条,我使用的是RSA加密方式生成的)、alipay_public_key(公鑰投剥,支付寶提供的)以及支付賬號师脂。
1.1先看配置文件:

// 合作身份者ID,簽約賬號江锨,以2088開頭由16位純數(shù)字組成的字符串
public static String partner = "";
// 收款支付寶賬號吃警,以2088開頭由16位純數(shù)字組成的字符串,一般情況下收款賬號就是簽約賬號public static String seller_user_id = partner;
// 商戶的私鑰,需要PKCS8格式啄育,RSA公私鑰生成
public static String private_key = "";
// 支付寶公鑰
public static String alipay_public_key  = "";
// 服務(wù)器異步通知頁面路徑  需http://格式的完整路徑酌心,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問
public static String notify_url = "http://xxx.xxxx.com/api/refund/refundBack_001";

1.2關(guān)鍵代碼:


兩種退款方式.png
/** * 退款操作(請求) * @param response * @return * @throws Exception  * trade_no 支付寶返回的交易號 * money  退款金額 */
public String aliRefund(HttpServletRequest request, HttpServletResponse response, String trade_no, String money,String refundId,String batch_no) throws Exception {PrintWriter out = ControllerUtils.getPrintWriter(response, logger, "------------AlipayRefundActionMultiController.aliRefund start------------");
//服務(wù)器異步通知頁面路徑
 String notify_url;
 String sHtmlText = "";
 try {MapsParaTemp = new HashMap();
 //退款詳細(xì)數(shù)據(jù)挑豌,必填安券,格式(支付寶交易號^退款金額^備注),多筆請用#隔開
 String detail_data = trade_no + "^" + money + "^退款";
 sParaTemp.put("detail_data", detail_data);//退款詳情
 sParaTemp.put("service", AlipayConfig.service);//
 sParaTemp.put("partner", AlipayConfig.partner);//合作者id
 sParaTemp.put("_input_charset", AlipayConfig.input_charset);//字符集格式
sParaTemp.put("notify_url", AlipayConfig.notify_url);//回調(diào)地址
sParaTemp.put("seller_email", "商家賬號");//賬號
sParaTemp.put("refund_date", UtilDate.getDateFormatter());//退款時間
sParaTemp.put("batch_no", batch_no);//批次號氓英,必填侯勉,格式:當(dāng)天日期[8位]+序列號[3至24位],如:201603081000001
sParaTemp.put("batch_num", "1"); //退款筆數(shù)铝阐,必填址貌,參數(shù)detail_data的值中,“#”字符出現(xiàn)的數(shù)量加1徘键,最大支持1000筆(即“#”字符出現(xiàn)的數(shù)量999個)
sHtmlText = AlipaySubmit.buildRequest(sParaTemp, "get", "確認(rèn)");
} catch (Exception e) {
e.printStackTrace();
}
return sHtmlText;
}```

***注意:***此處的交易號必須是你支付時保存的交易號练对,以及退款金額不能大于實付金額且不能<=0隘擎,否則無法調(diào)起支付二鳄。我是將退款信息用一個form表單封裝起來然后以流的方式輸出,前端頁面只需要拿到該信息然后填充到一個div中垄琐。
**1.3表單封裝:**

/** * 建立請求赠制,以表單HTML形式構(gòu)造(默認(rèn)) * @param sParaTemp 請求參數(shù)數(shù)組 * @param strMethod 提交方式赂摆。兩個值可選:post挟憔、get * @param strButtonName 確認(rèn)按鈕顯示文字 * @return 提交表單HTML文本 */
public static String buildRequest(Map < String, String > sParaTemp, String strMethod, String strButtonName){ //待請求參數(shù)數(shù)組
Map < String, String > sPara = buildRequestPara(sParaTemp);
List < String > keys = new ArrayList < String > (sPara.keySet());
StringBuffer sbHtml = new StringBuffer();
sbHtml.append("");
for (int i = 0; i < keys.size(); i++) {
String name = (String)keys.get(i);
String value = (String)sPara.get(name);
sbHtml.append("");
}
//submit按鈕控件請不要含有name屬性
sbHtml.append("");
sbHtml.append("document.forms['alipaysubmit'].submit();");
return sbHtml.toString();}


**1.4前端頁面拿到信息后進(jìn)行填充:**


![div.png](http://upload-images.jianshu.io/upload_images/2536237-738fbd47bcc6454a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![](http://upload-images.jianshu.io/upload_images/2536237-26d747c282f25dfc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**1.5效果展示:**
****
[圖片上傳中。烟号。绊谭。(4)]

![](http://upload-images.jianshu.io/upload_images/2536237-1cb4826902fb8fb6.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

***二、微信退款汪拥。***
***2.1配置文件***
******
![](http://upload-images.jianshu.io/upload_images/2536237-efcd58ddf33ad42b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**2.2退款前提條件:**
商戶必須開通微信支付功能达传,開發(fā)人員要拿到賬號以及**證書**(重點),退款金額不能大于實付價迫筑、小于等于0宪赶,并且傳入的實際支付價必須跟微信那邊保持一致,否則無法完成退款操作脯燃。
2.2關(guān)鍵代碼:

private String doRefundByWX(String money, String bankSerialNumber, long numberCount, String no,String sumAmout) throws UnrecoverableKeyException, KeyManagementException, KeyStoreException, NoSuchAlgorithmException, IOException{
String result="";
String appid=WeiXinUtil.appid;//應(yīng)用ID
String mch_id=WeiXinUtil.mch_id;//商戶號
String nonce_str=WeiXinUtil.CreateNoncestr();//隨機(jī)字符串
String transaction_id=bankSerialNumber;//微信訂單號
String out_refund_no=no;//商戶退款單號
Double total_fee=0d;
try {
total_fee = StringUtil.getDouble(sumAmout);
} catch (NumberFormatException e)
{e.printStackTrace();}
catch (Exception e) {
e.printStackTrace();
}
long totalAmount = new BigDecimal(total_fee * 100d).longValue();//總金額以分為單位Double refund_fee=Double.parseDouble(money);
long Amount = new BigDecimal(refund_fee * 100d).longValue();//退款金額以分為單位
String op_user_id=WeiXinUtil.mch_id;//操作員帳號, 默認(rèn)為商戶號 /簽名算法SortedMapSortedMap = new TreeMap();
SortedMap.put("appid", appid);
SortedMap.put("mch_id",mch_id);
SortedMap.put("nonce_str",nonce_str);
SortedMap.put("transaction_id", transaction_id);
SortedMap.put("out_refund_no", out_refund_no);
SortedMap.put("total_fee",String.valueOf(totalAmount));
SortedMap.put("refund_fee", String.valueOf(Amount));
SortedMap.put("op_user_id", op_user_id);
String sign=WeiXinUtil.createSign("UTF-8",SortedMap);
//獲取最終待發(fā)送的數(shù)據(jù)
String requestXml=WeiXinUtil.getRequestXml(SortedMap);
//(2)建立連接并發(fā)送數(shù)據(jù)
result=WeixinSendPost(requestXml);
return result;
}```

2.3退款操作:
先申明一點:微信退款沒有提供跳轉(zhuǎn)頁面搂妻,也就是一點擊退款,只要信息正確就會自動打錢到退款賬戶辕棚。

我們平臺的操作.png
退款成功結(jié)果.png
微信退款成功了.png

三欲主、關(guān)于保存微信支付、支付寶交易號作為退款字段的代碼圖(訂單支付的回調(diào)方法):

支付寶支付回調(diào)方式.png
微信支付回調(diào)方法.png

備注:由于時間問題就不上全部代碼逝嚎,如若要具體代碼請關(guān)注我扁瓢,如果響應(yīng)激烈我將會將代碼放到GitHub。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末补君,一起剝皮案震驚了整個濱河市引几,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赚哗,老刑警劉巖她紫,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屿储,居然都是意外死亡贿讹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門够掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來民褂,“玉大人,你說我怎么就攤上這事疯潭∩蘅埃” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵竖哩,是天一觀的道長哭廉。 經(jīng)常有香客問我相叁,道長辽幌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任乌企,我火速辦了婚禮成玫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哭当。我一直安慰自己,他們只是感情好荣病,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著个盆,像睡著了一般朵栖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陨溅,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機(jī)與錄音雹有,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛质帅,可吹牛的內(nèi)容都是我干的煤惩。 我是一名探鬼主播炼邀,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拭宁!你這毒婦竟也來了票彪?” 一聲冷哼從身側(cè)響起不狮,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤推掸,失蹤者是張志新(化名)和其女友劉穎谅畅,沒想到半個月后毡泻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仇味,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡丹墨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年没酣,在試婚紗的時候發(fā)現(xiàn)自己被綠了裕便。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闪金。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡囱嫩,死狀恐怖漏设,靈堂內(nèi)的尸體忽然破棺而出鸳碧,到底是詐尸還是另有隱情,我是刑警寧澤腾仅,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布肉迫,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏壳贪。R本人自食惡果不足惜撑碴,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一收苏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秆乳,春花似錦肛冶、人聲如沸睦袖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沥匈,卻和暖如春缰儿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞪浸。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蹈矮,地道東北人泛鸟。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓闸翅,卻偏偏與公主長得像缎脾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子华蜒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容