这篇文章将介绍 ASP.NET Core 中使用 开源项目 Payment, 实现接入微信 - 扫码支付及异步通知功能
开发环境: Win 10 x64VS2017 15.6.4.NET Core SDK 2.1.101.NET Core Runtime 2.0.6
1. 新建 "ASP.NET Core web 应用程序" 项目, 我将它命名为 WeChatPaySample.
2. 引入安装 Nuget 包 "Essensoft.AspNetCore.WeChatPay". 目前 (2018/03/23) 版本为 1.1.0
3. 在 Startup.cs 文件内 添加依赖注入设置参数(微信支付商户平台 - API 安全)
代码:
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddMvc();
- // 添加微信支付客户端依赖注入
- services.AddWeChatPay();
- // 可在添加依赖注入时设置参数 一般设置 AppIdMchIdKey, 其余默认即可.
- // 退款转账等需要双向证书的 API 需要配置 Certificate 参数, 将. p12 证书文件转成 base64 串写入即可.
- // 如:
- //services.AddWeChatPay(opt =>
- //{
/$/ 此处为 公众号 AppId 小程序 AppId 企业号 corpid 微信开放平台应用 AppId
// opt.AppId = "";
/$/ 微信支付商户号
// opt.MchId = "";
/$/ API 密钥
// opt.Key = "";
/$/ .p12 证书文件的 base64 串
- // opt.Certificate = "";
- //});
- // 具体参数见 WeChatPayOptions
- // 注册配置实例
- services.Configure<WeChatPayOptions>(Configuration.GetSection("WeChatPay"));
- // 两种方式设置注册配置实例参数
- // 1. 默认配置文件(开发环境 / 正式环境):
- // appsettings.Development.json / appsettings.json
- // 2. 用户机密配置文件(VS2017 15.6.4 中, 右键项目 => 管理用户机密):
- // Windows: % APPDATA %\microsoft\UserSecrets\<userSecretsId>\secrets.json
- // Linux: ~/.microsoft / usersecrets /<userSecretsId>/ secrets.json
- // macOS: ~/.microsoft / usersecrets /<userSecretsId>/ secrets.json
- // 配置文件内容如下('...'为省略的项目其他配置内容, 若有的情况下 -_-!):
- //{
- // ...
- // ...
- /$/ "WeChatPay": {
- // "AppId": "",
- // "MchId": "",
- // "Key": ""//"Certificate":""
- // }
- //}
- }
4. 添加一个控制器, 我将其命名为 WeChatPayController.cs
代码:
- using Essensoft.AspNetCore.WeChatPay;
- using Essensoft.AspNetCore.WeChatPay.Notify;
- using Essensoft.AspNetCore.WeChatPay.Request;
- using Microsoft.AspNetCore.Mvc;
- using System.Threading.Tasks;
- namespace WeChatPaySample.Controllers
- {
- public class WeChatPayController : Controller
- {
- // 微信支付请求客户端(用于处理请求与其响应)
- private readonly WeChatPayClient _client = null;
- // 微信证书请求客户端(用于处理双向证书请求与其响应)
- // private readonly WeChatPayCertificateClient _certClient = null;
- // 微信支付通知客户端(用于解析异步通知)
- private readonly WeChatPayNotifyClient _notifyClient = null;
- // 赋值依赖注入对象
- public WeChatPayController(WeChatPayClient client, WeChatPayNotifyClient notifyClient)
- {
- _client = client;
- _notifyClient = notifyClient;
- }
- /// <summary>
- /// 统一下单
- /// </summary>
- /// <param name="out_trade_no"></param>
- /// <param name="body"></param>
- /// <param name="total_fee"></param>
- /// <param name="spbill_create_ip"></param>
- /// <param name="notify_url"></param>
- /// <param name="trade_type"></param>
- /// <param name="openid"></param>
- /// <returns></returns>
- [HttpPost]
- 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)
- {
- var request = new WeChatPayUnifiedOrderRequest()
- {
- OutTradeNo = out_trade_no,
- Body = body,
- TotalFee = total_fee,
- SpbillCreateIp = spbill_create_ip,
- NotifyUrl = notify_url,
- TradeType = trade_type,
- ProductId = product_id,
- OpenId = openid,
- };
- // 发起请求
- var response = await _client.ExecuteAsync(request);
- // 将 response.CodeUrl 生成为二维码即可使用.
- return Ok(response.Body);
- }
- /// <summary>
- /// 支付结果通知
- /// </summary>
- /// <returns></returns>
- [HttpPost]
- public async Task<IActionResult> Notify()
- {
- try
- {
- // 以 WeChatPayUnifiedOrderNotifyResponse 类型 解析请求
- var notify = await _notifyClient.ExecuteAsync<WeChatPayUnifiedOrderNotifyResponse>(Request);
- if (!notify.IsError)
- {
- if (notify.ResultCode == "SUCCESS")
- {
- // 业务代码
- // ...
- // ...
- // 返回给微信支付成功内容, 停止继续通知
- return Content("<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>", "text/xml");
- }
- }
- // 订单其他状态均返回给微信支付空内容.
- return NoContent();
- }
- catch
- {
- // 参数异常 / 验签失败均返回给微信支付空内容.
- return NoContent();
- }
- }
- }
- }
5. 修改 Views/Home/Index 页面, 用于网站提交支付请求.
代码:
- @{
- ViewData["Title"] = "Home Page";
- }
- <div style="padding:24px 0">
- <h3 > 微信支付 扫码支付 - <a href="https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1" target="_blank">API 文档</a></h3>
- <hr />
- <form asp-controller="WeChatPay" asp-action="UnifiedOrder" target="_blank">
- <div class="form-group">
- <label>out_trade_no:</label>
- <input type="text" class="form-control" name="out_trade_no" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")">
- </div>
- <div class="form-group">
- <label>body:</label>
- <input type="text" class="form-control" name="body" value="微信扫码支付测试详情">
- </div>
- <div class="form-group">
- <label>total_fee:</label>
- <input type="text" class="form-control" name="total_fee" value="1">
- </div>
- <div class="form-group">
- <label>spbill_create_ip:</label>
- <input type="text" class="form-control" name="spbill_create_ip" value="127.0.0.1">
- </div>
- <div class="form-group">
- <label>notify_url(通知 Url 需外网环境可访问):</label>
- <input type="text" class="form-control" name="notify_url" value="http://xxx.com/wechatpay/notify">
- </div>
- <div class="form-group">
- <label>trade_type:</label>
- <input type="text" class="form-control" name="trade_type" value="NATIVE">
- </div>
- <div class="form-group">
- <label>product_id:</label>
- <input type="text" class="form-control" name="product_id" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")">
- </div>
- <button type="submit" class="btn btn-primary">提交</button>
- </form>
- </div>
实现页面如下:
来源: https://www.cnblogs.com/essenroc/p/8630730.html