【JAVA版】微信支付方案一詳解

      網友投稿 870 2025-03-31

      在接入微信支付插件時,如果使用方案一完成,難點還是在getOrderId。這個方法的服務器端實現,還要多參考微信提供的接口文檔。對接起來還是有很多小坑的,希望以下經驗,能給您提供幫助。

      參考接入接口 :?https://pay.weixin.qq.com/wiki/doc/api/index.html

      管理端后臺的Java主體代碼如下:

      /** ?????????*?微信支付獲取預支付訂單號 ?????????*?

        ?????????*?
      • 1、封裝數據,進行預支付,獲取統一下單的prepay_id
      • ?????????*?
      • 2、驗證是否下單成功,成功后,將簽名數據返回
      • ?????????*?
      ?????????*?@param?request ?????????*?@param?response ?????????*?@return ?????????*?@author?JiangZhongyan ?????????*?@throws?NoSuchAlgorithmException ?????????*/ ????????@SuppressWarnings("unchecked") ????????@ResponseBody ????????@RequestMapping(value?=?"wxpay-order-info") ????????public?String?getPayOrderInfo(HttpServletRequest?request,?HttpServletResponse?response) ????????????????????????throws?NoSuchAlgorithmException ????????{ ????????????????String?payType?=?request.getParameter("type"); ????????????????String?tradeNo?=?request.getParameter("tradeNo"); ????????????????String?totalFee?=?request.getParameter("totalFee"); ????????????????//?封裝微信支付申請參數對象,注意APP支付和微信公眾號支付的參數差異 ????????????????WxpayPreConfig?preConfig?=?new?WxpayPreConfig(tradeNo,?totalFee,?WxpayHelper.TRADE_TYPE_APP); ????????????????preConfig.setNotify_url(prop.getWxNotifyUrl()); ????????????????String?secretKey?=?prop.getWxAppSecret(); ????????????????preConfig.setTrade_type(WxpayHelper.TRADE_TYPE_APP); ????????????????preConfig.setAppid(prop.getWxAppId()); ????????????????preConfig.setMch_id(prop.getWxMchId()); ????????????????//?預支付信息 ????????????????Map?preInfo?=?new?HashMap<>(BeanMap.create(preConfig)); ????????????????preInfo.put("sign",?WxpayHelper.getMD5Sign(preInfo,?secretKey)); ????????????????String?resultStr?=?ClientUtils.sendPost(prop.getWxSendUri(), ????????????????????????????????WxpayHelper.getRequestXml(preInfo),?StringUtils.UTF8); ???????????????? ????????????????//?統一下單結果,主要為了獲取prepay_id ????????????????JSONObject?result?=?XmlUtils.getJSONFromXml(resultStr); ????????????????//?檢測是否下單成功以及簽名是否正確 ????????????????if?(result.getString("return_code").equals("SUCCESS") ????????????????????????????????&&?WxpayHelper.checkSign(result,?secretKey)) ????????????????{ ????????????????????????//?解析下單結果,并返回前臺使用 ????????????????????????WxpayConfig?retConfig?=?new?WxpayConfig(result.getString("prepay_id")); ????????????????????????retConfig.setAppid(prop.getWxAppId()); ????????????????????????retConfig.setPartnerid(prop.getWxMchId()); ????????????????????????Map?info?=?new?HashMap<>(BeanMap.create(retConfig)); ????????????????????????info.put("package",?"Sign=WXPay"); ????????????????????????//?二次簽名 ????????????????????????info.put("sign",?WxpayHelper.getMD5Sign(info,?secretKey)); ????????????????????????//?拼裝返回前臺信息 ????????????????????????return?JSONObject.fromObject(info).toString(); ????????????????} ????????????????return?JSONObject.fromObject(new?ErrorMsgBean(resultStr)).toString(); ????????}

      說明:

      1)其中,WxpayPreConfig類的內容,參考接口文檔,自己拼湊即可。

      2)prop.getWxSendUri() =?https://api.mch.weixin.qq.com/pay/unifiedorder

      3)附上MD5簽名方法,注意map的排序。

      public?static?String?getMD5Sign(Map?map,?String?key) ????????????????????????throws?NoSuchAlgorithmException ????????{ ????????????????StringBuffer?info?=?new?StringBuffer(StringUtils.getSortedParam(map)); ????????????????//?若有key ????????????????if?(!StringUtils.isNullOrEmpty(key)) ????????????????{ ????????????????????????info.append("&key="?+?key); ????????????????} ????????????????return?StringUtils.MD5(info.toString()).toUpperCase(); ????????}

      說明:這里附上的代碼,僅提供開發思路。可能不全。如果需要源代碼者,再線下聯系。可以提供相關代碼。

      如下為,正確統一下單之后,返回的結果數據:

      【微信統一下單參數結果】?]]>]]>]]>]]>

      在APP一側的JS代碼中,對接如下:

      /** ?????????????????*?微信支付 ?????????????????*?微信支付的最小單位是分 ?????????????????*?注意Number(price)?*?100的冗余錯誤,加上parseInt修正 ?????????????????*?parseInt(Number(price)?*?100) ?????????????????*?@param??tradeNo?商戶系統內部的訂單號 ?????????????????*?@param?price?訂單總金額,只能為整數,單位:分(¥) ?????????????????*/ ????????????????function?execWxpay(tradeNo,?price,?desc)?{ ????????????????????????var?data?=?{ ????????????????????????????????tradeNo?:?tradeNo, ????????????????????????????????totalFee?:?price, ????????????????????????????????description?:?'支付訂單' ????????????????????????} ????????????????????????ajax.post('app/wxpay-order-info.action',?data,?function(data)?{ ????????????????????????????????if?(!extApi.isNullObj(data))?{ ????????????????????????????????????????var?wxPay?=?api.require('wxPay'); ????????????????????????????????????????wxPay.payOrder({ ????????????????????????????????????????????????apiKey?:?data.appid, ????????????????????????????????????????????????orderId?:?data.prepayid, ????????????????????????????????????????????????mchId?:?data.partnerid, ????????????????????????????????????????????????nonceStr?:?data.noncestr, ????????????????????????????????????????????????timeStamp?:?data.timestamp, ????????????????????????????????????????????????package?:?'Sign=WXPay', ????????????????????????????????????????????????sign?:?data.sign ????????????????????????????????????????},?function(ret,?err)?{ ????????????????????????????????????????????????if?(!ret.status)?{ ????????????????????????????????????????????????????????var?msg?=?getWxRetErrorCodeMsg(err.code); ????????????????????????????????????????????????????????extApi.alert(msg,?'支付結果'); ????????????????????????????????????????????????} ???????????????????????????????????????????????? ????????????????????????????????????????????????if?(ret.status)?{ ????????????????????????????????????????????????????????closePayWin(); ????????????????????????????????????????????????} ????????????????????????????????????????}); ????????????????????????????????} ????????????????????????}); ????????????????} ????????????????/** ?????????????????*?微信支付失敗時返回的錯誤碼 ?????????????????*?-2:用戶取消 ?????????????????*?-1:未知錯誤,可能的原因:簽名錯誤、未注冊APPID、項目設置APPID不正確、注冊的APPID與設置的不匹配、其他異常等 ?????????????????*?1:apiKey值非法 ?????????????????*/ ????????????????function?getWxRetErrorCodeMsg(code)?{ ????????????????????????switch(code)?{ ????????????????????????????????case?'-2': ????????????????????????????????????????return?'用戶取消'; ????????????????????????????????case?'1': ????????????????????????????????????????return?'apiKey值非法'; ????????????????????????????????default: ????????????????????????????????????????return?'未知錯誤'; ????????????????????????} ????????????????}

      正確提交支付后,微信返回的支付成功數據串,示例如下:

      【微信支付回調時的String參數】]]>]]>]]>]]>1

      特別注意:

      1)尤其是APP和微信公眾號都有接入的項目,一定要注意二者之間的差異。主要在賬號上,不能混用,否則支付會一直不成功。

      【JAVA版】微信支付方案一詳解

      2)在附件中,會攜帶主要的Java類方法。但可能還是會不全。

      以上內容,希望對您有用。

      附件: wxpay.zip 3.87KB 下載次數:1次

      Java 移動APP

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:期貨數據分析軟件(什么期貨分析軟件)
      下一篇:excel如何設置大寫金額加元整(excel金額小寫轉大寫加元整)
      相關文章
      亚洲色大成网站www永久| 亚洲视频手机在线| 国产AV旡码专区亚洲AV苍井空| 亚洲欧洲日产v特级毛片| 久久夜色精品国产噜噜亚洲AV| 亚洲AV无码一区二区三区系列| 国产亚洲av片在线观看播放| 亚洲精品无码永久在线观看你懂的| 国产日产亚洲系列| 亚洲色婷婷综合久久| 久久精品国产亚洲沈樵| 国产V亚洲V天堂无码| 亚洲VA成无码人在线观看天堂| 亚洲VA成无码人在线观看天堂| 亚洲第一福利网站| 久久精品亚洲中文字幕无码麻豆 | 亚洲AV成人片色在线观看高潮| 亚洲AV无码一区二区三区DV | 亚洲国产AV无码专区亚洲AV| 无码久久精品国产亚洲Av影片| 亚洲bt加勒比一区二区| 久久久久亚洲av无码专区导航| 亚洲第一网站免费视频| 色在线亚洲视频www| 亚洲精品宾馆在线精品酒店| 亚洲AV无码XXX麻豆艾秋| 亚洲精品乱码久久久久久蜜桃| 亚洲无人区一区二区三区| 亚洲av永久无码精品漫画 | 亚洲国产精品久久久久| 亚洲精品国产肉丝袜久久| 亚洲av无码一区二区三区观看| 亚洲中文字幕久久精品无码A| 亚洲av色香蕉一区二区三区蜜桃| 亚洲av区一区二区三| 亚洲乱色熟女一区二区三区丝袜 | 亚洲高清资源在线观看| 国产亚洲福利在线视频| 最新亚洲人成无码网站| 国外亚洲成AV人片在线观看| 亚洲AV日韩AV鸥美在线观看|