老盐 發表於 2025-5-16 09:20:00

.NET 8 开发的跨平台多商户第三方支付SDK

<h2><span style="font-size: 16px">前言</span></h2>
<p><span style="font-size: 16px">快速发展的互联网应用开发中,支付功能已成为各类平台不可或缺的一环。为了帮助大家更高效地接入主流支付渠道,推荐一套基于 .NET 开发的第三方支付 SDK。该 SDK 支持跨平台运行,适用于多种操作系统和设备,并提供对支付宝和微信支付的全面支持。</span></p>
<h2><span style="font-size: 16px">项目介绍</span></h2>
<p><span style="font-size: 16px">本SDK 以简化接入流程、提升开发效率为目标,设计上注重易用性与扩展性,特别适合需要快速集成支付功能的多商户应用场景。不管是开发电商平台、SaaS 系统,还是其他需要支付能力的应用,本工具都能提供稳定、灵活且高效的解决方案。</span></p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202505/576536-20250516091325235-744794644.png" width="700" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<h2><span style="font-size: 16px">项目技术</span></h2>
<p><strong><span style="font-size: 16px">开发环境</span></strong></p>
<ul>
<li><span style="font-size: 16px">IDE:</span><span style="font-size: 16px">Rider、</span><span style="font-size: 16px">Visual Studio</span></li>
<li><span style="font-size: 16px">.NET SDK:</span><span style="font-size: 16px">.NET 9.0</span></li>
</ul>
<p><strong><span style="font-size: 16px">运行环境:</span></strong><span style="font-size: 16px">支持的.NET版本</span><span style="font-size: 16px">.NET 8.0、</span><span style="font-size: 16px">.NET 9.0</span></p>
<h3><span style="font-size: 16px">配置选项</span></h3>
<p><span style="font-size: 16px">本 SDK 提供了针对不同支付平台的客户端配置选项,以确保可以轻松地进行定制化设置:</span></p>
<ul>
<li><span style="font-size: 16px">AlipayClientOptions: 用于配置与支付宝对接所需的各种参数。</span></li>
<li><span style="font-size: 16px">WeChatPayClientOptions: 用于配置与微信支付对接所需的各种参数。</span></li>
<li><span style="font-size: 16px">配置选项简化开发流程,使得集成支付功能变得更加直观和高效。</span></li>
</ul>
<h2><span style="font-size: 16px">项目示例</span></h2>
<h3><span style="font-size: 16px">支付宝 - 示例代码</span></h3>
<p><span style="font-size: 16px">.NET 开发的第三方支付 SDK 实现支付宝 V3 扫码支付的一个简化步骤:</span></p>
<p><strong><span style="font-size: 16px">支付宝 V3 扫码支付实现步骤</span></strong></p>
<p><span style="font-size: 16px">1、安装NuGet包</span></p>
<p><span style="font-size: 16px">使用命令行工具安装必要的 NuGet 包:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">dotnet add package Essensoft.Paylinks.Alipay.Client
dotnet add package Essensoft.Paylinks.Alipay.Payments</span></pre>
</div>
<p><span style="font-size: 16px">2、配置依赖注入</span></p>
<p><span style="font-size: 16px">在&nbsp;<code>Startup.cs</code>&nbsp;或&nbsp;<code>Program.cs</code>&nbsp;文件中添加对&nbsp;<code>AlipayClient</code>&nbsp;的服务注册:</span></p>
<div class="cnblogs_code">
<pre>services.AddAlipay/XMLSchema</pre>
</div>
<p><span style="font-size: 16px">3、注入 IAlipayClient</span></p>
<p><span style="font-size: 16px">在需要使用的地方通过构造函数或方法参数注入&nbsp;<code>IAlipayClient</code>&nbsp;实例。</span></p>
<p><span style="font-size: 16px">4、支付宝客户端选项</span></p>
<p><span style="font-size: 16px">创建并配置&nbsp;<code>AlipayClientOptions</code>&nbsp;对象,设置如应用ID、私钥等必要参数(此处省略具体设置):</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> options = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AlipayClientOptions()
{
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置您的配置项</span>
};</pre>
</div>
<p><span style="font-size: 16px">5、创建请求模型</span></p>
<p><span style="font-size: 16px">交易预创建模型&nbsp;<code>AlipayTradePreCreateBodyModel</code>,包括商户订单号、总金额、商品标题和异步通知地址等信息:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> model = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AlipayTradePreCreateBodyModel
{
    OutTradeNo </span>= DateTimeOffset.Now.ToString(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">yyyyMMddHHmmssfff</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">),
    TotalAmount </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">0.01</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
    Subject </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">扫码支付测试</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
    NotifyUrl </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://www.domain.com/Alipay/Payments/Notify/TradeResult</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
};</span></pre>
</div>
<p><span style="font-size: 16px">6、初始化请求对象</span></p>
<p><span style="font-size: 16px">创建一个&nbsp;<code>AlipayTradePreCreateRequest</code>&nbsp;实例,并将之前准备好的模型绑定到该请求上:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> request = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AlipayTradePreCreateRequest();
request.SetBodyModel(model);</span></pre>
</div>
<p><span style="font-size: 16px">7、执行请求并处理响应</span></p>
<p><span style="font-size: 16px">调用&nbsp;<code>client.ExecuteAsync(request, options)</code>&nbsp;方法发送请求,并检查响应是否成功。如果成功,则可以获取返回的数据进行后续处理:</span></p>
<div class="code-block-extension-header">
<div class="code-block-extension-headerLeft">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> response = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> client.ExecuteAsync(request, options);
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (response.IsSuccessful)
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 处理成功响应...</span>
}</pre>
</div>
</div>
</div>
<p><span style="font-size: 16px">以上步骤提供了一个简化的流程,帮助快速理解和集成支付宝扫码支付功能到.NET 应用程序中。根据实际需求,可能还需要添加异常处理和日志记录等增强功能。</span></p>
<h3><span style="font-size: 16px">微信支付 - 示例代码</span></h3>
<p><span style="font-size: 16px">微信支付 V3 Native 下单示例代码整理出的简化步骤说明,便于快速理解与集成:</span></p>
<p><strong><span style="font-size: 16px">微信支付 V3 Native 下单实现步骤</span></strong></p>
<p><span style="font-size: 16px">1、安装 NuGet 包</span></p>
<p><span style="font-size: 16px">使用命令行安装必要的 SDK 组件:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">dotnet add package Essensoft.Paylinks.WeChatPay.Client
dotnet add package Essensoft.Paylinks.WeChatPay.Payments</span></pre>
</div>
<p><span style="font-size: 16px">2、注册服务(依赖注入)</span></p>
<p><span style="font-size: 16px">在&nbsp;<code>Startup.cs</code>&nbsp;或&nbsp;<code>Program.cs</code>&nbsp;中注册微信支付客户端服务:</span></p>
<div class="code-block-extension-header">
<div class="code-block-extension-headerLeft">
<div class="cnblogs_code">
<pre>services.AddWeChatPayClient();</pre>
</div>
</div>
</div>
<p><span style="font-size: 16px">3、注入&nbsp;<code>IWeChatPayClient</code></span></p>
<p><span style="font-size: 16px">在需要使用的类中通过构造函数注入微信支付客户端实例:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> PaymentService
{
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">readonly</span><span style="color: rgba(0, 0, 0, 1)"> IWeChatPayClient _client;

    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> PaymentService(IWeChatPayClient client)
    {
      _client </span>=<span style="color: rgba(0, 0, 0, 1)"> client;
    }
}</span></pre>
</div>
<p><span style="font-size: 16px">4、微信支付客户端配置选项</span></p>
<p><span style="font-size: 16px">创建并设置&nbsp;<code>WeChatPayClientOptions</code>,例如商户私钥、APIv3 密钥等:</span></p>
<div class="code-block-extension-header">
<div class="code-block-extension-headerLeft">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> options = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> WeChatPayClientOptions()
{
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置您的微信支付相关参数</span>
};</pre>
</div>
</div>
</div>
<p><span style="font-size: 16px">5、创建请求模型</span></p>
<p><span style="font-size: 16px">构建 Native 支付下单请求模型&nbsp;<code>WeChatPayTransactionsNativeBodyModel</code>:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> model = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> WeChatPayTransactionsNativeBodyModel
{
    AppId </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456789</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 应用ID</span>
    MchId = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456789</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 商户号</span>
    Description = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Native下单测试</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 商品描述</span>
    OutTradeNo = DateTimeOffset.Now.ToString(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">yyyyMMddHHmmssfff</span><span style="color: rgba(128, 0, 0, 1)">"</span>), <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 商户订单号</span>
    NotifyUrl = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://www.domain.com/WeChatPay/Payments/Notify/TransactionSuccess</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 异步通知地址</span>
    Amount = <span style="color: rgba(0, 0, 255, 1)">new</span> CommReqAmountInfo { Total = <span style="color: rgba(128, 0, 128, 1)">1</span> } <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 支付金额,单位:分</span>
};</pre>
</div>
<p><span style="font-size: 16px">6、初始化请求对象并绑定模型</span></p>
<p><span style="font-size: 16px">创建&nbsp;<code>WeChatPayTransactionsNativeRequest</code>&nbsp;实例,并将模型数据绑定到请求体中:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> request = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> WeChatPayTransactionsNativeRequest();
request.SetBodyModel(model);</span></pre>
</div>
<p><span style="font-size: 16px">7、执行请求并处理响应</span></p>
<p><span style="font-size: 16px">调用&nbsp;<code>ExecuteAsync</code>&nbsp;方法发起请求,并判断是否成功:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> response = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> client.ExecuteAsync(request, options);
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (response.IsSuccessful)
{
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取预支付交易码(二维码内容),返回给前端生成二维码</span>
    <span style="color: rgba(0, 0, 255, 1)">var</span> codeUrl =<span style="color: rgba(0, 0, 0, 1)"> response.CodeUrl;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 可以生成二维码图片或直接跳转至扫码页面</span>
<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
{
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 处理错误信息</span>
    Console.WriteLine($<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">请求失败: {response.ErrorMessage}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}</span></pre>
</div>
<h3><span style="font-size: 16px">补充建议</span></h3>
<ul>
<li>
<p><span style="font-size: 16px">订单号生成:建议封装一个方法生成唯一订单号,如&nbsp;<code>GenerateOutTradeNo()</code>。</span></p>
</li>
<li>
<p><span style="font-size: 16px">日志记录:推荐使用&nbsp;<code>ILogger</code>&nbsp;替代&nbsp;<code>Console.WriteLine</code>,方便追踪问题。</span></p>
</li>
<li>
<p><span style="font-size: 16px">异常处理:实际生产环境中应加入 try-catch 块,防止未捕获异常中断流程。</span></p>
</li>
<li>
<p><span style="font-size: 16px">多商户支持:可通过&nbsp;<code>IOptionsMonitor&lt;WeChatPayClientOptions&gt;</code>&nbsp;动态切换不同商户配置。</span></p>
</li>
</ul>
<h2><span style="font-size: 16px">项目源码</span></h2>
<p><span style="font-size: 16px"><strong>Gitee:</strong>https://gitee.com/essensoft/paylinks</span></p>
<p><span style="font-size: 16px"><strong>GitHub:</strong>https://github.com/essensoft/paylinks</span></p>
<h2><span style="font-size: 16px">总结</span></h2>
<p><span style="font-size: 16px">以上仅展示了第三方支付SDK的部分功能。更多实用特性和详细信息,请大家访问项目源码。</span></p>
<p><span style="font-size: 16px">希望通过本文能为.NET在第三方支付支付宝支付和微信支付开发方面提供有价值的参考。感谢您阅读本篇文章,欢迎在评论区留言交流,分享您的宝贵经验和建议。</span></p>
<h2><span class="md-plain md-expand">最后</span></h2>
<p><span style="font-size: 16px">如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。</span></p>
<p><span style="font-size: 16px">也可以加入微信公众号<strong></strong>&nbsp;社区,与其他热爱技术的同行一起交流心得,共同成长!<strong>优秀是一种习惯,欢迎大家留言学习!</strong></span></p>
<p><span style="font-size: 16px"><strong><img src="https://img2024.cnblogs.com/blog/576536/202408/576536-20240814113403514-910171896.png" alt="" style="display: block; margin-left: auto; margin-right: auto"></strong></span></p><br><br>
来源:https://www.cnblogs.com/1312mn/p/18879453
頁: [1]
查看完整版本: .NET 8 开发的跨平台多商户第三方支付SDK