关于微信支付,网上太多例子,由于步骤比较繁琐,对于小白来说坑较多,现总结一下完整流程
1.首先要到微信开放平台创建移动应用,提交审核,通过后得到AppID和AppSecret
2.申请开发者资质认证。
3.申请微信支付
申请成功会收到邮件,包含商户号wxPay_mchId和密码,用这个登录商户平台,开通APP支付,同时在商户平台->账户设置->API安全里填写的密钥得到wxPay_partnerKey
自此需要用到的AppID,AppSecret,mchId,partnerKey,notifyUrl(后台网站地址,自己设置)都获取完成,可将其放到配置文件或数据库。下面进入正式代码:
1.用户点击生成订单,APP将信息提交后台,后台生成完整订单返回APP,APP显示订单
PayOrder payOrder = new PayOrder();
payOrder.cname = cname;
payOrder.curUmno = curUmno;
payOrder.thisPay = Convert.ToDecimal(thispay);
payOrder.payType = payType;
payOrder.orderStatus = 0;
payOrder.orderNumber=WeiXinUtil.CreateNonce();//商户后台订单号,随机生成
payOrder.tradeType=tradeType;
payOrder.isDelete=0;
// payOrder.transactionId=;微信订单号支付完成后台异步填写
//payOrder.payDate支付完成后台异步填写
//payOrder.bankType支付完成后台异步填写
2.用户点击付款,将信息提交后台,后台组件下单对象(付款信息有APP传入,配置信息从配置文件或数据库读取),至少包含以下10个参数:
order.body
order.appid
order.mch_id
order.notify_url
order.attach
order.nonce_str
order.out_trade_no
order.total_fee
order.spbill_create_ip
order.trade_type
3.获取预支付订单id:getPrepay_id :string prepayid =getPrepay_id(order, pdd.getWxKey("wxPay_partnerKey"));//(wxPay_partnerKe重数据库或配置文件获取)
/// <summary>
/// 获取prepay_id
/// </summary>
public string getPrepay_id(Order order, string key)
{
string prepay_id = "";
string post_data = getUnifiedOrderXML(order, key);
string request_data = WeiXinUtil.PostXmlToUrl("https://api.mch.weixin.qq.com/pay/unifiedorder", post_data);
SortedDictionary<string, string> requestXML = WeiXinUtil.GetInfoFromXml(request_data);
foreach (KeyValuePair<string, string> k in requestXML)
{
if (k.Key == "prepay_id")
{
prepay_id = k.Value;
break;
}
}
return prepay_id;
}
//获取统一下单数据
public static string getUnifiedOrderXML(Order order, string key)
{
string return_string = string.Empty;
Dictionary<string, string> sParams = new Dictionary<string, string>();
sParams.Add("appid", order.appid);
sParams.Add("attach", order.attach);
sParams.Add("body", order.body);
sParams.Add("mch_id", order.mch_id);
sParams.Add("nonce_str", order.nonce_str);
sParams.Add("notify_url", order.notify_url);
sParams.Add("out_trade_no", order.out_trade_no);
sParams.Add("spbill_create_ip", order.spbill_create_ip);
sParams.Add("total_fee", order.total_fee.ToString());
sParams.Add("trade_type", order.trade_type);
order.sign = CreateSign(sParams, key);
sParams.Add("sign", order.sign);
//拼接成XML请求数据
StringBuilder sbPay = new StringBuilder();
foreach (KeyValuePair<string, string> k in sParams)
{
if (k.Key == "attach" || k.Key == "body" || k.Key == "sign")
{
sbPay.Append("<" + k.Key + "><![CDATA[" + k.Value + "]]></" + k.Key + ">");
}
else
{
sbPay.Append("<" + k.Key + ">" + k.Value + "</" + k.Key + ">");
}