最近剛接觸的微信公衆號,看了半天的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