uni-app uni pay 苹果内购提示订单的ID不存在怎么解决啊

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

uni-app uni pay 苹果内购提示订单的ID不存在怎么解决啊

请求示例

{
  "provider": "appleiap",
  "total_fee": 100,
  "order_no": "1636274598022787073",
  "out_trade_no": "1636274598022787073",
  "description": "com.gyj.cn.pa01",
  "type": "appleiap",
  "custom": {}
}

返回示例

{
  "errMsg": "requestPayment:fail Payment_appleiap:订单的ID不存在,https://ask.dcloud.net.cn/article/282",
  "errCode": -100,
  "code": -100
}

16 回复

苹果没查到该商品id 你需要先调用requestOrder获取商品id


大佬没有搜到到这个api呢,请问我的id这样不对吗?

回复 1***@qq.com: 感谢大佬,字母的确拼错了com.gyj.cn.pa01–》com.gjy.cn.pa01

不过这提示语的确有点困扰人呢

大佬还在吗? 修正好了com.gjy.cn.pa01 还是报这个错呢?99

回复 1***@qq.com: 不要写死 要通过api获取产品列表

回复 1***@qq.com: 你下面的截图后面不是还在报错 不一定能生效吧

回复 DCloud_iOS_WZT: 好的我先看看,感谢

截图那个之前测试是可以的, 我之前没有写死,是通过let productList = await appleiap.getProduct(); 获取产品列表的,但是发现这个api已知在pending

不是pending 我加日志了,请求苹果时候报错了。Bag Load Failed because we failed to load the bag

回复 1***@qq.com: 此问题已解决,检查各项配置,内购id是否正确,我的还可能是charles开启了。后来重启电脑等自己好了

这个是配置在内购项目里的

我发现另一个场景会产生这个错误: A手机下了个订单,未支付; B手机登陆了此账户,对这个未支付订单进行支付;

有没有遇到这种场景呀 , 用户第一次进入点击第一次出现订单的ID不存在 但是 后面就不会出现了~

在处理uni-app中的uni.pay进行苹果内购时,如果遇到提示“订单的ID不存在”的问题,这通常意味着传递给苹果的支付请求中的订单信息有误或未正确生成。苹果内购要求每个购买行为都有一个唯一的订单ID,这个ID通常是由开发者服务器生成的,并且在调用支付接口时传递给苹果服务器进行验证。

以下是一个简化的处理流程,包括生成订单ID和调用uni.pay的示例代码,以帮助你解决这个问题:

  1. 生成唯一订单ID: 在服务器端生成一个唯一的订单ID,可以使用UUID或其他唯一标识符生成方法。

    // 示例(Node.js环境):
    const { v4: uuidv4 } = require('uuid');
    const orderId = uuidv4(); // 生成唯一订单ID
    
  2. 保存订单信息: 在数据库中保存订单ID与相关信息(如商品ID、用户ID等),以便后续验证和处理支付结果。

  3. 调用uni.pay: 在前端使用uni-app调用uni.pay时,确保传递正确的订单信息,包括生成的订单ID。

    // 示例(uni-app前端代码):
    uni.request({
        url: 'https://your-server.com/api/generateOrder', // 请求你的服务器生成订单
        method: 'POST',
        data: {
            productId: 'your_product_id', // 苹果内购的商品ID
            userId: 'current_user_id' // 当前用户ID
        },
        success: (res) => {
            if (res.data && res.data.orderId) {
                const paymentRequest = {
                    timeStamp: '', // 这里需要填写时间戳,通常为当前时间的时间戳字符串
                    nonceStr: '', // 随机字符串,不长于32位
                    package: `com.yourapp.package.${res.data.orderId}`, // 注意这里的格式,com.yourapp.package是固定前缀,后面跟上订单ID
                    signType: 'MD5', // 签名方式
                    paySign: '', // 签名,需要根据苹果文档生成
                    success: function (res) {
                        // 支付成功回调
                        console.log('支付成功', res);
                    },
                    fail: function (err) {
                        // 支付失败回调
                        console.error('支付失败', err);
                    }
                };
                uni.pay(paymentRequest);
            } else {
                console.error('订单生成失败', res.errMsg);
            }
        }
    });
    

注意

  • timeStampnonceStrpaySign等字段的生成需要遵循苹果内购的签名规则,这里未详细展开。
  • package字段的格式通常为com.yourapp.package.<OrderID>,其中com.yourapp.package是应用标识的前缀,<OrderID>是唯一的订单ID。
  • 确保服务器生成的订单ID在数据库中唯一且未被重复使用。

通过上述步骤,你应该能够解决“订单的ID不存在”的问题。如果问题依旧存在,请检查订单ID的生成、传递和存储过程是否有误。

回到顶部