我用的是vs2012,c#。有个app调用微信支付,需要我在服务器端集成。已经大概用了2周时间,中间问过人,也看过很多帖子,还是有问题。主要是:签名错误!
1.基础工作
微信支付商户平台正常,有商户号,即mch_id,这里还要获取一个apikey,也是正常设置。
微信开放平台,申请了app应用,也都开通了微信支付功能。appid
2.代码部分
参考了网上的一份代码,主要几部分组成
(1)微信支付配置
mch_id,appid,apikey,appsecret,支付的网址:"https://api.mch.weixin.qq.com/pay/unifiedorder"
还有这个串: "Sign=WXPay";
(2)我找了很多原因,将我的信息写入,生成签名,sign,与“https://pay.weixin.qq.com/wiki/tools/signverify/”这里平台产生的签名是一致的。
(3)看代码:
[HttpPost]
public string Alipay_ulr([FromBody]Models.RetModel model)
{
PayConfig pay = new PayConfig();
string MchId = pay.MchId;
string AppId = pay.AppId;
string ApiKey = pay.AppKey;
string NotifyUrl = pay.NotifyUrl;
var payment = new pay(MchId,
AppId,
ApiKey,
NotifyUrl);
string Amount = model.Amount;
Int64 wx_total_fee = Int64.Parse(model.wxtotalfee);
var orderId = model.orderid;
var jsonStr = payment.Pay(wx_total_fee, orderId, "" + Amount + "", "ip地址");//填写本机的ip地址
return jsonStr;
}
调用的入口。
public string Pay(Int64 TotalFee, string TradeNo, string Des, string ClientIp, string FeeType = "CNY")
{
//为发送请求给微信服务器准备数据
var nstr = MakeNonceStr();
Hashtable packageParameter = new Hashtable();
packageParameter.Add("appid", this.AppId);
packageParameter.Add("body", Des);
packageParameter.Add("mch_id", this.MchId);
packageParameter.Add("notify_url", this.NotifyUrl);
packageParameter.Add("nonce_str", nstr);
packageParameter.Add("out_trade_no", TradeNo);
packageParameter.Add("total_fee", TotalFee.ToString());
packageParameter.Add("spbill_create_ip", ClientIp);
packageParameter.Add("trade_type", "APP");
packageParameter.Add("fee_type", FeeType);
var sign = CreateMd5Sign(packageParameter);
packageParameter.Add("sign", sign); //sign产生的值与微信平台产生的签名一致
var xe = PostDataToWeiXin(packageParameter);//这里开始出问题,贴上代码
//为响应客户端的请求准备数据
var timeStamp = GetTimeStamp();
var prepayId = xe.Element("prepay_id").Value;
nstr = xe.Element("nonce_str").Value;
Hashtable paySignReqHandler = new Hashtable();
paySignReqHandler.Add("appid", this.AppId);
paySignReqHandler.Add("partnerid", this.MchId);
paySignReqHandler.Add("prepayid", prepayId);
paySignReqHandler.Add("noncestr", nstr);
paySignReqHandler.Add("package", packageStr);
paySignReqHandler.Add("timestamp", timeStamp.ToString());
var paySign = CreateMd5Sign(paySignReqHandler);
var obj = new
{
appid = this.AppId,
partnerid = this.MchId,
prepayid = prepayId,
package = packageStr,
noncestr = nstr,
timestamp = timeStamp,
sign = paySign
};
var serializer = new JavaScriptSerializer();
var result = serializer.Serialize(obj);
return result;
}
private XElement PostDataToWeiXin(Hashtable parameters)
{
var xmlStr = getXmlStr(parameters);
var data = Encoding.UTF8.GetBytes(xmlStr);
Stream responseStream;
HttpWebRequest request = WebRequest.Create(WeiXinPayUrl) as HttpWebRequest;
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
request.ContentLength = data.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
try
{
responseStream = request.GetResponse().GetResponseStream(); //这里请求就会出现如图中的提示,如【1】图
}
catch (Exception exception)
{
throw exception;
}
string str = string.Empty;
using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))
{
str = reader.ReadToEnd();
}
responseStream.Close();
var xe = XElement.Parse(str);
return xe;
}
【1】图
(4)最后代码中,这段始终执行不下去。
var prepayId = xe.Element("prepay_id").Value;
提示为null。
请求大家给个建议。跪谢了!