公众号微信支付有时候可以顺利支付成功,有时候会报错

公众号微信支付有时候可以顺利支付成功,有时候会报调用支付jsapi缺少参数:package的错,有时候会报支付验证签名失败的错。为了 这个问题,烦恼了一个星期,百度了各种方法试都没办法解决,APPID,Openid这些参数都没传错,但是不知道为什么有时候会支付成功,有时候会报错,这一点真的百思不得其解,希望有做过微信支付的高人来帮忙指点下迷津!!!!

9个回答

微信支付报签名错误一般都是参数错误,一般确认以下几点就可以了:
1,请求参数没有做进行去除空格处理。所以加签报文里面存在空格
2,加签参数格式编码不对,可以对加签报文写入日志进行确认看是否有乱码的字符。
3. 请求接口所需的必传字段没有传。
4. 请求参数的值没有进行空值判断。
根据你的描述,支付的有时成功有时失败,而且报签名失败 和参数缺少,其实应该就是所传参数有时候有值有时候没有值所导致的。
这个你可以把请求参数和加签报文字串记录到 日志文件里面查看,这样等你再次报错的时候就能定位问题所在了。

qq_41485414
何处锦绣不灰堆 回复weixin_41325924: 为什么code每次都要重新获取呢,你不可以直接放到本地缓存中吗?sessiponStorge就可以啊
9 个月之前 回复
weixin_41325924
weixin_41325924 最后发现是自己代码的逻辑问题,谢谢这么详细的解答
大约一年之前 回复
wildss
wildss 回复weixin_41325924: code只能使用一次的,使用后变失效了,所以你需要调整逻辑,必须重新换取code之后再提交
大约一年之前 回复
weixin_41325924
weixin_41325924 看了一下日志,报的是errcode":40163,"errmsg":"code been used的错,百度了一下,发现是多次访问code的原因,我做的功能是一个充值的功能,如果用户取消支付,返回的话就会重新生成一个code,这时code就重复了,这样纸应该怎么解决呀
大约一年之前 回复

同意 @SmallYard 的说法,补充一下建议
1.在调统一支付接口之前把所有参数全部记录到日志,一旦支付失败查看对应的参数是否齐全,参数数值是否包含乱码等特殊字符,这种也会导致非预期的签名失败。
2.核查一下openid是否每次都能正常获取,如果是接口获取的,确保每次接口都能成功获取到openid
3.每一次成功调用统计下单接口后,商家订单号都是有唯一限制的,如果你重复调用统一下单接口,商家订单号不变,但是其他任何参数有变动,都会导致调用失败的,因为微信已经有下单记录,而你二次提交的数据已经篡改。

1、网络问题
2、参数问题
我觉得可能还是某些参数的问题

仔细检查一下代码,debug调式看看,有可能是逻辑上得错误

weixin_41325924
weixin_41325924 微信支付不在本地,怎么debug
大约一年之前 回复

缺少参数:package这个错应该是缺少了Js文件,请仔细排查一下;
至于支付验证签名失败,你看是不是这个原因:
最新微信支付提供的SDK代码中,统一下单接口sign_type是置为 HMAC-SHA256 而不是使用默认的 MD5,而公众号内发起支付的签名只能使用 MD5,正是这种不一致导致了签名验证错误,将统一下单的签名类型改成MD5即可。

weixin_41325924
weixin_41325924 下面是我的代码,麻烦大神看一下哪里有可能报错了
大约一年之前 回复
weixin_41325924
weixin_41325924 js文件我引用了两个,麻烦看一下对不对可以吗: <script src="/skin/js/jquery.js" type="text/javascript"></script> <script src="/skin/js/lazyloadv3.js" type="text/javascript"></script>
大约一年之前 回复

我想到的是两种:一种是网络问题;一种的订单异常了吧,可能订单已经支付过了,状态有问题,再去支付的话肯定会报错了。

weixin_41325924
weixin_41325924 但是如果我是要做充值的功能,用户取消支付,再重新支付怎么破
大约一年之前 回复
      下面这些是我的部分代码,麻烦大神帮忙看下
                #region 支付操作============================


                #region 基本参数===========================
                //时间戳 
                TimeStamp = TenpayUtil.getTimestamp();
                //随机字符串 
                NonceStr = TenpayUtil.getNoncestr();

                //创建支付应答对象
                var packageReqHandler = new RequestHandler(Context);
                //初始化
                packageReqHandler.init();

                //设置package订单参数  具体参数列表请参考官方pdf文档,请勿随意设置
                packageReqHandler.setParameter("body", Body); //商品信息 127字符
                packageReqHandler.setParameter("appid", PayConfig.AppId);
                packageReqHandler.setParameter("mch_id", PayConfig.MchId);
                packageReqHandler.setParameter("nonce_str", NonceStr.ToLower());
                packageReqHandler.setParameter("notify_url", PayConfig.NotifyUrl);/******************设置*********************************/
                packageReqHandler.setParameter("openid", UserOpenId);
                packageReqHandler.setParameter("out_trade_no", OrderSN); //商家订单号
                packageReqHandler.setParameter("spbill_create_ip", Page.Request.UserHostAddress); //用户的公网ip,不是商户服务器IP
                packageReqHandler.setParameter("total_fee", TotalFee.ToString()); //商品金额,以分为单位(money * 100).ToString()
                packageReqHandler.setParameter("trade_type", "JSAPI");
                if (!string.IsNullOrEmpty(Attach))
                    packageReqHandler.setParameter("attach", Attach);//自定义参数 127字符


                #endregion


                #region sign===============================
                Sign = packageReqHandler.CreateMd5Sign("key", PayConfig.AppKey);/******************设置*********************************/
                LogUtil.WriteLog("WeiPay 页面  sign:" + Sign);
                #endregion

                #region 获取package包======================
                packageReqHandler.setParameter("sign", Sign);

                string data = packageReqHandler.parseXML();
                LogUtil.WriteLog("WeiPay 页面  package(XML):" + data);

                string prepayXml = HttpUtil.Send(data, "https://api.mch.weixin.qq.com/pay/unifiedorder");
                LogUtil.WriteLog("WeiPay 页面  package(Back_XML):" + prepayXml);

                //获取预支付ID
                var xdoc = new XmlDocument();
                xdoc.LoadXml(prepayXml);
                XmlNode xn = xdoc.SelectSingleNode("xml");
                XmlNodeList xnl = xn.ChildNodes;
                if (xnl.Count > 7)
                {
                    PrepayId = xnl[7].InnerText;
                    Package = string.Format("prepay_id={0}", PrepayId);
                    LogUtil.WriteLog("WeiPay 页面  package:" + Package);
                }
                #endregion

                #region 设置支付参数 输出页面  该部分参数请勿随意修改 ==============
                var paySignReqHandler = new RequestHandler(Context);
                paySignReqHandler.setParameter("appId", PayConfig.AppId);
                paySignReqHandler.setParameter("timeStamp", TimeStamp);
                paySignReqHandler.setParameter("nonceStr", NonceStr);
                paySignReqHandler.setParameter("package", Package);
                paySignReqHandler.setParameter("signType", "MD5");
                PaySign = paySignReqHandler.CreateMd5Sign("key", PayConfig.AppKey);

我想到的是两种:一种是网络问题;一种的订单异常了吧,可能订单已经支付过了

我也遇到了偶尔成功,偶尔失败的问题。签名验证也一直是通过的,找了好几天原因然后发现微信支付没有配置js安全域名

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!