在应用程序购买收据验证问题

时间:2017-03-08 13:03:34

标签: ios swift in-app-purchase receipt-validation

我有一个支持订阅和付费功能的应用程序。我在服务器端遇到了收据验证问题。 如果

  1. 用户尚未订阅并尝试使用pay as下载内容 你去的我得到21002错误(传递共享秘密为 验证)
  2. 如果用户订阅且已过期。现在用户试图 下载付费,然后回复21004(不通过共享密钥)
  3. 我无法理解何时应将共享密钥传递给Apple服务器。由于我们只有一张包含消耗品和订阅收据信息的苹果收据。

    任何帮助?

1 个答案:

答案 0 :(得分:1)

Code 21002表示您发送给拥有共享密码的Apple的JSON和您的收据数据"错误的" 或不是格式苹果想要它。

enter image description here

另请尝试从收到字符'\n''\r'后删除,并将'+'替换为'%2B',然后再将其发送到服务器。像这样:

 NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
 NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
 NSString *receiptDataString = [receipt base64EncodedStringWithOptions:0];
 receiptDataString=[receiptDataString stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];
 receiptDataString=[receiptDataString stringByReplacingOccurrencesOfString:@"\n" withString:@""];
 receiptDataString=[receiptDataString stringByReplacingOccurrencesOfString:@"\r" withString:@""];
 NSString *postDataString = [NSString stringWithFormat:@"receipt-data=%@", receiptDataString];
 NSString *length = [NSString stringWithFormat:@"%lu", (unsigned long)[postDataString length]];
 [request setValue:length forHTTPHeaderField:@"Content-Length"];
 [request setHTTPBody:[postDataString dataUsingEncoding:NSASCIIStringEncoding]];

Reference

Code 21004这意味着你的代码中存在逻辑错误,在某种程度上你没有传递密钥