频道栏目
首页 > 资讯 > 微信公众平台开发 > 正文

第三方支付 - 微信

16-07-01        来源:[db:作者]  
收藏   我要投稿

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

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

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");
}
相关TAG标签
上一篇:如何实现从Android第三方平台推送微信公众号
下一篇:基于http的外网到内网服务器的免费代理
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站