PC网站微信扫码支付
PC網(wǎng)站微信掃碼支付(v3) Native支付對(duì)接流程以及注意事項(xiàng)
一.需要的參數(shù)
(1)獲取商戶號(hào)(mchID)
微信商戶平臺(tái): https://pay.weixin.qq.com/
場(chǎng)景:Native支付
步驟:提交資料 =>簽署協(xié)議 => 獲取商戶號(hào)
(2)獲取APPID
微信公眾平臺(tái): https://mp.weixin.qq.com/
步驟:注冊(cè)服務(wù)號(hào)=>服務(wù)號(hào)認(rèn)證 =>獲取APPID => 綁定商戶號(hào)(商戶產(chǎn)品中心的APPID賬號(hào)管理中把APPID配置進(jìn)去)
(3)獲取APIv3秘鑰(v3key)
APIv3版本的接口需要此秘鑰
步驟:登錄商戶平臺(tái)=>選擇賬戶中心=>安全中心=>AP安全=>設(shè)置APIV3密鑰隨機(jī)感碼生成工具: https://suijimimashengcheng.bmcx.com/
(4)申請(qǐng)商戶API證書(可通過代碼拉取證書,需要拿到證書序列號(hào),和私鑰文件)
APIv3版本的所有接口都需要,步驟:登錄商戶平臺(tái)=>選擇賬戶中心=>安全中心=>API安全=>申請(qǐng)API證書
=>證書管理=>申請(qǐng)新證書=>下載證書工具
代碼獲取證書需要:證書序列號(hào)(mch_serial_no)
如何查看證書序列號(hào)?
登錄商戶平臺(tái):API安全]=>API證書 =>查看證書,可查看商戶API證書序列號(hào)。
私鑰文件是下載證書pem結(jié)尾的文件,如下:
可以把此文件放到支付項(xiàng)目的resources文件下,用以下方式讀取:
/*** 獲取商戶的私鑰文件* @param filename* @return*/ private PrivateKey getPrivateKey(String filename){try {return PemUtil.loadPrivateKey(new FileInputStream(filename));} catch (FileNotFoundException e) {throw new RuntimeException("私鑰文件不存在", e);} }也可以放在服務(wù)器,定義privateKeyPath變量參數(shù),用一下方式讀取:
/*** 獲取商戶的私鑰文件*/ public PrivateKey getPrivateKey() {try {URL url=new URL(privateKeyPath);URLConnection connection=url.openConnection();InputStream stream=connection.getInputStream();return PemUtil.loadPrivateKey(stream);} catch (Exception e) {throw new RuntimeException("私鑰文件不存在", e);} }(5)微信服務(wù)器IP
"wxIp":"https://api.mch.weixin.qq.com"(6)回調(diào)路徑:回調(diào)路徑不需要在開放平臺(tái)配置,如果項(xiàng)目有網(wǎng)關(guān),只需在網(wǎng)關(guān)開放回調(diào)接口
例如: "notify":"http://gateway.jkcgy.com/payment/v1/wxpay/native/notify"
http://gateway.jkcgy.com:就是你網(wǎng)關(guān)訪問地址
payment/v1/wxpay/native/notify:就是你的回調(diào)接口路徑
可以在瀏覽器進(jìn)行測(cè)試,如果出現(xiàn)如下:則回調(diào)路徑開放成功。
二.可參考資料
JAVA對(duì)接Demo:https://github.com/LXT2017/JavaLearnProject ,可以拉到本地參考
對(duì)接中遇到問題可以在微信開放社區(qū)進(jìn)行搜索,社區(qū)地址:https://developers.weixin.qq.com/community/pay/article
三.配置參數(shù)存入數(shù)據(jù)庫
因?yàn)橹Ц秴?shù)對(duì)安全要求高,所以一般在開發(fā)中不以配置文件的形式存放支付參數(shù),需要把支付參數(shù)存放到數(shù)據(jù)庫。
可以把所有的參數(shù)配置成一個(gè)json字段,如下:
json字段格式:
{"mchID":"xxxxx","appID":"xxxxxxx","mch-serial-no":"xxxxxx","wxIp":"https://api.mch.weixin.qq.com","privateKeyPath":"https://服務(wù)器地址/apiclient_key.pem在服務(wù)器的地址","v3key":"xxxxxxx","notify":"xxxxxxx","notify_test":"xxxxx","notify_prod":"xxxxxxx" }在數(shù)據(jù)庫配置好參數(shù)后,可以在代碼中配置一個(gè)WxPayConfig的配置類,用來讀取數(shù)據(jù)庫參數(shù)。
讀取數(shù)據(jù)庫參數(shù)可以通過實(shí)現(xiàn):InitializingBean,重寫afterPropertiesSet(),InitializingBean接口為bean提供了屬性初始化后的處理方法,它只有一個(gè)afterPropertiesSet方法,
凡是繼承該接口的類,在bean的屬性初始化后都會(huì)執(zhí)行該方法。從而配置全局可引用的參數(shù)。
完整WxPayConfig配置,包含拉取證書,跳過驗(yàn)簽的一些配置:
四.對(duì)接注意事項(xiàng)
一.回調(diào)問題
回調(diào)通知:
?同樣的通知可能會(huì)多次發(fā)送給商戶系統(tǒng),商戶系統(tǒng)必須能夠正確處理重復(fù)的通知
確保回調(diào)URL是外部可正常訪問的,且不能攜帶后綴參數(shù)。
回調(diào)通知重復(fù)問題:
重復(fù)通知的時(shí)候,微信的請(qǐng)求id是一樣的,用這個(gè)做請(qǐng)求冪等性處理響應(yīng)給微信的內(nèi)容不規(guī)范 或者 超過5秒沒響應(yīng)。
并發(fā)下重復(fù)通知問題:
可以通過可重入鎖 ReentrantLock的tryLock()解決
測(cè)試的問題:
如果有多個(gè)未響應(yīng)的,則測(cè)試的請(qǐng)求id,可能有之前的請(qǐng)求繼續(xù)回調(diào)過來 .
二.金額轉(zhuǎn)換問題
微信支付的金額單位是分,必須轉(zhuǎn)換為Int類型
Integer totalfree = order.getTotalAmount().multiply(new BigDecimal(100)).stripTrailingZeros().intValue();三.退款原因問題
微信退款原因官方規(guī)定不能超過80個(gè)字,可以做一個(gè)截取。
五.核心流程
第一步 獲取報(bào)文
第二步 驗(yàn)證簽名(確保是微信傳輸過來的)
第三步 解密(AES對(duì)稱解密出原始數(shù)據(jù))
第四步 處理業(yè)務(wù)邏輯
第五步 響應(yīng)請(qǐng)求
總結(jié)
以上是生活随笔為你收集整理的PC网站微信扫码支付的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORCIS-6238
- 下一篇: python编写一个将十进制转换为二进制