当前位置:   article > 正文

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

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

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

初步猜测:
  1. 没有拿到收据
  2. 收据没有通过二次验证 于是加入了以下代码验证:
  1. var data = new Dictionary<string, object>
  2. {
  3. { "receipt_data", transactionResult.receipt },
  4. };
  5. //将内购信息转发到服务器收集查询
  6. ServerManager.instance.SendToUrl("purchase/receipts", "POST", data, jObject =>
  7. {
  8. var statusToken = jObject["status"];
  9. if (statusToken.IsNullOrEmpty())
  10. {
  11. callback(false);
  12. return;
  13. }
  14. var status = (int)statusToken;
  15. callback(status == 0);
  16. });

复制

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

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

复制


继续往下分析

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

OC代码问题

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

  1. #import <Foundation/Foundation.h>
  2. #import <StoreKit/StoreKit.h>
  3. NSString *managerName = @"IAPManager";
  4. NSString *initSucceedFuncName = @"OnInitSucceed";
  5. NSString *transactionFuncName = @"OnTransactionCompleted";
  6. NSString *restoreCompleteFuncName = @"OnRestoreCompleted";
  7. NSString *splitString = @"-";
  8. @interface IAPManager : NSObject<SKProductsRequestDelegate, SKPaymentTransactionObserver>
  9. {
  10. SKProductsRequest *productsRequest;
  11. NSArray *products;
  12. }
  13. -(void)initIAP;
  14. -(void)buy:(NSString *)productIdentifier;
  15. -(void)restore;
  16. @end
  17. @implementation IAPManager
  18. IAPManager *iapManager = nil;
  19. //初始化, 商品id用,分隔
  20. -(void) initIAP:(NSString *)productIdentifiers
  21. {
  22. [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
  23. NSArray *idArra
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/404506
推荐阅读
相关标签
  

闽ICP备14008679号