ASP.NET Core Web 支付功能接入 微信-扫码支付篇

这篇文章将介绍ASP.NET Core中使用 开源项目 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.WeChatPay". 目前(2018/03/23)版本为 1.1.0

3. 在Startup.cs文件内 添加依赖注入、设置参数(微信支付商户平台 - API安全)

代码:

public void ConfigureServices(IServiceCollection services)

        {

            services.AddMvc();


            // 添加微信支付客户端依赖注入

            services.AddWeChatPay();


            // 可在添加依赖注入时设置参数 一般设置 AppId、MchId、Key,其余默认即可.

            // 退款、转账等需要双向证书的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://github.com/Essensoft/Payment 提交Issue ,也可以加入Payment 交流群:522457525

本篇文章到此结束,具体效果可自行测试。感谢各位观看。

原文地址:http://www.cnblogs.com/essenroc/p/8630730.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14、java中的集合(1)

1、为什么使用集合 面向对象语言使用对象体现事物&#xff0c;存储对象可以使用数组&#xff0c;但是数组的长度是固定的&#xff0c;存储的对象类型单一&#xff0c;不适用需求的变化&#xff0c;所以提供了集合。 2、集合和数组的区别 1&#xff09;数组长度定义之后不能改…

Microsoft AI - Custom Vision in C#

概述前面一篇 Microsoft AI - Custom Vision 中&#xff0c;我们介绍了 Azure 认知服务中的自定义影像服务&#xff1a;Custom Vision&#xff0c;也介绍了如果通过这个在线服务&#xff0c;可视化的完成项目创建、数据集上传和标注、模型训练、模型评估和测试。我们也提到&…

Unity引擎及编辑器C#源代码发布

3月23日我们在GitHub上发布了Unity引擎和编辑器的C#源代码&#xff0c;仅供Unity学习参考使用。为何如此决定为了了解或改进自己的Unity项目&#xff0c;一直以来有用户对Unity .NET程序集反汇编&#xff0c;我们的服务条款明确允许这样做。但反汇编有二大缺点&#xff1a;尽管…

k8s实战为aspnetcore.webapi微服务注入配置信息

1、浅析k8s配置信息Secret以密文的形式存储数据&#xff0c;可以用来保存一些敏感信息&#xff0c;例如&#xff1a;OAuth tokens、私钥、密码、数据库连接、事件总线连接等。ConfigMap以明文的形式存储数据&#xff0c;可以用来保存一些非敏感信息&#xff0c;例如&#xff1a…

10、mysql数据表中数据的查询(2)

介绍一下mysql中查询的重中之重&#xff0c;连接查询 创建student和teacher表&#xff0c;表中数据如下&#xff1a; studentteacher 交叉连接查询 查询结果是连接的几个表中满足条件的相关联的数据的交集 sql SELECT s.id sid, s.name sname , t.id tid ,t.name tname FRO…

微软将人工智能嵌入Windows 10更新

下一轮Windows 10更新为Windows应用程序与人工智能功能的集成提供了新途径&#xff0c;将直接令数以亿计的个人电脑、平板、IoT边缘设备等Windows设备受益。新版Windows ML平台可供开发者直接通过Visual Studio将预先训练好的深度学习模型与自己的应用程序集成&#xff0c;在导…

24、mysql连接线程的show和kill

1、登陆到mysql服务器 Mysql –h ip –u 用户名 –p 密码; 2、检查当前连接的线程 show full processlist 或 show processlist 或 selelct * from information_schema.processlist; Id&#xff1a;线程标识 User&#xff1a;当前用户 Host&#xff1a;sql的来源&#xff0c;i…

ASP.NET Core MVC 2.1 顶级参数验证

本文讨论ASP.NET Core 2.1中与ASP.NET Core MVC / Web API控制器中的模型绑定相关的功能。虽说这是一个功能&#xff0c;但从我的角度来看&#xff0c;它更像是一个错误修复&#xff01;请注意&#xff0c;我使用的是 NET Core 2.1 Preview 1&#xff0c;正式版发布后&#xff…

.net core2.0下Ioc容器Autofac使用

Autofac基本使用Autofac是一款轻量级的IOC框架&#xff0c;使用率上还是挺高的&#xff0c;官方网站http://autofac.org&#xff0c;源码下载地址https://github.com/autofac/Autofac。下面以狗的列子来介绍autofac&#xff0c;nuget搜索Autofac进行安装public interface IDog{…

微软重组变两大事业部:Windows主管离职

微软CEO纳德拉通过内部邮件宣布&#xff0c;整个公司进行重大重组&#xff0c;划分为两个新的事业部(部门)&#xff0c;同时Windows业务主管Terry Myerson(特里梅尔森)将离开微软。Terry Myerson最为人诟病的就是推倒了Windows Mobile而打造全新的Windows Phone&#xff0c;结果…

41、java应用占用cpu过高原因分析

线上服务器cpu占用过高问题排查 1、定位最耗cpu的进程 命令&#xff1a;top 2、定位最耗cpu的线程 命令&#xff1a;Top –Hp PID 例如&#xff1a;Top –Hp 12086 3、打印线程堆栈信息 命令&#xff1a;Printf ‘%x\n’ PID 例如&#xff1a;printf ‘%x\n’ 12118 先将…

Google Optimization Tools介绍

Google Optimization Tools(OR-Tools)是一款专门快速而便携地解决组合优化问题的套件。它包含了&#xff1a;约束编程求解器。简单而统一的接口&#xff0c;用于多种线性规划和混合整数规划求解&#xff0c;包括 CBC、CLP、GLOP、GLPK、Gurobi、CPLEX 和SCIP。图算法 (最短路径…

11、mysql数据表中数据的查询(3)

说一下子查询&#xff0c;子查询的意义就是使用一个查询语句做为另一个查询语句的条件&#xff0c;一般使用exists和in来引导子查询 exists子查询 exists 放在 where 之后使用&#xff0c;可以看成查询数据所满足的一个条件&#xff0c;只是这个条件的值比较特殊&#xff08;…

使用.Net Core与Google Optimization Tools实现员工排班计划Scheduling

上一篇说完《Google Optimization Tools介绍》&#xff0c;让大家初步了解了Google Optimization Tools是一款约束求解&#xff08;CP&#xff09;的高效套件。那么我们用.Net Core与Google Optimization Tools来实现一个有关员工排班计划的场景感受一下。众所周知&#xff0c;…

42、Java服务内存OOM原因分析

1、出现问题的可能原因 对于应用来说内存分配太少 对象创建太多&#xff0c;又没有释放&#xff0c;造成内存泄漏严重&#xff0c;导致内存耗尽 申请太多的系统资源&#xff0c;系统资源耗尽。例如&#xff1a;不断创建线程&#xff0c;不断发起网络连接 2、如何定位问题&a…

Slickflow.NET 开源工作流引擎基础介绍-.NET Core2.0 版本实现介绍

前言&#xff1a;.NET Core 是.NET Framework的新一代版本&#xff0c;是微软开发的第一个跨平台 (Windows、Mac OSX、Linux) 的应用程序开发框架&#xff08;Application Framework&#xff09;&#xff0c;未来也将会支持 FreeBSD 与 Alpine 平台。.Net Core也是微软在一开始…

DotNetty 跨平台的网络通信库

久以来,.Net开发人员都非常羡慕Java有Netty这样&#xff0c;高效&#xff0c;稳定又易用的网络通信基础框架。终于微软的Azure团队&#xff0c;使用C#实现的Netty的版本发布。不但使用了C#和.Net平台的技术特点&#xff0c;并且保留了Netty原来绝大部分的编程接口。让我们在使用…

26、临时表的创建和重复数据的处理

UPDATE student b SET b.sname dd WHERE b.id (SELECT a.id FROM student a WHERE a.id 3) Mysql中根据条件&#xff08;表A中的字段&#xff09;操作表A中的数据时是不可以的 所以借助临时表来删除/更新重复的数据&#xff0c;原理就是删除每组重复数据中除id值最大的其他…

1、java简介

关于java介绍也没什么好说的&#xff0c;在这里简单介绍一下&#xff0c;说起java&#xff0c;我第一想到的就是它的简单和强大&#xff0c;简单是简单易学&#xff0c;开发速度快&#xff1b;强大是其功能强大&#xff0c;各个领域都可使用&#xff0c;其代码一次编译可以处处…

C# 观察者模式 以及 delegate 和 event

观察者模式这里面综合了几本书的资料.需求有这么个项目: 需求是这样的:一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, 它能从气象站获得这三个数据. 还有三种设备, 可以按要求展示气象站的最新数据.WeatherData的结构如下:有3个get方法, 分别获取最新的…