很多用户在调用微信支付扫码支付沙箱环境都一脸迷茫,废话不多说,遇到很多坑,为了让大家少走弯路下面直接说说我开发微信支付遇到坑,微信沙箱不是一般的坑,是很大的坑。
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,签名验证错误