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,一经查实,立即删除!

相关文章

jzoj3832-在哪里建酿酒厂【指针】

正题 题目链接:https://jzoj.net/senior/#main/show/3832 题目大意 一个环形的&#xff0c;知道每个城市分布的位置和需要的酒数。然后要求在一个位置建厂使得运输价格最低。 解题思路 我们将数据复制一份放到后面&#xff0c;然后枚举建厂位置。我们现在要找到一个包含该位…

14、java中的集合(1)

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

动态规划练习3 [砝码称重]

【问题描述】 设有 1g 、 2g 、 3g 、 5g 、 10g 、 20g 的砝码各若干枚&#xff08;其总重 <1000 &#xff09;&#xff0c;用他们能称出的重量的种类数。 【输入文件】 a1 a2 a3 a4 a5 a6 &#xff08;表示 1g 砝码有 a1 个&#xff0c; 2g 砝码有 a2 个…

Microsoft AI - Custom Vision in C#

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

jzoj3833-平坦的折线【模型转换,LIS】

正题 题目链接:https://jzoj.net/senior/#contest/show/2930/3 题目大意 一个平面直角坐标系上有nnn个点&#xff0c;如果两个点之间斜率在−1∼1-1\sim 1−1∼1之间那么就可以连接&#xff0c;求最少多少条折线可以连接这些点。 解题思路 我们将整个坐标系逆时针选择45∘(4…

22、mysql主键自增值和偏移量的查看和修改

1、查看mysql自增值和偏移量 show variables like %increment%; auto_increment_increment1 -- 自增倍数是1 auto_increment_offset1 -- 偏移量是1 上边这是一般的设置&#xff0c;每次每次主键自增的倍数是1&#xff0c;偏移量是1 例如&#xff1a;插入第n条记录&#x…

动态规划训练5 [回文词]

【问题描述】 回文词是一种对称的字符串——也就是说&#xff0c;一个回文词&#xff0c;从左到右读和从右到左读得到的结果是一样 的。任意给定一个字符串&#xff0c;通过插入若干字符&#xff0c;都可以变成一个回文词。你的任务是写一个程序&#xff0c;求出将 给定字符串变…

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

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

40、使用javassit操作运行时字节码文件

1、是什么 Javassit是一个功能包&#xff0c;作用类似于java的反射&#xff0c;用于操作运行时字节码文件&#xff0c;实现动态编程&#xff0c;但性能高于反射。 2、怎么用&#xff1f; 首先需要获取存放class文件的容器ClassPool&#xff0c;根据全类名获取一个CtClass对象…

jzoj3844-统计损失【树形dp,换根法】

正题 题目链接:https://jzoj.net/senior/#main/show/3844 题目大意 一棵树&#xff0c;求每条路径的点权乘积之和。 解题思路 若只考虑从xxx出发往子树的路径&#xff0c;那么有fxaxax∗∑x−>yfyf_xa_xa_x*\sum_{x->y}f_yfx​ax​ax​∗x−>y∑​fy​ 定义gig_ig…

动态规划训练6 [统计单词个数]

【问题描述】 给出一个长度不超过 200 的由小写英文字母组成的字母串 ( 约定&#xff1a;该字母串以每行 20 个字母的方式输 入&#xff0c;且保证每行一定为 20 个 ) 。要求将此字母串分成 k 份 (1<k<40) &#xff0c;且每份中包含的单词个数加起来总数 最大 ( …

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…

jzoj3845-简单题【dp】

正题 题目链接:https://jzoj.net/senior/#main/show/3845 题目大意 美丽的仙人掌定义为&#xff1a; 一个仙人掌&#xff0c;第iii到jjj号点(i<j)(i<j)(i<j)一定存在一条经过了j−i1j-i1j−i1个点的简单路径。 给出一张无向图&#xff0c;选出最多的边使得它是一个…

微软将人工智能嵌入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…

动态规划训练8 [E - Multiplication Puzzle POJ1651]

Multiplication Puzzle POJ - 1651 题意&#xff1a; 在一个序列中&#xff0c;拿走一个数字&#xff0c;那么得分就是这个数字以及它相邻的两个数字&#xff0c;这三个数字的乘积。求最小得分。 这道题乍一看感觉是区间DP&#xff0c;但是需要逆向思考的技巧。 记dp[i][k]…

牛客-复读数组

正题 题目链接:https://ac.nowcoder.com/acm/contest/1103/A 题目大意 将一个长度为nnn的数组复制成kkk份&#xff0c;然后每个区间的值是一个区间中不同的数的数量&#xff0c;求每个非空区间的值和。 解题思路 若一个区间长度>n>n>n那么他们的值是固定的&#xf…

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…

25、sql分析命令explain和desc

explain和desc命令的效果相同&#xff0c;命令格式如下&#xff1a; mysql> explain SELECT s.id sid, s.name sname , t.id tid ,t.name tname FROM student s LEFT JOIN teacher t ON s.name t.name; --------------------------------------------------------------…