坑爹的微信支付v3,其實沒有那麼坑

2021-09-06 19:57:22 字數 1268 閱讀 7521

現在說正題。。

從開始遇到錯誤到最後解決簽名的問題,總結的問題就是我在生成簽名的時候把引數進行了編碼,而官方給的開發文件並沒有說要做url編碼,另外乙個就是我進入了乙個死胡同,總覺得自己的理解與實現過程沒有問題,但最後當我把之前寫的**完全放棄,推倒重做後,問題終於解決。興奮之極。下面從頭說下我的理解與解決方法。

官方文件中介面呼叫規則:

�  認證方式:https 認證,退款和沖正介面呼叫需要商戶證書(證書在審核郵件附件

中)�  請求採用 post 方式

�  提交和返回結果採用 xml 格式

�  字符集預設使用 utf-8,請勿使用其它字符集

�  處理返回時先判斷協議返回錯誤碼,再判斷業務返回錯誤碼,最後判斷交易狀態

下面是官方的簽名生成方法

a.對所有傳入引數按照欄位名的 ascii 碼從小到大排序(字典序)後,使用 url 鍵值對的格式(即 key1=value1&key2=value2…)拼接成字串 string1,注意:值為空的引數不參與簽名

b. 在 string1 最 後 拼 接 上 key=key( 商 戶 支 付 密 鑰 ) 得 到 stringsigntemp 字 符 串 , 並 對 stringsigntemp 進行 md5 運算,再將得到的字串所有字元轉換為大寫,得到 sign 值

下面是我所理解的簽名生成規則:

1,所有的引數都是小寫的

2,引數的值不需要做任何處理,包括url編碼

3,確保必須的引數不能為空,且是正確無誤的。

下面是示範過程:

首先將鍵值對存入 dictionary中,其次根據key值公升序排序,**如下:    var dictemp = dic.orderby(d => d.key);

生成簽名後將sign=簽名  鍵值對新增到生成簽名時生成的dictemp中,然後將dictemp轉換成xml,post到返回值也是xml,最後對xml進行解析,為了保證安全性,需將解析後的鍵值對進行簽名校驗。

下面是生成鍵值對的方法,由於請求支付的過程中,到處需要生成簽名,所以我將各個請求引數都寫成了乙個個類,然後使用泛型類和反射動態生成字典鍵值對,請求url和xml。**如下:

到這裡應該就可以滿足jsapi的需求了, 後期會將native和其他介面分享給大家。

ios微信支付 v3

v2版本和v3版本存在很大的差異。在v3中你獲得不到v2所謂的 paysignkey 這個把我害殘了。當然在v3你真的不需要這個引數了。annotation id annotation 這個方法,等下要用到。不得不承認這個文件有點渣。但大體步驟還是ok的。6.用統一下單的api生成預支付單,獲取pr...

微信支付 退款 v3版微信支付

證書 apiclient cert.p12。jar包 commons codec 1.6.jar commons logging 1.1.3.jar fluent hc 4.3.4.jar httpclient 4.3.4.jar httpclient cache 4.3.4.jar httpcor...

jsapi微信支付v3版

v2還是 v3。在這裡整理的是 v3的,v2的同學請忽略!前期準備須要用的是商戶證書,用的是 p12的。設定 api金鑰 jsapi 授權資料夾 1.openid 授權完 你的 url response type code scope snsapi userinfo state 1 wechat r...