ASP.NET Core 2.0 使用支付宝PC网站支付

news/2024/5/20 5:35:34/文章来源:https://blog.csdn.net/findhappy117/article/details/79367375

概述

支付宝有比较多的支付产品,比如当面付、APP支付、手机网站支付、电脑网站支付等,本次讲的是电脑网站支付。

详细

代码下载:http://www.demodashi.com/demo/11730.html

前言

最近在使用ASP.NET Core来进行开发,刚好有个接入支付宝支付的需求,百度了一下没找到相关的资料,看了官方的SDK以及Demo都还是.NET Framework的,所以就先根据官方SDK的源码,用.NET Standard 2.0 实现了支付宝服务端SDK,Alipay.AopSdk.Core(github:https://github.com/stulzq/Alipay.AopSdk.Core) ,支持.NET CORE 2.0。为了使用方便,已上传至Nuget可以直接使用。

支付宝有比较多的支付产品,比如当面付、APP支付、手机网站支付、电脑网站支付等,本次讲的是电脑网站支付。

1.gif

一、创建项目

新建一个ASP.NET Core 2.0 MVC项目

2.gif

二、配置

由于我在开发的时候支付接口并没有申请下来,所以使用的是支付宝沙箱环境来进行开发的。

支付宝沙箱环境介绍:蚂蚁沙箱环境(Beta)是协助开发者进行接口功能开发及主要功能联调的辅助环境。沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑,在开发者应用上线审核前,开发者可以根据自身需求,先在沙箱环境中了解、组合和调试各种开放接口,进行开发调通工作,从而帮助开发者在应用上线审核完成后,能更快速、更顺利的进行线上调试和验收工作。
如果在签约或创建应用前想要进行集成测试,可以使用沙箱环境。
沙箱环境支持使用个人账号或企业账号登陆。

沙箱环境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info

1、生成秘钥

下载支付宝官方提供的密钥生成工具来进行生成,详细介绍:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105971&docType=1

2、设置应用公钥

我们生成密钥之后,需要到支付宝后台设置应用公钥,就是我们生成的公钥。

3.gif

设置之后,支付宝会给我们一个支付宝公钥,保存这个支付宝公钥

这个支付宝公钥和我们自己生成的公钥是不一样的,我们在配置SDK时用的公钥就是支付宝公钥

3、配置SDK

新建一个Config类,在里面存储我们的配置。

public class Config
{// 应用ID,您的APPIDpublic static string AppId = "";// 支付宝网关public static string Gatewayurl = "";// 商户私钥,您的原始格式RSA私钥public static string PrivateKey = "";// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。public static string AlipayPublicKey = "";// 签名方式public static string SignType = "RSA2";// 编码格式public static string CharSet = "UTF-8";
}
  • 应用ID和支付宝网关都可以在支付宝后台查看。

  • 商户私钥即我们自己生成的私钥,公钥就是支付宝公钥这里一定要注意,别用错了。这里的公钥私钥直接填写字符串即可。

  • 签名方式推荐使用RSA2,使用RSA2,支付宝会用SHA256withRsa算法进行接口调用时的验签(不限制密钥长度)。

  • 编码格式,如果我们是直接配置的字符串(公钥、私钥),那么就是我们代码的编码,如果使用的是文件(公钥、私钥),那么就是文件的编码。

  • 完成配置如下:

三、添加SDk

官方SDK的源码(.NET Framework),用.NET Standard 2.0 实现的支付宝服务端SDK,Alipay.AopSdk.Core(github:https://github.com/stulzq/Alipay.AopSdk.Core) ,支持.NET Core 2.0。
通过Nuget安装:Install-Package Alipay.AopSdk.Core

四、支付

添加一个控制器 PayController

/// 发起支付请求
/// </summary>
/// <param name="tradeno">外部订单号,商户网站订单系统中唯一的订单号</param>
/// <param name="subject">订单名称</param>
/// <param name="totalAmout">付款金额</param>
/// <param name="itemBody">商品描述</param>
/// <returns></returns>
[HttpPost]
public void PayRequest(string tradeno,string subject,string totalAmout,string itemBody)
{DefaultAopClient client = new DefaultAopClient(Config.Gatewayurl, Config.AppId, Config.PrivateKey, "json", "2.0",Config.SignType, Config.AlipayPublicKey, Config.CharSet, false);// 组装业务参数modelAlipayTradePagePayModel model = new AlipayTradePagePayModel();model.Body = itemBody;model.Subject = subject;model.TotalAmount = totalAmout;model.OutTradeNo = tradeno;model.ProductCode = "FAST_INSTANT_TRADE_PAY";AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();// 设置同步回调地址request.SetReturnUrl("http://localhost:5000/Pay/Callback");// 设置异步通知接收地址request.SetNotifyUrl("");// 将业务model载入到requestrequest.SetBizModel(model);var response = client.SdkExecute(request);Console.WriteLine($"订单支付发起成功,订单号:{tradeno}");//跳转支付宝支付Response.Redirect(Config.Gatewayurl + "?" + response.Body);
}

运行:

  • 图1

  • 图2

  • 图3

五、支付异步回调通知

支付宝同步回调通知(支付成功后跳转到商户网站),是不可靠的,所以这里必须使用异步通知来获取支付结果,异步通知即支付宝主动请求我们提供的地址,我们根据请求数据来校验,获取支付结果。

/// <summary>
/// 支付异步回调通知 需配置域名 因为是支付宝主动post请求这个action 所以要通过域名访问或者公网ip
/// </summary>
public async void Notify()
{/* 实际验证过程建议商户添加以下校验。1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)4、验证app_id是否为该商户本身。*/Dictionary<string, string> sArray = GetRequestPost();if (sArray.Count != 0){bool flag = AlipaySignature.RSACheckV1(sArray, Config.AlipayPublicKey,Config.CharSet, Config.SignType, false);if (flag){//交易状态//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_amount与通知时获取的total_fee为一致的//如果有做过处理,不执行商户的业务程序//注意://退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知Console.WriteLine(Request.Form["trade_status"]);await Response.WriteAsync("success");}else{await Response.WriteAsync("fail");}}
}

六、同步回调

同步回调即支付成功跳转回商户网站

运行:

/// <summary>
/// 支付同步回调
/// </summary>
[HttpGet]
public  IActionResult Callback()
{/* 实际验证过程建议商户添加以下校验。1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)4、验证app_id是否为该商户本身。*/Dictionary<string, string> sArray = GetRequestGet();if (sArray.Count != 0){bool flag = AlipaySignature.RSACheckV1(sArray, Config.AlipayPublicKey, Config.CharSet, Config.SignType, false);if (flag){Console.WriteLine($"同步验证通过,订单号:{sArray["out_trade_no"]}");ViewData["PayResult"] = "同步验证通过";}else{Console.WriteLine($"同步验证失败,订单号:{sArray["out_trade_no"]}");ViewData["PayResult"] = "同步验证失败";}}return View();
}

七、订单查询

查询订单当前状态:已付款、未付款等等。

运行:

[HttpPost]
public JsonResult Query(string tradeno, string alipayTradeNo)
{DefaultAopClient client = new DefaultAopClient(Config.Gatewayurl, Config.AppId, Config.PrivateKey, "json", "2.0",Config.SignType, Config.AlipayPublicKey, Config.CharSet, false);AlipayTradeQueryModel model = new AlipayTradeQueryModel();model.OutTradeNo = tradeno;model.TradeNo = alipayTradeNo;AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();request.SetBizModel(model);var response = client.Execute(request);return Json(response.Body);
}

八、订单退款

退回该订单金额。

运行:

/// <summary>
/// 订单退款
/// </summary>
/// <param name="tradeno">商户订单号</param>
/// <param name="alipayTradeNo">支付宝交易号</param>
/// <param name="refundAmount">退款金额</param>
/// <param name="refundReason">退款原因</param>
/// <param name="refundNo">退款单号</param>
/// <returns></returns>
[HttpPost]
public JsonResult Refund(string tradeno,string alipayTradeNo,string refundAmount,string refundReason,string refundNo)
{DefaultAopClient client = new DefaultAopClient(Config.Gatewayurl, Config.AppId, Config.PrivateKey, "json", "2.0",Config.SignType, Config.AlipayPublicKey, Config.CharSet, false);AlipayTradeRefundModel model = new AlipayTradeRefundModel();model.OutTradeNo = tradeno;model.TradeNo = alipayTradeNo;model.RefundAmount = refundAmount;model.RefundReason = refundReason;model.OutRequestNo = refundNo;AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();request.SetBizModel(model);var response = client.Execute(request);return Json(response.Body);
}

九、退款查询

查询退款信息。

运行:

/// <summary>
/// 退款查询
/// </summary>
/// <param name="tradeno">商户订单号</param>
/// <param name="alipayTradeNo">支付宝交易号</param>
/// <param name="refundNo">退款单号</param>
/// <returns></returns>
[HttpPost]
public JsonResult RefundQuery(string tradeno,string alipayTradeNo,string refundNo)
{DefaultAopClient client = new DefaultAopClient(Config.Gatewayurl, Config.AppId, Config.PrivateKey, "json", "2.0",Config.SignType, Config.AlipayPublicKey, Config.CharSet, false);if (string.IsNullOrEmpty(refundNo)){refundNo = tradeno;}AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();model.OutTradeNo = tradeno;model.TradeNo = alipayTradeNo;model.OutRequestNo = refundNo;AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();request.SetBizModel(model);var response = client.Execute(request);return Json(response.Body);
}

十、订单关闭

对一定时间以后没有进行付款的订单进行关闭,订单状态需为:待付款,已完成支付的订单无法关闭。

运行:

/// <summary>
/// 关闭订单
/// </summary>
/// <param name="tradeno">商户订单号</param>
/// <param name="alipayTradeNo">支付宝交易号</param>
/// <returns></returns>
[HttpPost]
public JsonResult OrderClose(string tradeno, string alipayTradeNo)
{DefaultAopClient client = new DefaultAopClient(Config.Gatewayurl, Config.AppId, Config.PrivateKey, "json", "2.0",Config.SignType, Config.AlipayPublicKey, Config.CharSet, false);AlipayTradeCloseModel model = new AlipayTradeCloseModel();model.OutTradeNo = tradeno;model.TradeNo = alipayTradeNo;AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();request.SetBizModel(model);var response = client.Execute(request);return Json(response.Body);
}

十、项目文件截图

blob.png

十一、地址集合

  • 支付宝API文档

  • 支付宝沙箱环境

  • 支付宝密钥生成工具

  • 支付宝服务端SDK源码

  • 支付宝服务端SDK Nuget



代码下载:http://www.demodashi.com/demo/11730.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权


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

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

相关文章

基于Python-Flask实现的网站例子

概述 使用Flask写的体育网站 包括&#xff08;注册 论坛 文章评论 组建战队 后台管理&#xff09;等功能 示例地址文中有写 萌新 请多指教详细 代码下载&#xff1a;http://www.demodashi.com/demo/12380.html 项目示例地址: 网站演示 一、环境搭建 1. 安装配置python3.6 示例网…

JavaScript 编程精解 中文第三版 二十一、项目:技能分享网站

二十一、项目&#xff1a;技能分享网站 原文&#xff1a;Project: Skill-Sharing Website 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《JavaScript 编程精解&#xff08;第 2 版&#xff09;》 If you have knowledge, let others l…

基于webmagic的种子网站爬取

代码地址如下&#xff1a;http://www.demodashi.com/demo/12175.html 1. 概述 因为无聊&#xff0c;闲来没事做&#xff0c;故突发奇想&#xff0c;爬个种子&#xff0c;顺便学习爬虫。本文将介绍使用Spring/Mybatis/webmagic等框架构建项目并爬取种子磁链。 2. 项目搭建 如下…

基于React的PC网站前端架构分析

代码地址如下&#xff1a;http://www.demodashi.com/demo/12252.html 本文适合对象 有过一定开发经验的初级前端工程师&#xff1b;有过完整项目的开发经验&#xff0c;不论大小&#xff1b;对node有所了解&#xff0c;关注前端发展&#xff0c;了解所谓“大前端”的概念&…

基于Python-Flask实现的网站例子

概述 使用Flask写的体育网站 包括&#xff08;注册 论坛 文章评论 组建战队 后台管理&#xff09;等功能 示例地址文中有写 萌新 请多指教 详细 项目示例地址: 网站演示 源码下载地址&#xff1a; http://www.demodashi.com/demo/12380.html 一、环境搭建 1. 安装配置py…

Python-Flask实现基金自选网站

代码地址如下&#xff1a;http://www.demodashi.com/demo/14734.html 项目介绍 本项目的基金数据来自天天基金网&#xff0c;但该网站用户体验较差&#xff0c;内容冗余&#xff0c;故自己实现一个轻量级网站&#xff0c;从8个指标维度对股票基金和债券基金进行挑选&#xff0…

任晶磊:如何看待程序员在 GitHub 发起抗议互联网公司实行 996 工作制网站?

作者&#xff1a;任晶磊 有人说&#xff0c;此行为艺术仍然停留在抱怨的阶段。那么我们来看看出路在何方&#xff0c;所幸已有人在路上。注意&#xff0c;这里都是正在落地的干货。 Disclaimer&#xff1a;我在表达观点时会引用自己的研究工作。如果认为此有夹带私货之嫌&…

大型网站架构系列:分布式消息队列

以下是消息队列以下的大纲&#xff0c;本文主要介绍消息队列概述&#xff0c;消息队列应用场景和消息中间件示例&#xff08;电商&#xff0c;日志系统&#xff09;。 本次分享大纲 消息队列概述消息队列应用场景消息中间件示例JMS消息服务常用消息队列参考&#xff08;推荐&am…

Python网页分析,分析网站的日志数据

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 以下文章来源于大话数据分析&#xff0c;作者&#xff1a;尚天强 网站的日志数据记录了所有Web对服务器的访问活动&#xff0c;本节通过Python第…

基于django快速开发一个网站(一)

* 创建虚拟环境、基于虚拟环境创建django2.0.0和图片加载库和mysql数据库驱动 1. 创建目录并创建虚拟环境 ╰$ mkdir Cornucopiavirtualenv ╰$ cd Cornucopiavirtualenv ╰$ virtualenv env1 2. 进入bin目录&#xff0c;并激活虚拟环境 ╰$ cd bin ╰$ source activate …

发现一个好看的手机壁纸网站,撸代码的手已经饥渴难耐了

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 最近有同学的爬虫代码出了bug&#xff0c;给问我怎么改 于是就发现了这个好看的手机壁纸网站。 看到那么多好看的壁纸&#xff0c;我的爬虫已经饥渴难耐…

浅谈web网站架构演变过程

前言我们以javaweb为例&#xff0c;来搭建一个简单的电商系统&#xff0c;看看这个系统可以如何一步步演变。该系统具备的功能&#xff1a;用户模块&#xff1a;用户注册和管理商品模块&#xff1a;商品展示和管理交易模块&#xff1a;创建交易和管理阶段一、单机构建网站网站的…

php域名墙检测,php 网站域名被墙判断请求方法

可以使用exec去进行查询判断&#xff0c;判断traceroute to 出的ip和最后追踪到的IP是否匹配&#xff0c;如果不匹配可能就被墙了。也可以有个保险的方法&#xff0c;去请求下看是否有返回数据没有基本就是墙了。查询命令方法&#xff1a;traceroute --tcp youtubemy.com[rootl…

思科模拟器企业网站服务器配置,思科模拟器服务器配置

思科模拟器服务器配置 内容精选换一换虚拟IP(Virtual IP Address&#xff0c;简称VIP)是一个未分配给真实弹性云服务器网卡的IP地址。弹性云服务器除了拥有私有IP地址外&#xff0c;还可以拥有虚拟IP地址&#xff0c;用户可以通过其中任意一个IP(私有IP/虚拟IP)访问此弹性云服务…

推荐95个极富创意的单页网站设计实例欣赏

随着网络带宽的快速提升&#xff0c;越来越多的Web视觉设计师开始将自己的网页设计推向单页面的表现形式&#xff0c;他们在不断的尝试各种令人耳目一新的设计方案&#xff0c;像下面的这些例子有很多都是出自个人网站&#xff0c;使用JavaScript来实现单页面内的内容切换&…

30 个用于杂志网站的 WordPress 主题

WordPress 已经形成了一个非常完善的生态链&#xff0c;为 WordPress 开发的各种插件、主题越来越丰富。本文介绍 30 个适用于杂志网站使用的 WordPress 主题&#xff0c;其中也包含一些收费的主题&#xff0c;制作非常精美。 免费的 WordPress 杂志主题 Snips DotNews Render …

网站安全检测 Web 安全测试工具

随着 Web 应用越来越广泛&#xff0c;Web 安全威胁日益凸显。黑客利用网站操作系统的漏洞和 Web 服务程序的 SQL 注入漏洞等得到Web服务器的控制权限&#xff0c;轻则篡改网页内容&#xff0c;重则窃取重要内部数据&#xff0c;更为严重的则是在网页中植入恶意代码&#xff0c;…

SharePoint 2010设计(Design)权限能操作的网站操作菜单项

在SharePoint平台中有经典的5大权限&#xff1a;完全控制、设计、参与讨论、只读、仅查看。其中设计权限与完全控制权限有些相似&#xff0c;而只读和仅查看基本上差不多&#xff0c;参与讨论权限主要是针对内容管理的。设计权限在SharePoint 2010里是不能设置权限的&#xff0…

ubuntu服务器网站备份,用 Ubuntu 建立 Time Machine 备份服务器

用 Ubuntu 建立 Time Machine 备份服务器&#xff1a;1、安装 Netatalksudo apt-get install netatalk2、设置 Time Machine 备份文件存放位置, 假设位置在 /backup/TimeMachinesudo vi /etc/netatak/AppleVolumes.default#~/ "Home Directory"/backup/TimeMachine &…

arcgis制作瓦片地图_挖掘Dark Sky Maps(热的要死后,疯传的一个气温地图网站)...

最近&#xff0c;各种朋友圈&#xff0c;社会媒体&#xff0c;都在疯传一张图&#xff0c;这张图显示的全球的气温图&#xff0c;本没有什么特别的&#xff0c;但是这张图的网站来源所展示的数据与气象局或者各种天气预报的温度值相差倒是不少&#xff0c;引来一片网友的吐槽。…