第三方支付 - 微信

微信支付流程[支付模式二]

首先需要生成一系列键值对, 代表要提交给支付宝的业务和非业务参数

var param = new Dictionary<string, string>();
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);

/*
<xml>
   <appid>商户ID</appid>
   <body>商品描述</body>
   .........
</xml>
*/

提交到支付宝并接受返回值

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("<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>");
    return Content(xml, "text/xml");
}

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2016-06-28 22:42  `Laimic  阅读(160)  评论(0)    收藏  举报