日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PC网站微信扫码支付

發布時間:2024/3/26 编程问答 152 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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配置,包含拉取證書,跳過驗簽的一些配置:

@Configuration @Data @Slf4j public class WxPayConfig implements InitializingBean {@Resourceprivate WxPaymentCfgMapper wxPaymentCfgMapper;// 商戶號private String mchId;// 商戶API證書序列號private String mchSerialNo;// 商戶私鑰文件private String privateKeyPath;// APIv3密鑰private String apiV3Key;// APPIDprivate String appid;// 微信服務器地址private String domain;// 接收結果通知地址private String notifyDomain;/*** 獲取商戶的私鑰文件* @param* @return*/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);}}/*** 獲取簽名驗證器* @return*/@Beanpublic ScheduledUpdateCertificatesVerifier getVerifier(){log.info("獲取簽名驗證器");//獲取商戶私鑰PrivateKey privateKey = getPrivateKey();//私鑰簽名對象PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, privateKey);//身份認證對象WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, privateKeySigner);// 使用定時更新的簽名驗證器,不需要傳入證書ScheduledUpdateCertificatesVerifier verifier = new ScheduledUpdateCertificatesVerifier(wechatPay2Credentials,apiV3Key.getBytes(StandardCharsets.UTF_8));return verifier;}/*** 獲取HttpClient,無需進行應答簽名驗證,跳過驗簽的流程*/@Bean(name = "wxPayNoSignClient")public CloseableHttpClient getWxPayNoSignClient(ScheduledUpdateCertificatesVerifier verifier){//獲取商戶私鑰PrivateKey privateKey = getPrivateKey();//用于構造HttpClientWechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()//設置商戶信息.withMerchant(mchId, mchSerialNo, privateKey)//無需進行簽名驗證、通過withValidator((response) -> true)實現.withValidator((response) -> true);// 通過WechatPayHttpClientBuilder構造的HttpClient,會自動的處理簽名和驗簽,并進行證書自動更新CloseableHttpClient httpClient = builder.build();log.info("== getWxPayNoSignClient END ==");return httpClient;}@Overridepublic void afterPropertiesSet(){WxPaymentCfg wxPayment = wxPaymentCfgMapper.selectById(1);String json = wxPayment.getJson();WxPaymentCfgDto wxPayments = JSONObject.parseObject(json, WxPaymentCfgDto.class);this.setMchId(wxPayments.getMchId());this.setAppid(wxPayments.getAppId());this.setPrivateKeyPath(wxPayments.getPrivateKeyPath());this.setApiV3Key(wxPayments.getV3key());this.setDomain(wxPayments.getWxIp());this.setNotifyDomain(wxPayments.getNotify());this.setMchSerialNo(wxPayments.getMchSerialNo());} }

四.對接注意事項

一.回調問題

回調通知:

?同樣的通知可能會多次發送給商戶系統,商戶系統必須能夠正確處理重復的通知

確?;卣{URL是外部可正常訪問的,且不能攜帶后綴參數。

回調通知重復問題:

重復通知的時候,微信的請求id是一樣的,用這個做請求冪等性處理響應給微信的內容不規范 或者 超過5秒沒響應。

并發下重復通知問題:
可以通過可重入鎖 ReentrantLock的tryLock()解決

private final ReentrantLock lock = new ReentrantLock();/**在對業務數據進行狀態檢查和處理之前,要采用數據鎖進行并發控制,以避免函數重入造成的數據混亂**///嘗試獲取鎖:成功獲取則立即返回true,獲取失敗則立即返回false。不會一直等待鎖的釋放if (lock.tryLock())

測試的問題:

如果有多個未響應的,則測試的請求id,可能有之前的請求繼續回調過來 .

二.金額轉換問題

微信支付的金額單位是分,必須轉換為Int類型

Integer totalfree = order.getTotalAmount().multiply(new BigDecimal(100)).stripTrailingZeros().intValue();
三.退款原因問題

微信退款原因官方規定不能超過80個字,可以做一個截取。

五.核心流程

第一步 獲取報文

第二步 驗證簽名(確保是微信傳輸過來的)

第三步 解密(AES對稱解密出原始數據)

第四步 處理業務邏輯

第五步 響應請求

總結

以上是生活随笔為你收集整理的PC网站微信扫码支付的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。