C#实现支付宝转账功能

这篇具有很好参考价值的文章主要介绍了C#实现支付宝转账功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境

.net 6
AlipaySDKNet.OpenAPI 2.4.0

申请证书

登录支付宝开放平台https://open.alipay.com/
进入控制台
C#实现支付宝转账功能,dotnet,c#,数据库,开发语言
C#实现支付宝转账功能,dotnet,c#,数据库,开发语言
授权回调地址也设置一下,加密方式AES

新建.net 6空白的web项目

证书除了java都需要自己生成一下pkcs1的密钥
C#实现支付宝转账功能,dotnet,c#,数据库,开发语言
privatekey.txt就是根据应用私钥生成的pkcs1密钥
安装AlipaySDKNet.OpenAPI 2.4.0
C#实现支付宝转账功能,dotnet,c#,数据库,开发语言
配置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; } = "";
    }
}

实现方法文章来源地址https://www.toymoban.com/news/detail-758810.html

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();
        }
    }
}

到了这里,关于C#实现支付宝转账功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • php实现支付宝商户转账

    目录 一:背景介绍 一:准备工作 三:代码实现 一:背景介绍 最近工作中,要用到支付宝的商家转账功能,用php代码实现,网上找的内容,有些是老版本的实现,有些是调用sdk,而且功能还不完善。最后自己实现了官方最新的转账功能,特此记录下。 一:准备工作 1:在开

    2024年01月20日
    浏览(37)
  • [C#] WinForm/WPF 实现数据库连接与操作(MySQL)

    目录 🌿前言 🌿MySQL数据库简介 🌿数据库的基本概念 🌿ADO.NET体系结构 数据提供程序(.NET Framework Data Provider) 程序数据集(DataSet) 🌿数据库的访问形式 🌿数据库的连接 🌿实现增查改删(CRUD)操作 CRUD SQL常用语句 程序实现数据读取操作 程序实现增删改操作 数据库的使用在涉及

    2024年02月09日
    浏览(44)
  • JavaWeb05(删除&增加&修改功能实现&连接数据库)

    目录 一.实现删除功能 1.1 url如何传参? xx.do?参数=参数值参数名=参数值 1.2 servlet如何拿对应值? //根据参数名拿到对应的参数值  String str = req.getParameter(\\\"参数名\\\") 1.3 如何询问? οnclick=\\\"return confirm(\\\'确定要删除嘛?\\\')\\\" 1.4 代码分析 1.4.1 前端传参 删除  1.4.2 后台业务处理 二.实

    2024年02月02日
    浏览(49)
  • MVC框架实现用户登录注册功能(连接数据库)

    一、简单理解MVC框架 二、项目结构 三、项目源码 3.1 User 3.2 UserDao 3.3 RegisterDao 3.4 servletControll 3.5 servletControllRegister 3.6 web.xml 3.7 login.jsp 3.8 register.jsp 3.9 success.jsp 3.10 failure.jsp  四、实现效果 总结 本篇文章主要介绍利用MVC框架去实现一个简单的用户登录注册功能,内容主

    2024年02月06日
    浏览(61)
  • Flutter框架实现登录注册功能,不连接数据库

    要在Flutter框架中实现登录和注册功能,而不连接数据库,可以使用本地存储来存储用户信息。以下是一个简单的示例,演示如何使用本地存储来实现登录和注册功能。 首先,我们需要添加 shared_preferences 插件到 pubspec.yaml 文件中: 然后,在 lib 文件夹中创建一个新的文件夹

    2024年02月08日
    浏览(42)
  • JavaWeb实现简易的注册登录功能(与数据库连接)

    一、创建数据库表连接 这里我们创建一个数据库名为db_user,创建库的使用可视化工具很简单就不细说了,下面sql代码块是我们创建一个简易用户表为了方便我们后续进行登录注册操作。 下面就是建好的表: 1、建一个与数据库连接的file文件:db.properties 二、创建前端页面 1、

    2024年01月19日
    浏览(50)
  • 利用 pt-archiver 实现数据库归档功能

    一个完整的项目,除了开发阶段,还有运维移交阶段,运维移交往往需要考虑数据库后续的归档机制,比如:将1年前的数据归档到另外一台服务器的归档库。有些业务表数据量比较大,为了更快的查询速度更好的用户体验,可能会对某张特定的表做归档处理,只保留最近1个

    2024年02月19日
    浏览(41)
  • JavaWeb04(登录&绑值&模糊查询&功能实现&连接数据库)

    目录 一.实现登录功能  2.2 制作简易验证码 2.3 完成登录验证 2.4 登录实现 ①连接字符串 private static final String URL=\\\"jdbc:oracle:thin:@localhost:1521:orcl\\\"; ②加载驱动  OracleDriver private static final String URL=\\\"jdbc:oracle:thin:@localhost:1521:orcl\\\";      二.实现表格版的绑定数据 2.1 效果预览 2.2 代

    2024年02月02日
    浏览(53)
  • 使用Kepserver 自带 DataLogger 功能 实现工控数据转储关系型数据库

    本文以 Mysql数据库为例,介绍使用 kepserver 的datalogger 功能转储数据到 mysql 第一步:下载安装 Mysql ODBC 数据库驱动 前往 官网下载ODBC驱动 https://downloads.MySQL.com/archives/c-ODBC/ 建议下载 msi 格式的安装文件   下载完成后,直接安装。 如果安装过程报这个错,那就下载个 vc_redist 

    2024年02月02日
    浏览(37)
  • 通过Annotation将用户操作记录到数据库表功能实现

    一、背景         在用户对我们所开发的系统访问的时候,需要我们的系统具有强大的健壮性,使得给与用户的体验感十足。在业务开发的过程中,我们通过将几个相关的操作绑定成一个事件,使得安全性以及数据的前后一致性得到提高。但是在溯源方面,我们往往没有很好

    2024年03月13日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包