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