asp.net mvc下实现微信公众号(JsApi)支付介绍
本文主要讲解asp.net mvc框架下公众号支付如何实现,公众号支付主要包括三个核心代码,前台调起支付js代码、对应js调用参数参数生成代码、支付成功处理代码。
一、微信支付方式介绍
微信提供了各种支付方式,试用于各种不同的支付场景,主要有如下几种:
1、刷卡支付
刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。
2、扫码支付
扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。
3、公众号支付
公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:
- ◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
- ◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
- ◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付
4、APP支付
APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。
5、H5支付
H5支付用于在手机端微信外浏览器进行支付,笔者的测试本支付方式在微信内不能使用。
具体相关代码如下:
二、前端js调起代码
var _wxJsApiParam; function callpay() { if (typeof WeixinJSBridge == "undefined") { if (document.addEventListener) { document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); } else if (document.attachEvent) { document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } } else { jsApiCall(); } } //调用微信JS api 支付 function jsApiCall() { WeixinJSBridge.invoke('getBrandWCPayRequest', _wxJsApiParam, function (res) { if (res.err_msg == "get_brand_wcpay_request:cancel") { $.messager.alert('提示信息', '支付已经取消!', 'info'); return false; } else if (res.err_msg == "get_brand_wcpay_request:ok") { //支付成功 $.messager.alert('提示信息', '支付成功!', 'info'); } }); } $(function () { $("#buyBtn").click(function () { //调起微信公众号JsApi支付 $.ajax({ url: "/Pay/GenerateOrder", type: 'post', cache: false, dataType: 'html', data: { OBJECTID: $("#OBJECTID").val() }, success: function (data) { if (data != "Error") { _wxJsApiParam = eval('(' + data + ')'); callpay(); } else $.messager.alert('提示信息', '生成订单失败!', 'info'); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus); return; } }); }); });
三、Js参数生成代码
/// <summary> /// 生成订单及JSAPI提交参数 /// </summary> /// <param name="tmpModel"></param> /// <returns></returns> [HttpPost] public ActionResult GenerateOrder() { try { //调用支付 JsApiPay jsApiPay = new JsApiPay(); jsApiPay.bodyStr = "商品名称"; jsApiPay.attachStr = "附加信息"; jsApiPay.orderId = "订单编号"; jsApiPay.openid = "OpenId"; jsApiPay.total_fee = 1;//测试 订单金额(1表示分,正式金额要*100) //JSAPI支付预处理 //调用统一下单,获得下单结果 WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(); //从统一下单成功返回的数据中获取微信浏览器调起jsapi支付所需的参数 var wxJsApiParam = jsApiPay.GetJsApiParameters(); //获取到的是json格式字符串 return Content(wxJsApiParam); } catch (Exception e) { return Content("Error"); } }
四、成功支付处理代码
/// <summary> /// 支付成功后台处理方法 /// </summary> /// <returns></returns> [HttpPost] public virtual ActionResult JsApiNotifyUrl() { WxPayData notifyData = GetNotifyData(); //检查支付结果中transaction_id是否存在 if (!notifyData.IsSet("transaction_id")) { //若transaction_id不存在,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "支付结果中微信订单号不存在"); Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml()); return Content("支付结果中微信订单号不存在"); } string transaction_id = notifyData.GetValue("transaction_id").ToString(); string trade_no = notifyData.GetValue("out_trade_no").ToString();//订单号 //查询订单,判断订单真实性 if (!QueryOrder(transaction_id)) { //若订单查询失败,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单查询失败"); Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml()); return Content("订单查询失败"); } //查询订单成功 else { WxPayData res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml()); //更新支付状态 return Content("支付成功" + res.ToXml()); } }
五、源码下载地址:http://www.kwstu.com/ResourcesView/weixin_201710301110519827
联系QQ:806693619