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

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

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

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

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

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

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

      下面这些是我的部分代码,麻烦大神帮忙看下
                #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);

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

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

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