asp.net微信支付,有时候可以成功支付,有时候却会报调用支付JSAPI缺少参数package

新手上路,请多包涵

asp.net微信支付,有时候可以成功支付,有时候却会报调用支付JSAPI缺少参数package,有大神知道为啥吗?

参数什么的都没传错,appid,server,商户号,地址这些都是对的,但是还是报错,希望大神来拯救一下我

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

        private void GetUserOpenId()
        {
            string code = Request.QueryString["code"];
            if (string.IsNullOrEmpty(code))
            {
                string code_url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_userinfo&state=lk#wechat_redirect", "wx97199c27223d23df", "http%3A%2F%2Fhnsthm.cn%2FWap%2Fwxpay%2FUser_WeCha.aspx");
                Response.Redirect(code_url);
            }
            else
            {

                LogUtil.WriteLog(" ============ 开始 获取微信用户相关信息 =====================");

                #region 获取支付用户 OpenID================
                string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", PayConfig.AppId, PayConfig.AppSecret, code);
                string returnStr = HttpUtil.Send("", url);
                LogUtil.WriteLog("Send 页面  returnStr 第一个:" + returnStr);

                var obj = JsonConvert.DeserializeObject<OpenModel>(returnStr);
                /****************************************/

                /****************************************/
                url = string.Format("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1}", PayConfig.AppId, obj.refresh_token);
                returnStr = HttpUtil.Send("", url);
                obj = JsonConvert.DeserializeObject<OpenModel>(returnStr);

                LogUtil.WriteLog("Send 页面  access_token:" + obj.access_token);
                LogUtil.WriteLog("Send 页面  openid=" + obj.openid);

                /****************************************/

                /****************************************/
                url = string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}", obj.access_token, obj.openid);
                returnStr = HttpUtil.Send("", url);
                LogUtil.WriteLog("Send 页面  returnStr:" + returnStr);

                //this.UserOpenId = obj.openid;

                LogUtil.WriteLog(" ============ 结束 获取微信用户相关信息 =====================");

                /****************************************/


                /****************************************/

                /************************************结束 获取微信用户相关信息******************************************/
                LogUtil.WriteLog("============ 单次支付开始 ===============");
                PayModel model = new PayModel();
                model.OrderSN = txtOrderSN.Text;
            /*model.TotalFee = int.Parse(rbtlPay.SelectedValue);*/
            model.TotalFee = Convert.ToInt32(0.01);

            //if (rbtlPay.SelectedValue == "0")
            //{
            //    model.TotalFee = Convert.ToInt32(Send.Text);
            //}
            model.Body = txtBody.Text;
                model.OpenId = obj.openid;
                model.Attach = "test";

                string OrderSN = model.OrderSN;
                string Body = model.Body;
                int aa = model.TotalFee * 100;
                string TotalFee = aa.ToString();
                string Attach = model.Attach;
                string UserOpenId = obj.openid;

                LogUtil.WriteLog(string.Format("传递支付参数:OrderSN={0}、Body={1}、TotalFee={2}、Attach={3}、UserOpenId={4}",
               //this.OrderSN, this.Body, this.TotalFee, this.Attach, this.UserOpenId));
               OrderSN, Body, TotalFee, Attach, UserOpenId));

                #endregion

                #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

            /*H5调起微信支付的内置JS*/

            #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);

            LogUtil.WriteLog("WeiPay 页面  paySign:" + PaySign);
            #endregion

            #endregion
            }

你期待的结果是什么?实际看到的错误信息又是什么?

阅读 8.5k
1 个回答

首先

package这个参数发送统一下单Api请求后,微信回传回后端,后端再传给前端支付。

然后

1、前端拿到的值应该是prepay_id,用来组装package
2、组装后的数据'prepay_id=xxxxxxxxx' 这个数据才是package的字符串内容。
3、去后端签名
所以,这个错误应该是前端抛出才对,那么你需要做日志检查,问题应该来自后端你的数据取值方式。

你的代码

奇怪的是,为什么用下标来找相应参数,应该转为强类型映射值啊。
你这么做,如果微信官方参数顺序变了呢?
先后台测试能不能拿到package这个值吧
clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进