我用c#将微信支付集成到服务器端,供app调用,现在总有问题,困扰很久,请求解决!
我将微信支付集成到服务器端,参考的是网上有大牛提供的代码,我修改了app_id,mch_id,appkey,appsecret,支付的url等,都配置好了,我调用的代码如下:
public IHttpActionResult Wxpay(string strPayOrderData)
{
WXConfig p = new WXConfig();
string MchId = p.MchId; //商户号
string AppId = p.AppId; //开发者平台的AppId不是公众平台
string ApiKey = p.AppKey; //商户平台自己配置的密钥
string NotifyUrl = p.NotifyUrl; //支付成功公众地址
PayWxDataStruct p1 = Newtonsoft.Json.JsonConvert.DeserializeObject<PayWxDataStruct>(strPayOrderData);
var payment = new MyWxPay(MchId, AppId, ApiKey, NotifyUrl);
var jsonStr = payment.Pay(p1.total,p1.Des, HttpContext.Current.Request.UserHostAddress);
return Json<dynamic>(jsonStr);
}
MyWxPay这个类里的部分代码如下:
public string Pay(Int64 TotalFee,string Des,string ClientIp, string FeeType = "CNY")
{
//为发送请求给微信服务器准备数据
var nstr = MakeNonceStr();
Hashtable packageParameter = new Hashtable();
string TradeNo = "";
TradeNo = ResultHelper.NewId;
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);
var xe = PostDataToWeiXin(packageParameter);
//为响应客户端的请求准备数据
var timeStamp = GetTimeStamp();
var prepayId = xe.Element("prepay_id").Value; //执行到这句错误,提示prepay_id是null
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;
}
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
private XElement PostDataToWeiXin(Hashtable parameters)
{
var xmlStr = getXmlStr(parameters);
var data = Encoding.UTF8.GetBytes(xmlStr);
Stream responseStream;
HttpWebRequest request = WebRequest.Create(WXPayurl) 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();
}
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;
}
private string getXmlStr(Hashtable parameters)
{
var sb = new StringBuilder();
sb.Append("<xml>");
foreach (string k in parameters.Keys)
{
var v = (string)parameters[k];
if (Regex.IsMatch(v, @"^[0-9.]$"))
{
sb.Append("<" + k + ">" + v + "</" + k + ">");
}
else
{
sb.Append("<" + k + "><![CDATA[" + v + "]]></" + k + ">");
}
}
sb.Append("</xml>");
return sb.ToString();
}
private string CreateMd5Sign(Hashtable parameters)
{
var sb = new StringBuilder();
var akeys = new ArrayList(parameters.Keys);
akeys.Sort();//排序,这是微信要求的
foreach (string k in akeys)
{
var v = (string)parameters[k];
sb.Append(k + "=" + v + "&");
}
sb.Append("key=" + ApiKey);
string sign = GetMD5(sb.ToString());
return sign;
}
private string MakeNonceStr()
{
var timestap = DateTime.Now.ToString("yyyyMMddhhmmssffff");
return GetMD5(timestap);
}
private string GetMD5(string src)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] data = Encoding.UTF8.GetBytes(src);
byte[] md5data = md5.ComputeHash(data);
md5.Clear();
var retStr = BitConverter.ToString(md5data);
retStr = retStr.Replace("-", "").ToUpper();
return retStr;
}
这个代码有问题吗?请给我看看,谢谢!