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.mzph.cn/news/219878.shtml

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

相关文章

玩转大数据16:大数据存储与文件格式优化

随着大数据时代的到来&#xff0c;存储和处理海量数据成为了一个重要的挑战。在大数据存储中&#xff0c;选择合适的文件格式对数据的压缩率、读写性能和扩展性起着关键作用。本文将介绍大数据存储的挑战&#xff0c;探讨常见的文件格式&#xff0c;并深入讨论文件格式优化的策…

小新Air-14 Plus 2021款AMD ACN版(82L7)原装出厂Win11系统镜像

LENOVO联想笔记本开箱状态原厂Windows11系统包 链接&#xff1a;https://pan.baidu.com/s/1D_sYCJAtOeUu9RbTIXgI3A?pwd96af 提取码&#xff1a;96af 联想小新AIR14笔记本电脑原厂系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等预装程序 所需要工具&am…

Mapreduce小试牛刀(1)

1.与hdfs一样&#xff0c;mapreduce基于hadoop框架&#xff0c;所以我们首先要启动hadoop服务器 --------------------------------------------------------------------------------------------------------------------------------- 2.修改hadoop-env.sh位置JAVA_HOME配…

MBR30300FCT-ASEMI高耐压肖特基MBR30300FCT

编辑&#xff1a;ll MBR30300FCT-ASEMI高耐压肖特基MBR30300FCT 型号&#xff1a;MBR30200FCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 最大平均正向电流&#xff1a;30A 最大重复峰值反向电压&#xff1a;300V 产品引线数量&#xff1a;3 产品内部芯片个数&…

***Cpolar配置外网访问和Dashy

Dashy是一个开源的自托管的导航页配置服务,具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起,形成自己的导航页。一款功能超强大,颜值爆表的可定制专属导航页工具 结合cpolar内网工具,我们实现无需部署到公网服务器…

一文1000字基于Jenkins实现接口自动化持续集成!

一、JOB项目配置 1、添加描述 可选选项可填可不填 2、限制项目的运行节点 节点中要有运行环境所需的配置 节点配置教程&#xff1a;https://blog.csdn.net/YZL40514131/article/details/131504280 3、源码管理 需要将脚本推送到远程仓库中 4、构建触发器 可以选择定时构建…

vite 打包图标icon ,content 内容乱码

问题描述&#xff1a;本地开发环境icon 显示正常&#xff0c;打包后发布线上环境icon乱码&#xff0c;而且具有偶发性&#xff0c;刷新页面乱码又正常了。 找问题&#xff1a;观察发现是content 内容没有编译成功导致乱码 解决&#xff1a;vite.config.ts / vite.config.js 文件…

Facebook运营技巧详解,Facebook多店铺如何运营?

在前不久的文章中就讲过Facebook养号和广告的投放技巧&#xff0c;今天东哥就趁热打铁来接着讲讲Facebook的运营技巧&#xff0c;现在做外贸和跨境电商的人基本上都用过Facebook&#xff0c;像在流量这么庞大的平台上想要抓住更多机遇&#xff0c;懂得一些运营技巧是必不可少的…

数据可视化作用探析

数据可视化是一种将数据转化为图表、图形或其他视觉形式的过程&#xff0c;旨在更直观、更易于理解地展示数据信息。它不仅仅是对数据的简单呈现&#xff0c;更是一种利用视觉化手段帮助人们理解数据、发现模式、分析趋势和做出决策的强大工具。今天&#xff0c;我就从可视化从…

设计模式之开篇

在软件开发的世界里&#xff0c;设计模式有如一本精妙的工程艺术指导准则&#xff0c;为我们提供了解决常见问题的优雅实现方案。然而&#xff0c;有些程序员可能会认为设计模式太过繁琐&#xff0c;一个简单的 if/else 语句就能解决问题&#xff0c;何必费心去学习这些看似复杂…

input 获取焦点后样式的修改

一、实现目标 1.没有获取焦点时样子 2.获取焦点时 代码&#xff1a; <input class"input"placeholder"请输入关键字" input"loadNode" />css .input {border-radius: 14px;border:1px solid #e4e4e4;margin: 5px;margin-top: 10px;wi…

小程序开发实战案例四 | 小程序标题栏如何设置

上一期我们了解了 小程序底部导航栏 的实现效果&#xff0c;今天一起来了解下如何设置小程序标题栏&#xff5e; 基础标题栏 小程序标题栏主要包含返回、标题、收藏、菜单、收起 5 个模块&#xff0c;其中能够调整的部分只有标题和背景色。 另外 IDE上无法展示收藏按钮&#…

『PyTorch』张量和函数之gather()函数

文章目录 PyTorch中的选择函数gather()函数 参考文献 PyTorch中的选择函数 gather()函数 import torch a torch.arange(1, 16).reshape(5, 3) """ result: a [[1, 2, 3],[4, 5, 6],[7, 8, 9],[10, 11, 12],[13, 14, 15]] """# 定义两个index…

Linux的基本指令和权限的知识

学前的建议&#xff1a;大家不要太关注指令是啥&#xff0c;记不住怎么办&#xff08;没事&#xff0c;想用时去查就好了&#xff09;&#xff0c;这篇文章重点部分是围绕指令的周边知识。毕竟指令是“死肌肉”&#xff0c;而一些关于Linux和操作系统的理论知识才是最重要滴&am…

认识loader和plugin

在 webpack 中&#xff0c;专注于处理 webpack 在编译过程中的某个特定的任务的功能模块&#xff0c;可以称为插件。它和 loader 有以下区别&#xff1a; 1loader 是一个转换器&#xff0c;将 A 文件进行编译成 B 文件&#xff0c;比如&#xff1a;将 A.less 转换为 A.css&…

webpack学习-4.开发环境

webpack学习-4.开发环境 1.mode2.使用source map3.自动编译代码3.1 webpack 的 观察模式3.2 使用 webpack-dev-server3.3 使用 webpack-dev-middleware 4.总结 1.mode 本章的标题一看就是开发环境&#xff0c;那就要引入webpack配置文件的mode了。 mode 属性用于指定 Webpack …

052:vue重新发布,软件热更新方面的一点经验示例

第052个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

Github 2023-12-13 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-13统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量非开发语言项目5Python项目2TypeScript项目1Jupyter Notebook项目1JavaScript项目1PHP项目1 从零开始构建技术…

Unity中Shader URP的安装与设置

文章目录 前言一、URP安装1、Window -> Project Manager -> 搜索 Render 二、URP设置1、创建一个URP配置文件2、渲染管线的修改&#xff08;当为空时&#xff0c;使用的是 BuildIn Render Pipeline&#xff09;3、这时我们新建一个对象。使用的材质球默认使用 URP 默认Sh…

MySQL基础笔记

MySQL 1. SQL1.1 SQL-DDL语句1.1.1 数据库操作1.1.2 表操作 1.2 MySQL-DML语句1.3 MySQL-DQL语句1.3.1 基本查询1.3.2 条件查询1.3.3 聚合函数1.3.4 分组查询1.3.5 排序查询1.3.6 分页查询 1.4 MySQL-DCL语句1.4.1 管理用户1.4.2 权限控制 2. 函数2.1 字符串函数2.2 数值函数2.…