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
}
首先
package
这个参数发送统一下单
Api请求后,微信回传回后端,后端再传给前端支付。然后
1、前端拿到的值应该是
prepay_id
,用来组装package
,2、组装后的数据
'prepay_id=xxxxxxxxx'
这个数据才是package的字符串内容。3、去后端
签名
。所以,这个错误应该是
前端
抛出才对,那么你需要做日志检查,问题应该来自后端你的数据取值方式。你的代码
奇怪的是,为什么用下标来找相应参数,应该转为强类型映射值啊。

你这么做,如果微信官方参数顺序变了呢?
先后台测试能不能拿到package这个值吧