java苹果沙盒验证参数问题_php – iOS7 – 收据未在沙盒验证 – 错误21002(java.lang.IllegalArgumentException)...

在将应用从iOS6升级到iOS7时,开发者遇到了收据验证问题。使用新的appStoreReceiptURL获取收据并进行Base64编码后,通过POST请求发送到Apple服务器进行验证。无论是使用生产环境还是沙盒环境,都收到了状态为21002的错误,表示收据数据无效。错误日志显示异常类型为`java.lang.IllegalArgumentException`。问题可能与Base64编码的大小和格式有关,因为不同编码方式导致了发送数据的成功与失败。
摘要由CSDN通过智能技术生成

我正在将应用程式从iOS6转换为iOS7.在我使用不建议使用的transactionReceipt方法之前,我正在尝试推荐的方法来检索收据,然后在64位编码:

NSData *working = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];

// Tried 64 or 76 chars/line and LF or CR line endings

NSString *receipt = [working base64EncodedStringWithOptions:kNilOptions];

以上是代码中唯一的变化.以下是我如何验证它,没有更改:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue,

^{

NSMutableString *url = [NSMutableString string];

[url appendFormat:@"%@", WEB_SERVICE];

[url appendFormat:@"receipt=%@", receipt];

NSStringEncoding encoding;

NSError *error = [NSError new];

NSURL *URL = [NSURL URLWithString:url];

NSString *json = [NSString stringWithContentsOfURL:URL usedEncoding:&encoding error:&error];

// check json and error

// ... code omitted

}

在服务器端,这是我用来验证收据的PHP代码,除了尝试沙盒以外的任何错误,没有任何变化:

// Encode as JSON

$json = json_encode(array('receipt-data' => $receipt));

// Try production first, if it doesn't work, then try the sandbox

$working = postJSONToURL('https://buy.itunes.apple.com/verifyReceipt', $json, false);

error_log('production - '.print_r($working, true));

if (@$working['status'] !== 0) // === 21007)

$working = postJSONToURL('https://sandbox.itunes.apple.com/verifyReceipt', $json, true);

error_log('sandbox - '.print_r($working, true));

这是错误日志输出:

production - Array\n(\n [status] => 21002\n [exception] => java.lang.IllegalArgumentException\n)\n

sandbox - Array\n(\n [status] => 21002\n [exception] => java.lang.IllegalArgumentException\n)\n

看起来我正在苹果投掷各种异常!

再次,唯一的区别是如何检索和编码收据.有没有人遇到这个问题并修复它?

谢谢阅读.

/ YR

根据要求,PostJSONToURL的代码:

function postJSONToURL($url, $json, $disableSSLVerify = false)

{

$resource = curl_init($url);

curl_setopt($resource, CURLOPT_CUSTOMREQUEST, 'POST');

curl_setopt($resource, CURLOPT_POSTFIELDS, $json);

curl_setopt($resource, CURLOPT_RETURNTRANSFER, true);

curl_setopt($resource, CURLOPT_HTTPHEADER, array(

'Content-Type: application/json',

'Content-Length: '.strlen($json)));

curl_setopt($resource, CURLOPT_HEADER, 0);

if ($disableSSLVerify)

{

curl_setopt($resource, CURLOPT_SSL_VERIFYHOST, 0);

curl_setopt($resource, CURLOPT_SSL_VERIFYPEER, 0);

}

//curl_setopt($resource, CURLOPT_VERBOSE, true);

//curl_setopt($resource, CURLOPT_STDERR, $fp = fopen('/tmp/curl_output'.rand(1000, 9999).'.txt', 'w'));

$contents = json_decode(curl_exec($resource), true);

if (!$contents)

$contents = array();

curl_close($resource);

//fclose($fp);

return $contents;

}

经过一些实验后的新细节,已经确定发送现有数据作为基础64编码可能侵犯了一些内部限制.如果超出了一些内部限制,数据甚至不会被发送,那么本地设备就会在本地发生故障.列是:数据格式,编码数据的大小,是否到达服务器:

raw receipt data 5K N/A

base64 no options 6.66K yes

base64 76 chars/line 6.75K no

base64 64 chars/line 6.77K no

hex coded 10K no

请注意,成功发送和不发送之间的差异小于100字节.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值