最近刚接触的微信公众号,看了半天的Api文档,直接就上手开发了,用了几天的时间,结束了公众号支付的任务。javascript
首先,须要准备的东西是:一、微信公众号;二、支付申请;三、公众号配置(坑);四、开发。html
微信公众号申请前端
通常开通就好了,https://mp.weixin.qq.com,度娘一下就好了;此处能够省略;
java
支付申请git
要缴费才给开通,以后上传相关的资料,审核经过以后,通常一个多星期就可以搞定;github
公众号配置ajax
(1)【配置oAuth2网页受权】,这个须要申请公众号开发者【开发】-【接口权限】-【网页受权】-【修改】-【网页受权域名】 注意,该域名填写,必须严格按照提示填写,目前的格式是:域名(不带http://或者https://),例如:www.baidu.com ,对了,这里只要是备案过的域名,不分一二级域名;json
(2)【支付目录配置】,这个分两种【支付受权目录】和【测试受权目录】,第一种是正式的支付受权目录,mvc框架的话,这种精确至Controller,例如:http://www.baidu.com/Pay/,第二种也跟前一种差很少,只是须要添加测试白名单;api
(3)开发中所须要的参数:跨域
MCHID:在【微信支付】-【商户信息】-【基本信息】;
APPID:【基本配置】-【开发者ID】-【】 ;
APPSECRET:【基本配置】-【开发者ID】-【】 ;
KEY:登陆商户平台 【帐户中心】-【API安全】-【设置密钥】,本身设置的;
作完以上的步骤,就能够开始开发了。
下载官方的demo下载,可是WebForm版本的,其实,大致上是差很少的。
控制器
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using WxPayAPI; namespace MVC_WxPay_Demo.Controllers { public class WxPayController : Controller { /// <summary> /// 调用js获取收货地址时须要传入的参数 /// 格式:json串 /// 包含如下字段: /// appid:公众号id /// scope: 填写“jsapi_address”,得到编辑地址权限 /// signType:签名方式,目前仅支持SHA1 /// addrSign: 签名,由appid、url、timestamp、noncestr、accesstoken参与签名 /// timeStamp:时间戳 /// nonceStr: 随机字符串 /// </summary> public static string wxEditAddrParam { get; set; } /// <summary> /// openId /// </summary> public static string openid { get; set; } /// <summary> /// 受权后微信端返回的code(用于获取openid和access_token) /// </summary> public static string code { get; set; } /// <summary> /// H5调起JS API参数 /// </summary> public static string wxJsApiParam { get; set; } [AllowAnonymous] public ActionResult Index() {
JsApiPay jsApiPay = new JsApiPay(HttpContext); jsApiPay.GetOpenidAndAccessToken(); if (jsApiPay.openid != null) { openid = jsApiPay.openid; GetJsApiParameters(); } ViewBag.Params = wxJsApiParam; return View(); } /// <summary> /// 获取前端参数 /// </summary> private void GetJsApiParameters() { if (openid != null) { //若传递了相关参数,则调统一下单接口,得到后续相关接口的入口参数 JsApiPay jsApiPay = new JsApiPay(HttpContext); jsApiPay.openid = openid; jsApiPay.total_fee = 1; //1分钱 jsApiPay.attach = "test"; jsApiPay.goods_tag = "test"; jsApiPay.body = "body"; //jsapi支付预处理 try { WxPayData unifiedorderresult = jsApiPay.GetUnifiedOrderResult(); wxJsApiParam = jsApiPay.GetJsApiParameters();//获取h5调起js api参数 } catch (Exception ex) { } } } /// <summary> /// 回调 /// </summary> public void Notify() { } } }
Index视图
@{ ViewBag.Title = "Pay"; } <!DOCTYPE html> <html> <head> <title>@ViewBag.Title</title> <script type="text/javascript"> //调用微信JS api 支付 function onBridgeReady(){ WeixinJSBridge.invoke( 'getBrandWCPayRequest',@Html.Raw(ViewBag.Params) , function(res){ if (res.err_msg == "get_brand_wcpay_request:ok") { } // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。 else{ } window.location.href='/WxPay/Notify'; } ); } if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', onBridgeReady); document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); } }else{ onBridgeReady(); } </script> </head> <body> <div> </div> </body> </html>
Index()里面如何改,本身发挥,必定要保证经过身份验证以后,微信回调可以再次调用GetOpenidAndAccessToken()。
以后,将须要用到的business文件夹中的JsApiPay.cs,NativeNotify.cs和utils文件夹中的Config.cs,Data.cs,HttpService.cs,Notify.cs,WxPayApi.cs 引用进来即可以了。
贴完代码,就要来讲说里面的坑了,那些不得不说的坑,首先,要分清楚,HttpContext是什么鬼?如ajax请求,例如:用post或者get,http://xxx.com/WxPay/Index 这个的话,会出现微信带Code参数的回调请求失败,出现302,是由于微信经过身份验证以后会回调设置好的redirect_url,一样的用ajax去身份验证的,回调也是用ajax, 而后会出现跨域的问题,因此,须要前端那边用location直接跳转新页面到http://xxx.com/WxPay/Index ,切记,必定要跳转新页面!至于要带什么参数,根据业务须要传;至于还有什么其余坑.其实也不是坑,严格按照文档走,相似键值对的顺序、签名的大小写问题等等,这些也是须要注意的,不过好在微信返回的错误码以及错误信息都是比较齐全跟明确的,查看文档就能够继续往下走。
写好这些,估计就没什么问题了,有问题能够一块儿交流。
最后,附上本身的写的Demo,仅供参考:百度云:MVC_WxPay_Demo.zip
Github:MVC_WxPay_Demo.zip
以为能够帮忙顶一下,谢谢。
QQ交流群:523490820