.NET 6+ 必须绕过官方AlipaySDKNet SDK,手动拼接HTTP请求并用RSA.Create()加载PEM私钥签名,因旧SDK依赖已移除的RSACryptoServiceProvider;alipay.trade.qr.pay仅返回跳转链接,需QRCoder生成二维码。

别用官方 AlipaySDKNet SDK —— 它在 .NET 6+ 上根本跑不起来,不是配置错,是底层调用已移除的 System.Web 和 RSACryptoServiceProvider,强行加载会直接抛 System.PlatformNotSupportedException 或 System.MissingMethodException。你得自己拼 HTTP 请求 + 手动签名。
为什么 DefaultAopClient 在 .NET Core 6+ 中会崩溃
DefaultAopClient 依赖旧版 SDK 的 AlipaySignature.RSASign,而该方法内部硬编码调用了已被 .NET Core 彻底移除的 RSACryptoServiceProvider 构造函数。NuGet 上所谓“兼容版”包(如 Alipay.AopSdk.Core)多数只是简单封装了同步 HTTP 调用,签名逻辑仍走老路,运行时必炸。
- 错误现象:
System.MissingMethodException: Method not found: 'System.Security.Cryptography.RSA System.Security.Cryptography.RSA.Create(System.String)' - 真实原因:不是缺引用、不是没装包,是 API 已被废弃,无法 shim
- .NET 6+ 唯一可行路径:绕过 SDK,用
System.Net.Http.HttpClient发起 POST,所有参数手拼、签名手算
签名必须用 PEM 私钥 + RSA.Create() + PKCS#1 v1.5
支付宝要求 sign_type=RSA2(即 SHA256withRSA),但 .NET 6+ 不再支持从 PFX/P12 或字符串直接加载私钥。你必须提前把应用私钥转成 PEM 格式,并用 RSA.Create() 加载。
- 转换命令(用 OpenSSL):
openssl pkcs8 -topk8 -inform PEM -in app_private_key.pem -outform PEM -nocrypt - 加载方式(不能用
new RSACryptoServiceProvider()):using var rsa = RSA.Create(); rsa.ImportFromPem(privateKeyPemText); - 签名前要对拼接字符串做 UTF-8 编码,再调用:
rsa.SignData(dataBytes, HashAlgorithmName.SHA256, RSAEncryptionPadding.Pkcs1) - 签名结果是
byte[],必须用WebEncoders.Base64UrlEncode()(不是Convert.ToBase64String()),否则支付宝验签失败
alipay.trade.qr.pay 接口返回的是跳转链接,不是图片
这个接口不生成二维码图,只返回一个 qr_code 字段,值是形如 https://qr.alipay.com/xxx 的扫码跳转地址。你要用它本地生成二维码图片。
- 请求必须带齐 8 个基础参数:
app_id、method、format、charset、sign_type、sign、timestamp、version -
biz_content必须是 JSON 字符串(不是对象!),且需先JsonSerializer.Serialize()再Uri.EscapeDataString() -
out_trade_no必须全局唯一,total_amount单位是元,最多两位小数(如"99.9"合法,"99.900"验证失败) - 沙箱网关地址是
https://openapi.alipaydev.com/gateway.do,正式环境是https://openapi.alipay.com/gateway.do,写反就收不到响应
生成二维码要用 QRCoder,别指望 SDK 自带
官方 SDK 没有图像生成功能。你得用 QRCoder 把 qr_code 字符串转成 Bitmap 或 Byte[],再塞进 PictureBox 或返回 HTTP 响应。
- NuGet 安装:
QRCoder(注意不是QrCodeGenerator等其他包) - 关键代码片段:
var qrGenerator = new QRCodeGenerator(); var qrData = qrGenerator.CreateQrCode(qrCodeUrl, QRCodeGenerator.ECCLevel.Q); var qrCode = new PngByteQRCode(qrData); byte[] pngBytes = qrCode.GetGraphic(20); // 20 是缩放倍数
- WinForm 中显示:
pictureBox.Image = Image.FromStream(new MemoryStream(pngBytes));
最易被忽略的一点:支付宝 v3 REST API 的签名拼接规则和旧 SDK 完全不同——所有参数(包括 biz_content)都要参与排序、拼接、URL 编码,且键名必须小写、不能含空格、不能有多余换行。少一个字符、多一个空格、大小写错位,签名就无效。别抄错示例,自己逐字比对文档。



















