業務需要一個在微信上能付款的功能,於是乎想到了最普遍的支付寶,坑爹的是T與A是水火不容啊,默默的還是接微信支付吧,沒想到從此掉進了連環坑……
網上寫微信支付接口的還是很多,PHP官方有(鄙視源碼作者,連參數對應都錯了,能跑通才怪),NET版 微信支付--入門篇 這篇算是比較全的,java版。
PHP的只能參考,終究還是先按NET版的還創建項目,不過文章里面也沒具體寫到如何前后台交互(偶用的MVC),對於初次接觸的人來說只能問題來一個解決一個。
至於怎么從0開發就不用詳細說明了,參考這位仁兄的 微信支付--入門篇 ,微信支付V2版網上也有Demo,但V3與V2相差太大,以此就新版V3 碰到的問題來說明解決方法。
基礎問題先排除:
-
- 確保 商戶功能 審核通過,會有官方郵件
- 支付授權目錄(注意看文檔,大小寫關系很大 點擊支付按鈕,提示“access_denied” 網上有很多關於此問題的解決)
- 點擊支付按鈕,提示“access_not_allow” 需要將測試人的微信帳號加入白名單
- 【在開發調試階段,測試鏈接需要在公眾號內點擊打開 白名單用戶在公眾號內向公眾號發一條消息,消息內容即為測試鏈接,然后點擊打開】文檔中寫得很清楚,但中招的人還是不計其數(偶也中了……)。
- 【參數大小寫敏感】md5 運算后,字符串的字符要轉換為大寫,注意是MD5運算模塊。
基本問題排除后,出問題最多的就是 利用JSAPI 支付,提示“該公眾號支付簽名無效,無法發起該筆交易”,此問題搞了2天多,網上到處搜索,不停的對比文檔,無耐欲哭無淚啊,“不要用wifi和用流量才不報錯”的答案都有(沒遇到過)
基於園友提出的另一個問題”測試目錄改為http://mall.xxx.com/后,網頁支付時直接提示get_brand_wcpay_request:fail_invalid appid 。使用了其他的目錄如http://store.xxx.com/ 也毫無問題。估計微信內部把含mall的支付都給屏蔽了。 “ 此問題還沒親自驗證,不過在微信中還是請不要用關於阿里有關的域名,否則都不知道怎么坑死的。
具體的問題與 坑人的微信新版支付(V3.3.6) 中說的一樣,能得到預支付 ID:prepay_id,但點擊支付就是一直 提示“該公眾號支付簽名無效,無法發起該筆交易”,又不能本地調試,只能發布后寫日志。
根據網上說的調整參數位置、沒辦法又看文檔,那問題出在哪呢?
簽名無效,說明出在第二次簽名,此次要將參數提交給前台用js來傳給微信來校驗,查看MD5操作,
prepay_id的獲得需傳參:
其中MD5簽名方法
/// <summary> /// 創建md5摘要,規則是:按參數名稱a-z排序,遇到空值的參數不參加簽名 /// </summary> /// <param name="key">參數名</param> /// <param name="value">參數值</param> /// key和value通常用於填充最后一組參數 /// <returns></returns> public virtual string CreateMd5Sign(string key, string value) { StringBuilder sb = new StringBuilder(); ArrayList akeys = new ArrayList(Parameters.Keys); akeys.Sort(); foreach (string k in akeys) { string v = (string)Parameters[k]; if (null != v && "".CompareTo(v) != 0 && "sign".CompareTo(k) != 0 && "key".CompareTo(k) != 0) { sb.Append(k + "=" + v + "&"); } } sb.Append(key + "=" + value); string sign = MD5Util.GetMD5(sb.ToString(), GetCharset()).ToUpper(); return sign; }
1.package改為prepay_id=u802345jgfjsdfgsdXXX 的格式(html頁也是此格式)
2.加入signType為MD5加密參數(有人說不加是不對的)
3.兩次MD5加密都要按文檔的方法 key要放在最后再加密
4.MD5加密對大小寫加密的結果是不一樣的,檢查 appId與appid、timeStamp與timestamp加密后是不一樣的,確保HTML與后台加密的參數一模一樣,是一模一樣哦!!(坑中坑,沒想到微信支付竟然對大小寫敏感到如此地步),注意第一次加密參數都是小寫
5.參數個數5個
6.body參數過長
7.加入openid
我們的問題大多出現在4,按上面順序解決后終於看到了支付窗口!!!!
此文獻給還在深坑中的小伙伴們……
不說了,說多了都是淚……
之前微支付已經集成到項目中一直沒時間抽出,現在需要的留下郵箱,java的單獨說明下,點下推薦。
鑒於沒時間看郵件急於想要的可自行掃文尾的二維碼進入微信公眾號【一個碼農的日常】,回復 net支付 或 java支付 或 php支付
或加入 新建2號QQ群:340250479 (1號群: 437802986 已滿)在文件里面有源碼地址(等群主有時間會通過)。
這里抽出來的是net版本的,主要解決前期頁面支付問題,只是個基本的demo,沒有回調頁面。有園友也提出了demo中的不足,建議先跑通這個demo,然后在此基礎上補充不嚴謹的支付邏輯,畢竟是涉及到money的問題,畢竟也只是個demo,不能不思考就完全照般。
微信現在開放了最新的JS-SDK, 有園友指出現在的demo上用js-sdk會沖突,建議先不用js-sdk,能運行后,可將全部js都照JS-SDK的支付方法更改。微信JS-SDK說明文檔。哥也只能幫你到這了……
=============================================================
爭對於園友新手調通支付后回調頁面問題特此又寫了一篇 到處都是坑的微信支付V3之 微信支付回調頁面 以供參考。
最近將NET版的回調頁也加入了源碼。
其它干貨下載資源已放入公眾號【一個碼農的日常】微信號:icodertime