很多使用者在呼叫微信支付掃碼支付沙箱環境都一臉迷茫,廢話不多說,遇到很多坑,為了讓大家少走彎路下面直接說說我開發微信支付遇到坑,微信沙箱不是一般的坑,是很大的坑。
1.首先下載的官方demo,不能直接用,裡面引數少,引數少啊,需要按照官方的api文件,對照必傳引數。
2.微信支付不同於其他支付,沙箱環境利用的是正式賬號,其signkey也是根據正式key獲取到的,沙箱只支援MD5加密,然後獲取後呼叫介面時候需要替換正式key。
微信支付驗收階段可以用沙盒測試支付流程
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_1
步驟如下
1.正式請求地址修改,增加/sandboxnew/
2.按正式流程做sign
3.用正式sign,額外呼叫 https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey 獲得sandbox_signkey
4.用sandbox_signkey 替換使用者自己的key,再做sign簽名
5.用第二次生成的sign來掉起支付
6.發起支付的瞬間就會有回掉通知
/// <summary> /// 獲取沙箱簽名金鑰。 /// </summary> /// <returns></returns> public static string GetSignKey() { string nonceStr = WxPayApi.GenerateNonceStr(); WxPayData signParam = new WxPayData(); signParam.SetValue("mch_id", WxPayConfig.GetConfig().GetMchID()); signParam.SetValue("nonce_str", nonceStr); signParam.SetValue("sign", signParam.MakeSign()); string xml = signParam.ToXml(); string url = "https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey"; string response = HttpService.Post(xml, url, false, 10); Log.Debug("WxPayApi", "GetSignKey response : " + response); WxPayData result = new WxPayData(); SortedDictionary<string, object> items = result.FromXml(response); object signKey; if (items.TryGetValue("sandbox_signkey", out signKey)) { return signKey.ToString(); } else if (items.TryGetValue("return_msg", out signKey)) { throw new WxPayException(signKey.ToString()); } else throw new WxPayException("獲取沙箱金鑰失敗!"); }
也可以利用POSTMAN獲取,獲取到的測試key並非長期有效,有三天有效期
3.重要的事情說三遍
微信支付沙箱環境不用掃碼,不用掃碼,不用掃碼,掃了白掃,掃完你會一臉懵逼,模式一二維碼一直提示原生支付URL引數錯誤,模式二掃碼的時候提示碼已經過期,請重新生成。沙箱環境是直接出現二維碼後5秒後需要呼叫自動下單介面,然後再 呼叫查詢訂單介面。他不是真實支付所以不需要用微信掃碼。
4.還有一點需要注意的地方需要關注微信支付商戶接入驗收助手,按照驗收指引操作,裡面有測試用例,其支付金額不是隨意,必須按照測試用例金額測試。
5.找到Data.cs檔案,圖中圈中的地方,註釋掉
6還有圖中圈中的地方,需要增加ToUpper(),如果不加我除錯的程式碼出來是小寫獲取的簽名是大學,造成不等返回false,簽名驗證錯誤