微信支付流程[支付模式二]
首先需要生成一系列键值对, 代表要提交给支付宝的业务和非业务参数
var param = new Dictionary(); param.Add("appid", "商户ID"); param.Add("body", "商品描述"); param.Add("detail", "商品详情"); param.Add("mch_id", "商户号"); param.Add("nonce_str", "随机码"); param.Add("notify_url", "微信异步通知地址"); param.Add("out_trade_no", "商户唯一订单号"); param.Add("spbill_create_ip", "提交请求的IP地址"); param.Add("total_fee", "价格"); param.Add("trade_type", "支付方式");
之后需要对这些键值对按照 key 的 ASCII 码值排序
然后重新编码成 key1=value1&key2=value2 的形式 (不包含 sign, sign_type, 以及空值的参数)
var str = StringHelper.ConcatParamToUrl(param);
之后在这串新编码之后链接上 key=md5key
str = str + "key=" + md5key;
并用MD5加密成一个字符串
var md5 = StringHelper.MD5Encrypt(str);
最后添加到参数中
param.Add("sign", "签名");
将整个参数集合并成 XML
var xml = StringHelper.ParseXML(param); /**/ 商户ID 商品描述 .........
提交到支付宝并接受返回值
var url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; var result = NetHelper.PostXmlToUrl(url, xml);
解析返回值为 XML
var xDoc = XDocument.Parse(result); var returnCode = xDoc.Element("xml").Element("return_code").Value; var returnMsg = xDoc.Element("xml").Element("return_msg").Value; var resultCode = xDoc.Element("xml").Element("result_code").Value; string codeUrl = xDoc.Element("xml").Element("code_url").Value;
如果都成功, 则获取 codeUrl 作为二维码, 生成到网页上
可以用 qrcode 等第三方库, 在前端后端生成都可
用户扫码支付完毕后, 微信将异步通知 notify_url 设定的地址
该函数需要用 Request.InputStream 来接受参数
之后在 notify_url 上处理业务, 并将结果编码成 xml 返回给 微信
[HttpPost] public ActionResult WeChatNotifyUrlAsyn() { StreamReader reader = new StreamReader(Request.InputStream); string xmlData = reader.ReadToEnd(); string curTxt = HttpUtility.UrlDecode(xmlData); var xDoc = XDocument.Parse(curTxt); var returnCode = xDoc.Element("xml").Element("return_code").Value; var resultCode = xDoc.Element("xml").Element("result_code").Value; var outTradeNo = xDoc.Element("xml").Element("out_trade_no").Value; var errCode = xDoc.Element("xml").Element("err_code").Value; var errCodeDes = xDoc.Element("xml").Element("err_code_des").Value; xml = string.Format(""); return Content(xml, "text/xml"); }