支付宝官方C# SDK(AlipaySDKNet)不支持.NET Core 6+,因依赖已移除的System.Web和RSACryptoServiceProvider;.NET 5+项目须手写HTTP调用v3 REST API,用System.Security.Cryptography.RSA签名PEM私钥,并自行生成二维码。

支付宝 SDK 不支持 .NET Core 6+ 直接调用
支付宝官方 C# SDK(AlipaySDKNet)最后更新是 2020 年,仅兼容 .NET Framework 4.5+,在 .NET 6/7/8 上会直接报 System.PlatformNotSupportedException 或找不到 System.Web 类型。这不是配置问题,是底层依赖断层。
实操建议:
- 若项目是 .NET Framework 4.6.1+,可直接用官方 SDK,注意 NuGet 包名是
AlipaySDKNet(不是Alipay或Alipay.EasySDK) - 若项目是 .NET Core / .NET 5+,必须绕过 SDK,手写 HTTP 请求对接支付宝开放平台 REST API(推荐 v3 接口)
- 签名不能用 SDK 里的
AlipaySignature.RSASign,要改用System.Security.Cryptography.RSA+ PKCS#1 v1.5 签名,私钥格式必须是 PEM(-----BEGIN RSA PRIVATE KEY-----),不是 PFX/P12
生成支付二维码本质是调用 alipay.trade.qr.pay 接口
支付宝没有“生成二维码图片”的独立接口,而是返回一个带 qr_code 字段的 JSON 响应,值是支付宝扫码跳转链接(以 https://qr.alipay.com/ 开头)。二维码需本地用第三方库(如 QRCoder)生成。
关键点:
- 请求必须带
app_id、method、format、charset、sign_type、sign、timestamp、version这 8 个基础参数,缺一不可 -
biz_content是 JSON 字符串(不是对象!),必须用JsonSerializer.Serialize后再 URL 编码,其中out_trade_no需业务系统唯一,total_amount单位是元且最多两位小数 - 支付宝沙箱环境的网关地址是
https://openapi.alipaydev.com/gateway.do,正式环境是https://openapi.alipay.com/gateway.do,别写反
AlipaySignature.RSASign 在 .NET Core 下会抛 System.MissingMethodException
因为旧 SDK 调用了已移除的 RSACryptoServiceProvider 构造函数。强行加载会崩溃,不是加个兼容包就能修好的事。
替代方案(.NET 6+):
- 用
System.Security.Cryptography.RSA.Create()加载 PEM 私钥(需先用 OpenSSL 转换:openssl pkcs8 -topk8 -inform PEM -in app_private_key.pem -outform PEM -nocrypt) - 签名前对拼接字符串做 UTF-8 编码,再用
rsa.SignData+HashAlgorithmName.SHA256+RSAEncryptionPadding.Pkcs1 - 结果是 byte[],必须 Base64 编码后 URL 安全转义(
WebEncoders.Base64UrlEncode),不能直接用Convert.ToBase64String
沙箱支付成功但收不到异步通知?检查 notify_url 是否公网可达
支付宝服务器只往你填的 notify_url 发 POST 请求,且要求 HTTPS、响应超时 ≤5 秒、返回字符串 success(纯文本,无空格无换行)。本地 localhost 或内网地址一律失败。
调试建议:
- 用
ngrok http 5000暴露本地端口,把https://xxx.ngrok.io/alipay/notify填进沙箱后台 - 通知接口必须是 POST,
[HttpPost],且读取原始 body(Request.Body),不能依赖模型绑定——支付宝发的是 form-urlencoded,不是 JSON - 验签前先用
HttpUtility.ParseQueryString解析 body,过滤掉sign和sign_type,再按字母序拼接键值对(key=value&key=value…),最后用公钥验签
最容易被忽略的是:支付宝公钥不是你上传的那把,得从沙箱后台「查看密钥」里单独下载「支付宝公钥」(RSA2),不是「应用公钥」。



















