// 隨着版本更迭,新版本可能沒法徹底適用,請參考倉庫內的示例。php
這篇文章將介紹ASP.NET Core中使用 開源項目 Payment(https://github.com/Essensoft/Payment),實現接入微信-掃碼支付及異步通知功能。git
開發環境:Win 10 x6四、VS2017 15.6.四、.NET Core SDK 2.1.10一、.NET Core Runtime 2.0.6github
1.新建"ASP.NET Core Web 應用程序"項目,我將它命名爲WeChatPaySample.json
2. 引入安裝Nuget包 "Essensoft.AspNetCore.Payment.WeChatPay". 目前(2018/03/29)版本爲 1.2.1小程序
3. 在Startup.cs文件內 添加依賴注入、設置參數(微信支付商戶平臺 - API安全)api
代碼:安全
1 public void ConfigureServices(IServiceCollection services) 2 { 3 services.AddMvc(); 4 5 // 添加微信支付客戶端依賴注入 6 services.AddWeChatPay(); 7 8 // 可在添加依賴注入時設置參數 通常設置 AppId、MchId、Key,其他默認便可. 9 // 退款、轉帳等須要雙向證書的API 須要配置 Certificate 參數,將.p12證書文件轉成base64串寫入便可. 10 // 如: 11 //services.AddWeChatPay(opt => 12 //{ 13 // // 此處爲 公衆號AppId、小程序AppId、企業號corpid、微信開放平臺應用AppId 14 // opt.AppId = ""; 15 16 // // 微信支付商戶號 17 // opt.MchId = ""; 18 19 // // API密鑰 20 // opt.Key = ""; 21 22 // // .p12證書文件的base64串 23 // opt.Certificate = ""; 24 //}); 25 26 // 具體參數見 WeChatPayOptions 27 28 // 註冊配置實例 29 services.Configure<WeChatPayOptions>(Configuration.GetSection("WeChatPay")); 30 31 // 兩種方式設置註冊配置實例參數 32 33 // 1.默認配置文件(開發環境/正式環境): 34 // appsettings.Development.json / appsettings.json 35 36 // 2.用戶機密配置文件(VS2017 15.6.4 中,右鍵項目 => 管理用戶機密): 37 // Windows: % APPDATA %\microsoft\UserSecrets\< userSecretsId >\secrets.json 38 // Linux: ~/.microsoft / usersecrets /< userSecretsId >/ secrets.json 39 // macOS: ~/.microsoft / usersecrets /< userSecretsId >/ secrets.json 40 41 // 配置文件內容以下('...'爲省略的項目其餘配置內容,如有的狀況下 -_-!): 42 43 //{ 44 // ... 45 // ... 46 // 47 // "WeChatPay": { 48 // "AppId": "", 49 // "MchId": "", 50 // "Key": "" 51 // "Certificate": "" 52 // } 53 //} 54 }
4. 添加一個控制器, 我將其命名爲 WeChatPayController.cs微信
代碼:app
1 using Essensoft.AspNetCore.Payment.WeChatPay; 2 using Essensoft.AspNetCore.Payment.WeChatPay.Notify; 3 using Essensoft.AspNetCore.Payment.WeChatPay.Request; 4 using Microsoft.AspNetCore.Mvc; 5 using System.Threading.Tasks; 6 7 namespace WeChatPaySample.Controllers 8 { 9 public class WeChatPayController : Controller 10 { 11 // 微信支付請求客戶端(用於處理請求與其響應) 12 private readonly WeChatPayClient _client = null; 13 14
15
16 17 // 微信支付通知客戶端(用於解析異步通知) 18 private readonly WeChatPayNotifyClient _notifyClient = null; 19 20 // 賦值依賴注入對象 21 public WeChatPayController(WeChatPayClient client, WeChatPayNotifyClient notifyClient) 22 { 23 _client = client; 24 _notifyClient = notifyClient; 25 } 26 27 /// <summary> 28 /// 統一下單 29 /// </summary> 30 /// <param name="out_trade_no"></param> 31 /// <param name="body"></param> 32 /// <param name="total_fee"></param> 33 /// <param name="spbill_create_ip"></param> 34 /// <param name="notify_url"></param> 35 /// <param name="trade_type"></param> 36 /// <param name="openid"></param> 37 /// <returns></returns> 38 [HttpPost] 39 public async Task<IActionResult> UnifiedOrder(string out_trade_no, string body, int total_fee, string spbill_create_ip, string notify_url, string trade_type, string product_id, string openid) 40 { 41 var request = new WeChatPayUnifiedOrderRequest() 42 { 43 OutTradeNo = out_trade_no, 44 Body = body, 45 TotalFee = total_fee, 46 SpbillCreateIp = spbill_create_ip, 47 NotifyUrl = notify_url, 48 TradeType = trade_type, 49 ProductId = product_id, 50 OpenId = openid, 51 }; 52 53 // 發起請求 54 var response = await _client.ExecuteAsync(request); 55 56 // 將response.CodeUrl生成爲二維碼便可使用. 57 58 return Ok(response.Body); 59 } 60 61 /// <summary> 62 /// 支付結果通知 63 /// </summary> 64 /// <returns></returns> 65 [HttpPost] 66 public async Task<IActionResult> Notify() 67 { 68 try 69 { 70 // 以 WeChatPayUnifiedOrderNotifyResponse 類型 解析請求 71 var notify = await _notifyClient.ExecuteAsync<WeChatPayUnifiedOrderNotifyResponse>(Request); 72 if (!notify.IsError) 73 { 74 if (notify.ResultCode == "SUCCESS") 75 { 76 // 業務代碼 77 // ... 78 // ... 79 80 //返回給微信支付成功內容,中止繼續通知 81 return Content("<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>", "text/xml"); 82 } 83 } 84 85 // 訂單其餘狀態均返回給微信支付空內容. 86 return NoContent(); 87 } 88 catch 89 { 90 // 參數異常/驗籤失敗均返回給微信支付空內容. 91 return NoContent(); 92 } 93 } 94 95 } 96 }
5. 修改 Views/Home/Index 頁面,用於網站提交支付請求.異步
代碼:
1 @{ 2 ViewData["Title"] = "Home Page"; 3 } 4 5 <div style="padding:24px 0"> 6 <h3>微信支付 掃碼支付 - <a href="https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1" target="_blank">API文檔</a></h3> 7 <hr /> 8 <form asp-controller="WeChatPay" asp-action="UnifiedOrder" target="_blank"> 9 <div class="form-group"> 10 <label>out_trade_no:</label> 11 <input type="text" class="form-control" name="out_trade_no" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")"> 12 </div> 13 <div class="form-group"> 14 <label>body:</label> 15 <input type="text" class="form-control" name="body" value="微信掃碼支付測試詳情"> 16 </div> 17 <div class="form-group"> 18 <label>total_fee:</label> 19 <input type="text" class="form-control" name="total_fee" value="1"> 20 </div> 21 <div class="form-group"> 22 <label>spbill_create_ip:</label> 23 <input type="text" class="form-control" name="spbill_create_ip" value="127.0.0.1"> 24 </div> 25 <div class="form-group"> 26 <label>notify_url(通知Url需外網環境可訪問):</label> 27 <input type="text" class="form-control" name="notify_url" value="http://xxx.com/wechatpay/notify"> 28 </div> 29 <div class="form-group"> 30 <label>trade_type:</label> 31 <input type="text" class="form-control" name="trade_type" value="NATIVE"> 32 </div> 33 <div class="form-group"> 34 <label>product_id:</label> 35 <input type="text" class="form-control" name="product_id" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")"> 36 </div> 37 <button type="submit" class="btn btn-primary">提交</button> 38 </form> 39 </div>
實現頁面以下:
有疑問能夠在 https://github.com/Essensoft/Payment 提交Issue ,也能夠加入Payment 交流羣:522457525
本篇文章到此結束,具體效果可自行測試。感謝各位觀看。