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

news/2024/5/20 21:21:07/文章来源:https://blog.csdn.net/weixin_34290390/article/details/93801352

前言

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

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

创建项目

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

配置

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

支付宝沙箱环境介绍:蚂蚁沙箱环境(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.设置应用公钥

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

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

这个支付宝公钥和我们自己生成的公钥是不一样的,我们在配置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载入到request
    request.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);
}

 

地址集合

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

最重要的:

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

 

原文地址:http://www.cnblogs.com/stulzq/p/7606164.html

转载于:https://www.cnblogs.com/kuoAT/p/7606755.html

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

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

相关文章

挑战者联盟:这20个编码挑战和竞赛网站请收好!

全文共4567字&#xff0c;预计学习时长16分钟图源&#xff1a;unsplash我们通常以10年为期划分一代人&#xff0c;2020年是特别的一年&#xff0c;代表着一个十年的结束&#xff0c;另一个十年的开始。在过去的十年里&#xff0c;人类社会繁荣发展&#xff0c;科学技术取得了巨…

网站提速-页面静态化(2)

第一篇、页面静态化 页面静态化概念 我们大多数情况下是直接访问php文件,php脚本在服务器端执行并 返回信息,对于一些大型的网站,访问量很大,频繁的动态操作和操作 数据库会加重服务器的负担.在实际开发中&#xff0c;通常使用缓存技术()或者页面静态化来解决 页面静态化分为: …

域名欺诈之辩:美国最高法院最近的规定会否改变网站运营的方式?

全文共3391字&#xff0c;预计学习时长9分钟 图源&#xff1a;kinsta 如果一个品牌可以独占描述其商品特性的统称词汇&#xff0c;例如苹果公司可以把“电脑”作为商标&#xff0c;并起诉使用这一词汇的竞争商&#xff0c;这似乎不太对劲儿&#xff0c;对吗&#xff1f;这不公…

互联网面向所有人:使你的网站更易访问的6条tips

全文共3099字&#xff0c;预计学习时长8分钟图源&#xff1a;unsplash《美国残疾人法案》&#xff08;ADA&#xff09;的周年纪念日刚过去不久&#xff0c;本次纪念日将无障碍主题带入了讨论的最前沿&#xff0c;尤其是在科技相关的话题方面。似乎很多开发人员都将Web可访问性标…

网站防篡改脚本

这是我生产中所用的防篡改脚本需要的拿走点赞. 扫描定义的数组目录的所有文件的MD5值&#xff0c;然后在用下面个脚本对比 1.2.2.4 扫描deploy目录的md5值脚本 [rootlocalhost scripts]# cat md5sum_check.sh #!/bin/sh path( /deploy/factory/tomcat/webapps /deploy/passport…

java 网站用户在线和客服聊天

注&#xff1a;本文来源于《java 网站用户在线和客服聊天》这是应用到项目中的一个例子。 实现原理是将信息存储到Application域里面。然后使用Struts2 Action 用json格式的数据进行前后台交互。 截图&#xff1a; 前台用户界面&#xff1a; 后台客服界面&#xff1a; 编辑框采…

熊掌号PHP,个人网站接入百度熊掌号方法,手把手教你如何配置!

前两天开通熊掌号&#xff0c;昨天通过了。就想着赶快接入网站&#xff0c;听说对网站有加成&#xff0c;可以提高收录和排名&#xff0c;新站不容易啊&#xff0c;写了文章都没人看&#xff0c;哭!刚刚网上找教程&#xff0c;根据蝈蝈要安静博客的代码&#xff0c;成功接入熊掌…

2021值得关注的科技与应用:开发运营和网站可靠性工程师看过来!

全文共2431字&#xff0c;预计学习时长7分钟图源&#xff1a;Google三个主流云提供商&#xff08;AWS/Azure/GCP&#xff09;现在都支持通过自定义资源定义&#xff08;CRDs&#xff09;来从Kubernetes中提供和管理云服务。AWS有在开发者预览过程中服务Kubernetes的AWS控制器&a…

向一个网站发请求的几种方式

1. 用requests模块&#xff1a; from django.shortcuts import render, HttpResponse, redirect import requestsdef index(request):re requests.get(http://www.bing.com)# re.encoding utf-8res re.textreturn HttpResponse(res)2. 用http.client 该库一般不直接使用&am…

《大型网站技术架构》读书笔记之五:万无一失之网站的高可用架构

此篇已收录至《大型网站技术架构》读书笔记系列目录贴&#xff0c;点击访问该目录可获取更多内容。 一、可用性度量与考核 首先&#xff0c;不得不说&#xff1a;要保证一个网站永远完全可用几乎是一件不可能完成的任务&#xff08;Mission Impossible&#xff0c;是不是有点碟…

干货|网站前端开发「必会基础知识」有哪些?

Web前端开发网页制主要由HTML、CSS、JavaScript三大要素组成。随着企业需求变&#xff0c;前端开发技术的三要素也演变成现今的HTML5、CSS3、jQuery。响应式布局、微网站等是Web前端未来的发展方向之一。网站前端开发基础知识学习内容&#xff1a;1.HTML基础标签HTML不管前后端…

干货|10个帮程序员减压放松的网站,爽!

工作之余&#xff0c;不妨放下微博跟朋友圈&#xff0c;来这10个网站感受一下。今天播妞给大家推荐的网站&#xff0c;利用代入感强的图片与音频&#xff0c;迅速帮你抹平焦虑&#xff0c;获得平和心态&#xff0c;疲惫的程序员朋友们快来试试吧~✤ 1.Calm这是同类型中最火的网…

推荐10个Java学习神器网站分享给大家肯定有你不知道的哦

不管谁手里都藏着些许自己觉得好用的网站&#xff0c;今天专门找大厂出来的同学同事觉得好用的网站分享给大家&#xff0c;如果这里有你没收藏还不知道觉得还蛮有用的网站可以给我点个赞&#xff0c;大家一起进步&#xff0c;一起学习&#xff0c;同时也可以分享你觉得好用实用…

干货丨网站域名后缀都是什么含义?

互联网技术让信息传递更加快捷&#xff0c;据网络信息&#xff0c;2019年我国网站数量已经达到518万个&#xff0c;每一个网站都有一个唯一的网站域名。细心的同学可能会注意到大部分域名的后缀都是.com。如果你要注册域名就会发现大部分.com域名已经被注册&#xff0c;然而域名…

解决:写的CSDN博客百度搜索不到 (网站/博客/链接 提交百度检索方法)

往往发布了一篇博客&#xff0c;会发现按照博客标题搜索&#xff0c;无法在百度搜索到自己的这篇文章。 这时&#xff0c;我们在以下网站提交我们的博客链接即可&#xff1a; 链接提交_加快网站内容抓取&#xff0c;快速提交数据工具_站长工具_网站支持_百度搜索资源平台 但是…

java中nextint()_「nextint」Java中关于nextInt()、next()和nextLine() - seo实验室

nextint原博客地址&#xff1a;https://www.cnblogs.com/Skyar/p/5892825.htmljava中关于nextint()、next()和nextLine()的理解先看解释&#xff1a;nextInt(): it only reads the int value, nextInt() places the cursor in the same line after reading the input.next(): r…

程序员接私活月入2万?分享10个接私活的网站!

最近&#xff0c;播妞在和身边的程序员聊天中&#xff0c;听不少朋友分享了自己接私活的经历&#xff0c;那收入真是让我“瞠目结舌” ......程序员A&#xff1a;我Java程序员&#xff0c;工作两年&#xff0c;月薪13K&#xff0c;私活20K。程序员B&#xff1a;之前在单位上班&…

Django-oscar 快速搭建商城网站

Django是一个相对容易学习的框架&#xff0c;并且已经发展了许多年&#xff0c;拥有相对活跃的开源环境。像豆瓣、Instagram&#xff0c;Spotify&#xff0c;YouTube等官方网站都是基于Django搭建的。Python实用宝典 曾经发表过Django的实战教程&#xff1a;Python Django快速开…

企业级-Shell案例8——批量检测网站是否异常并邮件通知

批量检测网站是否异常脚本 检测网站运行是否正常&#xff0c;如果不能正常访问&#xff0c;发送邮件通知管理员 curl -o /de/dev/null -s -w "%{http_code}" www.baidu.com访问失败&#xff0c;也又可能和网络等等原因有关。 所以我们要进行次数判断&#xff0c;超…

企业级-Shell案例10——一键部署LNMP网站平台脚本

一键部署LNMP网站平台脚本 网站浏览流程图 L &#xff1a;Linux N &#xff1a; Nginx M &#xff1a;Mysql P &#xff1a;PHP user --> Nginx --> PHP --> Mysql Centos软件安装 1、yum安装 2、源码编译 1&#xff09;./configure 2&#xff09;make…