ASP.NET Core Web 支付功能接入 微信-扫码支付篇(转)
原文 https://www.cnblogs.com/essenroc/p/8630730.html
// 随着版本更迭,新版本可能无法完全适用,请参考仓库内的示例。
这篇文章将介绍ASP.NET Core中使用 开源项目 Payment(https://github.com/Essensoft/Payment),实现接入微信-扫码支付及异步通知功能。
开发环境:Win 10 x64、VS2017 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.Payment.WeChatPay". 目前(2018/03/29)版本为 1.2.1
3. 在Startup.cs文件内 添加依赖注入、设置参数(微信支付商户平台 - 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
代码:

- 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
本篇文章到此结束,具体效果可自行测试。感谢各位观看。
ASP.NET Core Web 支付功能接入 微信-扫码支付篇(转)的更多相关文章
- ASP.NET Core Web 支付功能接入 微信-扫码支付篇
这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET Core SDK ...
- 【转载】ASP.NET Core Web 支付功能接入 微信-扫码支付篇
转自:http://www.cnblogs.com/essenroc/p/8630730.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步 ...
- 【移动支付】.NET微信扫码支付接入(模式二-NATIVE)
一.前言 经过两三天的琢磨总算完成了微信扫码支付功能,不得不感叹几句: 微信提供的DEMO不错,直接复制粘贴就可以跑起来了: 微信的配置平台我真是服了.公众平台.商户平台.开放平台,一个平 ...
- C# 微信扫码支付API (微信扫码支付模式二)
一.SDK下载地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1,下载.NET C#版本: 二.微信相关设置:(微信扫码 ...
- PHP PC端微信扫码支付【模式二】详细教程-附带源码(转)
博主写这破玩意儿的时候花了大概快两天时间才整体的弄懂逻辑,考虑了一下~还是把所有代码都放出来给大家~抱着开源大无私的精神!谁叫我擅长拍黄片呢?同时也感谢我刚入行时候那些无私帮过我的程序员们! 首先还是 ...
- thinkphp.2 thinkphp5微信支付 微信公众号支付 thinkphp 微信扫码支付 thinkphp 微信企业付款5
前面已经跑通了微信支付的流程,接下来吧微信支付和微信企业付款接入到thinkphp中,版本是3.2 把微信支付类.企业付款类整合到一起放到第三方类库,这里我把微信支付帮助类和企业付款类放到同一个文件了 ...
- asp.net core 微信扫码支付(扫码支付,H5支付,公众号支付,app支付)之1
2018-08-13更新生成二维码的方法 在做微信支付前,首先要了解你需要什么方式的微信支付,目前本人做过的支付包含扫码支付.H5支付.公众号支付.App支付等,本人使用的是asp.net mvc c ...
- JAVA微信扫码支付模式二功能实现完整例子
概述 本例子实现微信扫码支付模式二的支付功能,应用场景是,web网站微信扫码支付.实现从点击付费按钮.到弹出二维码.到用户用手机微信扫码支付.到手机上用户付费成功.web网页再自动调整到支付成功后的页 ...
- 微信扫码支付PHP接入总结
微信扫码支付分为两种模式, 模式一比较复杂,需要公众号配置回调地址. 模式二比较简单,只需要在代码中配置回调地址就可以了. 我这次使用的是模式二. 需要配置参数, const APPID = 'xxx ...
随机推荐
- LeetCode双周赛#35
1589. 所有排列中的最大和 #差分 #贪心 题目链接 题意 给定整数数组nums,以及查询数组requests,其中requests[i] = [starti, endi] .第i个查询求 num ...
- AppWeb认证绕过漏洞(CVE-2018-8715)
AppWeb认证绕过漏洞(CVE-2018-8715) 一.漏洞描述 Appweb简介 Appweb是一个嵌入式HTTP Web服务器,主要的设计思路是安全.这是直接集成到客户的应用和设备,便于开发和 ...
- Spring Cloud 学习 (二) Ribbon
负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式:一种是独立进程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如 Ngnix:另一种是将负载均衡逻辑以代码的形式封装到服务消费 ...
- 通过sql 语句将多行数据拼接到一行中
- 第4.3节 Python中与迭代相关的函数
下面要介绍的enumerate.range.zip.reversed.sorted属于Python内置的函数或者类别,返回的对象都可通过迭代方法访问. 一. enumerate函数 1. ...
- Python使用property函数定义的属性名与其他实例变量重名会怎么样?
首先如果定义的属性名与该属性对应的操作方法操作的实例对象同名就会触发无穷的递归调用,相关部分请参考<Python案例详解:使用property函数定义与实例变量同名的属性会怎样?> 但如果 ...
- 使用文件描述符作为Python内置函数open的file实参调用示例
一.关于文件描述符 open()函数的file参数,除了可以接受字符串路径外,还可以接受文件描述符(file descriptor),文件描述符是个整数,对应程序中已经打开的文件. 文件描述符是操作系 ...
- Python中使用“模块名.__all__”查看模块建议导出的属性
在<第10.5节 使用__all__定义Python模块导入白名单>中,老猿介绍了在自定义模块中使用定义__all__属性来提供模块对外可见的白名单,使用该机制除了可以定义访问的白名单外, ...
- 本地web项目部署到服务器里连接不上数据库的解决办法
今天突然想到把自己之前的项目挂到服务器上,但是用到了数据库,于是给服务器装上了MySQL,想着能赶紧把项目挂上去看看效果,然后并不是一帆风顺,在奋斗了四小时后终于解决了问题的所在. (1)首先我找到了 ...
- KafKa简介和利用docker配置kafka集群及开发环境
KafKa的基本认识,写的很好的一篇博客:https://www.cnblogs.com/sujing/p/10960832.html 问题:1.kafka是什么?Kafka是一种高吞吐量的分布式发布 ...