// 随着版本更迭,新版本可能无法完全适用,请参考仓库内的示例。

这篇文章将介绍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 支付功能接入 支付宝-电脑网页支付篇的更多相关文章

  1. 【转载】ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇

    转自:http://www.cnblogs.com/essenroc/p/8627775.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入支付宝-电脑网页支付 ...

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

    这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET Core SDK ...

  3. 【转载】ASP.NET Core Web 支付功能接入 微信-扫码支付篇

    转自:http://www.cnblogs.com/essenroc/p/8630730.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步 ...

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

    原文 https://www.cnblogs.com/essenroc/p/8630730.html // 随着版本更迭,新版本可能无法完全适用,请参考仓库内的示例. 这篇文章将介绍ASP.NET C ...

  5. 手机网站支付如何接入支付宝简易版支付功能PHP版

    接入支付宝准备工作:(关于账号可以是个体商户也可以是企业账号但必须有营业执照) 1.登录蚂蚁金服开放平台  2.创建应用,应用分类网页应用和移动应用.应用提交审核审核通过后得到Appid才能调用相应的 ...

  6. asp.net core web的导入导出excel功能

    这里主要记录下asp.net core web页面上进行导入导出excel的操作. 主要是导入,因为现在使用的很多前端框架(例如kendo ui)本身就有导出的功能. 这里使用到EPPlus.Core ...

  7. ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现

    很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构.这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地 ...

  8. Azure 部署 Asp.NET Core Web App

    在云计算大行其道的时代,当你在部署一个网站时,第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core 的网站呢?Azure 的 Web A ...

  9. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

    对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...

随机推荐

  1. @restcontroller与@controller的区别

    这段时间偷偷看了下spring boot.结果引用模板时没注意,把@restcontroller替换了@controlle,结果模板出不来.终究原因是spring的知识不到位. 下面说说这2的说明和区 ...

  2. FusionCharts封装-Data

    DataSet.java: /** * @Title:DataSet.java * @Package:com.fusionchart.model * @Description:FusionCharts ...

  3. 解决 Cannot find OpenSSL's <evp.h> 和sasl.h not found!

    编译mongodb拓展出现 Cannot find OpenSSL's <evp.h> 解决方法:安装openssl yum install openssl openssl-devel 出 ...

  4. 判断一个jquery对象是否为空

    今天用jquery $获取一个jquery对象.$("#id") 然后用判断这个对象是否存在,id不存在的时候,判断这个是否存在, if($("#id")) 始 ...

  5. SQL注入攻击三部曲之进阶篇

    SQL注入攻击三部曲之进阶篇 通过入门篇的学习,我们知道了SQL注入攻击的判断方法,但是如果想侵入网站,获取网站的机密内容,那么仅靠入门篇的知识是无法达到的.本篇文章我们将进一步的分析SQL注入攻击. ...

  6. Java Web项目缺少jsp、servlet jar包

    1.错误描述  Caused by:java.lang.ClassNotFoundException:javax.servlet.jsp.PageContent 2.错误原因      缺少有关的js ...

  7. 错误卸载软件导致Windows7系统中的软件无法播放视频

    1.错误描述 2.错误原因 在卸载软件时,不小心将Windows7中的服务给删除了 3.解决办法 重新安装操作系统

  8. TypeError: Error #1034: 强制转换类型失败:无法将 mx.controls::DataGrid@9a7c0a1 转换为 spark.core.IViewport。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 mx.controls::DataGrid@9aa90a1 转换为 spark.core.IViewport. ...

  9. 微软依赖注入Unity

    Unity是一个依赖注入(Dependency Injection,DI)容器.DI的标准描述文章来自Martin Flower[0].作为一个快速的摘要,依赖注入容器就是一个用于构建高度松耦合的软件 ...

  10. 查找IFileSourceFilter上的Pin

    创建了IFileSourceFilter,可IFileSourceFilter好像不是从IBaseFilter继承来的,没有EnumPins,那应该怎么查找IFileSourceFilter上的pin ...