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

http://www.cnblogs.com/zskbll/p/wxpay.htmlhtml

研究微信開發一年多了,每一個新接口,都會第一時間進行研究。微信支付開放好久,一直沒機會接觸到支付接口,等了很久終於從朋友那兒搞到了接口,今後開始了我兩天多的支付接口的研究。ajax

 

拿到這個接口文檔的第一個想法就是這也沒什麼難的嘛, 和支付寶、財付通、網銀在線等一些傳統接口的思路邏輯都是同樣的,以爲差很少最多一個下午就能夠搞定,結果第一步調用統一支付接口就給來了個下馬威,無論怎麼改,就一直返回簽名錯誤。第一次遇到簽名錯誤,首先想到的是應該是沒有正確理解簽名的生成規則,又從頭看了幾回簽名的生成規則,每次都是的理解都是同樣的,試了改幾回仍是不行。 這一次已經開始懷疑騰訊的文檔寫的有問題,一邊找其餘資料一邊在內心罵騰訊寫文檔的做者。在園子裏看到了處處都是坑的微信支付V3後,更加確認是微信的文檔的問題。如今想一想當時的想法太幼稚了,大部分自信心爆棚的人,在遇到解決不了的問題時老是會懷疑是否是別人給的東西不對,而不會從自身找問題,一句話總結就是一到便祕就怪地球沒引力。(各位看官請勿對號入座,純屬我的看法,勿噴)。api

如今說正題。。安全

從開始遇到錯誤到最後解決簽名的問題,總結的問題就是我在生成簽名的時候把參數進行了編碼,而官方給的開發文檔並無說要作url編碼,另一個就是我進入了一個死衚衕,總以爲本身的理解與實現過程沒有問題,但最後當我把以前寫的代碼徹底放棄,推倒重作後,問題終於解決。興奮之極。下面從頭說下個人理解與解決方法。微信

官方文檔中接口調用規則:微信開發

�  認證方式:HTTPS 認證,退款和衝正接口調用須要商戶證書(證書在審覈郵件附件app

中)post

�  請求採用 POST 方式微信支付

�  提交和返回結果採用 XML 格式編碼

�  字符集默認使用 UTF-8,請勿使用其它字符集

�  商戶與微信之間的交互(特別是 Native 回調和支付通知回調),都須要驗證簽名

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

 

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

a.對全部傳入參數按照字段名的 ASCII 碼從小到大排序(字典序)後,使用 URL 鍵值對的格式(即 key1=value1&key2=value2…)拼接成字符串 string1,注意:值爲空的參數不參與簽名

b. 在 string1 最 後 拼 接 上 key=Key( 商 戶 支 付 密 鑰 ) 得 到 stringSignTemp 字 符 串 , 並 對 stringSignTemp 進行 md5 運算,再將獲得的字符串全部字符 轉換爲大寫,獲得 sign 值

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

1,全部的參數都是小寫的

2,參數的值不須要作任何處理,包括url編碼

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

下面是示範過程:

要傳入的參數分別爲:appid,mch_id,nonce_str,body,attach,out_trade_no,total_fee,spbill_create_ip,notify_url,trade_type,openid(jsapi必須) ,product_id(native必須)。

首先將鍵值對存入 Dictionary<string,string>中,其次根據key值升序排序,代碼以下:    var dictemp = dic.OrderBy(d => d.Key);

而後將鍵值對轉換成url形式後,在末尾連接上key值,例如:appid=****&attach=****…………&key=******,最後進行md5加密並將加密後的字符串轉換成大寫。這裏須要特別注意的是,md5加密是須要將字符集轉換成utf-8,不然中文商品描述會出現亂碼。

  md5加密

 

生成簽名後將sign=簽名  鍵值對添加到生成簽名時生成的dictemp中,而後將dictemp轉換成xml,post到https://api.mch.weixin.qq.com/pay/unifiedorder,返回值也是xml,最後對xml進行解析,爲了保證安全性,需將解析後的鍵值對進行簽名校驗。

  正確的xml

校驗簽名無誤後,下一步就是取出預支付id prepay_id,而後調用微信支付js,注意:調用微信支付js以前也須要將全部參與調用的參數進行簽名,且這裏的參與簽名的參數須要驗證遵照大小寫(騰訊有的時候真的很腦殘,一會全小寫,一會有大寫有小寫)。生成簽名後就能夠調用微信支付js了,代碼以下:

  微信支付js

爲了方便調用,我將微信支付js寫到了一個單獨的js文件,而後在頁面中載入,生成簽名用ajax調用。調用代碼以下:

  支付js調用

這裏我只傳入了一些和商品相關的參數,其餘和商品沒法的參數寫到了後臺代碼中。後臺收到請求後,將appid,mch_id等參數拼接成鍵值對進行進一步的處理,而後將處理後的結果返回給前臺。

 

  獲取js支付參數

下面是生成鍵值對的方法,因爲請求支付的過程當中,處處須要生成簽名,因此我將各個請求參數都寫成了一個個類,而後使用泛型類和反射動態生成字典鍵值對,請求url和xml。代碼以下:

  生成鍵值對,url,xml

  到這裏應該就能夠知足jsapi的需求了, 後期會將native和其餘接口分享給你們。

 

 

 

 

若是你以爲本文對你有幫助,請大方的掃下面的二維碼懸賞一下吧。

新建了個微信支付及微信開發的QQ羣,歡迎你們加入一塊兒交流微信開發技術。C#微信開發交流

相關文章
相關標籤/搜索