You need to enable JavaScript to run this app. C#实现Apple App Store促销优惠签名生成无效问题求助
优惠活动
大模型
产品
解决方案
定价
更多

C#实现Apple App Store促销优惠签名生成无效问题求助

C# 生成Apple App Store内购促销优惠签名校验无效问题

基本情况

参照Apple官方内购促销优惠签名生成规范,通过C#代码为移动端提供内购场景的促销签名服务,但生成的所有签名均被App Store校验为无效。
无效签名示例:EbnuPbJn0ht/xtRBN6jDZAIg1LfxPo+YMYg/PbNQEoASSbI/m1+SeOF/uD+HXm6Jv+Xbh/jbsyvxY3cfrSQNAQ==

现有实现代码

string appBundleID = ConfigurationManager.AppSettings["Apple:AppBundleId"];
string keyIdentifier = ConfigurationManager.AppSettings["Apple:KeyId"];
string privateKey = ConfigurationManager.AppSettings["Apple:PrivateKey"];

var nonce = Guid.NewGuid().ToString().ToLower();
var unixTimestamp = (long)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds;
string unsignedString = appBundleID + '\u2063' + keyIdentifier + '\u2063' + productIdentifier + '\u2063' + offerIdentifier + '\u2063' + applicationUsername + '\u2063' + nonce + '\u2063' + unixTimestamp;

CngKey key = CngKey.Import(Convert.FromBase64String(privateKey), CngKeyBlobFormat.Pkcs8PrivateBlob);

using (ECDsaCng dsa = new ECDsaCng(key))
{
    dsa.HashAlgorithm = CngAlgorithm.Sha256;
    var unsignedData = Encoding.UTF8.GetBytes(unsignedString);
    var signature = dsa.SignData(unsignedData);
    if (dsa.VerifyData(unsignedData, signature))
    {
        var signatureString = Convert.ToBase64String(signature);
        return new IAPSignatureViewModel()
        {
            KeyIdentifier = keyIdentifier,
            Nonce = nonce,
            Signature = signatureString,
            TimeStamp = unixTimestamp
        };
    }
}

常见无效原因排查

  • 签名编码格式不匹配:.NET 中ECDsaCng默认输出ASN.1 DER结构的签名,而Apple要求的是无结构的紧凑格式:将签名拆分出的r、s两个大整数,各自补齐到32字节长度后直接拼接为64字节的二进制流,再转Base64字符串返回。直接对默认DER格式签名转Base64,长度和结构都不符合要求,必然校验失败。
  • 时间戳单位错误:代码中使用了毫秒级Unix时间戳,Apple要求传入的是10位秒级Unix时间戳,精度不匹配会直接触发校验失败。
  • nonce格式不规范:代码中生成的Guid带有横杠分隔符,需要移除所有横杠后再转成小写无分隔符的字符串参与签名拼接,格式不匹配无法通过校验。
  • applicationUsername字段处理错误:不能直接传入applicationUsername明文,需要对用户传入的用户名计算SHA-1哈希值,取十六进制小写字符串参与签名拼接;如果无applicationUsername则直接填空字符串占位,不能传null导致拼接值异常。
  • 私钥导入异常:从Apple开发者后台下载的.p8私钥文件,需要移除首尾的-----BEGIN PRIVATE KEY-----、-----END PRIVATE KEY-----标识,去掉所有换行后再解码为Base64字节流导入,否则导入的私钥本身无效。
  • 待签名串顺序错误:字段拼接顺序必须严格遵循appBundleID、keyIdentifier、productIdentifier、offerIdentifier、处理后的applicationUsername值、nonce、timestamp的顺序,用\u2063作为分隔符,顺序调换会直接导致签名不匹配。

内容的提问来源于stack exchange,提问作者adelahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 08:36:03