基本問題排除后,出問題最多的就是 利用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簽名方法
```sh
/// <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,按上面順序解決后終于看到了支付窗口!!!!
此文獻給還在深坑中的小伙伴們……
不說了,說多了都是淚……
這里抽出來的是net版本的,主要解決前期頁面支付問題,只是個基本的demo,沒有回調頁面。有園友也提出了demo中的不足,建議先跑通這個demo,然后在此基礎上補充不嚴謹的支付邏輯,畢竟是涉及到money的問題,畢竟也只是個demo,不能不思考就完全照般。
這里抽出來的是net版本的,主要解決前期頁面支付問題,只是個基本的demo,沒有回調頁面。有園友也提出了demo中的不足,建議先跑通這個demo,然后在此基礎上補充不嚴謹的支付邏輯,畢竟是涉及到money的問題,畢竟也只是個demo,不能不思考就完全照般。