.net服务端接入支付宝接口
时间:2020-01-18
本文章向大家介绍.net服务端接入支付宝接口,主要包括.net服务端接入支付宝接口使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
创建沙箱测试账号及引入支付宝相应语言的SDK,支付宝开放平台有详细介绍,这里就不做赘述了。
主要代码如下:
创建支付配置类
public class AlipayConfig { //APPID public static string appId = "2016101500694440"; //支付宝网关 public static string gateway = "https://openapi.alipaydev.com/gateway.do"; //用户私钥 public static string privateKey = "MIIEpQIBAAKCAQEAu+yEUg/5qZD/Q0iDNPzzx+RPTwcjgrX0QlXoOdz7datalPhgDZv1+BIR0No26d1IM9+5kALu0DwQAQ/9bsUN+eat417QOJzsW2NUcLUhHZF6r6+TcJzJXon/yyrTVEIdLm6bSCMTlbO50xJXFWLkYUs0Z8MOMFjESlRbFPpO8cB0satG85GSFXNdBoMxr9rxYnbgFev5162L0xxL5XP9CtTRkRo0JeJsf9PHuZTiiH5NduVATe/piKoUw/2Bk7rjQJsJZLsGh+CAw6Mf6SqgqX0SbjMiiEbPBdv1Nbb+cY3FSNBed3ms4A0coyh4KaL3++PU7q1yOAOL5Zs6Dk1H7QIDAQABAoIBAQCwrYIN4QUZnb/P0ynANJ1Bbm3937lMF6NIhpnpZNBpZauo6QbtZJbRHrPvRmlgX/GVC57bPVanIgDt7smXTd6A95a+cJKU1zwEA5QMzs4OjYrqB8k3k8BiiJ2btmyvB+WFlOma3Zd5JFrtjY2gBrSuoFTpxOHfJGWPeFWVmGuGLolEZVtAwJ4y98HRug+shz0R5LSA8Wg3QiXgie5Za5xnuFIMY2QAAqDqKxbV3/rYZzLdZy1xiWr1Qdsmal7dDV//E+9HwcM6GN1KWCdLyWnroRj5EfP/FLImQBRu/7ZTrQQ0QjTqcEzoyiQ4SuzBzC/1F60kkaF3Lh5GaKlSecrhAoGBAPx1yhTAM+nKI9zfHHM9VOCMz9nfTAGqAXiFMxoKw1UXnerlCMZv/Il5ELzp+KL61UjMgYbNRdusfVuq432kE5QZ+ZntrgHjwutoEgHbQDwWWW6nLAo8KbbVuyI0as5AoThxB7HWdYLDFpCKBYF9PA5EnFMAIfe2UBacOwrUzULJAoGBAL6PEs1WZVGxTKWpZwMoU7o8H77UpnAXqIoBSt30StSEf2Qx6xgugHnaEX5nGKdF47RBLkLImgOxzOLPurGtUQaMJ3s1N6SC5KTc1qZnW54Pk41EEES8vW7DMRRKJMhPdNqmOSyLlsINAzC8W8sMgfZBCdlOkoAESPOHbawTpioFAoGBAOlHtlmCWPX5ETZw+4sI6zsrIo0CJuuKuh0xh8zSkTg5wHRi+r7SkBo/wlWuJVAEU70XK8DyQVEBjDx+JgPc7zJ05g10cMvSODTqT2ljvXFIfY8f7jPu7+TAjlDG+sJnOhI7b47GyoLv3hPlVb0XibztbT3M65ZH4q1h47TYemrxAoGAfVcYU+3G+QP42WJiuoX1BKN1cgznaQV2u0d8Wh/MdJquPFZFP4OeyAdyyETBx4zF6JOS/SR7gYCatnlSYHoSuI7JjVYEwnXCNNp5abzEW2P9dsbVOJE4vLkw+BqItSTmRMdfBfjO8dajSZQrgJQ6i6Jd+wyeegvXfC+RKMVH340CgYEAlB6N7FQU44lqIO9Os1bY06+yPFBUH476R7m8CC2KCW3fc7pHCvWRva4XM8pHnsBf2utF/LgvHpVQIhvieLQaCRwRa24I1RBNyFQ7Z3AFnodHv5fZzxFYbfqS1mZHJF1WnC+jVj6F1oh+DMmPrl69U6dTTppsdM5n1LclXzNhRmc="; //支付宝公钥 public static string alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlUaqoPnb+UVjC/lEUcRytpMQtbVKcTnsT4derbrju/wbvwnL+CjJ8jNgIA8jysAwk2NOzZUY5JU3P24CnW16KiPHiqlWUB4YE1ZJEMmAu5qedu37XjYBmKUFoTtoFq2YtVvFCTQFmRYcFwRARbXFWyUMF30b+mOiD6bldsFtf7VzU6bawOs7YsgCMpUBcA+iIxNIZ8dK8s6PYzn54pKsHmID6Og+VOwNkvjnYG1xOAXqK5Fz6JPaJQRR/XvkHcqVWwBwOFCWx9XXOCNKxgYKY3J/RENSy3JV9IbKtxnWyrb54G32gdT4h+VOaDggqTaH8Pxk7oRCegqBpZdcr+SCqQIDAQAB"; //支付成功的回调地址 public static string returnURL = "Student/Index"; // 签名方式 public static string sign_type = "RSA2"; // 编码格式 public static string charset = "UTF-8"; private static string generateOrderNumber() { return DateTime.Now.ToString("yyyyMMddHHmmssfff"); } /* * 创建支付model * price:商品价格 * title:商品标题 * description:商品描述 * **/ public static AlipayTradePagePayModel creatModel(string price, string title, string description) { AlipayTradePagePayModel model = new AlipayTradePagePayModel(); model.Body = description; model.Subject = title; //付款金额 model.TotalAmount = price; //商户网站中唯一订单号 model.OutTradeNo = generateOrderNumber(); model.ProductCode = "FAST_INSTANT_TRADE_PAY"; return model; } }
Controller层主要接口:
用户点击支付后的跳转接口
public string Index() { DefaultAopClient client = new DefaultAopClient(AlipayConfig.gateway, AlipayConfig.appId, AlipayConfig.privateKey, "json", "1.0", AlipayConfig.sign_type, AlipayConfig.alipayPublicKey, AlipayConfig.charset, false); //金额格式必须是小数点后两位数或是正整数且不是金额格式(即$123.00),以及非常重要的一个原则,传递的参数要么不传递这个参数(即传递的众多参数中,这个参数完全不存在 AlipayTradePagePayModel model = AlipayConfig.creatModel("9.90","测试商品","测试商品支付"); AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); //支付成功的回调地址 request.SetReturnUrl("xxxxxxxxxx"); // 设置异步通知接收地址,需要公网能够访问 request.SetNotifyUrl("xxxxxxxxxx"); // 将业务model载入到request request.SetBizModel(model); AlipayTradePagePayResponse response = null; try { response = client.pageExecute(request); return response.Body; } catch (Exception exp) { throw exp; } }
在此过程中支付宝会返回给我们一个表单数据,此表单不需要我们做任何操作,自动提交
同步回调地址为通知用户付款操作后自定义的跳转页面,异步回调地址为支付宝通知后台用户付款操作的结果;具体操作结果以异步通知结果为准。
异步回调接口:
public void notify() { Dictionary<string, string> sArray = GetRequestPost(); if(sArray.Count > 0){ //调用SDK验签方法 bool signVerified = AlipaySignature.RSACheckV1(sArray, AlipayConfig.alipayPublicKey, AlipayConfig.charset); //此判断结果中书写业务逻辑代码 if (signVerified) //验证支付发过来的消息,签名是否正确 { //商户订单号 string out_trade_no = Request.Form["out_trade_no"]; //支付宝交易号 string trade_no = Request.Form["trade_no"]; //交易状态 string trade_status = Request.Form["trade_status"]; if (Request.Form["trade_status"] == "TRADE_FINISHED") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 } else if (Request.Form["trade_status"] == "TRADE_SUCCESS") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //付款完成后,支付宝系统发送该交易状态通知 //请在这里加上商户的业务逻辑程序代码 } else { } Response.Write("success"); //返回给支付宝消息,成功,这里不要动!!! } else { Response.Write("fail"); } } } public Dictionary<string, string> GetRequestPost() { int i = 0; Dictionary<string, string> sArray = new Dictionary<string, string>(); NameValueCollection coll; coll = Request.Form; String[] requestItem = coll.AllKeys; for (i = 0; i < requestItem.Length; i++) { sArray.Add(requestItem[i], Request.Form[requestItem[i]]); } return sArray; }
至此,支付接口调用完成。
支付宝对于接口调用 的文档说明还是比较清晰详细的,仔细去阅读以下文档,思路还是较为清晰的
原文地址:https://www.cnblogs.com/xiaowangxiao/p/12209553.html
- 打造属于自己的支持版本迭代的Asp.Net Web Api Route
- 分布式消息队列 RocketMQ 源码分析 —— Message 拉取与消费(上)
- 分布式消息队列 RocketMQ 源码分析 —— Message 拉取与消费(下)
- Spring Boot中使用RabbitMQ
- Spring Cloud构建微服务架构:消息驱动的微服务(入门)【Dalston版】
- 哪类人适合当产品经理?
- 产品经理·杂谈
- Python机器学习中的特征选择
- Android学习第八弹之改变状态栏的颜色使其与APP风格一体化
- 手把手教你 MongoDB 的安装与详细使用(二)
- 搭建 MongoDB分片(sharding) / 分区 / 集群环境
- Android调用手机中的应用市场,去评分的功能实现
- ANR 原理与实战技巧
- Android将应用程序的崩溃信息如何保存到本地文件,并上传至服务器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- WPF 使用 HandyControl 给 ListView 添加漂亮的表头效果
- kali2020 忘记密码
- 低比特量化之DoreFa-Net理论与实践
- 不用数组求多个数的最小值
- 小程序 Tip | 文档、环境、开发工具界面与特性
- 大佬的思路就是不一样,这是我见过最简洁又清晰的SSM框架整合
- SQL Server重置自增的值为0
- 被经理邀请去“爬山”,只是因为我写错了一条SQL语句?
- Maven环境配置-必会
- Centos7中Docker安装RabbitMQ
- 又陷入知识盲区了,面试被问Redis事务,我差点脸都“绿”了
- Mybatis中#{}与${}的区别
- POI合并单元格
- Centos7.x安装Docker
- 实在是妙啊!Java中强软虚弱引用,居然还能这样去操作