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

news/2024/5/15 3:55:15/文章来源:https://blog.csdn.net/weixin_33721344/article/details/85944314

前言

最近在使用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支付、手机网站支付、电脑网站支付等,本次讲的是电脑网站支付。

668104-20170928113142778-998090264.png

如果你没有时间阅读文章,可以直接从github获取Demo原来进行查看,非常简单。github: https://github.com/stulzq/Alipay.Demo.PCPayment

创建项目

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

668104-20170928120255184-232813832.png

配置

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

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

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

1.生成密钥

这里所使用的RSA密钥标准为PKCS1,需要特别注意。

可以下载我写的密钥生成器:https://github.com/dotnetcore/Alipay.AopSdk.Core/tree/dev/tool

运行可以直接生成长度为2048标准为PKCS1的公钥和私钥。

668104-20180516161536950-688189340.png

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

2.设置应用公钥

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

668104-20170928114115122-123212068.png

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

668104-20170928114214372-1742883812.png

这个支付宝公钥和我们自己生成的公钥是不一样的,我们在配置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和支付宝网关都可以在支付宝后台查看。

668104-20170928114539419-787191384.png

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

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

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

  • 完成配置如下:

668104-20170928115000887-1386299754.png

添加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

668104-20170928120100840-748810867.png

支付

添加一个控制器 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

668104-20170928121809512-870471219.png

  • 图2

668104-20170928121829122-481143122.png

  • 图3

668104-20170928121921137-1859334726.png

支付异步回调通知

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

/// <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");}}
}

同步回调

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

运行:

668104-20170928122001044-26773231.png

/// <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();
}

订单查询

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

运行:

668104-20170928122027512-1678447959.png

[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);
}

订单退款

退回该订单金额。

运行:

668104-20170928122113544-1399356955.png

/// <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);
}

退款查询

查询退款信息。

运行:

668104-20170928122140450-358962496.png

/// <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);
}

订单关闭

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

运行:

668104-20170928122153044-969635053.png

/// <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);
}

地址集合

  • 支付宝API文档
  • 支付宝沙箱环境
  • 支付宝密钥生成工具
  • 支付宝服务端SDK源码
  • 支付宝服务端SDK Nuget

最重要的:

本文Demo:https://github.com/stulzq/Alipay.Demo.PCPayment

如果有问题欢迎提出!

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

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

相关文章

python 爬取图片、没有后缀名_初学Python-只需4步,爬取网站图片(附py文件)

很多人学习Python很重要的一个原因是&#xff0c;可以很简单的把一个网站的数据爬下来。尤其是做我们这一行&#xff0c;产品经理&#xff0c;电商行业。领导&#xff1a;弄一个买卖游戏周边商品的交易APP出来。我&#xff1a;行&#xff0c;那我们卖什么呀&#xff1f;领导&am…

python 实现爬取网站下所有URL

python3 实现爬取网站下所有URL获取首页元素信息&#xff1a;首页的URL链接获取&#xff1a;遍历第一次返回的结果&#xff1a;递归循环遍历&#xff1a;全部代码如下&#xff1a;小结&#xff1a;python3.6 requests && bs4 采用递归方法&#xff0c;最终爬取网站所有…

企业网站托管外包公司有哪几种形式?

所有的企业网络营销都离不开网站&#xff0c;网站是基础也是核心。试问一句如果企业没有网站维护人员&#xff0c;那么企业选择网站托管公司网站托管公司又包括哪些内容呢?1网站策划任何一个企业的网络营销工作都是从网站策划开始的&#xff0c;前期网站策划的好坏直接影响着后…

自动化测试 (一) 12306火车票网站自动登录工具

还记得2011年春运&#xff0c;12306火车票预订网站经常崩溃无法登录吗。 今天我们就开发一个12306网站自动登录软件。 帮助您轻松订票 通过前两篇博客Fiddler教程和HTTP协议详解&#xff0c;我们了解了Web的原理. Web的原理就是&#xff0c;浏览器发送一个Request给Web服务器…

如何做一个大数据seo人员

作为流量运营者或者SEO人员&#xff0c;对于所从事行业领域的认识往往建立在一种直觉之上&#xff0c;我们很难对一个行业有一个全面的了解&#xff0c;这个行业领域有多宽&#xff0c;流量聚焦在哪里&#xff0c;那些是用户最关心的问题&#xff1f; 有的时候很难准确的把握&a…

7年测试工程师经验,浅谈一下如何测试一个web网站?

最近有工作了一年多的朋友在问我&#xff0c;一个web页面到底怎么测试&#xff1f;我的第一感觉是震惊&#xff0c;天天做web测试&#xff0c;咋还不知道怎么测试呢&#xff1f;再仔细一想&#xff0c;可能是我们每天忙于测试而忽略测试导致的&#xff0c;毕竟当局者迷&#xf…

dz论坛Discuz_X3.4最新网站漏洞

近期我们sinesafe安全部门审计discuz最新版的时候发现配置文件写入导致代码执行的问题。cms安装的时候一般会分为几个步骤去进行&#xff0c;其中有对配置文件config进行写入的步骤&#xff0c;当写入的时候未严格限制传入的参数就存在代码执行问题。 源码信息&#xff1a;Disc…

软件测试:测试一个网站

一、软件测试的原则 1、软件测试应尽早执行&#xff0c;并贯穿于整个软件生命周期 2、软件测试应追溯需求 3、测试应由第三方来构造 4、穷举测试是不可能的,要遵循 Good-enough 原则 5、必须确定预期输出&#xff08;或结果&#xff09; 6、必须彻底检查每个测试结果 7、…

网站流量下降的6个原因

网站流量下降的6个原因 有时网络流量会发生变化。有时是最好的。有时候不是那么好。诊断流量变化的原因并不困难。以下是如何控制网络流量以帮助其保持增长。 1.移动范式影响流量 移动正在改变搜索习惯。越来越多的企业注意到搜索模式正在发生变化。这是因为我们正在寻找人们搜…

web网站常用功能测试点总结

一、输入框 1.字符型输入框&#xff1a; &#xff08;1&#xff09;字符型输入框&#xff1a;英文全角、英文半角、数字、空或者空格、特殊字符 “~&#xff01;#&#xffe5;%……&*&#xff1f;[]{}” 特别要注意单引号和&符号。禁止直接输入特殊字符时&#xff0c…

基于web网站项目的性能测试结果分析

一款对并发要求比较高的web项目&#xff0c;需要对其压力测试&#xff0c;模拟线上可能存在的问题 工具描述&#xff1a; 压力工具&#xff1a;Loadrunner 服务器监控&#xff1a;nmon 数据库&#xff1a;oracle web容器&#xff1a;Tomcat war 项目就好像是一个木桶&…

Linux中什么是动态网站环境及如何部署

当谈论起网站时&#xff0c;我们可能听说过静态和动态这两个词&#xff0c;但却不知道它们的含义&#xff0c;或者从字面意思了解一些却不知道它们的区别。这一切可以追溯到网站和网络应用程序&#xff0c;Web应用程序是一个网站&#xff0c;但很多网站不是Web应用程序&#xf…

微服务 | 微服务网站性能测试

开发者们在工作中经常会遇到过这样的情况&#xff1a;在接手实际项目时&#xff0c;在传统的单体架构下&#xff0c;一个同事负责的功能模块出现故障后&#xff0c;会导致整个系统瘫痪。那么有什么办法才能解决这种问题呢&#xff1f;云上有一种服务——微服务&#xff0c;可以…

九度搜索引擎点击优化_快排会影响到seo优化排名吗?

今天&#xff0c;在seo优化中被人们常提起的就是“快排”&#xff0c;它的出现对seo行业整体冲击很大&#xff0c;不过很多的从事seo优化的站长又说&#xff0c;这种优化方式属于作弊手段&#xff0c;一旦网站做了快排&#xff0c;被搜索引擎发现很容易会惩罚网站&#xff0c;导…

cdn对php网站的加速效果,配置七牛自定义域名cdn加速,让你的网站飞起来

之前发过一篇是没有备案的&#xff0c;使用测试域名来缓存静态文件&#xff0c;效果也是杠杠的。如果你还没有备案&#xff0c;先看这篇文章吧&#xff0c;域名没备案使用七牛cdn加速 。步入正题了(为了节约博主发文的时间&#xff0c;尽量少用文字&#xff0c;多以图片展示&am…

怎么建文件夹_用 GitHub Pages 建个人网站的小白级教程

前段时间心血来潮想建一个个人网站&#xff0c;调研了一圈&#xff0c;试用了 Weebly、Wix、Squarespace 等等产品&#xff0c;感觉都没有办法满足我的奇葩需求……最终还是觉得 GitHub Pages 是最好的——自由、免费、流量够用&#xff0c;目前的访问速度也还不错&#xff0c;…

jsp mysql 注入_Jsp+Mysql网站注入并拿root权限的全过程

很多人可能都知道asp,php的编程要防止sql注入漏洞,而并不知道jsp编程同样也需要防备sql注入漏洞.其实,一旦jsp代码有注入漏洞,将直接影响到整个系统的安全。本文就是主要展示一下我的一次JSPMYSQL注入导出webshell的过程。www.***.***.cn是国内某一个著名研究所的网站&#xff…

模板建站和开发网站区别_模板网站与定制网站有什么区别?

如今存在许多网站设计公司&#xff0c;主要包括使用智能建站和成品网站等的模板网站建设公司还有定制网站建设公司两个大类。这两者都具有各自的优势与不足&#xff0c;接下来我们就将要对这两种不同的网站建设形式进行分析。模板建站和定制建站最显著的差异体现在价格上。正如…

网站服务器机房硬件配置,有关web服务器硬件配置的进阶知识

有关web服务器硬件配置的进阶知识今天&#xff0c;小编来聊一聊web服务器硬件配置&#xff0c;其希望大家对服务器各个配件有一些了解&#xff0c;特别是现在很多人选择组装的方式构建服务器&#xff0c;就更应该用稳定和适用去衡量产品&#xff0c;而不要一味降低成本&#xf…

静态文件快速建站

文章目录部署静态文件一、 初始化1、 创建文件2、 上传文件二、 GitHub1、 基本部署2、 框架部署三、 netlify部署静态文件 一、 初始化 1、 创建文件 首先我们要创建好我们的文件&#xff0c;这个可以随便写一点内容。然后我们写好的静态文件使用git添加到GitHub远程仓库中…