ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇
// 随着版本更迭,新版本可能无法完全适用,请参考仓库内的示例。
这篇文章将介绍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 应用程序"项目,我将它命名为AlipaySample.
2. 引入安装Nuget包 "Essensoft.AspNetCore.Payment.Alipay". 目前(2018/03/29)版本为 1.2.1
3. 在Startup.cs文件内 添加依赖注入、设置参数(蚂蚁金服开放平台 - 账户管理 - 密钥管理 - 开放平台密钥)
代码:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(); // 添加支付宝客户端依赖注入
services.AddAlipay(); // 可在添加依赖注入时设置参数 一般设置 AppId、RsaPrivateKey、RsaPublicKey,其余默认即可.
// 如:
//services.AddAlipay(opt =>
//{
// //此处为蚂蚁金服开放平台上创建的APPID,而非老版本的商户号
// opt.AppId = ""; // // 这里的公私钥 默认均为支付宝官方推荐使用的RSAWithSHA256.
// // 商户私钥
// opt.RsaPrivateKey = "";
// // 支付宝公钥
// opt.RsaPublicKey = "";
//}); // 具体参数见 AlipayOptions // 注册配置实例
services.Configure<AlipayOptions>(Configuration.GetSection("Alipay")); // 两种方式设置注册配置实例参数 // 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 // 配置文件内容如下('...'为省略的项目其他配置内容,若有的情况下 -_-!): //{
// ...
// ...
//
// "Alipay": {
// "AppId": "",
// "RsaPublicKey": "",
// "RsaPrivateKey": ""
// }
//}
}
4. 添加一个控制器, 我将其命名为 AlipayController.cs
代码:
using Essensoft.AspNetCore.Payment.Alipay;
using Essensoft.AspNetCore.Payment.Alipay.Domain;
using Essensoft.AspNetCore.Payment.Alipay.Notify;
using Essensoft.AspNetCore.Payment.Alipay.Request;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks; namespace AlipaySample.Controllers
{
public class AlipayController : Controller
{
// 支付宝请求客户端(用于处理请求与其响应)
private readonly AlipayClient _client = null; // 支付宝通知客户端(用于解析异步通知或同步跳转)
private readonly AlipayNotifyClient _notifyClient = null; // 赋值依赖注入对象
public AlipayController(AlipayClient client, AlipayNotifyClient notifyClient)
{
_client = client;
_notifyClient = notifyClient;
} [HttpPost]
public async Task<IActionResult> PagePay(string out_trade_no, string subject, string total_amount, string body, string product_code, string notify_url, string return_url)
{
// 组装模型
var model = new AlipayTradePagePayModel()
{
Body = body,
Subject = subject,
TotalAmount = total_amount,
OutTradeNo = out_trade_no,
ProductCode = product_code,
}; var req = new AlipayTradePagePayRequest(); // 设置请求参数
req.SetBizModel(model); // 设置异步通知URL
req.SetNotifyUrl(notify_url); // 设置同步跳转URL
req.SetReturnUrl(return_url); // 页面请求处理 传入 'GET' 返回的 response.Body 为 URL, 'POST' 返回的 response.Body 为 HTML.
var response = await _client.PageExecuteAsync(req, null, "GET"); // 重定向到支付宝电脑网页支付页面.
return Redirect(response.Body);
} /// <summary>
/// 电脑网页支付-同步跳转
/// 常用于展示订单支付状态页,建议在异步通知统一做业务处理,而不是在此处.
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<IActionResult> PagePayReturn()
{
try
{
// 以 AlipayTradePagePayReturnResponse 类型 解析
var notify = await _notifyClient.ExecuteAsync<AlipayTradePagePayReturnResponse>(Request);
return Content("成功:" + notify.OutTradeNo);
}
catch
{
return Content("参数异常/验签失败");
}
} /// <summary>
/// 电脑网页支付-异步通知
/// 常用于订单业务处理
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> PagePayNotify()
{
try
{
// 以 AlipayTradePagePayNotifyResponse 类型 解析
var notify = await _notifyClient.ExecuteAsync<AlipayTradePagePayNotifyResponse>(Request);
if ("TRADE_SUCCESS" == notify.TradeStatus) // 订单是否交易完成
{
// 业务代码
// ...
// ... //返回给支付宝成功内容,停止继续通知
return Content("success", "text/plain");
}
// 订单其他状态均返回给支付宝空内容.
return NoContent();
}
catch
{
// 参数异常/验签失败均返回给支付宝空内容.
return NoContent();
}
}
}
}
5. 修改 Views/Home/Index 页面,用于网站提交支付请求.
代码:
@{
ViewData["Title"] = "Home Page";
} <div style="padding:24px 0">
<h3>支付宝 电脑网站支付 - <a href="https://docs.open.alipay.com/270/alipay.trade.page.pay" target="_blank">API文档</a></h3>
<hr />
<form asp-controller="Alipay" asp-action="PagePay" target="_blank">
<div class="form-group">
<label>body:</label>
<input type="text" class="form-control" name="body" value="支付宝网站支付测试详情">
</div>
<div class="form-group">
<label>subject:</label>
<input type="text" class="form-control" name="subject" value="支付宝网站支付测试">
</div>
<div class="form-group">
<label>total_amount:</label>
<input type="text" class="form-control" name="total_amount" value="0.01">
</div>
<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>product_code:</label>
<input type="text" class="form-control" name="product_code" value="FAST_INSTANT_TRADE_PAY">
</div>
<div class="form-group">
<label>notify_url(通知Url需外网环境可访问):</label>
<input type="text" class="form-control" name="notify_url" value="http://xxx.com/alipay/pagepaynotify">
</div>
<div class="form-group">
<label>return_url:</label>
<input type="text" class="form-control" name="return_url" value="http://xxx.com/alipay/pagepayreturn">
</div>
<button type="submit" class="btn btn-primary">提交</button>
</form>
</div>
实现页面如下:
有疑问可以在 https://github.com/Essensoft/Payment 提交Issue ,也可以加入Payment 交流群:522457525
本篇文章到此结束,具体效果可自行测试。感谢各位观看。
ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇的更多相关文章
- 【转载】ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇
转自:http://www.cnblogs.com/essenroc/p/8627775.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入支付宝-电脑网页支付 ...
- 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,实现接入微信-扫码支付及异步 ...
- ASP.NET Core Web 支付功能接入 微信-扫码支付篇(转)
原文 https://www.cnblogs.com/essenroc/p/8630730.html // 随着版本更迭,新版本可能无法完全适用,请参考仓库内的示例. 这篇文章将介绍ASP.NET C ...
- 手机网站支付如何接入支付宝简易版支付功能PHP版
接入支付宝准备工作:(关于账号可以是个体商户也可以是企业账号但必须有营业执照) 1.登录蚂蚁金服开放平台 2.创建应用,应用分类网页应用和移动应用.应用提交审核审核通过后得到Appid才能调用相应的 ...
- asp.net core web的导入导出excel功能
这里主要记录下asp.net core web页面上进行导入导出excel的操作. 主要是导入,因为现在使用的很多前端框架(例如kendo ui)本身就有导出的功能. 这里使用到EPPlus.Core ...
- ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现
很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构.这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地 ...
- Azure 部署 Asp.NET Core Web App
在云计算大行其道的时代,当你在部署一个网站时,第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core 的网站呢?Azure 的 Web A ...
- 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)
对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...
随机推荐
- Unity引擎与C#脚本简介
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 由 QQ会员技术团队 发布在云+社区 1. Unity编辑器基础 从原理上讲,游戏开发就是将一系列变动的场景呈现在玩家面前,并根据玩家的输入 ...
- .net mvc web api 返回 json 内容时过滤值为null的属性
1.响应内容(过滤前) {"msg":"初始化成功!","code":"","success":tr ...
- Linux基础六
用户账号管理 基于账号身份对资源访问进行控制 账户类别:用户账号,组账号 识别方式:UID,GID 用户账号:超级用户root,系统用户,普通用户 组账号:用来区分权限,不用于登陆 基本组(私有组) ...
- DM6446的Bootloader
RBL(ARM ROM Boot Loader)在芯片出厂的时候就已经烧写到ROM里了,这不需要大家关心,上电后,RBL会自动从EMIFA EM_CS2 memory space (0x0200 00 ...
- dojo中取查询出来的地市维表数据的id
1.页面中引入隐藏域 <input type="hidden" id="area_desc"/> 2.通过在属性中设置 onchange:funct ...
- Netty的并发编程实践5:不要依赖线程优先级
当有多个线程同时运行的时候,由线程调度器来决定哪些线程运行.哪些等待以及线程切换的时间点,由于各个操作系统的线程调度器实现大相径庭,因此,依赖JDK自带的线程优先级来设置线程优先级策略的方法是错误和非 ...
- emWin 2天速成实例教程000_如何快速入门ucGUI/emWin
备注:(1)打开工程目录下的"Exe\GUISimulationDebug.exe"即可看到效果.(2)看完教程000-005就基本会用emWin做项目,其他章节可以需要时再参考. ...
- CSS3 2D、3D转换
2D转换方法:transform().rotate().scale().skew().matrix() 3D转换方法:rotateX().rotateY() 1.示例代码 <!DOCTYPE h ...
- Python基础_函数2
在介绍完函数的大体概念如定义.传参.作用域之后,本节主要介绍函数的几个细节部分. 一. print()函数与return的区别. 相同点:print与return都是向用户在输出界面上展示结果 不同点 ...
- [HNOI2011]XOR和路径 && [HNOI2013]游走
[HNOI2011]XOR和路径 题目大意 具体题目:戳我 题目: 给定一个n个点,m条边的有重边.有自环的无向图,其中每个边都有一个边权. 现在随机选择一条1到n的路径,路径权值为这条路径上所有边权 ...