首页  >  文章  >  后端开发  >  应用内购买收据验证故障排除:如何处理“无效状态”响应?

应用内购买收据验证故障排除:如何处理“无效状态”响应?

Linda Hamilton
Linda Hamilton原创
2024-10-17 20:13:03307浏览

Troubleshooting In-App Purchase Receipt Validation: How to Handle

验证应用内购买收据

应用内购买验证对于确保用户进行合法购买并授予他们访问权限至关重要优质内容或功能。尽管有文档,但实施有效的收据验证可能具有挑战性。

一种方法是将收据数据发送到 PHP 服务器,然后将其转发到 Apple App Store 进行验证。成功的响应确认了购买的有效性,允许您继续在服务器上记录交易。

但是,如果您在收据验证期间遇到“无效状态”响应,则必须检查是否有任何拼写错误你的代码。以下示例代码提供了解决方案:

- (BOOL)verifyReceipt:(SKPaymentTransaction *)transaction {
    NSString *jsonObjectString = [self encode:(uint8_t *)transaction.transactionReceipt.bytes length:transaction.transactionReceipt.length];      
    NSString *completeString = [NSString stringWithFormat:@"http://url-for-your-php?receipt=%@", jsonObjectString];               
    NSURL *urlForValidation = [NSURL URLWithString:completeString];       
    NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];              
    [validationRequest setHTTPMethod:@"GET"];         
    NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil];  
    [validationRequest release];
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding];
    NSInteger response = [responseString integerValue];
    [responseString release];
    return (response == 0);
}

- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length {
    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    NSMutableData *data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
    uint8_t *output = (uint8_t *)data.mutableBytes;

    for (NSInteger i = 0; i < length; i += 3) {
        NSInteger value = 0;
        for (NSInteger j = i; j < (i + 3); j++) {
            value <<= 8;

            if (j < length) {
                value |= (0xFF & input[j]);
            }
        }

        NSInteger index = (i / 3) * 4;
        output[index + 0] =                    table[(value >> 18) & 0x3F];
        output[index + 1] =                    table[(value >> 12) & 0x3F];
        output[index + 2] = (i + 1) < length ? table[(value >> 6)  & 0x3F] : '=';
        output[index + 3] = (i + 2) < length ? table[(value >> 0)  & 0x3F] : '=';
    }

    return [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease];
}

此外,可以在您的服务器上使用以下 PHP 代码来处理收据验证并记录交易:

$receipt = json_encode(array("receipt-data" => $_GET["receipt"]));
// NOTE: use "buy" vs "sandbox" in production.
$url = "https://sandbox.itunes.apple.com/verifyReceipt";
$response_json = call-your-http-post-here($url, $receipt);
$response = json_decode($response_json);

// Save the data here!

echo $response->status;

记住替换使用您首选的 HTTP post 机制“call-your-http-post-here”。通过实施此代码并确保其准确性,您可以有效地验证收据购买并自信地管理应用内交易。

以上是应用内购买收据验证故障排除:如何处理“无效状态”响应?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn