uni-app ios内购上架被拒绝--点击开通一直无限期加载

发布于 1周前 作者 yuanlaile 来自 Uni-App

uni-app ios内购上架被拒绝–点击开通一直无限期加载 我们继续发现您的应用内购买产品存在一个或多个错误,导致用户体验不佳。具体来说,当我们点击“立即开通”时,该应用程序正在无限期加载。请查看以下详细信息和资源,并完成后续步骤。

查看设备详细信息:

  • 设备类型:iPad Air(第 5 代)
  • 操作系统版本:iOS 17.4

后续步骤

在服务器上验证收据时,服务器需要能够处理从 Apple 测试环境获取收据的生产签名应用。建议的方法是,您的生产服务器始终首先根据生产 App Store 验证收据。如果验证失败并显示错误代码“生产中使用的沙盒收据”,则应改为针对测试环境进行验证。

信息 描述
开发环境
版本号 iOS 17.4
项目创建方式

14 回复

疑问:提交给审核员审核时是否需要将sandbox改为true


试试替换以下代码
打开文件 /uni_modules/uni-pay/uniCloud/cloudfunctions/uni-pay-co/service/pay.js 找到函数 async verifyReceiptFromAppleiap(data) { 函数里

if (verifyReceiptRes.tradeState !== “SUCCESS”) {
throw { errCode: ERROR[54002] };
} 改成
if (verifyReceiptRes.tradeState !== “SUCCESS”) {
// 尝试使用相反的环境再次验证
let uniPayConifg = await this.getUniPayConfig({ provider: “appleiap”, provider_pay_type: “app” });
uniPayInstance = uniPay.initAppleIapPayment({
…uniPayConifg,
sandbox: !uniPayConifg.sandbox,
});
verifyReceiptRes = await uniPayInstance.verifyReceipt({
receiptData: transaction_receipt
});
if (verifyReceiptRes.tradeState !== “SUCCESS”) {
// 如果还是不成功,则校验不通过
throw { errCode: ERROR[54002] };
}
}

这个我已经换过了呀

会不会是因为提交给审核员审核时需要将sandbox改为true,等待审核通过后再改为false

回复 辣条人: 改成这个代码后,每个订单都会自动进行2次验证,一次是sandbox为true, 一次是false, 所以不用改sandbox

之前已经换过了

换了后要重新上传下uni-pay-co

回复 DCloud_uniCloud_VK: 上传了,审核员测试说无限期加载呀

回复 辣条人: 那你看下是否还有其他原因, 理论上这样改就可以了

回复 辣条人: 大佬,我也遇到了,这个问题卡几天了,咋处理好的?

回复 DCloud_uniCloud_VK: 大佬,我也遇到了,这个问题卡几天了,咋处理好的?

大佬,我也遇到了,这个问题卡几天了,咋处理好的?

沙盒模式关掉

针对uni-app在iOS内购上架时遇到“点击开通一直无限期加载”的问题,这通常与内购流程的实现和苹果服务器的交互有关。以下是一些可能帮助解决问题的代码示例和检查点,但请注意,由于我无法直接访问你的项目代码和配置,以下示例是基于通用情况提供的。

1. 检查内购配置

确保你的App Store Connect中内购项目(IAP)已正确配置,包括产品ID、价格、可用性等信息。

2. 初始化StoreKit框架

在uni-app中,你可能需要使用原生的StoreKit框架来处理内购。以下是一个使用Swift的示例,你可以通过uni-app的插件或原生模块集成这段代码:

import StoreKit

class InAppPurchaseManager: NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserver {
    func requestProducts() {
        let productIdentifiers = Set<String>(["your_product_id"])
        let request = SKProductsRequest(productIdentifiers: productIdentifiers)
        request.delegate = self
        request.start()
    }

    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        for product in response.products {
            print("Found product: \(product.localizedTitle) \(product.price)")
        }
    }

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch transaction.transactionState {
            case .purchased:
                queue.finishTransaction(transaction)
                // 处理购买成功逻辑
                break
            case .failed:
                queue.finishTransaction(transaction)
                // 处理购买失败逻辑
                break
            case .restored:
                queue.finishTransaction(transaction)
                // 处理恢复购买逻辑
                break
            default:
                break
            }
        }
    }
}

3. 集成到uni-app

你需要将上述Swift代码封装成一个uni-app的原生插件或模块,然后在uni-app中调用这个插件的相关方法来处理内购。确保在调用内购流程时,有适当的错误处理和用户反馈机制,避免用户遇到无限加载的情况。

4. 调试和日志

增加详细的日志记录,特别是在发起购买请求、接收产品信息和处理交易状态时。这可以帮助你更快地定位问题所在。

5. 测试

在沙盒环境中彻底测试你的内购流程,确保所有可能的路径都被覆盖,包括购买成功、失败和恢复购买的场景。

结论

由于uni-app本身是一个跨平台框架,对于iOS特定的功能(如内购),通常需要依赖原生代码或插件。因此,确保你的原生代码正确实现了内购流程,并且与uni-app的集成没有问题,是解决这个问题的关键。如果问题依旧存在,可能需要进一步检查苹果服务器的响应或联系苹果支持获取更具体的帮助。

回到顶部