首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RMStore接收验证故障流程

RMStore接收验证故障流程
EN

Stack Overflow用户
提问于 2014-08-25 19:46:50
回答 1查看 724关注 0票数 0

我正在使用RMStore来验证收据。请注意,我不使用RMStore的实际购买部分。如果接收无效,则该过程将成功地处理抛出错误和不传递内容的成功和失败。我有意地改变了包,以强制失败作为一个测试。不过,我的问题是,苹果的失败过程和确认。

问题是,虽然这个过程确实检测到了验证失败,因此阻止了内容被发送给用户,但Apple随后仍然返回了一个关于购买成功的对话框。好消息是,购买并不成功,内容也没有交付,但我希望苹果的这个对话框不会显示出来,因为它会造成混乱。

这是我检查的实现。现在,我只是在测试失败场景,然后再在失败块中进行更多的测试。

代码语言:javascript
复制
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
    NSLog(@"completeTransaction...");

    RMStoreAppReceiptVerificator *verifyReceipt = [[RMStoreAppReceiptVerificator alloc]init];

    [verifyReceipt verifyTransaction:transaction success:^{
        [self provideContentForProductIdentifier:transaction.payment.productIdentifier];
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    }failure:^(NSError *error){
        NSLog(@"failure to verify: %@",error.description);
    }];
}

在失败块中是否有一种方法可以停止在Apple中创建成功对话框的过程,还是我需要在早期阶段执行此检查?

更新:

在进一步研究这个问题时,状态SKPaymentTransactionStatePurchased调用了上面的方法--每个苹果的状态定义是:

“应用商店成功地处理了付款。您的应用程序应该提供用户购买的内容。”

这告诉我,阻止对话可能为时已晚。但是,有一个较早的状态,但是,我认为收据验证必须在购买之后,但在交付内容之前(否则将不会有购买验证)。所以,这只是一个必须处理冲突信息的问题,还是我遗漏了什么?

更新2:在注释中为请求添加更多方法

代码语言:javascript
复制
@interface IAPHelper () <SKProductsRequestDelegate, SKPaymentTransactionObserver>
@end

@implementation IAPHelper
{
    SKProductsRequest * _productsRequest;
    RequestProductsCompletionHandler _completionHandler;

    NSSet * _productIdentifiers;
    NSMutableSet * _purchasedProductIdentifiers;
    NSDictionary *_mappingDict;
}

- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers andMappings:(NSDictionary *)mappingDict
{

    if ((self = [super init])) {

        // Store product identifiers & mappings
        _productIdentifiers = productIdentifiers;
        _mappingDict = mappingDict;

        // Add self as transaction observer
        [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

    }
    return self;

}

- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler {


    // 1
    _completionHandler = [completionHandler copy];

    // 2
    _productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers];
    _productsRequest.delegate = self;
    [_productsRequest start];

}

- (BOOL)productPurchased:(NSString *)productIdentifier {
    return [_purchasedProductIdentifiers containsObject:productIdentifier];
}

- (void)buyProduct:(SKProduct *)product {

    NSLog(@"Buying %@...", product.productIdentifier);

    SKPayment * payment = [SKPayment paymentWithProduct:product];
    [[SKPaymentQueue defaultQueue] addPayment:payment];

}

#pragma mark - SKProductsRequestDelegate

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

    NSLog(@"Loaded list of products...");
    _productsRequest = nil;

    NSArray * skProducts = response.products;
    for (SKProduct * skProduct in skProducts) {
        NSLog(@"Found product: %@ %@ %0.2f",
              skProduct.productIdentifier,
              skProduct.localizedTitle,
              skProduct.price.floatValue);
    }

    if (_completionHandler)
    {
        _completionHandler(YES, skProducts);
        _completionHandler = nil;
    }
}

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {

    NSLog(@"Failed to load list of products.");
    _productsRequest = nil;

    if (_completionHandler)
    {
        _completionHandler(NO, nil);
        _completionHandler = nil;
    }
}

下面是调用completeTransaction的特定方法

代码语言:javascript
复制
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for (SKPaymentTransaction * transaction in transactions) {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                [self restoreTransaction:transaction];
            default:
                break;
        }
    };
}
EN

回答 1

Stack Overflow用户

发布于 2014-08-29 21:34:18

我们在评论中指出,这个问题与RMStore无关。

你并不是在测试真实的欺诈场景,所以苹果公司是否会发出警告并不重要。

这将涉及使用假收据,或发送假电话给Store事务观察员。在这两种情况下,你都会得到警报。

当使用有效事务模拟失败场景时,您不能期望Apple也会认为事务无效。没有API可以告诉苹果交易是欺诈的。您只能完成一项事务,或者不能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25493268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档