C#实现支付宝转账功能

环境

.net 6
AlipaySDKNet.OpenAPI 2.4.0

申请证书

登录支付宝开放平台https://open.alipay.com/
进入控制台
在这里插入图片描述
在这里插入图片描述
授权回调地址也设置一下,加密方式AES

新建.net 6空白的web项目

证书除了java都需要自己生成一下pkcs1的密钥
在这里插入图片描述
privatekey.txt就是根据应用私钥生成的pkcs1密钥
安装AlipaySDKNet.OpenAPI 2.4.0
在这里插入图片描述
配置json

"AliPayConfig": {"ServerUrl": "https://openapi.alipay.com","AppId": "",//参考appCertPublicKey_{APPID}.crt"PrivateKey": "AliPay/privatekey.txt","AlipayPublicKey": "AliPay/publickey.txt","AppCertPath": "AliPay/appCertPublicKey_{APPID}.crt","AlipayPublicCertPath": "AliPay/alipayCertPublicKey_RSA2.crt","RootCertPath": "AliPay/alipayRootCert.crt","EncryptKey": "","QrcodeNotifyUrl": "https://xxxx/Notify"
}

新建AliPayConfigModel.cs

namespace 支付宝转账测试01.Model
{/// <summary>/// 支付宝支付配置/// </summary>public class AliPayConfigModel{/// <summary>/// 服务器地址/// v2 https://openapi.alipay.com/gateway.do/// v3 https://openapi.alipay.com/// 【必填】/// </summary>public string ServerUrl { get; set; } = "";/// <summary>/// 应用ID/// 【必填】/// </summary>public string AppId { get; set; } = "";/// <summary>/// 应用密钥/// 【必填】/// </summary>public string PrivateKey { get; set; } = "";/// <summary>/// 支付宝公钥/// 【密钥模式】/// 【特殊必填,密钥模式和证书模式二选一,建议证书模式】/// </summary>public string AlipayPublicKey { get; set; } = "";/// <summary>/// 应用公钥/// 【证书模式】/// 【特殊必填,密钥模式和证书模式二选一,建议证书模式】/// </summary>public string AppCertPath { get; set; } = "";/// <summary>/// 支付宝公钥/// 【证书模式】/// 【特殊必填,密钥模式和证书模式二选一,建议证书模式】/// </summary>public string AlipayPublicCertPath { get; set; } = "";/// <summary>/// 支付宝根证书/// 【证书模式】/// 【特殊必填,密钥模式和证书模式二选一,建议证书模式】/// </summary>public string RootCertPath { get; set; } = "";/// <summary>/// AES加密的密钥/// 【选填】/// </summary>public string EncryptKey { get; set; } = "";/// <summary>/// 支付宝二维码扫码成功之后通知地址/// </summary>public string QrcodeNotifyUrl { get; set; } = "";}
}

实现方法

using AlipaySDKNet.OpenAPI.Api;
using AlipaySDKNet.OpenAPI.Client;
using AlipaySDKNet.OpenAPI.Model;
using AlipaySDKNet.OpenAPI.Util;
using AlipaySDKNet.OpenAPI.Util.Model;
using 支付宝转账测试01.Model;namespace ZhifubaoTest01
{public class Program{public static void Main(string[] args){var builder = WebApplication.CreateBuilder(args);var configuration = builder.Configuration;#region 配置阿里云var alipayConfigModel = configuration.GetSection("AliPayConfig").Get<AliPayConfigModel>();AlipayConfig alipayConfig = new AlipayConfig();// 设置应用私钥alipayConfig.PrivateKey = File.ReadAllText(alipayConfigModel.PrivateKey);alipayConfig.ServerUrl = alipayConfigModel.ServerUrl;alipayConfig.AppId = alipayConfigModel.AppId;//证书模式alipayConfig.AppCertPath = alipayConfigModel.AppCertPath;alipayConfig.AlipayPublicCertPath = alipayConfigModel.AlipayPublicCertPath;alipayConfig.RootCertPath = alipayConfigModel.RootCertPath;AlipayConfigUtil alipayConfigUtil = new AlipayConfigUtil(alipayConfig);#endregionvar app = builder.Build();app.MapGet("/", async (context) =>{AlipayFundAccountApi instance = new AlipayFundAccountApi();instance.Client.SetAlipayConfigUtil(alipayConfigUtil);string merchantUserId = null;string alipayUserId = "";//就是支付宝里面的商户号string alipayOpenId = null;string accountProductCode = null;string accountType = "ACCTRANS_ACCOUNT";string accountSceneCode = null;string extInfo = null;try{var response = instance.Query(merchantUserId, alipayUserId, alipayOpenId, accountProductCode, accountType, accountSceneCode, extInfo);await context.Response.WriteAsync($"xxx公司支付宝,账户可用余额:{response.AvailableAmount},账户冻结余额:{response.FreezeAmount}");}catch (ApiException e){AlipayFundAccountQueryDefaultResponse errorObject = (AlipayFundAccountQueryDefaultResponse)e.ErrorObject;await context.Response.WriteAsync("调用失败:" + errorObject);}});app.MapGet("/zhuanzhang", async (context) =>{AlipayFundTransUniApi instance = new AlipayFundTransUniApi();instance.Client.SetAlipayConfigUtil(alipayConfigUtil);AlipayFundTransUniTransferModel data = new AlipayFundTransUniTransferModel();data.OutBizNo = "202312131557";data.Remark = "";//业务备注长度200data.BusinessParams = "{\"payer_show_name_use_alias\":\"true\"}";data.BizScene = "DIRECT_TRANSFER";//单笔无密转账固定data.ProductCode = "TRANS_ACCOUNT_NO_PWD";//单笔无密转账固定Participant payeeInfo = new Participant();payeeInfo.Identity = "支付宝账号邮箱或者手机号";payeeInfo.IdentityType = "ALIPAY_LOGON_ID";payeeInfo.Name = "转账支付宝真实姓名";data.PayeeInfo = payeeInfo;data.TransAmount = "0.10";//单位是元,最低0.10data.OrderTitle = "xxx转账";//长度128try{var response = instance.Transfer(data);await context.Response.WriteAsync("转账完成");}catch (ApiException e){//{"code":"EXCEED_LIMIT_SM_MIN_AMOUNT","message":"请求金额不能低于0.1元"}var errStr = e.ErrorContent.ToString();var systemError = errStr?.Contains("SYSTEM_ERROR");//系统错误,需要单独处理var notEnough = errStr?.Contains("BALANCE_IS_NOT_ENOUGH");//余额不足var isNotRealName = errStr?.Contains("PAYEE_NOT_RELNAME_CERTIFY");//未实名认证var accOcupied = errStr?.Contains("PAYEE_ACC_OCUPIED");//多个支付宝账号var nameError = errStr?.Contains("PAYEE_NOT_EXIST");//收款方姓名错误if (systemError == true){/*可能发生了网络或者系统异常,导致无法判定准确的转账结果。此时,商户不能直接当做转账成功或者失败处理,可以考虑采用相同的out_biz_no重发请求,或者通过调用“(alipay.fund.trans.common.query 转账业务单据查询接口)”来查询该笔转账订单的最终状态*/AlipayFundTransCommonApi alipayFundTransInstance = new AlipayFundTransCommonApi();alipayFundTransInstance.Client.SetAlipayConfigUtil(alipayConfigUtil);string productCode = "STD_RED_PACKET";string bizScene = "PERSONAL_PAY";string outBizNo = "201808080001";string orderId = "20190801110070000006380000250621";string payFundOrderId = "20190801110070001506380000251556";try{var response = alipayFundTransInstance.Query(productCode, bizScene, outBizNo, orderId, payFundOrderId);}catch (ApiException ex){AlipayFundTransCommonQueryDefaultResponse alipayFundTransCommonQueryDefaultResponse = (AlipayFundTransCommonQueryDefaultResponse)ex.ErrorObject;await context.Response.WriteAsync("调用失败:" + alipayFundTransCommonQueryDefaultResponse);//TODO 重发请求,参考上面代码}return;}if (notEnough == true){//余额不足await context.Response.WriteAsync("余额不足");return;}if (isNotRealName == true){//未实名认证await context.Response.WriteAsync("未实名认证");return;}if (accOcupied == true){await context.Response.WriteAsync("多个支付宝账号");return;}if (nameError == true){await context.Response.WriteAsync("收款方姓名不正确");return;}AlipayFundTransUniTransferDefaultResponse errorObject = (AlipayFundTransUniTransferDefaultResponse)e.ErrorObject;await context.Response.WriteAsync("调用失败:" + errorObject);}});app.Run();}}
}

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

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

相关文章

登录/验证码/注册

登录 pom文件 <!--hutool工具类--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.9</version></dependency><!--jwt--><dependency><groupId>io.jsonw…

智慧燃气让城市能源系统高效运行

关键词&#xff1a;智慧燃气、燃气数字化、智慧燃气平台、智慧燃气解决方案、智慧燃气系统 随着我国城镇燃气行业的发展&#xff0c;燃气行业管理及服务从简单的手工运作阶段迈入数字燃气阶段&#xff0c;大量采用信息化手段管理燃气业务&#xff0c;智慧燃气应运而生。它既是…

【深度学习】注意力机制(六)

本文介绍一些注意力机制的实现&#xff0c;包括MobileVITv1/MobileVITv2/DAT/CrossFormer/MOA。 【深度学习】注意力机制&#xff08;一&#xff09; 【深度学习】注意力机制&#xff08;二&#xff09; 【深度学习】注意力机制&#xff08;三&#xff09; 【深度学习】注意…

国产数据库适配-达梦(DM)

1、通用性 达梦数据库管理系统兼容多种硬件体系&#xff0c;可运行于X86、X64、SPARC、POWER等硬件体系之上。DM各种平台上的数据存储结构和消息通信结构完全一致&#xff0c;使得DM各种组件在不同的硬件平台上具有一致的使用特性。 达梦数据库管理系统产品实现了平台无关性&…

Docker技术基础梳理 - Docker网络管理

为什么需要容器的网络管理&#xff1f; 容器的网络默认与宿主机、与其他容器相互隔离&#xff0c;且容器中可以运行一些网络应用&#xff0c;比如nginx、web应用、数据库等&#xff0c;如果需要让外部也可以访问这些容器中运行的网络应用&#xff0c;那么就需要配置网络来实现…

thinkphp连接数据库mysql 报错问题

第一 看报错日志php如果是下面这个报错的话 就是mysql 数据库没有验证连接 ​​​​​​​[2023-12-13T09:57:0108:00][error] [10501]SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client 我们就可以去mysql 的文件检查 验证身份 使…

量子芯片技术:未来的计算革命

量子芯片技术&#xff1a;未来的计算革命 一、引言 随着科技的不断发展&#xff0c;人类正在进入一个全新的技术时代&#xff0c;即量子时代。量子芯片技术作为这个时代的重要代表&#xff0c;正逐渐改变我们对计算和信息处理的理解。本文将深入探讨量子芯片技术的基本原理、…

【概率方法】重要性采样

从一个极简分布出发 假设我们有一个关于随机变量 X X X 的函数 f ( X ) f(X) f(X)&#xff0c;满足如下分布 p ( X ) p(X) p(X)0.90.1 f ( X ) f(X) f(X)0.10.9 如果我们要对 f ( X ) f(X) f(X) 的期望 E p [ f ( X ) ] \mathbb{E}_p[f(X)] Ep​[f(X)] 进行估计&#xff0…

数据无效:问题和解决方案的分析

一、说明 在数字时代&#xff0c;数据已成为企业、组织和个人的基本资源。然而&#xff0c;在浩瀚的数据海洋中&#xff0c;困扰数据分析的一个常见问题是存在空值或缺失数据。数据无效是指某些数据字段中缺少信息&#xff0c;这在根据该数据进行分析和决策时可能会导致重大问题…

【计算机视觉】SIFT

在边缘提取的时候&#xff0c;用高斯一阶导对信号进行卷积&#xff0c;响应值最大的就是边界如果用高斯二阶导对信号进行卷积&#xff0c;0点就是边界点&#xff08;二阶导等于0的点&#xff0c;对应一阶导的极值点&#xff09; 如果用高斯二阶导在不同的信号上进行卷积&#x…

JS基础之作用域链

JS基础之作用域链 作用域链作用域链函数创建函数激活总结 作用域链 当JavaScript代码执行一段可执行的代码&#xff08;execution code&#xff09;时&#xff0c;会创建对应的执行上下文&#xff08;execution context&#xff09;。 对于每个执行上下文&#xff0c;都有三个重…

Linux 安装图形界面 “startx”

———————————————— 报错&#xff0c;如下&#xff1a; bash :startx command not found ———————————————— 解决方法&#xff1a; 1.先安装 — X Windows System&#xff0c;输入以下命令&#xff1a; yum groupinstall “X Window System”…

【干货分享】KingIOServer与三菱PLC的通讯的应用案例

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 最近一个项目涉及用KingIOServer采集三菱PLC数据&#xff0c;特记录通讯过程方便备忘。 一、版本说明&#xff1a; 1、KingIOServer版本&#xff1a;3.7SP2 2、PLC型号&#xff1a;Q03UDV 和Q03UDE自带以太网网口。…

redis:一、面试题常见分类+缓存穿透的定义、解决方案、布隆过滤器的原理和误判现象、面试回答模板

redis面试题常见分类 缓存穿透 定义 缓存穿透是一种现象&#xff0c;引发这种现象的原因大概率是遭到了恶意攻击。具体就是查询一个一定不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致这个数据的每次请求都需要查DB&#xff0c;数据库压力…

人工智能导论习题集(3)

第五章&#xff1a;不确定性推理 题1题2题3题4题5题6题7题8 题1 题2 题3 题4 题5 题6 题7 题8

基于YOLOv8深度学习的吸烟/抽烟行为检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

编程应用实际场景:台球厅怎么样用电脑给客人计时,台球计时收费系统操作教程

一、前言 准确控制顾客在店内游玩的时间&#xff0c;从而控制店内的各项成本&#xff0c;并提升店内的客流量。在顾客享受计时项目的时候&#xff0c;可以同时添加其他食物消费&#xff0c;并将单据合并统一结账。软件中的会员功能可以为客户办理会员可以使用灯控器控灯&#…

C语言之基本数据类型和数

目录 算数类型和基本数据类型 基数 基数转换 由八进制数、十六进制数、二进制数向十进制数转换 由十进制数向八进制数、十六进制数、二进制数转换 二进制和十六进制的基数转换 在学习基本数据类型之前我们先来学习数。 算数类型和基本数据类型 在前面的学习中我们可以使用…

html 中vue3 的setup里调用element plus的弹窗 提示

引入Elementplus之后&#xff0c;在setup&#xff08;&#xff09;方法外面导入ElMessageBox const {ElMessageBox} ElementPlus 源码 &#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><!-- import Vue before Elemen…

外包干了3个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…