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

这篇文章将介绍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. UVA-818 dfs + 位运算

    暴力枚举一些圆环,将这些圆环解开,看能否成为单链.判断单链的三个条件: 除了这些删除的圆环之外,其他圆环还连接着的圆环不能超过两个. 剩下的环没有连成圈. 剩下的圆环共分成m堆,每堆之间无连接,m必须 ...

  2. PDO学习

    参考: http://php.net/manual/zh/pdostatement.fetch.php http://php.net/manual/zh/pdo.constants.php

  3. springmvc报406错误

    springmvc出现406,无非就两种情况,第一,百分之九十是json包没加进来,第二,百分之十,就是@ResponseBody返回的的数据,在请求的URL中不能有  .html的后缀

  4. HashMap/HashSet,hashCode,哈希表

    hash code.equals和“==”三者的关系 1) 对象相等则hashCode一定相等: 2) hashCode相等对象未必相等. == 是比较地址是否相等,JAVA中声明变量都是引用嘛,不同 ...

  5. 八爪鱼采集器︱爬取外网数据(twitter、facebook)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 要想采集海外数据有两种方式:云采集+单机采集. ...

  6. Form提交表单页面不跳转

    1.设计源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  7. R语言︱非结构化数据处理神器——rlist包

    本文作者:任坤,厦门大学王亚南经济研究院金融硕士生,研究兴趣为计算统计和金融量化交易,pipeR,learnR,rlist等项目的作者. 近年来,非关系型数据逐渐获得了更广泛的关注和使用.下面分别列举 ...

  8. FusionWidgets DrawingPad图

    1.数据源 DrawingPad.xml: <?xml version="1.0" encoding="UTF-8"?> <chart bgC ...

  9. JDBC异常总结

    1.异常一 (1)详情如下 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source reje ...

  10. C#中各种计时器 Stopwatch、TimeSpan

    1.使用 Stopwatch 类 (System.Diagnostics.Stopwatch)Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.在典型的 St ...