qq_38211448 2024-03-13 18:55 采纳率: 98.4%
浏览 8
已结题

如何查询ios 已付款但未结束交易的内购订单

iOS内购,如何处理购买完,App挂掉,没有来得及交付商品的问题。

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-13 18:55
    关注

    引自免费微信小程序:皆我百晓生

    查询iOS已付款但未结束交易的内购订单,以及处理购买后App意外退出导致商品未交付的问题,可以通过监听和查询StoreKit相关API来实现。以下是详细步骤及代码示例:

    1. 监听支付状态变化: 首先在你的应用中设置一个SKPaymentTransactionObserver来监听交易状态的变化。当用户完成支付但App崩溃前,系统会自动恢复这个未完成的交易。
    // 在AppDelegate或初始化的地方注册观察者
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
        // ...
    }
    
    // 实现SKPaymentTransactionObserver协议方法
    @interface YourViewController () <SKPaymentTransactionObserver>
    // ...
    @end
    
    @implementation YourViewController
    
    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)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];
                    break;
                default:
                    break;
            }
        }
    }
    
    // 完成交易并提供商品(虚拟商品)
    - (void)completeTransaction:(SKPaymentTransaction *)transaction {
        // 提交验证,解锁商品或服务
        // 这里假设你有一个方法deliverProductIdentifier:用于提供商品
        [self deliverProductIdentifier:transaction.payment.productIdentifier];
        
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    }
    
    // 错误处理
    - (void)failedTransaction:(SKPaymentTransaction *)transaction {
        if (transaction.error.code != SKErrorPaymentCancelled) {
            NSLog(@"Transaction error: %@", transaction.error.localizedDescription);
        }
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    }
    
    // 恢复交易处理
    - (void)restoreTransaction:(SKPaymentTransaction *)transaction {
        // 还原用户的商品状态,类似于completeTransaction:操作
        [self deliverProductIdentifier:transaction.originalTransaction.payment.productIdentifier];
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    }
    
    @end
    
    1. 启动时检查未完成的交易: 为了确保即使在App挂掉之后也能处理这种情况,在App每次启动时,可以查询所有待处理的交易。
    - (void)applicationDidBecomeActive:(UIApplication *)application {
        // 检查是否有未完成的交易
        NSArray *transactions = [[SKPaymentQueue defaultQueue].transactions];
        for (SKPaymentTransaction *transaction in transactions) {
            if (transaction.transactionState == SKPaymentTransactionStatePurchased) {
                [self completeTransaction:transaction];
            }
        }
    }
    

    通过以上代码,你可以确保即使在App异常退出的情况下,也能够正确处理用户已经付款但未交付的商品问题。不过请注意,实际开发中请根据你的业务逻辑调整和完善上述代码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月22日
  • 已采纳回答 3月14日
  • 创建了问题 3月13日

悬赏问题

  • ¥15 请帮我看一看数电项目如何设计
  • ¥23 (标签-bug|关键词-密码错误加密)
  • ¥66 比特币地址如何生成taproot地址
  • ¥20 数学建模数学建模需要
  • ¥15 关于#lua#的问题,请各位专家解答!
  • ¥15 什么设备可以研究OFDM的60GHz毫米波信道模型
  • ¥15 不知道是该怎么引用多个函数片段
  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 基于pso参数优化的LightGBM分类模型