我试着查看所有其他问题,似乎没有解决这个问题。我已缩小范围,因此https://sandbox.itunes.apple.com/verifyReceipt的回复只是{"status":21002}
。任何帮助将不胜感激,我已复制下面的相关代码。
NSString *completeString = @"http://www.mysite.com/verify.php";
NSURL *urlForValidation = [NSURL URLWithString:completeString];
NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];
[validationRequest setHTTPMethod:@"POST"];
NSString *strTest = [NSString stringWithFormat:@"receipt=%@", [self createEncodedString:transaction.transactionReceipt]];
[validationRequest setHTTPBody:[NSData dataFromBase64String:strTest]];
NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil];
NSString *response = [[NSString alloc] initWithData: responseData encoding: NSUTF8StringEncoding];
NSLog(@"%@", response);
- (NSString*) createEncodedString:(NSData*)data {
static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
const int size = ((data.length + 2)/3)*4;
uint8_t output[size];
const uint8_t* input = (const uint8_t*)[data bytes];
for (int i = 0; i < data.length; i += 3)
{
int value = 0;
for (int j = i; j < (i + 3); j++)
{
value <<= 8;
if (j < data.length)
value |= (0xFF & input[j]);
}
const int index = (i / 3) * 4;
output[index + 0] = table[(value >> 18) & 0x3F];
output[index + 1] = table[(value >> 12) & 0x3F];
output[index + 2] = (i + 1) < data.length ? table[(value >> 6) & 0x3F] : '=';
output[index + 3] = (i + 2) < data.length ? table[(value >> 0) & 0x3F] : '=';
}
return [[NSString alloc] initWithBytes:output length:size encoding:NSASCIIStringEncoding];
}
最后这是使用的PHP代码:
$url = 'https://sandbox.itunes.apple.com/verifyReceipt';
$receipt = "{%s}" % $_POST["receipt"];
$purchase_encoded = base64_encode( $receipt );
$encodedData = json_encode( Array(
'receipt-data' => $purchase_encoded
) );
//Open a Connection using POST method, as it is required to use POST method.
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $encodedData);
$encodedResponse = curl_exec($ch);
curl_close($ch);
//Decode response data using json_decode method to get an object.
echo $encodedResponse;
$response = json_decode( $encodedResponse );
echo $response;
答案 0 :(得分:3)
经过大量的摆弄,我能够弄明白。我认为最大的错误是我如何设置HTTP正文。最终的代码如下,希望这可以帮助其他人!
目标-C:
NSString *completeString = @"http://www.mysite.com/verify.php";
NSURL *urlForValidation = [NSURL URLWithString:completeString];
NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];
[validationRequest setHTTPMethod:@"POST"];
NSString *strTest = [NSString stringWithFormat:@"receipt=%@", [self base64forData:transaction.transactionReceipt]];
[validationRequest setHTTPBody:[strTest dataUsingEncoding:NSUTF8StringEncoding]];
NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil];
NSString *response = [[NSString alloc] initWithData: responseData encoding: NSUTF8StringEncoding];
NSLog(@"%@", response);
PHP:
$url = 'https://sandbox.itunes.apple.com/verifyReceipt';
$encodedData = json_encode( Array(
'receipt-data' => $_POST["receipt"]
) );
//Open a Connection using POST method, as it is required to use POST method.
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $encodedData);
$encodedResponse = curl_exec($ch);
curl_close($ch);
$response = json_decode( $encodedResponse );
/*
echo "Status Code:";
echo $response->{'status'};
*/
if ($response->{'status'} != 0) {
echo "FAIL";
} else {
echo "SUCCESS";
}
答案 1 :(得分:0)
nlutterman的回答是正确的!它对我帮助很大。 如果有人试图让他的解决方案工作,只有使用以下方法将收据数据编码为base64(应用程序内)时,它才有效。
- (NSString*)base64forData:(NSData*)theData {
const uint8_t* input = (const uint8_t*)[theData bytes];
NSInteger length = [theData length];
static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
uint8_t* output = (uint8_t*)data.mutableBytes;
NSInteger i;
for (i=0; i < length; i += 3) {
NSInteger value = 0;
NSInteger j;
for (j = i; j < (i + 3); j++) {
value <<= 8;
if (j < length) {
value |= (0xFF & input[j]);
}
}
NSInteger theIndex = (i / 3) * 4;
output[theIndex + 0] = table[(value >> 18) & 0x3F];
output[theIndex + 1] = table[(value >> 12) & 0x3F];
output[theIndex + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '=';
output[theIndex + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '=';
}
return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; }
正常的base64EncodedStringWithOptions:
无法正常工作。