iOS内购-部分玩家无法恢复购买

目录

iOS内购-部分玩家无法恢复购买

重现:

初步猜测:

OC代码问题

Apple bug

Apple TSI(苹果技术支持)

解决方案

到Apple developer forum找解决方案

通过另外的方式去恢复购买或兑换

结语

作者简介:


iOS内购-部分玩家无法恢复购买

重现:

  1. 在设备1上兑换了A商品,恢复购买和再次免费购买,是无效的,而在设备2上用同一个账号却是有效的。
  2. 在设备上再次购买已购买的A商品,提示已购买将免费获取,点击后却无反应。

由于这只能在正式环境上重现,可以代码调试的沙盒测试是不行的,只能通过猜测和上线调试代码才能验证问题

初步猜测:

  1. 没有拿到收据
  2. 收据没有通过二次验证 于是加入了以下代码验证:

var data = new Dictionary<string, object>
{
    { "receipt_data", transactionResult.receipt },
};
//将内购信息转发到服务器收集查询
ServerManager.instance.SendToUrl("purchase/receipts", "POST", data, jObject =>
{
    var statusToken = jObject["status"];
    if (statusToken.IsNullOrEmpty())
    {
        callback(false);
        return;
    }
    var status = (int)statusToken;
    callback(status == 0);
});
 

var data = new Dictionary<string, object>
{
    { "receipt_data", transactionResult.receipt },
};
//将内购信息转发到服务器收集查询
ServerManager.instance.SendToUrl("purchase/receipts", "POST", data, jObject =>
{
    var statusToken = jObject["status"];
    if (statusToken.IsNullOrEmpty())
    {
        callback(false);
        return;
    }
    var status = (int)statusToken;
    callback(status == 0);
});

复制

通过收据内容就可以分析。 最后发现,客户端的内购没有回调

//内购状态回调
-(void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions


继续往下分析

  1. Apple bug
  2. 由于内购OC代码是借助Unity插件IOSNative的,所以可能是这部分OC代码问题
  3. 内购丢单和兑换码无效是同一个模块导致的

OC代码问题

由于代码是IOSNative的,找了一些主流的内购插件,甚至Unity自带的Unity IAP,底层原理都一样,还是无法解决问题,所以需要自己去写OC代码,把内购信息从OC转发到C#去验证

#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>


NSString *managerName = @"IAPManager";
NSString *initSucceedFuncName = @"OnInitSucceed";
NSString *transactionFuncName = @"OnTransactionCompleted";
NSString *restoreCompleteFuncName = @"OnRestoreCompleted";
NSString *splitString = @"-";

@interface IAPManager : NSObject<SKProductsRequestDelegate, SKPaymentTransactionObserver>
{
    SKProductsRequest *productsRequest;
    NSArray *products;
}

-(void)initIAP;
-(void)buy:(NSString *)productIdentifier;
-(void)restore;

@end

@implementation IAPManager
IAPManager *iapManager = nil;
//初始化, 商品id用,分隔
-(void) initIAP:(NSString *)productIdentifiers
{
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    NSArray *idArray = [productIdentifiers componentsSeparatedByString:splitString];
    NSSet *idSet = [NSSet setWithArray:idArray];
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:idSet];
    request.delegate = self;
    [request start];
}

//购买
-(void) buy:(NSString *)productIdentifier
{
    SKProduct *product = nil;
    for (SKProduct *p in products)
    {
        if ([p.productIdentifier isEqualToString:productIdentifier])
        {
            product = p;
            break;
        }
    }
    if (product != nil)
    {
        SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    }
}</

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值