uni-app iOS内购问题 #插件讨论# uni-pay - DCloud前端团队 iOS内购一直没有username,提示丢单

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

uni-app iOS内购问题 #插件讨论# uni-pay - DCloud前端团队 iOS内购一直没有username,提示丢单

通过uni-pay的uniapp+uniCloud支付方案的iap苹果内购,创建订单后不能唤起沙盒支付弹窗,打印日志中不存在username,transactionState=1,一直提示丢单。

沙盒账号清空购买记录后可以成功支付。

请问是有哪里配置不对么?

信息类型 详情
开发环境 uni-app + uniCloud
版本号 未提及
项目创建方式 未提及
10 回复

更新到最新版uni-pay试试


嗯,就是使用的最新版本,又检查了一遍版本 uni-pay@2.3.1

检查了下uni-pay的版本是最新的2.3.1

丢单发生在什么时候,有100%必现的步骤吗?

回复 DCloud_uniCloud_VK: 我又导入【uni-pay示例】项目,只替换了notifyUrl和内购产品productid后重新打包自定义基座后运行,就会直接提示漏单了。 不确定是否和更换过bundleId但是没设置appleiap共享密钥password有关系。

尝试减少out_trade_no的长度试试,保持在24位以内

回复 DCloud_uniCloud_VK: 应该是不超过24位就行吧?今天把订单号生成服务改成生成24位了,也加上了App专用共享密钥,还是会出现这种情况。感觉就是沙盒情况下,多试两次就出现了

回复 Warn: 在订单号存在且长度合理的情况下,我这边目前无法复现你的问题

查看了下uni-pay-co 函数运行失败日志,也没看出具体相关信息
请求入参: {
“args”: {
“method”: “verifyReceiptFromAppleiap”,
“params”: [
{
“out_trade_no”: “test1735011586340”,
“transaction_receipt”: “MIIhQgYJKoZIhvcNAQcCoII。。。。”,
“transaction_identifier”: “2000000814639023”
}
],
“clientInfo”: {
“PLATFORM”: “app”,
“OS”: “ios”,
“APPID”: “__UNI__F891E6F”,
“DEVICEID”: “DA8081DC98489D301A1DD94392DC7281”,
“channel”: “phone”,
“scene”: 1001,
“appId”: “__UNI__F891E6F”,
“appLanguage”: “zh-Hans”,
“appName”: “uni-pay示例”,
“appVersion”: “1.0.0”,
“appVersionCode”: “100”,
“appWgtVersion”: “1.0.0”,
“browserName”: “wkwebview”,
“browserVersion”: “17.7”,
“deviceBrand”: “apple”,
“deviceId”: “DA8081DC98489D301A1DD94392DC7281”,
“deviceModel”: “iPhone 14 Pro”,
“deviceType”: “phone”,
“osName”: “ios”,
“osVersion”: “17.7”,
“ua”: “Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Html5Plus/1.0 (Immersed/20) uni-app”,
“uniCompilerVersion”: “4.36”,
“uniPlatform”: “app”,
“uniRuntimeVersion”: “4.36”,
“locale”: “zh-Hans”,
“LOCALE”: “zh-Hans”
}
},
“requestId”: “ac1cc3181735013099951164167”
}
[uni-pay-co/ac1cc3181735013099951164167/1486ms/ERROR] undefined
undefined
请求响应状态: fail

在处理 uni-app 中的 iOS 内购问题,特别是涉及 uni-pay 插件时,确实可能会遇到一些挑战,尤其是当系统提示丢单或者内购流程中缺少 username 信息时。以下是一个简化的代码示例,展示了如何使用 uni-pay 插件进行 iOS 内购,并尝试确保所有必要的参数都已正确传递,以减少丢单的可能性。请注意,由于具体的错误提示“没有username”可能涉及更复杂的后台配置或苹果服务器的问题,这里的代码主要关注前端调用流程的正确性。

首先,确保你已经正确安装了 uni-pay 插件并在项目中进行了配置。

1. 引入插件并初始化

const uniPay = uni.requireNativePlugin('uni-pay');

// 初始化支付(这里以苹果内购为例)
function initPay() {
    uniPay.init({
        provider: 'apple', // 指定为苹果内购
        success: function (res) {
            console.log('支付初始化成功:', res);
            // 初始化成功后,可以调用购买函数
            purchaseProduct();
        },
        fail: function (err) {
            console.error('支付初始化失败:', err);
        }
    });
}

2. 购买产品

function purchaseProduct() {
    const productId = 'com.example.yourapp.product1'; // 替换为你的产品ID
    uniPay.requestOrder({
        provider: 'apple',
        orderId: generateOrderId(), // 生成一个唯一的订单ID,有助于追踪订单
        productId: productId,
        extra: {
            username: 'user12345', // 假设这里有一个用户名,尽管苹果内购通常不需要这个字段
            // 其他自定义参数,根据业务需求添加
        },
        success: function (res) {
            console.log('购买成功:', res);
            // 处理购买成功逻辑
        },
        fail: function (err) {
            console.error('购买失败:', err);
            // 处理购买失败逻辑,可能包括重试机制
        }
    });
}

// 生成唯一订单ID的函数
function generateOrderId() {
    return 'ORD-' + Math.random().toString(36).substr(2, 9);
}

注意事项

  • 确保产品ID正确:在调用 purchaseProduct 时,确保 productId 与你在苹果开发者后台配置的一致。
  • 后台验证:虽然前端代码可以触发购买流程,但所有内购交易都需要在服务器端进行验证,以防止欺诈。
  • 错误处理:增强错误处理逻辑,包括网络异常、用户取消支付等情况。
  • 日志记录:在生产环境中,详细记录支付流程中的每一步,有助于快速定位问题。

如果问题依旧存在,建议检查苹果开发者账号的配置,或联系苹果支持团队获取更专业的帮助。

回到顶部