在C#项目中对接支付宝支付,核心难点集中在SDK的签名校验和异步通知数据的解析处理,这两部分直接关系到支付流程的安全性和数据准确性,需要严格按照支付宝的接口规范实现。

环境准备与SDK引入
首先需要在项目中引入支付宝官方提供的.NET SDK,目前主流版本支持.NET Framework和.NET Core,可通过NuGet包管理器搜索AlipaySDKNet安装,安装完成后即可调用相关接口完成支付对接。
支付下单接口调用
调用支付宝的支付下单接口需要先配置商户的基础信息,包括应用ID、商户私钥、支付宝公钥等,以下是下单的基础代码示例:
using AlipaySDKNet.OpenAPI;
using AlipaySDKNet.OpenAPI.Models;
using System;
namespace AlipayDemo
{
public class PayService
{
// 配置支付宝参数
private static string appId = "你的应用ID";
private static string merchantPrivateKey = "你的商户私钥";
private static string alipayPublicKey = "你的支付宝公钥";
private static string serverUrl = "https://openapi.alipay.com/gateway.do";
private static string charset = "UTF-8";
public static string CreatePayOrder(string outTradeNo, string totalAmount, string subject)
{
// 初始化客户端
AlipayClient client = new DefaultAlipayClient(serverUrl, appId, merchantPrivateKey, "json", charset, alipayPublicKey, "RSA2");
// 构造下单请求
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
// 设置回调地址
request.SetReturnUrl("http://ipipp.com/return");
request.SetNotifyUrl("http://ipipp.com/notify");
// 设置业务参数
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.OutTradeNo = outTradeNo;
model.TotalAmount = totalAmount;
model.Subject = subject;
model.ProductCode = "FAST_INSTANT_TRADE_PAY";
request.SetBizModel(model);
// 执行请求获取支付表单
string form = client.pageExecute(request).Body;
return form;
}
}
}
SDK验签核心实现
验签是确认支付宝返回数据真实性的关键步骤,SDK提供了内置的验签方法,不需要开发者手动实现签名算法,只需要传入对应的参数即可完成校验:
using AlipaySDKNet.OpenAPI;
using System.Collections.Specialized;
using System.Web;
namespace AlipayDemo
{
public class VerifyService
{
private static string alipayPublicKey = "你的支付宝公钥";
private static string charset = "UTF-8";
public static bool VerifySign(NameValueCollection requestParams)
{
// 将请求参数转换为字典
IDictionary<string, string> paramsDict = new Dictionary<string, string>();
foreach (string key in requestParams.AllKeys)
{
paramsDict.Add(key, requestParams[key]);
}
// 调用SDK验签方法
bool verifyResult = AlipaySignature.RSACheckV2(paramsDict, alipayPublicKey, charset, "RSA2", false);
return verifyResult;
}
}
}
异步通知解析与处理
支付宝支付完成后会向配置的异步通知地址发送回调请求,需要正确解析请求参数,完成验签后再处理业务逻辑,以下是异步通知的处理示例:
using System;
using System.Collections.Specialized;
using System.Web;
namespace AlipayDemo
{
public class NotifyHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
NameValueCollection requestParams = context.Request.Form;
// 先完成验签
bool isVerify = VerifyService.VerifySign(requestParams);
if (!isVerify)
{
context.Response.Write("failure");
return;
}
// 验签通过后解析业务参数
string tradeStatus = requestParams["trade_status"];
string outTradeNo = requestParams["out_trade_no"];
string tradeNo = requestParams["trade_no"];
string totalAmount = requestParams["total_amount"];
// 处理支付成功的逻辑
if (tradeStatus == "TRADE_SUCCESS" || tradeStatus == "TRADE_FINISHED")
{
// 更新订单状态、发货等业务操作
Console.WriteLine($"订单{outTradeNo}支付成功,支付宝交易号:{tradeNo},金额:{totalAmount}");
// 返回成功响应给支付宝,避免重复通知
context.Response.Write("success");
}
else
{
context.Response.Write("success");
}
}
public bool IsReusable
{
get { return false; }
}
}
}
注意事项
- 商户私钥和支付宝公钥需要严格保密,不要硬编码在代码中,建议放在配置文件或密钥管理服务中。
- 异步通知地址必须是公网可访问的地址,且不能携带自定义参数,否则支付宝无法正确发送回调。
- 收到异步通知后一定要先完成验签再处理业务逻辑,避免伪造请求导致业务异常。
- 支付宝可能会重复发送异步通知,业务处理需要保证幂等性,避免重复处理同一笔订单。
常见问题排查
如果验签失败,首先检查支付宝公钥是否正确,是否和当前应用的环境匹配,其次检查字符集是否统一为UTF-8,签名算法是否使用RSA2。如果异步通知没有收到,检查通知地址是否正确可达,是否被服务器防火墙拦截。