uni-app ios 内购商品在获取商品时报错,但不是每次都报错

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

uni-app ios 内购商品在获取商品时报错,但不是每次都报错

产品分类

uniapp/App

开发环境信息

项目 详情
PC开发环境操作系统 Windows
PC开发环境版本号 win10
HBuilderX类型 正式
HBuilderX版本号 4.45
手机系统 iOS
手机系统版本号 iOS 18
手机厂商 苹果
手机机型 14pro max
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码

getProduct(productIds) {  
    return new Promise((resolve, reject) => {  
        console.log("获取苹果内购产品", productIds)  
        this._channel.requestProduct(productIds, (res) => {  
            console.log(res)  
            resolve(res);  
        }, (err) => {  
            console.log("获取苹果内购产品-error", err)  
            reject(err);  
        })  
    });  
},
{
    "code": 0,
    "message": "Payment_appleiap:Error Domain=SKErrorDomain Code=0 \"发生未知错误\" UserInfo={NSLocalizedDescription=发生未知错误, NSUnderlyingError=0x281600f00 {Error Domain=ASDErrorDomain Code=507 \"Error decoding response\" UserInfo={NSLocalizedDescription=Error decoding response, NSLocalizedFailureReason=Could not decode media products response}}},https://ask.dcloud.net.cn/article/282",
    "errCode": 0,
    "errMsg": "Payment_appleiap:Error Domain=SKErrorDomain Code=0 \"发生未知错误\" UserInfo={NSLocalizedDescription=发生未知错误, NSUnderlyingError=0x281600f00 {Error Domain=ASDErrorDomain Code=507 \"Error decoding response\" UserInfo={NSLocalizedDescription=Error decoding response, NSLocalizedFailureReason=Could not decode media products response}}},https://ask.dcloud.net.cn/article/282"
}

操作步骤

import Iap, { IapTransactionState } from "@/pages-train/activeOrder/js/iap";  
// 初始化,获取iap支付通道  
await Iap.init();  
let res = await Iap.getProduct(['q3']);  
init() {  
    return new Promise((resolve, reject) => {  
        this.getChannels((channel) => {  
            console.log(channel)  
            resolve(channel);  
        }, (err) => {  
            console.log(err)  
            reject(err);  
        })  
    })  
},  
getProduct(productIds) {  
    return new Promise((resolve, reject) => {  
        console.log("获取苹果内购产品", productIds)  
        this._channel.requestProduct(productIds, (res) => {  
            console.log(res)  
            resolve(res);  
        }, (err) => {  
            console.log("获取苹果内购产品-error", err)  
            reject(err);  
        })  
    });  
},
getChannels(success, fail) {  
    if (this._channel !== null) {  
        success(this._channel)  
        return  
    }  

    if (this._channelError !== null) {  
        fail(this._channelError)  
        return  
    }  

    uni.getProvider({  
        service: 'payment',  
        success: (res) => {  
            this._channel = res.providers.find((channel) => {  
                return (channel.id === 'appleiap')  
            })  

            if (this._channel) {  
                success(this._channel)  
            } else {  
                this._channelError = {  
                    errMsg: 'paymentContext:fail iap service not found'  
                }  
                fail(this._channelError)  
            }  
        },  
        fail(err) {  
            console.log(err)  
        }  
    });  
},
get channel() {  
    return this._channel;  
},

预期结果

可以获取到商品列表

实际结果

有时能获取到有时报错

bug描述

this._channel.requestProduct 获取内购商品时报错,但是过一会又好了,再过一段时间又会报错,检查过证书协议和内购商品都没问题。代码也是复制的官方demo。

{
    "code": 0,
    "message": "Payment_appleiap:Error Domain=SKErrorDomain Code=0 \"发生未知错误\" UserInfo={NSLocalizedDescription=发生未知错误, NSUnderlyingError=0x2828f9cb0 {Error Domain=ASDErrorDomain Code=507 \"Error decoding response\" UserInfo={NSLocalizedDescription=Error decoding response, NSLocalizedFailureReason=Could not decode media products response}}},https://ask.dcloud.net.cn/article/282",
    "errCode": 0,
    "errMsg": "Payment_appleiap:Error Domain=SKErrorDomain Code=0 \"发生未知错误\" UserInfo={NSLocalizedDescription=发生未知错误, NSUnderlyingError=0x2828f9cb0 {Error Domain=ASDErrorDomain Code=507 \"Error decoding response\" UserInfo={NSLocalizedDescription=Error decoding response, NSLocalizedFailureReason=Could not decode media products response}}},https://ask.dcloud.net.cn/article/282"
}

2 回复

1.证书协议没得问题

内购商品正常
代码复制的demo id和格式均正确
这个问题一会出现一会又正常,并不是每次都出现


在处理uni-app中的iOS内购商品获取报错问题时,首先需要确保你的代码正确实现了内购流程,并且已经配置了所有必要的App Store Connect信息。以下是一个简化的代码示例,用于展示如何在uni-app中实现iOS内购商品获取,并处理可能的错误情况。

步骤1:配置App Store Connect

确保你的应用已经在App Store Connect中配置了内购项目,并且每个内购项目都有一个唯一的productIdentifier

步骤2:引入必要的库

在uni-app中,你可能需要使用storekit相关的库或API来与iOS内购系统交互。由于uni-app本身不直接提供内购API,你可能需要通过原生插件或者H5+ API(如果支持)来实现。以下是一个假设性的示例,使用JavaScript模拟调用原生StoreKit库的过程。

步骤3:实现内购商品获取

// 假设有一个插件或API封装了StoreKit功能
const store = require('storekit'); // 这是一个假设的模块

// 商品列表的productIdentifiers
const productIdentifiers = ['com.example.app.product1', 'com.example.app.product2'];

// 获取商品信息
function fetchProducts() {
    store.requestProducts(productIdentifiers, (error, products) => {
        if (error) {
            console.error('获取商品信息失败:', error);
            // 这里可以处理错误,比如重试机制或者用户提示
            return;
        }
        console.log('获取到的商品信息:', products);
        // 处理获取到的商品信息
    });
}

// 调用函数获取商品
fetchProducts();

// 错误处理示例:如果报错不是每次都发生,可以考虑实现重试机制
let retryCount = 0;
const maxRetries = 3;
function fetchProductsWithRetry() {
    fetchProducts();
    retryCount++;
    if (retryCount < maxRetries) {
        setTimeout(fetchProductsWithRetry, 2000); // 延迟2秒后重试
    } else {
        console.error('重试获取商品信息失败,已达到最大重试次数');
    }
}

// 初始调用带重试的函数
fetchProductsWithRetry();

注意事项

  1. 错误处理:上述代码中,我们简单地在控制台输出了错误信息。在实际应用中,你应该根据错误类型给用户适当的反馈。
  2. 重试机制:示例中实现了简单的重试机制,但重试次数和间隔应根据实际情况调整。
  3. 原生插件:uni-app本身可能不直接支持StoreKit,你可能需要查找或开发一个原生插件来封装这些功能。
  4. 沙盒环境:在测试内购时,确保使用沙盒环境进行测试。

这个示例是一个简化的版本,实际实现可能需要根据你的具体需求和uni-app的版本进行调整。

回到顶部