【JAVA版】支付寶支付方案一詳解
在使用“aliPayPlus”模塊進行接入支付寶支付過程中,如果采用方案一(推薦)進行支付時,重要組裝orderInfo字段數據。APICloud的文檔中,沒有提及太多,示例代碼中的數據也有一定的問題。參考螞蟻金服接口參數文檔,終于接入成功。后臺采用Java代碼書寫,特將信息整理出來,避免新接入的朋友,重新趟雷。
接口參數參考地址:https://doc.open.alipay.com/docs ... Id=105465&docType=1
直接上代碼:
/** ?????????*?調用支付寶的SDK,封裝發送給支付寶服務器的數據參數。?
?????????*?返回數據供APICloud支付方式一調用。?
?????????*?調用簽名方法進行數據簽名,步驟如下: ?????????*?
- ?????????*?
- 參考接口參數文檔,對于sign之外的數據,進行封裝,存入到map中 ?????????*?
- 調用AlipaySignature.rsaSign方法,進行數據簽名。方法內部會自動完成排序。 ?????????*?
- 將得到的sign內容,賦值給sign。加入到map中。 ?????????*?
- ?????????*?
- 將所有的參數數據,進行URLEncoder編碼。 ?????????*?
- 最后調用SDK方法,將map轉換成排序后的字符串,返回給客戶端 ?????????*?
?????????*?注意:坑比較多,文檔中也有錯誤,不需要Base64的編碼。 ?????????*?
?????????*? ?????????*?@param?request ?????????*?@param?response ?????????*?@return ?????????*?@author ?????????*?@throws?AlipayApiException ?????????*?@throws?FrameworkException ?????????*?@throws?UnsupportedEncodingException ?????????*?@see?螞蟻金服接口參數文檔 ?????????*/ ????????@ResponseBody ????????@RequestMapping(value?=?"alipay-order-info") ????????public?String?getPayOrderInfo(HttpServletRequest?request,?HttpServletResponse?response) ????????????????????????throws?AlipayApiException,?FrameworkException,?UnsupportedEncodingException ????????{ ????????????????//?從客戶端傳遞得到訂單數據 ????????????????String?tradeId?=?request.getParameter("out_trade_no"); ????????????????String?amount?=?request.getParameter("total_amount"); ????????????????String?notifyUrl?=?request.getParameter("notify_url"); ????????????????//?組裝發送給支付寶服務器的數據串 ????????????????AlipayBizContent?bizContent?=?new?AlipayBizContent(); ????????????????bizContent.setOut_trade_no(tradeId); ????????????????bizContent.setProduct_code(AlipayHelper.PRODUCT_CODE); ????????????????bizContent.setSeller_id(prop.getAliSellerId()); ????????????????bizContent.setSubject(AlipayHelper.SUBJECT); ????????????????bizContent.setTotal_amount(amount); ????????????????Map其中, AlipayBizContent 的類代碼如下,參考接口文檔
public?class?AlipayBizContent { ????????/** ?????????*?對一筆交易的具體描述信息。如果是多種商品,請將商品描述字符串累加傳給body。 ?????????*/ ????????private?String?body; ????????/** ?????????*?商品的標題/交易標題/訂單標題/訂單關鍵字等。 ?????????*/ ????????private?String?subject; ????????/** ?????????*?商戶網站唯一訂單號 ?????????*/ ????????private?String?out_trade_no; ????????/** ?????????*?訂單總金額,單位為元,精確到小數點后兩位,取值范圍[0.01,100000000] ?????????*/ ????????private?String?total_amount; ????????/** ?????????*?收款支付寶用戶ID。?如果該值為空,則默認為商戶簽約賬號對應的支付寶用戶ID ?????????*/ ????????private?String?seller_id; ????????/** ?????????*?銷售產品碼,商家和支付寶簽約的產品碼,為固定值QUICK_MSECURITY_PAY ?????????*/ ????????private?String?product_code;
注意代碼中的簽名、編碼和排序。要使用支付寶提供的接口jar方法實現。
這樣,通過getPayOrderInfo方法得到的字符串數據,就可以供API中的方法調用了。
另外,如果電商訂單,關于訂單的后處理,要在回調接口方法中完成,如下示例:
/** ?????????*?支付寶支付完成之后,返回數據到客戶服務端。 ?????????*?
?????????*?程序執行完后必須打印輸出“success”(不包含引號)。如果商戶反饋給支付寶的字符不是success這7個字符,支付寶服務器會不斷重發通知,直到超過24小時22分鐘。一般情況下,25 ?????????*?小時以內完成8次通知(通知的間隔頻率一般是:4m,10m,10m,1h,2h,6h,15h); ?????????*?
?????????*? ?????????*?@param?request ?????????*?@param?response ?????????*?@author?JiangZhongyan ?????????*?@throws?IOException ?????????*/ ????????@RequestMapping(value?=?"/alipay-finish-notify") ????????@SystemControllerLog ????????public?void?alipayNotify(HttpServletRequest?request,?HttpServletResponse?response) ????????????????????????throws?IOException ????????{ ???????Map在notify_url中,去完成你想要在支付成功之后做的事情。盡量不要在JS一側執行。
以上是服務器端的代碼,因為代碼不全,僅供講解過程,具體邏輯代碼,根據實際情況調整。拼裝的數據,示例如下:
【支付寶支付請求參數】app_id=<自己的ID號>&biz_content=%7B%22body%22%3A%22%22%2C%22out_trade_no%22%3A%2220170829093417364%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22seller_id%22%3A%222088221616699040%22%2C%22subject%22%3A%22%E6%98%9F%E6%B1%89%E6%9E%9C%E5%9B%AD%22%2C%22total_amount%22%3A%220.01%22%7D&charset=utf-8&method=alipay.trade.app.pay?ify_url=http%3A%2F%2Fxinghansoft.com%2Ffruitshop%2Fapp%2Falipay-finish-notify.action&sign=<用私鑰加密的簽名數據>&sign_type=RSA×tamp=2017-08-29+09%3A34%3A21&version=1.0
從支付寶一側返回的數據,示例如下:
【支付寶支付回調參數】{subject=<應用名稱>,?sign_type=RSA,?buyer_logon_id=144***@qq.com,?auth_app_id=
在APP一側的JS代碼如下:
/** ?????????????????*?阿里支付寶支付 ?????????????????*?支付寶支付的金額單位為元 ?????????????????*?@param??tradeNo?商戶系統內部的訂單號 ?????????????????*?@param?price?訂單總金額,只能為整數,單位:分(¥) ?????????????????*/ ????????????????function?execAlipay(tradeNo,?price)?{ ????????????????????????var?data?=?{ ????????????????????????????????out_trade_no?:?tradeNo, ????????????????????????????????total_amount?:?price, ????????????????????????????????notify_url?:?extApi.MainUrl?+?'app/alipay-finish-notify.action' ????????????????????????}; ????????????????????????ajax.post('app/alipay-order-info.action',?data,?function(ret)?{ ????????????????????????????????var?aliPayPlus?=?api.require('aliPayPlus'); ????????????????????????????????aliPayPlus.payOrder({ ????????????????????????????????????????orderInfo?:?ret.orderInfo ????????????????????????????????},?function(ret,?err)?{ ????????????????????????????????????????if?(ret.code?==?'9000')?{ ????????????????????????????????????????????????closePayWin(); ????????????????????????????????????????}else{ ???????????????????????????????????????????extApi.alert(getAliRetCodeMsg(ret.code),?'支付結果'); ????????????????????????????????????????} ????????????????????????????????}); ????????????????????????}); ????????????????} ????????????????/** ?????????????????*?阿里支付返回的錯誤碼,取值范圍如下: ?????????????????*?9000:支付成功 ?????????????????*?8000:正在處理中,支付結果未知(有可能已經支付成功),請查詢商戶訂單列表中訂單的支付狀態 ?????????????????*?4000:訂單支付失敗 ?????????????????*?5000:重復請求 ?????????????????*?6001:用戶中途取消支付操作 ?????????????????*?6002:網絡連接出錯 ?????????????????*?6004:支付結果未知(有可能已經支付成功),請查詢商戶訂單列表中訂單的支付狀態 ?????????????????*/ ????????????????function?getAliRetCodeMsg(code)?{ ????????????????????????switch(code)?{ ????????????????????????????????case?'9000': ????????????????????????????????????????return?'支付成功'; ????????????????????????????????case?'8000': ????????????????????????????????????????return?'正在處理中'; ????????????????????????????????case?'4000': ????????????????????????????????????????return?'訂單支付失敗'; ????????????????????????????????case?'5000': ????????????????????????????????????????return?'重復請求'; ????????????????????????????????case?'6001': ????????????????????????????????????????return?'用戶中途取消支付操作'; ????????????????????????????????case?'6002': ????????????????????????????????????????return?'網絡連接出錯'; ????????????????????????????????case?'6004': ????????????????????????????????????????return?'未知錯誤'; ????????????????????????????????default: ????????????????????????????????????????return?'未知錯誤'; ????????????????????????} ????????????????}
到此,如果您賬號正確,基本上就可以測試聯通了。希望能夠對你有幫助。
附件中,攜帶了兩個Java文件,供參考。
附件: aliPay.zip 5.29KB 下載次數:0次
Java 訂單
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。