当前位置:首页 > 行业动态 > 正文

c#支付宝二次开发教程

本教程详细介绍了基于C# MVC框架的WEB API通用框架,并集成了微信和支付宝支付功能。开发者可以通过该框架快速构建具备支付功能的Web应用,提升开发效率和用户体验。

一、开发环境搭建

1、安装Visual Studio:从微软官方网站下载并安装适合你操作系统的Visual Studio版本,建议选择最新的稳定版,如Visual Studio 2022或更高版本,在安装过程中,确保选择包含“ASP.NET和Web开发”以及“.NET Core跨平台开发”等组件。

2、注册支付宝开发者账号:访问支付宝开放平台官网(https://openhome.alipay.com/),按照提示完成开发者账号的注册流程,注册成功后,你将获得一个开发者APPID,它是后续开发中用于与支付宝服务器进行身份验证的重要凭证。

3、下载支付宝SDK:登录支付宝开放平台,在“文档中心”找到“接口文档”部分,根据你所使用的编程语言(C#)下载对应的支付宝SDK压缩包,解压后,你将得到相关的DLL文件和示例代码。

二、创建项目

1、创建ASP.NET Core Web应用程序:打开Visual Studio,选择“创建新项目”,然后选择“ASP.NET Core Web应用程序(.NET 6.0或以上)”,为项目命名并选择合适的保存位置,点击“创建”按钮。

2、配置项目依赖项:在解决方案资源管理器中,右键点击你的项目名称,选择“管理NuGet程序包”,搜索并安装“Alipay.OpenAPI”这个官方提供的支付宝SDK包,它将提供与支付宝交互所需的各种类和方法。

三、集成支付宝支付功能

1、设置配置文件:在项目的appsettings.json文件中,添加以下配置项来存储你的支付宝应用公钥和应用私钥(这些密钥可以在支付宝开放平台的开发者控制台中获取):

{
    "Alipay": {
        "AppId": "your_appid",
        "PrivateKey": "your_private_key",
        "PublicKey": "your_public_key",
        "NotifyUrl": "http://yourdomain.com/notify",
        "ReturnUrl": "http://yourdomain.com/return"
    }
}

请将上述配置中的占位符替换为你自己的实际值。

2、创建支付请求类:在项目中创建一个新的类,例如命名为AlipayService,用于封装与支付宝支付相关的逻辑,引入必要的命名空间:

using Alipay.OpenAPI;
using Alipay.OpenAPI.Domain;
using Alipay.OpenAPI.Request;
using Alipay.OpenAPI.Response;
using Microsoft.Extensions.Configuration;
using System.Text;

编写一个方法来发起支付请求:

public class AlipayService : IDisposable
{
    private readonly IConfiguration _configuration;
    private AlipayClient _client;
    public AlipayService(IConfiguration configuration)
    {
        _configuration = configuration;
        var options = new AlipayOptions
        {
            AppId = _configuration["Alipay:AppId"],
            PrivateKey = _configuration["Alipay:PrivateKey"],
            PublicKey = _configuration["Alipay:PublicKey"]
        };
        _client = new DefaultAlipayClient(options);
    }
    public string CreateOrder(string outTradeNo, decimal totalAmount, string subject, string body)
    {
        // 创建订单请求对象
        var request = new AlipayTradePagePayRequest
        {
            OutTradeNo = outTradeNo,
            TotalAmount = totalAmount.ToString("F2"),
            Subject = subject,
            Body = body,
            ProductCode = "FAST_INSTANT_TRADE_PAY", // 使用当面付产品码
            NotifyUrl = _configuration["Alipay:NotifyUrl"],
            ReturnUrl = _configuration["Alipay:ReturnUrl"]
        };
        // 执行请求并获取响应结果
        try
        {
            var response = _client.Execute(request, CommandType.SDK_EXECUTE);
            if (response.IsSuccessful())
            {
                return response.Result.Body; // 返回支付页面的HTML表单数据
            }
            else
            {
                throw new Exception($"支付宝支付请求失败: {response.Result.SubMsg}");
            }
        }
        catch (Exception ex)
        {
            // 处理异常情况,记录日志或抛出自定义异常
            Console.WriteLine(ex.Message);
            throw;
        }
    }
    public void Dispose()
    {
        _client?.Dispose();
    }
}

这个方法接受订单号、金额、订单标题和描述作为参数,构建一个支付请求并发送到支付宝服务器,如果请求成功,将返回支付页面的HTML表单数据,你可以将其嵌入到前端页面中供用户提交支付。

3、前端页面集成:在你的ASP.NET Core项目的Views文件夹下,创建一个用于显示支付按钮的视图,例如Payment.cshtml,在该视图中,通过控制器将生成的支付表单数据传递给前端,并使用JavaScript将其自动提交:

@model string
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>支付宝支付</title>
    <script type="text/javascript">
        function submitForm() {
            document.getElementById('alipaySubmit').submit();
        }
    </script>
</head>
<body onload="submitForm()">
    <form id="alipaySubmit" action="@Model" method="post">
        <input type="hidden" name="WIDout_trade_no" value="@ViewBag.OutTradeNo">
        <input type="hidden" name="WIDscene" value="@ViewBag.Scene">
        <input type="hidden" name="WIDchannel" value="@ViewBag.Channel">
        <input type="hidden" name="WIDshow_url" value="@ViewBag.ShowUrl">
        <input type="hidden" name="g_v_p_o_f" value="@ViewBag.GVPOF">
        <input type="hidden" name="sign" value="@ViewBag.Sign">
        <input type="hidden" name="_input_charset" value="utf-8">
    </form>
</body>
</html>

在控制器中,调用AlipayServiceCreateOrder方法生成支付表单数据,并将其传递给视图:

public class PaymentController : Controller
{
    private readonly IConfiguration _configuration;
    private readonly AlipayService _alipayService;
    public PaymentController(IConfiguration configuration, AlipayService alipayService)
    {
        _configuration = configuration;
        _alipayService = alipayService;
    }
    public IActionResult Index()
    {
        // 这里可以根据实际情况设置订单号、金额等信息
        string outTradeNo = Guid.NewGuid().ToString();
        decimal totalAmount = 100.0m; // 示例金额,单位为元
        string subject = "测试订单";
        string body = "这是一个测试订单的描述信息";
        string formData = _alipayService.CreateOrder(outTradeNo, totalAmount, subject, body);
        ViewBag.OutTradeNo = outTradeNo;
        ViewBag.Scene = "bar_code"; // 扫码支付场景
        ViewBag.Channel = "ALIPAY_QR"; // 支付渠道
        ViewBag.ShowUrl = "https://qr.alipay.com/bax07459bjt7dzl0ycxftnqg"; // 二维码地址(示例)
        ViewBag.GVPOF = "https://openapi.alipaydev.com/gateway.do?charset=utf-8&version=5.0&method=alipay.trade.page.pay&sign={SIGN}&auth_token={TOKEN}&format=json&timestamp={TIMESTAMP}&app_id={APPID}&biz_content=%7B%22out_trade_no%22%3A%22{OUT_TRADE_NO}%22%2C%22total_amount%22%3A%22{TOTAL_AMOUNT}%22%2C%22subject%22%3A%22{SUBJECT}%2C%22body%22%3A%22{BODY}%22%7D&notify_url={NOTIFY_URL}&return_url={RETURN_URL}"; // 网关地址(示例)
        ViewBag.Sign = "your_sign"; // 替换为实际生成的签名字符串
        ViewBag.Token = "your_token"; // 替换为实际生成的授权令牌字符串(如果有需要的话)
        ViewBag.Timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(); // 当前时间戳(秒级)
        ViewBag.AppId = _configuration["Alipay:AppId"]; // 你的应用ID
        ViewBag.NotifyUrl = _configuration["Alipay:NotifyUrl"]; // 通知回调地址
        ViewBag.ReturnUrl = _configuration["Alipay:ReturnUrl"]; // 同步回调地址
        return View("Payment");
    }
}

这样,当用户访问/Payment路由时,系统将自动跳转到支付宝支付页面进行支付。

四、处理支付回调和异步通知

1、创建回调处理控制器:在项目中创建一个新的控制器,例如命名为NotificationController,用于处理支付宝的异步通知和同步回调请求,引入必要的命名空间:

using Microsoft.AspNetCore.Mvc;
using System.Text;

创建两个方法分别处理POST和GET请求:

public class NotificationController : ControllerBase
{
    [HttpPost]
    public IActionResult Notify()
    {
        // 读取请求参数并进行验签等处理...
        // 这里只是一个简单的示例,实际应用中需要根据支付宝的文档实现完整的验签逻辑
        var dict = new Dictionary<string, string>();
        foreach (var key in Request.Form.Keys)
        {
            dict[key] = Request.Form[key];
        }
        // TODO: 添加验签逻辑,验证通知的合法性
        // 如果验签通过,则更新订单状态或执行其他业务逻辑...
        // 这里简单返回一个成功的响应结果
        return Content("success");
    }
    [HttpGet]
    public IActionResult Return()
    {
        // 处理同步回调请求...
        // 可以根据订单号查询订单状态并显示相应的页面信息给用户
        // 这里简单返回一个成功的页面信息
        return View();
    }
}

为了安全起见,你需要在Startup.cs中配置中间件以支持POST请求:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 其他中间件配置...
    app.UseStaticFiles(); // 静态文件中间件(如果需要)
    app.UseRouting(); // 路由中间件(如果需要)
    app.UseEndpoints(endpoints => { endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); // MVC路由配置(示例)
    app.UseEndpoints(endpoints => { endpoints.MapControllerRoute(name: "Payment", pattern: "Payment"); }); // 支付页面路由配置(示例)
    app.UseEndpoints(endpoints => { endpoints.MapControllerRoute(name: "Notification", pattern: "Notify"); }); // 通知回调路由配置(示例)
    app.UseEndpoints(endpoints => { endpoints.MapControllerRoute(name: "Notification", pattern: "Return"); }); // 同步回调路由配置(示例)
}

你还需要在支付宝开放平台的开发者后台配置通知回调地址(NotifyUrl)和同步回调地址(ReturnUrl),确保它们指向你的服务器上的相应控制器方法。

在实际生产环境中,你需要根据业务需求进一步完善代码逻辑,例如添加错误处理、日志记录、安全性检查等功能,希望这个教程对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时提问。

0