很多用户在调用微信支付扫码支付沙箱环境都一脸迷茫,废话不多说,遇到很多坑,为了让大家少走弯路下面直接说说我开发微信支付遇到坑,微信沙箱不是一般的坑,是很大的坑。

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,签名验证错误

 

 

版权声明:本文为zhaojingwei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhaojingwei/p/11262101.html