【JAVA版】支付寶支付方案一詳解

      網友投稿 1432 2025-03-31

      在使用“aliPayPlus”模塊進行接入支付寶支付過程中,如果采用方案一(推薦)進行支付時,重要組裝orderInfo字段數據。APICloud的文檔中,沒有提及太多,示例代碼中的數據也有一定的問題。參考螞蟻金服接口參數文檔,終于接入成功。后臺采用Java代碼書寫,特將信息整理出來,避免新接入的朋友,重新趟雷。

      接口參數參考地址:https://doc.open.alipay.com/docs ... Id=105465&docType=1

      直接上代碼:

      /** ?????????*?調用支付寶的SDK,封裝發送給支付寶服務器的數據參數。?
      ?????????*?返回數據供APICloud支付方式一調用。?
      ?????????*?調用簽名方法進行數據簽名,步驟如下: ?????????*?

        ?????????*?
      1. 參考接口參數文檔,對于sign之外的數據,進行封裝,存入到map中
      2. ?????????*?
      3. 調用AlipaySignature.rsaSign方法,進行數據簽名。方法內部會自動完成排序。
      4. ?????????*?
      5. 將得到的sign內容,賦值給sign。加入到map中。 ?????????*?
      6. ?????????*?
      7. 將所有的參數數據,進行URLEncoder編碼。
      8. ?????????*?
      9. 最后調用SDK方法,將map轉換成排序后的字符串,返回給客戶端
      10. ?????????*?
      ?????????*?

      ?????????*?注意:坑比較多,文檔中也有錯誤,不需要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?infoMap?=?new?HashMap(); ????????????????infoMap.put("app_id",?prop.getAliAppId()); ????????????????infoMap.put("biz_content",?JsonUtils.fromObject(bizContent)); ????????????????infoMap.put("charset",?AlipayHelper.CHARSET); ????????????????infoMap.put("method",?AlipayHelper.METHOD); ????????????????infoMap.put("notify_url",?notifyUrl); ????????????????infoMap.put("sign_type",?AlipayHelper.SIGN_TYPE); ????????????????infoMap.put("timestamp",?DateTimeUtils.getNowTimeStanderd()); ????????????????infoMap.put("version",?AlipayHelper.VERSION); ????????????????//?對于數據進行簽名操作 ????????????????String?sign?=?AlipaySignature ????????????????????????????????.rsaSign(infoMap,?prop.getAliRsaPriKey(),?AlipayHelper.CHARSET); ????????????????infoMap.put("sign",?sign); ????????????????//?將參數內容進行URL格式編碼 ????????????????for?(Map.Entry?entry?:?infoMap.entrySet()) ????????????????{ ????????????????????????entry.setValue(URLEncoder.encode(entry.getValue(),?AlipayHelper.CHARSET)); ????????????????} ????????????????//?將Map數據按照規則排列轉換成字符串,發送給支付寶服務端 ????????????????String?orderInfo?=?AlipaySignature.getSignContent(infoMap); ????????????????logger.info("【支付寶支付請求參數】"?+?orderInfo); ????????????????JSONObject?json?=?new?JSONObject(); ????????????????json.put("orderInfo",?orderInfo); ????????????????return?JsonUtils.fromObject(json); ????????}

      其中, 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?reqMap?=?getParamMap(request.getParameterMap()); ???????//?校驗支付返回數據狀態&&變更訂單狀態 ???????if?(alipayService.isPaySuccess(reqMap) ???????????&&?payService.dealOrder(reqMap.get("out_trade_no"),?ConstantHelper.ORDER_PAY_ALI)) ??????{ ???????????????logger.info("【支付寶回調成功】-返回success"); ???????????????response.getOutputStream().write("success".getBytes()); ??????} ??????else ?????{ ???????????????response.getOutputStream().write("fail".getBytes()); ?????} ????????}

      【JAVA版】支付寶支付方案一詳解

      在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=,?notify_type=trade_status_sync,?out_trade_no=20170829093417364,?point_amount=0.00,?version=1.0,?fund_bill_list=[{"amount":"0.01","fundChannel":"ALIPAYACCOUNT"}],?buyer_id=2088212389597532,?total_amount=0.01,?trade_no=2017082921001004530224695960,?notify_time=2017-08-29?09:34:33,?charset=utf-8,?invoice_amount=0.01,?trade_status=TRADE_SUCCESS,?gmt_payment=2017-08-29?09:34:33,?sign=<簽名字符串>,?gmt_create=2017-08-29?09:34:32,?buyer_pay_amount=0.01,?receipt_amount=0.01,?app_id=2016050401362525,?seller_id=<商戶ID號>,?notify_id=47a0e3508c7296c4f079a04043d2163k3a,?seller_email=<商戶郵箱>}

      在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小時內刪除侵權內容。

      上一篇:apaas平臺龍頭(apa品牌)
      下一篇:數字雙胞胎正在推動智能制造的生產效率
      相關文章
      亚洲国产成人久久综合| 亚洲不卡视频在线观看| 亚洲精品无码少妇30P| 亚洲伊人色一综合网| 亚洲欧洲精品在线| 91大神亚洲影视在线| 亚洲午夜精品一区二区| 亚洲国产美国国产综合一区二区 | 亚洲精品午夜国产VA久久成人| 亚洲国产精品自产在线播放 | 亚洲第一永久AV网站久久精品男人的天堂AV | 成人午夜亚洲精品无码网站| 亚洲精品一级无码鲁丝片| 亚洲美女在线国产| 久久精品亚洲男人的天堂| 国产gv天堂亚洲国产gv刚刚碰| 亚洲综合色婷婷七月丁香| 亚洲乱色熟女一区二区三区丝袜| 亚洲精品乱码久久久久久蜜桃不卡 | 亚洲综合偷自成人网第页色| 亚洲高清一区二区三区| 亚洲日韩AV一区二区三区四区| 亚洲爆乳成av人在线视菜奈实| 亚洲AV无码精品国产成人| 色五月五月丁香亚洲综合网| 亚洲国产成人精品女人久久久| 亚洲人成色77777在线观看大| 国产亚洲午夜高清国产拍精品| 亚洲乱码国产乱码精品精| 亚洲成人在线网站| 亚洲色偷偷av男人的天堂| 亚洲色欲色欲www| 亚洲AV性色在线观看| 亚洲国产午夜中文字幕精品黄网站 | 亚洲国产一二三精品无码| 亚洲网址在线观看你懂的| 亚洲人妖女同在线播放| 亚洲人成色77777在线观看| 国产亚洲福利一区二区免费看| 中文字幕日韩亚洲| 亚洲A∨无码无在线观看|