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);
            #endregion

            var 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 = "";//业务备注长度200
                data.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.10
                data.OrderTitle = "xxx转账";//长度128
                try
                {
                    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();
        }
    }
}

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

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

相关文章

星辰天合获评年度数智转型“优秀服务商”

近日&#xff0c;由中国智能制造百人会、中国智能制造产业网主办的“专精特新 单冠领航”-2023 制造业高质量发展大会暨数字化标准化创新高峰论坛在南京顺利举办&#xff0c;大会颁发了 2022-2023 年度数智转型“优秀服务商”奖项&#xff0c;星辰天合凭借在先进制造领域的优秀…

【论文阅读】MAKE-A-VIDEO: TEXT-TO-VIDEO GENERATION WITHOUT TEXT-VIDEO DATA

Make-a-video:没有文本-视频数据的文本-视频生成。 paper&#xff1a; code&#xff1a; ABSTRACT 优点: (1)加速了T2V模型的训练(不需要从头开始学习视觉和多模态表示)&#xff0c; (2)不需要配对的文本-视频数据&#xff0c; (3)生成的视频继承了当今图像生成模型的庞大…

SQL、Jdbc、JdbcTemplate、Mybatics

数据库&#xff1a;查询&#xff08;show、select&#xff09;、创建&#xff08;create)、使用(use)、删除(drop)数据库 表&#xff1a;创建&#xff08;【字段】约束、数据类型&#xff09;、查询、修改&#xff08;alter *add&#xff09;、删除 DML&#xff1a;增加(inse…

关于职场伪勤奋

前段时间看了一些关于勤奋学习、职场成长类的书籍&#xff0c;就在思考勤奋学习和职场的关系时&#xff0c;结合个人的理解&#xff0c;我定义了一种勤奋叫职场“伪勤奋”。那关于职场“伪勤奋”的定义和理解&#xff0c;与大家分享&#xff1a; 1、选择性任务完成 伪勤奋特征…

西电计科微机原理实验二(详细注释版)

西电计科微机原理实验二(详细注释版) 环境:VSCodeMASM/TASM插件(建议使用相同环境,学校机房环境有点老,可能会出一些奇怪的问题) 实验室:EⅡ-522 实验要求 输入一个不超过5位的十进制数,回车结束输入,并将其转换为二进制数,输出到屏幕上输入非数字字符,报错,重新输入输入q或…

git客户端安装问题

问题回顾&#xff1a; 做git客户端版本升级&#xff0c;安装好之后提示git&#xff1a;‘remote-https‘ 不是一个 git 命令。参见 git --help。 问题处理&#xff1a; 缺少第二步依赖下载 安装步骤&#xff1a; 1、删除安装git yum remove git 2、安装依赖 yum install lib…

Java常用注解

文章目录 第一章、Java注解与元数据1.1&#xff09;元数据与注解概念介绍1.2&#xff09;Java注解的作用和使用1.3&#xff09;注解的分类 第二章、Mybatis框架常用注解2.1&#xff09;Mybatis注解概览2.2&#xff09;常用注解MapperScanMapperSelectInsertUpdateDeleteParam结…

tcp的聊天室

注意&#xff1a;要加库文件&#xff0c;服务端客户端都要加 network 客户端的头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpSocket>//客户端类 #include <QMessageBox>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } Q…

Ubuntu 设置共享文件夹

一、在Windows中建立一个英文的文件夹 注意&#xff1a;新建文件夹的名称一定要是英文的&#xff0c;不能出现中文的路径&#xff08;可能出现问题&#xff09; 二、在VMware中添加共享文件 3: VMware安装VMware Tools 一般安装成功桌面上会显示这个安装包&#xff0c;&…

RV32/64 特权架构

machine mode: 运行最可信的代码;supervisor mode:为 Linux&#xff0c;FreeBSD 和 Windows 等操作系统提供支持;user mode:权限最低&#xff0c;应用程序的代码在此模式下运行&#xff1b; 这两种新模式都比user mode有着更高的权限&#xff0c;有更多权限的模式通常可以使用…

深度学习中的13种概率分布

1 概率分布概述 共轭意味着它有共轭分布的关系。 在贝叶斯概率论中&#xff0c;如果后验分布 p&#xff08;θx&#xff09;与先验概率分布 p&#xff08;θ&#xff09;在同一概率分布族中&#xff0c;则先验和后验称为共轭分布&#xff0c;先验称为似然函数的共轭先验。 多…

Python实现多种图像锐化方法:拉普拉斯算子和Sobel算子

Python实现多种图像锐化方法&#xff1a;拉普拉斯算子和Sobel算子 图像和视频逐渐成为人们生活中信息获取的重要来源&#xff0c;而图像和视频在传输过程中有很多因素可能造成图像模糊&#xff0c;比如不正确的聚焦会产生离焦模糊&#xff0c;景物和照相机的相对运动会造成运动…

C# 编写Windows服务程序

1.什么是windows服务&#xff1f; Microsoft Windows 服务&#xff08;即&#xff0c;以前的 NT 服务&#xff09;使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动&#xff0c;可以暂停和重新启动而且不显示任何用…

基于自动化脚本批量上传依赖到nexus内网私服

前言 因为某些原因某些企业希望私服是不能连接外网的&#xff0c;所以需要某些开源依赖需要我们手动导入到nexus中&#xff0c;尽管nexus为我们提供了web页面。但是一个个手动导入显然是一个庞大的工程。 对此我们就不妨基于脚本的方式实现这一过程。 预期效果 笔者本地仓库…

IDEA之设置主题风格为eclipse风格

设置IDEA的主题风格为eclipse风格&#xff0c;步骤如下: 1.选择File->Settings 2.选择 Plugins 3.搜索 eclipse theme&#xff0c;注意是红框里的&#xff0c;点击 install 下载后就会自动设置这个主题 4.你也可以去修改主题&#xff0c;选择 Appearance&#xff0c;设置th…

deepstream-python安装

​ 安装deepstream-docker 在这边文章中deepstream-docker详细介绍了如何在Ubuntu下安装deepstream-docker&#xff0c;安装完成之后&#xff0c;为了快速入门deepstream&#xff0c;我们可以安装deepstream-python库&#xff0c;通过阅读相应的例子来快速搭建一个应用。 安…

认识loader和plugin

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

IDEA之设置项目包的结构层级为eclipse默认样式

idea默认项目包的结构层级如下: 想修改成eclipse默认的那种样式&#xff0c;设置步骤如下: 1.点击下图中红框图标进行设置 2.选择 Tree Appearance&#xff0c;取消勾选 Compact Middle Packages 3.勾选红框里的两个选项&#xff0c;Flatten Packages 和 Hide Empty Middle Pa…

HTML插入视频和音频(详解)

&#x1f4cd;文章目录&#x1f4cd; &#x1f9c0;一&#xff0c;简介&#x1f9c0;二&#xff0c;视频(video)&#x1f367;1&#xff0c;普通的视频插入&#x1f367;2&#xff0c;在html5中嵌入视频网站视频 &#x1f9c0;三&#xff0c;音频(audio) &#x1f9c0;一&#…

50mA、24V、超低 IQ、低压降稳压器

一、Description The TPS715 low-dropout (LDO) voltage regulators offer the benefits of high input voltage, low-dropout voltage, low-power operation, and miniaturized packaging. The devices, which operate over an input range of 2.5 V to 24 V, are stable wit…