很多用户在调用微信支付扫码支付沙箱环境都一脸迷茫,废话不多说,遇到很多坑,为了让大家少走弯路下面直接说说我开发微信支付遇到坑,微信沙箱不是一般的坑,是很大的坑。
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());}elsethrow new WxPayException("获取沙箱密钥失败!");}
也可以利用POSTMAN获取,获取到的测试key并非长期有效,有三天有效期
3.重要的事情说三遍
微信支付沙箱环境不用扫码,不用扫码,不用扫码,扫了白扫,扫完你会一脸懵逼,模式一二维码一直提示原生支付URL参数错误,模式二扫码的时候提示码已经过期,请重新生成。沙箱环境是直接出现二维码后5秒后需要调用自动下单接口,然后再 调用查询订单接口。他不是真实支付所以不需要用微信扫码。
4.还有一点需要注意的地方需要关注微信支付商户接入验收助手,按照验收指引操作,里面有测试用例,其支付金额不是随意,必须按照测试用例金额测试。
5.找到Data.cs文件,图中圈中的地方,注释掉
6还有图中圈中的地方,需要增加ToUpper(),如果不加我调试的代码出来是小写获取的签名是大学,造成不等返回false,签名验证错误