APP实现苹果内购支付IOS内购接入流程步奏

1. 在 App Store Connect 填写 协议、税务和银行业务

2. 在 App Store Connect 添加 沙箱技术测试员(一个假的Apple ID,任意邮箱 + 不低于8位的大小写字母数字组合的密码)

3. 在测试APP的苹果手机 – 设置 – iTunes Store 与 App Store 页面,拉到最底部管理沙盒账户;

4. 在 App Store Connect 点进已经创建好的APP – 功能 – App 内购买项目,增删改查内购商品;

5. 参考 js SDK 文档 接入内购,基本流程如下:

5.1 引导用户购买的时候调用 canMakePayments 检查用户是否支持内购(一般都支持,想简单处理也可以省掉这一步);

5.2 执行 setTransanctionListener 设置交易监听器,在监听回调里面处理所有支付交易流程;

5.3 用户点购买的时候执行 purchase 发起付款,订单号可以放在 applicationUsername 字段,这个会在上一步的监听回调里面原样返回;

6. 重点在于处理 5.2 步 setTransanctionListener 的回调,js 拿到支付凭证(receipt 字段,此时 state 为 1) 后就发到服务器,在服务器上调用苹果提供的接口验证凭证,验证成功就表示苹果已经真的帮你收到钱了,给用户开通相应服务即可;

7. 在调用 finishTransaction 完成交易之前,交易信息会一直存在,所以在确认不再需这个交易信息时(比如 state == 2 交易失败,state == 1 并且已在服务器端确认)应调用 finishTransaction 把他结束掉,以后就不会在 setTransanctionListener 的回调中再次收到这笔交易了;

cancelDownloads 取消下载 APP开发接入苹果内购IOS内购开发教程

用做网页的技术做APP
一门提供标准化的jsbridge-mini.js库,您只需要在页面引用执行JS即可实现各种原生APP、原生PC的功能能力。

==================APP端==================
【APP端】(安卓版&苹果版)目前提供200+原生功能,2000+JS映射接口,用做网站的技术即可实现各种原生APP能力、APP demo地址https://www.yimenapp.com/doc/demo.cshtml下载教程:
♦ JS-SDK 引用方式:
♦ 普通网页 script 方式加载:下载最新版,请在页面上调用 jsBridge 接口之前引用 jsbridge-mini.js 库;
♦ js module 方式引用:npm install ym-jsbridge 具体请参考 npm package
一门APP开发平台通用JS

cancelDownloads 取消下载 APP开发接入苹果内购IOS内购开发教程

请在 setDownloadListener 中接收下载信息

核心代码示例,详情参阅demo

jsBridge.iap.cancelDownloads({
  //下载内容ID组成的数组
  contentIds: [
    "contentId1",
    "contentId2",
    "..."
  ]
});

A标签执行JS示例代码

<a href="javascript:void(0)" onclick="zhixing()">执行</a> 
<!-- 写入一个A标签href值为"javascript:void(0)",定义点击事件onclick;-->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- 在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接;-->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.cancelDownloads({
  //下载内容ID组成的数组
  contentIds: [
    "contentId1",
    "contentId2",
    "..."
  ]
});

}
</script>
<!--执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可;-->

按钮执行JS示例代码

<button onclick="zhixing()" >执行</button>
<!-- //写一个按钮,定义点击执行事件; -->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- //在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接; -->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.cancelDownloads({
  //下载内容ID组成的数组
  contentIds: [
    "contentId1",
    "contentId2",
    "..."
  ]
});

}
</script>
<!-- //执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可; -->

pauseDownloads 暂停下载 APP开发接入苹果内购IOS内购开发教程

用做网页的技术做APP
一门提供标准化的jsbridge-mini.js库,您只需要在页面引用执行JS即可实现各种原生APP、原生PC的功能能力。

==================APP端==================
【APP端】(安卓版&苹果版)目前提供200+原生功能,2000+JS映射接口,用做网站的技术即可实现各种原生APP能力、APP demo地址https://www.yimenapp.com/doc/demo.cshtml下载教程:
♦ JS-SDK 引用方式:
♦ 普通网页 script 方式加载:下载最新版,请在页面上调用 jsBridge 接口之前引用 jsbridge-mini.js 库;
♦ js module 方式引用:npm install ym-jsbridge 具体请参考 npm package
一门APP开发平台通用JS

pauseDownloads 暂停下载 APP开发接入苹果内购IOS内购开发教程

请在 setDownloadListener 中接收下载信息

核心代码示例,详情参阅demo

jsBridge.iap.pauseDownloads({
  //下载内容ID组成的数组
  contentIds: [
    "contentId1",
    "contentId2",
    "..."
  ]
});

A标签执行JS示例代码

<a href="javascript:void(0)" onclick="zhixing()">执行</a> 
<!-- 写入一个A标签href值为"javascript:void(0)",定义点击事件onclick;-->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- 在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接;-->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.pauseDownloads({
  //下载内容ID组成的数组
  contentIds: [
    "contentId1",
    "contentId2",
    "..."
  ]
});

}
</script>
<!--执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可;-->

按钮执行JS示例代码

<button onclick="zhixing()" >执行</button>
<!-- //写一个按钮,定义点击执行事件; -->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- //在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接; -->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.pauseDownloads({
  //下载内容ID组成的数组
  contentIds: [
    "contentId1",
    "contentId2",
    "..."
  ]
});

}
</script>
<!-- //执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可; -->

finishTransaction 完成指定交易 APP开发接入苹果内购IOS内购开发教程

用做网页的技术做APP
一门提供标准化的jsbridge-mini.js库,您只需要在页面引用执行JS即可实现各种原生APP、原生PC的功能能力。

==================APP端==================
【APP端】(安卓版&苹果版)目前提供200+原生功能,2000+JS映射接口,用做网站的技术即可实现各种原生APP能力、APP demo地址https://www.yimenapp.com/doc/demo.cshtml下载教程:
♦ JS-SDK 引用方式:
♦ 普通网页 script 方式加载:下载最新版,请在页面上调用 jsBridge 接口之前引用 jsbridge-mini.js 库;
♦ js module 方式引用:npm install ym-jsbridge 具体请参考 npm package
一门APP开发平台通用JS

finishTransaction 完成指定交易 APP开发接入苹果内购IOS内购开发教程

• 在完成购买并提供给用户相关功能后应该完成此次交易;

• finishTransaction 成功后,此交易将从 UnfinishedTransactions 队列中移除;

• 请在 setTransanctionListener 中接收交易数据;

核心代码示例,详情参阅demo

jsBridge.iap.finishTransaction({
  //交易id
  transactionId: "3A266867-8275-4299-9BEF-FF7A8A207D21"
});

A标签执行JS示例代码

<a href="javascript:void(0)" onclick="zhixing()">执行</a> 
<!-- 写入一个A标签href值为"javascript:void(0)",定义点击事件onclick;-->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- 在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接;-->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.finishTransaction({
  //交易id
  transactionId: "3A266867-8275-4299-9BEF-FF7A8A207D21"
});

}
</script>
<!--执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可;-->

按钮执行JS示例代码

<button onclick="zhixing()" >执行</button>
<!-- //写一个按钮,定义点击执行事件; -->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- //在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接; -->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.finishTransaction({
  //交易id
  transactionId: "3A266867-8275-4299-9BEF-FF7A8A207D21"
});

}
</script>
<!-- //执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可; -->

purchase 购买产品 APP开发接入苹果内购IOS内购开发教程

用做网页的技术做APP
一门提供标准化的jsbridge-mini.js库,您只需要在页面引用执行JS即可实现各种原生APP、原生PC的功能能力。

==================APP端==================
【APP端】(安卓版&苹果版)目前提供200+原生功能,2000+JS映射接口,用做网站的技术即可实现各种原生APP能力、APP demo地址https://www.yimenapp.com/doc/demo.cshtml下载教程:
♦ JS-SDK 引用方式:
♦ 普通网页 script 方式加载:下载最新版,请在页面上调用 jsBridge 接口之前引用 jsbridge-mini.js 库;
♦ js module 方式引用:npm install ym-jsbridge 具体请参考 npm package
一门APP开发平台通用JS

purchase 购买产品 APP开发接入苹果内购IOS内购开发教程

请在 setTransanctionListener 中接收交易数据

核心代码示例,详情参阅demo

jsBridge.iap.purchase({
  //你在 https://appstoreconnect.apple.com/ 创建的产品ID
  productId : "com.yidiantongqa.app.vip60",
  //可选,购买数量,不小于1的整数,默认1
  quantity  : 1,
  //可选,用户信息,交易回调里面原样返回,默认空
  applicationUsername: "myString"
});

A标签执行JS示例代码

<a href="javascript:void(0)" onclick="zhixing()">执行</a> 
<!-- 写入一个A标签href值为"javascript:void(0)",定义点击事件onclick;-->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- 在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接;-->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.purchase({
  //你在 https://appstoreconnect.apple.com/ 创建的产品ID
  productId : "com.yidiantongqa.app.vip60",
  //可选,购买数量,不小于1的整数,默认1
  quantity  : 1,
  //可选,用户信息,交易回调里面原样返回,默认空
  applicationUsername: "myString"
});

}
</script>
<!--执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可;-->

按钮执行JS示例代码

<button onclick="zhixing()" >执行</button>
<!-- //写一个按钮,定义点击执行事件; -->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- //在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接; -->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.purchase({
  //你在 https://appstoreconnect.apple.com/ 创建的产品ID
  productId : "com.yidiantongqa.app.vip60",
  //可选,购买数量,不小于1的整数,默认1
  quantity  : 1,
  //可选,用户信息,交易回调里面原样返回,默认空
  applicationUsername: "myString"
});

}
</script>
<!-- //执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可; -->

getUnfinishedTransactions 获取未完成的交易 APP开发接入苹果内购IOS内购开发教程

用做网页的技术做APP
一门提供标准化的jsbridge-mini.js库,您只需要在页面引用执行JS即可实现各种原生APP、原生PC的功能能力。

==================APP端==================
【APP端】(安卓版&苹果版)目前提供200+原生功能,2000+JS映射接口,用做网站的技术即可实现各种原生APP能力、APP demo地址https://www.yimenapp.com/doc/demo.cshtml下载教程:
♦ JS-SDK 引用方式:
♦ 普通网页 script 方式加载:下载最新版,请在页面上调用 jsBridge 接口之前引用 jsbridge-mini.js 库;
♦ js module 方式引用:npm install ym-jsbridge 具体请参考 npm package
一门APP开发平台通用JS

getUnfinishedTransactions 获取未完成的交易 APP开发接入苹果内购IOS内购开发教程

请在 setTransanctionListener 中接收交易数据

核心代码示例,详情参阅demo

jsBridge.iap.getUnfinishedTransactions();

A标签执行JS示例代码

<a href="javascript:void(0)" onclick="zhixing()">执行</a> 
<!-- 写入一个A标签href值为"javascript:void(0)",定义点击事件onclick;-->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- 在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接;-->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.getUnfinishedTransactions();

}
</script>
<!--执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可;-->

按钮执行JS示例代码

<button onclick="zhixing()" >执行</button>
<!-- //写一个按钮,定义点击执行事件; -->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- //在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接; -->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.getUnfinishedTransactions();

}
</script>
<!-- //执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可; -->

setTransanctionListener 设置交易监听器 APP开发接入苹果内购IOS内购开发教程

用做网页的技术做APP
一门提供标准化的jsbridge-mini.js库,您只需要在页面引用执行JS即可实现各种原生APP、原生PC的功能能力。

==================APP端==================
【APP端】(安卓版&苹果版)目前提供200+原生功能,2000+JS映射接口,用做网站的技术即可实现各种原生APP能力、APP demo地址https://www.yimenapp.com/doc/demo.cshtml下载教程:
♦ JS-SDK 引用方式:
♦ 普通网页 script 方式加载:下载最新版,请在页面上调用 jsBridge 接口之前引用 jsbridge-mini.js 库;
♦ js module 方式引用:npm install ym-jsbridge 具体请参考 npm package
一门APP开发平台通用JS

setTransanctionListener 设置交易监听器 APP开发接入苹果内购IOS内购开发教程

• 调用 getUnfinishedTransactions/purchase/restoreTransactions/finishTransaction 方法之前应设置本监听器,所有交易状态变更都会通知到此监听器。

• 系统以数组形式将交易信息传递给回调参数 transactions

• 如果多次设置监听器,只有最后一个才会收到通知。

核心代码示例,详情参阅demo

jsBridge.iap.setTransanctionListener(function(succ, transactions) {
  if (succ) {
    var json = JSON.stringify(transactions);
    jsBridge.setClipboardText(json);
    //transactions.forEach(function(x){jsBridge.iap.finishTransaction({transactionId: x.transactionId});})
    alert(json);
  } else {
    alert("操作失败\n" + JSON.stringify(transactions));
  }
});
alert("已设置监听器");

/**
transactions 返回交易信息数组
[{
  state:                 //交易状态,详见交易状态常量,数字类型    
  transactionId:         //交易id,字符串类型    
  originalTransactionId: //原始交易id,只在state为恢复购买时有效,字符串类型
  transactionDate:       //交易时间,UNIX 时间戳(秒)
  receipt:               //交易凭证,经过base64编码,用于验证交易是否合法和有效,避免因越狱破解内购后造成损失,只在state为购买成功时有效,字符串类型
  errorCode:             //交易失败时的错误码,数字类型    
  errorMsg:              //交易失败时的说明,字符串类型    
  payment:               //商品购买信息
  {
    productId:           //商品ID,字符串类型
    quantity:            //购买数量,数字类型
    applicationUsername: //用户信息,字符串类型
  },
  downloads:             //有下载内容时的下载信息列表
  [{    
    state:               //下载状态,详见下载状态常量,数字类型
    transactionId:       //下载内容所属交易id,字符串类型
    contentId:           //下载内容id,字符串类型
    progress:            //下载进度,取值范围0~1,数字类型
    contentLength:       //文件内容大小,数字类型
    timeRemaining:       //下载剩余时间,-1时表示未知,数字类型
    contentVersion:      //下载内容的版本,字符串类型
    contentURL:          //下载成功后文件路径,字符串类型
    errorCode:           //下载失败时的错误码,数字类型
    errorMsg:            //下载失败时的错误描述,字符串类型
  }]
}]

state(transaction) 交易状态常量说明
0: 已加入交易队列(Transaction is being added to the server queue.)
1: 交易完成(Transaction is in queue, user has been charged.  Client should complete the transaction.)
2: 交易失败(Transaction was cancelled or failed before being added to the server queue.)
3: 恢复购买(Transaction was restored from user's purchase history.  Client should complete the transaction.)
4: 交易等待被确认(The transaction is in the queue, but its final status is pending external action.)
    
state(download) 下载状态常量说明
0: 等待下载(Download is inactive, waiting to be downloaded)
1: 正在下载(Download is actively downloading)
2: 暂停下载(Download was paused by the user)
3: 下载完成(Download is finished, content is available)
4: 下载失败(Download failed)
5: 取消下载(Download was cancelled)

**/

A标签执行JS示例代码

<a href="javascript:void(0)" onclick="zhixing()">执行</a> 
<!-- 写入一个A标签href值为"javascript:void(0)",定义点击事件onclick;-->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- 在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接;-->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.setTransanctionListener(function(succ, transactions) {
  if (succ) {
    var json = JSON.stringify(transactions);
    jsBridge.setClipboardText(json);
    //transactions.forEach(function(x){jsBridge.iap.finishTransaction({transactionId: x.transactionId});})
    alert(json);
  } else {
    alert("操作失败\n" + JSON.stringify(transactions));
  }
});
alert("已设置监听器");

/**
transactions 返回交易信息数组
[{
  state:                 //交易状态,详见交易状态常量,数字类型    
  transactionId:         //交易id,字符串类型    
  originalTransactionId: //原始交易id,只在state为恢复购买时有效,字符串类型
  transactionDate:       //交易时间,UNIX 时间戳(秒)
  receipt:               //交易凭证,经过base64编码,用于验证交易是否合法和有效,避免因越狱破解内购后造成损失,只在state为购买成功时有效,字符串类型
  errorCode:             //交易失败时的错误码,数字类型    
  errorMsg:              //交易失败时的说明,字符串类型    
  payment:               //商品购买信息
  {
    productId:           //商品ID,字符串类型
    quantity:            //购买数量,数字类型
    applicationUsername: //用户信息,字符串类型
  },
  downloads:             //有下载内容时的下载信息列表
  [{    
    state:               //下载状态,详见下载状态常量,数字类型
    transactionId:       //下载内容所属交易id,字符串类型
    contentId:           //下载内容id,字符串类型
    progress:            //下载进度,取值范围0~1,数字类型
    contentLength:       //文件内容大小,数字类型
    timeRemaining:       //下载剩余时间,-1时表示未知,数字类型
    contentVersion:      //下载内容的版本,字符串类型
    contentURL:          //下载成功后文件路径,字符串类型
    errorCode:           //下载失败时的错误码,数字类型
    errorMsg:            //下载失败时的错误描述,字符串类型
  }]
}]

state(transaction) 交易状态常量说明
0: 已加入交易队列(Transaction is being added to the server queue.)
1: 交易完成(Transaction is in queue, user has been charged.  Client should complete the transaction.)
2: 交易失败(Transaction was cancelled or failed before being added to the server queue.)
3: 恢复购买(Transaction was restored from user's purchase history.  Client should complete the transaction.)
4: 交易等待被确认(The transaction is in the queue, but its final status is pending external action.)
    
state(download) 下载状态常量说明
0: 等待下载(Download is inactive, waiting to be downloaded)
1: 正在下载(Download is actively downloading)
2: 暂停下载(Download was paused by the user)
3: 下载完成(Download is finished, content is available)
4: 下载失败(Download failed)
5: 取消下载(Download was cancelled)

**/

}
</script>
<!--执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可;-->

按钮执行JS示例代码

<button onclick="zhixing()" >执行</button>
<!-- //写一个按钮,定义点击执行事件; -->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- //在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接; -->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.setTransanctionListener(function(succ, transactions) {
  if (succ) {
    var json = JSON.stringify(transactions);
    jsBridge.setClipboardText(json);
    //transactions.forEach(function(x){jsBridge.iap.finishTransaction({transactionId: x.transactionId});})
    alert(json);
  } else {
    alert("操作失败\n" + JSON.stringify(transactions));
  }
});
alert("已设置监听器");

/**
transactions 返回交易信息数组
[{
  state:                 //交易状态,详见交易状态常量,数字类型    
  transactionId:         //交易id,字符串类型    
  originalTransactionId: //原始交易id,只在state为恢复购买时有效,字符串类型
  transactionDate:       //交易时间,UNIX 时间戳(秒)
  receipt:               //交易凭证,经过base64编码,用于验证交易是否合法和有效,避免因越狱破解内购后造成损失,只在state为购买成功时有效,字符串类型
  errorCode:             //交易失败时的错误码,数字类型    
  errorMsg:              //交易失败时的说明,字符串类型    
  payment:               //商品购买信息
  {
    productId:           //商品ID,字符串类型
    quantity:            //购买数量,数字类型
    applicationUsername: //用户信息,字符串类型
  },
  downloads:             //有下载内容时的下载信息列表
  [{    
    state:               //下载状态,详见下载状态常量,数字类型
    transactionId:       //下载内容所属交易id,字符串类型
    contentId:           //下载内容id,字符串类型
    progress:            //下载进度,取值范围0~1,数字类型
    contentLength:       //文件内容大小,数字类型
    timeRemaining:       //下载剩余时间,-1时表示未知,数字类型
    contentVersion:      //下载内容的版本,字符串类型
    contentURL:          //下载成功后文件路径,字符串类型
    errorCode:           //下载失败时的错误码,数字类型
    errorMsg:            //下载失败时的错误描述,字符串类型
  }]
}]

state(transaction) 交易状态常量说明
0: 已加入交易队列(Transaction is being added to the server queue.)
1: 交易完成(Transaction is in queue, user has been charged.  Client should complete the transaction.)
2: 交易失败(Transaction was cancelled or failed before being added to the server queue.)
3: 恢复购买(Transaction was restored from user's purchase history.  Client should complete the transaction.)
4: 交易等待被确认(The transaction is in the queue, but its final status is pending external action.)
    
state(download) 下载状态常量说明
0: 等待下载(Download is inactive, waiting to be downloaded)
1: 正在下载(Download is actively downloading)
2: 暂停下载(Download was paused by the user)
3: 下载完成(Download is finished, content is available)
4: 下载失败(Download failed)
5: 取消下载(Download was cancelled)

**/

}
</script>
<!-- //执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可; -->

getProducts 获取产品列表 APP开发接入苹果内购IOS内购开发

用做网页的技术做APP
一门提供标准化的jsbridge-mini.js库,您只需要在页面引用执行JS即可实现各种原生APP、原生PC的功能能力。

==================APP端==================
【APP端】(安卓版&苹果版)目前提供200+原生功能,2000+JS映射接口,用做网站的技术即可实现各种原生APP能力、APP demo地址https://www.yimenapp.com/doc/demo.cshtml下载教程:
♦ JS-SDK 引用方式:
♦ 普通网页 script 方式加载:下载最新版,请在页面上调用 jsBridge 接口之前引用 jsbridge-mini.js 库;
♦ js module 方式引用:npm install ym-jsbridge 具体请参考 npm package
一门APP开发平台通用JS

getProducts 获取产品列表 APP开发接入苹果内购IOS内购开发

核心代码示例,详情参阅demo

jsBridge.iap.getProducts({
  //你在 https://appstoreconnect.apple.com/ 创建的产品ID数组
  productIds: [
    "com.yidiantongqa.app.vip30",
    "com.yidiantongqa.app.vip60",
    "com.yidiantongqa.app.vip360"
  ]
}, function(succ, products) {
  if (succ) {
    alert(JSON.stringify(products));
  } else {
    alert("操作失败\n" + JSON.stringify(products));
  }
});

/**
products 返回产品信息
{   
  invalidProductIds:[]      //无效的产品ID,如果你提供了无效的产品ID,会在这里返回,数组类型
  products:                 //有效的产品信息,数组类型
  [{
    productId:              //产品id,字符串类型
    title:                  //产品标题,字符串类型
    description:            //产品描述,字符串类型
    price:                  //产品价格,数字类型
    formattedPrice:         //产品格式化后的价格,如¥6.00,字符串类型
    downloadable:           //是否有下载内容,布尔类型
    downloadContentLengths: //下载内容长度,数字组成的数组
    downloadContentVersion: //下载内容的版本,字符串类型
  }]
}

**/

A标签执行JS示例代码

<a href="javascript:void(0)" onclick="zhixing()">执行</a> 
<!-- 写入一个A标签href值为"javascript:void(0)",定义点击事件onclick;-->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- 在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接;-->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.getProducts({
  //你在 https://appstoreconnect.apple.com/ 创建的产品ID数组
  productIds: [
    "com.yidiantongqa.app.vip30",
    "com.yidiantongqa.app.vip60",
    "com.yidiantongqa.app.vip360"
  ]
}, function(succ, products) {
  if (succ) {
    alert(JSON.stringify(products));
  } else {
    alert("操作失败\n" + JSON.stringify(products));
  }
});

/**
products 返回产品信息
{   
  invalidProductIds:[]      //无效的产品ID,如果你提供了无效的产品ID,会在这里返回,数组类型
  products:                 //有效的产品信息,数组类型
  [{
    productId:              //产品id,字符串类型
    title:                  //产品标题,字符串类型
    description:            //产品描述,字符串类型
    price:                  //产品价格,数字类型
    formattedPrice:         //产品格式化后的价格,如¥6.00,字符串类型
    downloadable:           //是否有下载内容,布尔类型
    downloadContentLengths: //下载内容长度,数字组成的数组
    downloadContentVersion: //下载内容的版本,字符串类型
  }]
}

**/
}
</script>
<!--执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可;-->

按钮执行JS示例代码

<button onclick="zhixing()" >执行</button>
<!-- //写一个按钮,定义点击执行事件; -->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- //在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接; -->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.getProducts({
  //你在 https://appstoreconnect.apple.com/ 创建的产品ID数组
  productIds: [
    "com.yidiantongqa.app.vip30",
    "com.yidiantongqa.app.vip60",
    "com.yidiantongqa.app.vip360"
  ]
}, function(succ, products) {
  if (succ) {
    alert(JSON.stringify(products));
  } else {
    alert("操作失败\n" + JSON.stringify(products));
  }
});

/**
products 返回产品信息
{   
  invalidProductIds:[]      //无效的产品ID,如果你提供了无效的产品ID,会在这里返回,数组类型
  products:                 //有效的产品信息,数组类型
  [{
    productId:              //产品id,字符串类型
    title:                  //产品标题,字符串类型
    description:            //产品描述,字符串类型
    price:                  //产品价格,数字类型
    formattedPrice:         //产品格式化后的价格,如¥6.00,字符串类型
    downloadable:           //是否有下载内容,布尔类型
    downloadContentLengths: //下载内容长度,数字组成的数组
    downloadContentVersion: //下载内容的版本,字符串类型
  }]
}

**/

}
</script>
<!-- //执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可; -->

canMakePayments 检查当前设备是否支持内购 APP开发接入苹果内购教程

♦ 苹果官方文档 https://developer.apple.com/documentation/appstorereceipts/verifyreceipt

♦ 沙盒凭证验证接口 https://sandbox.itunes.apple.com/verifyReceipt

♦ 生产环境凭证验证接口 https://buy.itunes.apple.com/verifyReceipt

♦ 注意,APP上架审核时苹果审核员用的是沙盒账户;

♦ 识别沙盒环境下收据的方法有两种:
1.根据凭证验证返回的字段 environment = sandbox。
2.根据凭证验证返回的状态码,如果 status = 21007,则表示当前的收据为沙盒环境下凭证;

♦ 构造JSON { “receipt-data” : “(receipt 支付凭证)” } POST 到苹果的验证接口,处理返回结果即可。

用做网页的技术做APP
一门提供标准化的jsbridge-mini.js库,您只需要在页面引用执行JS即可实现各种原生APP、原生PC的功能能力。

==================APP端==================
【APP端】(安卓版&苹果版)目前提供200+原生功能,2000+JS映射接口,用做网站的技术即可实现各种原生APP能力、APP demo地址https://www.yimenapp.com/doc/demo.cshtml下载教程:
♦ JS-SDK 引用方式:
♦ 普通网页 script 方式加载:下载最新版,请在页面上调用 jsBridge 接口之前引用 jsbridge-mini.js 库;
♦ js module 方式引用:npm install ym-jsbridge 具体请参考 npm package
一门APP开发平台通用JS

canMakePayments 检查当前设备是否支持内购 APP开发接入苹果内购教程

可能由于家长控制等原因,当前设备不支持APP内购买,在发起内购前可以先判断是否支持。

核心代码示例,详情参阅demo

jsBridge.iap.canMakePayments(function(yes) {
  alert(yes ? "支持内购" : "不支持内购");
});

A标签执行JS示例代码

<a href="javascript:void(0)" onclick="zhixing()">执行</a> 
<!-- 写入一个A标签href值为"javascript:void(0)",定义点击事件onclick;-->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- 在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接;-->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.canMakePayments(function(yes) {
  alert(yes ? "支持内购" : "不支持内购");
});

}
</script>
<!--执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可;-->

按钮执行JS示例代码

<button onclick="zhixing()" >执行</button>
<!-- //写一个按钮,定义点击执行事件; -->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- //在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接; -->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
jsBridge.iap.canMakePayments(function(yes) {
  alert(yes ? "支持内购" : "不支持内购");
});

}
</script>
<!-- //执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可; -->

华为内购管理订阅组

华为内购管理订阅组

每个自动续费订阅商品必须属于某个订阅组。一个订阅组中可以包含多个订阅型商品。用户订购自动续费订阅商品时,对于一个订阅组,只能订阅其中一个商品。如果希望用户购买多个订阅型商品,可以把这些商品放在不同的订阅组中,例如电影会员组(月会员、年会员)、音乐会员组(月会员、年会员)。

前提条件

  • 您已在商品管理新增商品
  • 推荐您使用Google Chrome浏览器访问商品管理服务,最低版本为62.0.3202.62。

新增订阅组

  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要新增订阅组的应用。
  3. 选择“运营”页签,在左侧导航栏选择“产品运营 > 商品管理”。
  4. 选择“订阅组列表”页签,点击“添加订阅组”。
  5. 在对话框中输入订阅组名称,完成后单击“确定”。

华为内购删除/还原应用内商品

华为内购删除/还原应用内商品

前提条件

  • 您已在商品管理新增商品
  • 推荐您使用Google Chrome浏览器访问商品管理服务,最低版本为62.0.3202.62。

删除商品

如果您想将某个冗余的商品从商品列表中去除,您可以选择删除该商品。

说明

待删除的商品应处于失效状态,否则无法删除该商品,商品的失效操作具体请参考失效商品

  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要删除的商品的应用。
  3. 在“运营”页签下的左侧导航栏中,选择“产品运营 > 商品管理”。
  4. 在商品列表中,点击待删除商品对应“操作”列下的“编辑”。
  5. 点击“编辑商品”页面右上角的“删除商品”。
  6. 在弹框中,点击“确认”。注意删除商品后,该商品将无法支付购买,且此商品ID将无法在该应用下继续创建商品时使用。

还原商品

商品被删除后,您将无法通过商品列表查看该商品的相关信息。如果您需要找回已删除的商品,您可通过还原操作,将该商品恢复至商品列表中。

说明

目前,仅支持90天(含)内已删除商品的还原操作。

  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要被还原的商品的应用。
  3. 在“运营”页签下的左侧导航栏中,选择“产品运营 > 商品管理”。
  4. 点击页面右上角下拉选项中“还原商品”。
  5. 在查询框中输入商品ID或商品标题,点击“确定”进行查询。
  6. 点击待还原商品“操作”列的“还原”,即可成功还原该商品。

华为内购激活/失效应用内商品

华为内购激活/失效应用内商品

前提条件

  • 您已在商品管理新增商品
  • 推荐您使用Google Chrome浏览器访问商品管理服务,最低版本为62.0.3202.62。

激活商品

新增商品后该商品默认为“失效”状态,手动失效商品后商品状态也为“失效”状态,您可通过激活该商品,使该商品可以被开放购买。

  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要被激活商品的应用。
  3. 选择“运营”页签,在左侧导航栏选择“产品运营 > 商品管理”。
  4. 在商品列表中,点击待激活商品对应“操作”列的“激活”。
  5. 在弹出的“激活商品”提示框中,点击“确定”。说明失效商品激活后,将被开放购买。

失效商品

激活后的商品则被开放购买,如需停止该商品的对外售卖,可选择失效该商品。

  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要停止生效商品的应用。
  3. 在“运营”页签下的左侧导航栏中,选择“产品运营 > 商品管理”。
  4. 在商品列表中,点击待失效商品对应“操作”列的“停止生效”。
  5. 在弹出停止生效提示框,点击“确定”。说明
    • 失效后的商品将被禁止购买。
    • 原已生效的订阅仍然有效,老用户将正常续费。
    • 如有进行中的优惠活动将立即结束。

华为内购修改 修改应用内商品

在商品管理新增商品后,您可以根据需要修改商品的基本信息或价格。您还可以对商品设置促销价格,以提高商品购买量。

前提条件

  • 您已在商品管理新增商品
  • 推荐您使用Google Chrome浏览器访问商品管理服务,最低版本为62.0.3202.62。

修改单个商品

非订阅类商品

  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要修改商品的应用。
  3. 在“运营”页签下的左侧导航栏中,选择“产品运营 > 商品管理”。
  4. 在商品列表中,点击待编辑的非订阅类商品对应“操作”列的“编辑”。
  1. 如需修改商品基本信息,完成后点击“保存”。
  2. 如需修改商品价格,点击商品编辑页面的“查看编辑”。
  3. 修改商品价格。
    • 不同国家/地区的商品价格a)在“商品价格”页面,点击右上角“编辑”。b)修改“汇率换算基准价格”,勾选排序规则,在列表中选择使用汇率刷新价格的国家/地区,点击“刷新”同步更新商品价格。如果您需要对指定国家/地区的商品价格进行调整,还可以手动填写来修改该国家/地区对应的商品的用户支付价格(含税)。说明
      • 当进行切换“汇率换算基准价格”选项(含税或不含税)时,如果该商品存在未开始或者正在进行中的促销活动,需要先删除/结束促销活动后才能切换成功。切换成功后之前计算出的所有国家/地区的价格将被清空,需选中所有国家/地区点击刷新重新计算。
      • 当华为支付新增上线国家后,如果开发者未重新确认保存商品价格,新上线国家的价格会受到汇率变动而变动(已上线国家价格不受影响)。只有当您重新确认保存商品价格后,新上线国家的价格才会固定下来,不再受汇率变动影响。
    • 商品促销价格您还可根据您的促销策略设置商品促销价,详情请参见设置促销价格
  4. 完成修改后,点击“保存”。

订阅类商品

  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要修改商品的应用。
  3. 在“运营”页签下的左侧导航栏中,选择“产品运营 > 商品管理”。
  4. 在商品列表中,点击待编辑的订阅类商品对应“操作”列的“编辑”。
  1. 如需修改商品基本信息,完成后点击“保存”。
  2. 如需修改商品价格,点击商品编辑页面的“查看编辑”。
  3. 修改商品价格。
    • 不同国家/地区的商品价格a)在“商品价格”页面,点击右上角“编辑”。b)修改“汇率换算基准价格”,勾选排序规则,在列表中选择使用汇率刷新价格的国家/地区,点击“刷新”同步更新商品价格。如果您需要对指定国家/地区的商品价格进行调整,还可以手动填写来修改该国家/地区对应商品的用户支付价格(含税)。说明
      • 当进行切换“汇率换算基准价格”选项(含税或不含税)时,如果该商品存在未开始或者正在进行中的促销活动,需要先删除/结束促销活动后才能切换成功。切换成功后之前计算出的所有国家/地区的价格将被清空,需选中所有国家/地区点击刷新重新计算。
      • 如果对商品进行涨价,且对当前订阅者生效,系统会对已订阅用户发送涨价通知,如用户未进行确认将不再自动续费。降价则不需要用户确认。
      • 当华为支付新增上线国家后,如果开发者未重新确认保存商品价格,新上线国家的价格会受到汇率变动而变动(已上线国家价格不受影响)。只有当您重新确认保存商品价格后,新上线国家的价格才会固定下来,不再受汇率变动影响。
    • 商品促销价格您还可根据您的促销策略设置商品促销价,详情请参见设置促销价格
  4. 完成修改后,点击“保存”。

批量修改商品

  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要批量修改商品的应用。
  3. 在“运营”页签下的左侧导航栏中,选择“产品运营>商品管理”。
  4. 下载表格,批量修改商品信息并上传。注意请按照规范批量修改商品信息,否则会在上传时报错,具体错误信息可参见常见错误说明
    • 方法一:a)点击页面右上角,下载商品模板并保存到本地。b)按规范修改商品信息。c)点击“批量操作”下拉选项中的 “修改商品”,并在弹出的添加框中点击选择上传已填写的商品模板。
    • 方法二:a)点击“导出商品”,下载商品信息表格并保存到本地。b)按规范修改商品信息。c)点击“批量操作”下拉选项中的 “修改商品”,并在弹出的添加框中点击选择上传已修改的商品信息表格。
  5. 在确认页面可查看商品信息修改前后对比图,点击“确定”。

设置促销价格

非订阅类商品

  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要设置促销价格的应用。
  3. 在“运营”页签下的左侧导航栏中,选择“产品运营 > 商品管理”。
  4. 在商品列表中,点击待设置促销价的非订阅类商品对应“操作”列的“编辑”。
  5. 点击商品编辑页面上的“查看编辑”。
  6. 在商品价格页面,点击“设置促销价”。
  7. 在弹出的“设置促销价”页面中,点击“添加促销价”。
  8. 设置促销活动语言、名称以及开始/结束时间,点击“下一步”。
  9. 设置促销活动适用的国家或地区,点击“下一步”。
  10. 设置“汇率换算基准价格”(须低于当前原价),点击“刷新”同步更新不同促销国家/地区的促销价格,并点击“完成”。说明如果您需要调整某个国家/地区商品的用户支付促销价,可单独进行修改。

订阅类商品

  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要设置促销价格的应用。
  3. 在“运营”页签下的左侧导航栏中,选择“产品运营 > 商品管理”。
  4. 在商品列表中,点击待设置促销价的订阅类商品对应“操作”列的“编辑”。
  5. 选择商品编辑页面上的“查看编辑”。
  6. 在商品价格页面,点击“设置促销价”。
  7. 在弹出的“设置促销价”页面中,点击“添加促销价”。
  8. 设置促销活动语言、名称以及开始/结束时间,点击“下一步”。
  9. 设置参与促销活动的国家/地区,设置完成后点击“下一步”。
  10. 设置活动类型。
    • 免费试用:需设置试用的期限。
    • 按周期扣费:需设置优惠续费周期以及促销优惠价,且促销优惠价必须低于原价。
  11. 若选择“免费试用”,设置完成后点击“完成”即可。若选择“按周期扣费”,设置完成后点击“下一步”,可对所有区域的价格进行确认或修改,确认后点击“完成”。说明如果您需要调整某个国家/地区商品的用户支付促销价,可单独进行修改。

常见错误说明

字段错误提示语原因说明
productId商品ID不符合规范,请参考表头说明。productId不符合规范。
文件中商品ID重复,请更换商品ID。批量修改时,同一个商品输入了多次,且其他内容不完全相同。(如果其他内容也完全相同,会自动去重)
此商品不存在,请创建商品后再操作。该商品不存在,数据库中查不到该商品。
商品ID冲突,请更换商品ID。批量新建时,导入的id是存在的。
ProductType商品类型不符合规范,请参考表头说明。productType无效,非0、2或3(0:消耗型;3:非消耗型;2:订阅型)。
订阅商品不支持修改,请删除。订阅型商品不允许修改。
商品类型不允许修改。商品类型不允许修改。
商品类型或者币种不支持,请确认。商品类型或者币种不支持,请确认。
商品类型和订阅型周期不匹配,请确认。订阅型商品类型填错。
Locale Title Description本地化语言信息不符合规范,请参考表头说明。Locale Title Description字段不符合规范。
首个语言类型为默认语言,请修改为{{}}。默认语言类型不支持导入修改,请在页面操作修改。不允许修改默认语言类型,如默认语言是zh_CN,而输入的第一个locale是en_GB
营销中的商品不允许修改语言名称和描述。营销中商品不允许修改语言描述等。
一种语言输入了多种商品名称描述,请修改以下语言内的信息:{{}}。同一个locale输入了多种描述,如zh_CN|name|desc|en_GB|name|desc|zh_CN|othername|otherdesc。(如果相同,会自动去重)。
商品语言类型不符合规范,请参考表头说明;请点击查询规范说明。商品语言类型不符合规范,请参考表头说明。
Price价格不符合规范,请参考表头说明。输入的价格无效。
币种仅支持整数如5.00,请修改;点击此处查询国家对应币种。商品价格不满足该特殊国家币种仅支持整数的要求。
币种以五分之一为最小单位如5.20,请修改;点击此处查询国家对应币种。商品价格不满足该特殊国家币种仅支持五分之一小数的要求。
所有国家商品原价需高于促销优惠价,请调高价格,建议促销优惠结束后再修改商品原价。商品原价必须高于促销价。
此商品还有国家价格为空,请在页面刷新设置或在文件中完整录入所有国家的价格。商品信息中还有国家的价格为空。
同一国家/地区输入了多种价格,请修改以下国家/地区内的信息:{{}}同一个国家,输入了多次不同的价格,如CN;100;AR;80;CN;30;其中CN输入了两次,而且两次价格不同。(如果相同,会自动去重)
请至少输入一组国家码和价格,所有价格不能超过2位小数,国家码请确认正确。示例:CN;1.00;DE;0.50国家价格对输入不符合要求,比如ABCDEF|100.1213123;
默认币种不符合规范,请参考表头说明。默认币种不符合规范。
价格超出两位小数,请修改。价格超出两位小数,请修改。
SubPeriod订阅周期不符合规范,请参考表头说明。订阅周期不符合规范。
Subgroup ID订阅组ID不符合规范,请参考表头说明。订阅组ID不符合规范。
订阅组不存在,请参考表头说明。订阅组不存在。
通用文件过大。文件超过100M限制。
文件类型错误。文件内容错误,比如将.exe改后缀名为.xlsx再上传。
文件名称不合法。文件名错误,包含特殊字符,不可访问等情况。
文件为空。文件为空。
文件上传次数已达上限,请稍后再试。上传次数超过限制,一小时内最多上传1000000次。
商品导入单次最大支持{{}}条,超出请分批上传。excel超过指定行数,目前批量导入商品最多支持300条,批量修改商品最多支持200条。
该商品创建失败,请联系客服处理。没有数据需要更新,临时表中无数据。
商品无任何修改,请确认。输入无任何修改。
尊敬的开发者,您好。很抱歉,当前操作遇到异常无法正常完成。如需帮助请联系我们。内部错误,原因不明。

华为内购设置指南 创建应用内商品

商品类型分为非订阅类商品和订阅类商品:

商品说明
非订阅类商品一次性购买的商品,又可分为消耗品和非消耗品。消耗品:随使用减少,需要再次购买的商品,例如游戏货币,游戏道具。非消耗品:用户只需购买一次,这类商品不会过期或随着使用而减少,例如去广告,升级专业版。
订阅类商品可自动续费购买的一种商品,例如月度会员。

应用分发地包含中国大陆的非订阅类商品(消耗/非消耗商品)还可以配置虚拟商品。虚拟商品库存服务是AGC为分发到中国大陆的商品提供的托管虚拟商品库存的一种服务。目前,暂不支持订阅类商品配置虚拟商品。具体请参考配置虚拟商品

前提条件

  • 推荐您使用Google Chrome浏览器访问商品管理服务,最低版本为62.0.3202.62。
  • 您需要先设置好应用分发国家/地区。
  • 新建商品前,您需要提前仔细规划好商品ID,以便顺畅完成商品配置。商品ID规则如下:
    • 必须以大小写字母或数字开头,并且只能由大小写字母 (A-Z,a-z)、数字 (0-9)、下划线(_)或句点 (.) 组成。
    • 输入字符数上限148个。
    • 同一个应用内商品ID不能重复,保存后将无法修改(删除后也无法再次使用该商品ID新建商品)。

新增单个商品

非订阅类商品

  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要新增商品的应用。
  3. 在“运营”页签下的左侧导航栏中,选择“产品运营 > 商品管理”。
  4. 选择“商品列表”页签,并点击“添加商品”。说明如果应用还未设置分发国家/地区,则会弹出“请先设置应用分发国家/地区”的警告提示,请先设置应用分发国家/地区后再创建商品。
  5. 配置商品信息,完成后点击“保存”。相关参数如下表所示。参数说明类型非订阅类商品只能选择“消耗型”或者“非消耗型”。请参见非订阅类商品。注意商品创建成功后,商品类型将无法更改。商品ID必须以大小写字母或数字开头,并且只能由大小写字母 (A-Z,a-z)、数字 (0-9)、下划线(_)或句点 (.) 组成。输入字符数上限148个字符。注意同一个应用内商品ID不能重复,保存后将无法修改(删除后也无法再次使用),请仔细规划。语言点击“管理语言列表”,勾选需要支持的语言种类。注意如果配置多种语言种类后,必须依次选择下拉框中配置的语言,配置此语言对应的“商品名称”和“商品简介”。商品名称不能为空,最长55个字符,不支持特殊字符 |商品简介不能为空,最长100个字符,不支持特殊字符 |商品价格(含税)点击“查看编辑”,为商品配置合适的价格。说明此价格为展示给用户查看和支付的应用内商品价格(含税),华为将根据当地税率,扣税后与开发者分成,分成以对账单为准。
  6. 点击商品编辑页面的“查看编辑”,配置商品的用户支付价格(含税)。选择“本站默认展示”的国家和币种,勾选“汇率换算基准价格”类型,配置基准价格,根据使用需要勾选排序规则,在列表中选择使用汇率刷新价格的国家/地区,点击 “刷新”同步更新商品的用户支付价格(含税)。说明
    • 当您在设置完“汇率换算基准价格”并点击刷新后,系统会自动根据汇率(及税率)和相应币种美化/更正规则计算出所选国家/地区商品的用户支付价格(含税),具体请参考换算规则描述
    • 您还可以根据不同国家/地区的商品价格策略,手动编辑商品价格表中指定国家/地区的价格,保存后将以此价格作为商品在该国家/地区的用户支付价格(含税)。
    • 在使用汇率刷新不同国家/地区商品的用户支付价格(含税)时,如出现币种兑换查无汇率的警告,则您需要手动填写该国家/地区商品的用户支付价格(含税)。
    • 华为汇率每日刷新,但是不会更改您已经保存的商品价格,如果您需要刷新商品价格,可以手动根据当前最新汇率刷新。
    • 税率只与不同国家/地区相关,如果某国家/地区没有税率,则表示税率为0,不含税价即等同于含税价,页面展示为横线“-”。
    相关参数如下表所示。参数说明本站默认展示您查看商品管理页面默认展示的国家和币种。汇率换算基准价格商品价格的汇率换算基准价格。目前,支持填入“含税”或“不含税”两种类型的基准价格,默认为“含税”类型。
    • 含税:汇率换算基准价格中含有税额。
    • 不含税:汇率换算基准价格中不含税额。
    说明系统会根据汇率换算基准价格计算出商品的用户支付价格(含税),具体请参考换算规则描述。由于不同国家/地区的币种不同,系统会根据您输入的汇率换算基准价格进行如下规则的自动调整:
    • 通用币种要求国家/地区:支持整数或小数(均保留两位小数)作为输入价格,如输入1.34,则将1.34作为该商品的输入价格;
    • 特殊币种要求国家/地区(详见下表):– 仅支持整数(保留两位小数)的国家/地区,以整数或向上取整的值(均保留两位小数)作为输入价格,如输入5.02,则默认选取6.00作为该商品的输入价格。– 仅以五分之一为最小单位(保留两位小数)的国家/地区,以整数或向上取符合五分之一要求的数值(均保留两位小数)作为输入价格,如输入1.23,则默认选取1.40作为该商品的输入价格。
    排序规则国家/地区的排序规则。
    • 按字母A-Z顺序排序
    • 按地理区域分组排序
    置顶国家/地区置顶汇率换算国家/地区,方便您查看或编辑商品价格,可选。
    • 当国家/地区按字母A-Z顺序排序时,您可以在下拉选项中选择您要置顶的国家/地区。
    • 当国家/地区按地理区域分组排序时,您可以在下拉选项中选择您要置顶的区域。
    特殊币种要求国家/地区如下表所示。区域序号国家/地区币种备注欧洲1匈牙利HUF仅支持整数(保留两位小数),如5.00亚太2越南VND仅支持整数(保留两位小数),如5.003印度尼西亚IDR仅支持整数(保留两位小数),如5.004日本JPY仅支持整数(保留两位小数),如5.005法属波利尼西亚XPF仅支持整数(保留两位小数),如5.00中东、北非、南非6喀麦隆XAF仅支持整数(保留两位小数),如5.007塞内加尔XOF仅支持整数(保留两位小数),如5.008刚果布XAF仅支持整数(保留两位小数),如5.009几内亚XAF仅支持整数(保留两位小数),如5.0010加蓬XAF仅支持整数(保留两位小数),如5.0011毛里塔尼亚MRO仅支持以五分之一为最小单位(保留两位小数),如1.00、1.20、1.40、1.60、1.80、2.0012尼日尔XOF仅支持整数(保留两位小数),如5.0013乍得XAF仅支持整数(保留两位小数),如5.0014赤道几内亚XAF仅支持整数(保留两位小数),如5.0015肯尼亚KES仅支持整数(保留两位小数),如5.00拉美16巴拉圭PYG仅支持整数(保留两位小数),如5.0017哥伦比亚COP仅支持整数(保留两位小数),如5.0018智利CLP仅支持整数(保留两位小数),如5.00
  1. 点击“保存”,并在弹框中点击“确定”。
  2. 如需使该商品生效,返回商品列表,点击该商品对应“操作”列的“激活”即可,具体请参考激活应用内商品

说明

除了在AGC界面可以新增商品,您还可以通过创建商品接口创建单个商品或者通过批量创建商品接口批量创建商品。

订阅类商品

  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要新增商品的应用。
  1. 在“运营”页签下的左侧导航栏中,选择“产品运营 > 商品管理”。
  2. 选择“商品列表”页签,点击“添加商品”。说明如果应用还未设置分发国家/地区,则会弹出“请先设置应用分发国家/地区”的提示,请先设置应用分发国家/地区后再创建商品。
  3. 配置商品信息,完成后点击“保存”。相关参数如下表所示。参数说明类型订阅类商品选择“自动续费订阅”。注意商品创建成功后,商品类型将无法更改。商品ID必须以大小写字母或数字开头,并且只能由大小写字母 (A-Z,a-z)、数字 (0-9)、下划线(_)和句点 (.) 组成。输入字符数上限148个字符。注意同一个应用内商品ID不能重复,保存后将无法修改(删除后也无法再次使用),请仔细规划。语言点击“管理语言列表”,勾选需要支持的语言种类。注意如果配置多种语言种类后,必须依次选择下拉框中配置的语言,配置此语言对应的“商品名称”和“商品简介”。商品名称不能为空,最长55个字符,不支持以下特殊字符 |商品简介不能为空,最长100个字符,不支持以下特殊字符 |自动续费周期该参数只有在“类型”选择“自动续费订阅”时才会展示。系统将按此周期自动扣除订阅商品价格。除非用户主动取消或商品涨价后用户未确认自动取消或用户帐号多次扣费失败自动取消,否则会自动按此周期续期。当前支持的续费周期为1周、1个月、2个月、3个月、6个月、1年。所属订阅组该参数只有在“类型”选择“自动续费订阅”时才会展示。自动续费订阅商品所属的订阅组,必须提前创建。创建订阅组的具体步骤请参见新增订阅组。商品价格(含税)点击“查看编辑”,为商品选择合适的价格。说明此价格为展示给用户查看和支付的应用内商品价格(含税),华为将根据当地税率,扣税后与开发者分成,分成以对账单为准。
  4. 点击商品编辑页面的“查看编辑”,配置商品的用户支付价格(含税)。选择“本站默认展示”的国家和币种,勾选“汇率换算基准价格”类型,配置基准价格,根据使用需要勾选排序规则,在列表中选择使用汇率刷新价格的国家/地区,点击 “刷新”同步更新商品的用户支付价格(含税)。说明
    • 当您在设置完“汇率换算基准价格”并点击刷新后,系统会自动根据汇率(及税率)和相应币种美化/更正规则计算出您所选国家/地区商品的用户支付价格(含税),具体请参考换算规则描述
    • 您还可以根据不同国家/地区的商品的价格策略,手动编辑商品价格表中指定国家/地区的价格,保存后将以此价格作为商品在该国家/地区的用户支付价格(含税)。
    • 在使用汇率刷新不同国家/地区商品的用户支付价格(含税)时,如出现币种兑换查无汇率异常场景的警告,则您需要手动填写该国家/地区商品的用户支付价格(含税)。
    • 华为汇率每日刷新,但是不会更改您已经保存的商品价格,如果您需要刷新商品价格,可以手动根据当前最新汇率刷新。
    • 税率只与不同国家/地区相关,如果某国家/地区没有税率,则表示税率为0,不含税价即等同于含税价,页面展示为横线“-”。
    相关参数如下表所示。参数说明本站默认展示开发者查看商品管理页面默认展示的国家和币种。汇率换算基准价格商品价格的汇率换算基准价格。目前,支持填入“含税”或“不含税”两种类型的基准价格。
    • 含税:汇率换算基准价格中含有税额。
    • 不含税:汇率换算基准价格中不含税额。
    说明系统会根据汇率换算基准价格计算出商品的用户支付价格(含税),具体请参考换算规则描述。由于不同国家/地区的币种不同,系统会根据您输入的汇率换算基准价格进行如下规则的自动调整:
    • 通用币种要求国家/地区:支持整数或小数(均保留两位小数)作为输入价格,如输入1.34,则将1.34作为该商品的输入价格;
    • 特殊币种要求国家/地区(详见下表):– 仅支持整数(保留两位小数)的国家/地区,以整数或向上取整的值(均保留两位小数)作为输入价格,如输入5.02,则默认选取6.00作为该商品的输入价格;– 仅以五分之一为最小单位(保留两位小数)的国家/地区,以整数或向上取符合五分之一要求的数值(均保留两位小数)作为输入价格,如输入1.23,则默认选取1.40作为该商品的输入价格;
    排序规则国家/地区的排序规则。
    • 按字母A-Z顺序排序
    • 按地理区域分组排序
    置顶国家/地区置顶汇率换算国家/地区,方便您查看或编辑商品价格,可选。
    • 当国家/地区按字母A-Z顺序排序时,您可以在下拉选项中选择您要置顶的国家/地区。
    • 当国家/地区按地理区域分组排序时,您可以在下拉选项中选择您要置顶的区域。
    特殊币种要求国家/地区如下表所示。区域序号国家/地区币种备注欧洲1匈牙利HUF仅支持整数(保留两位小数),如5.00亚太2越南VND仅支持整数(保留两位小数),如5.003印度尼西亚IDR仅支持整数(保留两位小数),如5.004日本JPY仅支持整数(保留两位小数),如5.005法属波利尼西亚XPF仅支持整数(保留两位小数),如5.00中东、北非、南非6喀麦隆XAF仅支持整数(保留两位小数),如5.007塞内加尔XOF仅支持整数(保留两位小数),如5.008刚果布XAF仅支持整数(保留两位小数),如5.009几内亚XAF仅支持整数(保留两位小数),如5.0010加蓬XAF仅支持整数(保留两位小数),如5.0011毛里塔尼亚MRO仅支持以五分之一为最小单位(保留两位小数),如1.00、1.20、1.40、1.60、1.80、2.0012尼日尔XOF仅支持整数(保留两位小数),如5.0013乍得XAF仅支持整数(保留两位小数),如5.0014赤道几内亚XAF仅支持整数(保留两位小数),如5.0015肯尼亚KES仅支持整数(保留两位小数),如5.00拉美16巴拉圭PYG仅支持整数(保留两位小数),如5.0017哥伦比亚COP仅支持整数(保留两位小数),如5.0018智利CLP仅支持整数(保留两位小数),如5.00
  1. 点击“保存”,并在弹框中点击“确定”。
  2. 如需使该商品生效,返回商品列表,点击该商品对应“操作”列的“激活”即可,具体请参考激活应用内商品

说明

除了在AGC界面可以新增商品,您还可以通过创建商品接口创建单个商品或者通过批量创建商品接口批量创建商品,具体请参见创建商品

批量导入商品

  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要导入商品的应用。
  3. 在“运营”页签下的左侧导航栏中,选择“产品运营 > 商品管理”。
  4. 在“商品列表”页签中,点击页面右上角下载商品模板,在下载的模板中按要求填写商品信息。说明“商品模板”中支持填写的国家/地区、语言、币种等商品信息,具体可参见国家/地区、语言、币种列表
  5. 点击“批量操作”下拉选项中的 “添加商品”,并在弹出的添加框中点击选择上传已填写的商品模板。
  6. 在弹框中点击“确定”,完成商品导入。

配置虚拟商品

虚拟商品库存服务,即分发到中国大陆的应用中商品,AGC提供托管虚拟商品库存的一种服务。您可以在AGC中配置虚拟商品,并在您的应用中允许用户使用兑换码兑换对应的商品。当用户在华为应用市场/游戏中心点击购买商品后,由华为应用市场/游戏中心直接发起支付,支付完成后用户可以在华为应用市场/游戏中心获取商品兑换码,用户可前往应用/网页中兑换对应的虚拟商品。

目前,只有非订阅类商品(消耗/非消耗商品)可以配置虚拟商品,每个商品可对应多个虚拟兑换码。配置虚拟商品,需进入“配置虚拟商品库存”服务入口,设置“兑换码有效期”,上传兑换码。

注意

  • 如分发地未包含中国大陆,“配置虚拟商品库存”入口默认隐藏。
  • 已设置商品营销Deeplink或发货通知地址,则不能再配置虚拟商品库存。
  1. 登录AppGallery Connect,选择“我的应用”。
  2. 在应用列表中点击需要配置虚拟商品的应用。
  1. 在“运营”页签下的左侧导航栏中,选择“产品运营 > 商品管理”。
  2. 在商品列表中,点击需要配置虚拟商品的非订阅类商品对应“操作”列的“编辑”。
  3. 进入“编辑商品”页面,完善商品相关信息后,点击下方“添加”。
  4. 进入“配置虚拟商品库存”页面,点击“添加”按钮。
  5. 进入“配置虚拟商品库存”页面,设置“兑换码有效期”,并点击“请下载格式模板”,根据实际情况填写完成后点击“浏览”,上传已填写的兑换码文件,在弹出的提示窗口点击“确定”,完成兑换码上传,点击右上方“保存”,并在弹出的提示窗口点击“确定”,完成添加商品库存操作。
    • 有效期设置:当前展示的时间为您的电脑系统时区时间,对用户展示将自动转换为其手机系统的时区时间。有效期必须大于48小时。
    • 模板格式与要求:
    -文件格式必须是ANSI编码的txt格式;-文件中每行排列1条数据,请勿添加其他注释;-串码只能由英文大小写字母、数字和少量特殊符号(仅支持英文下划线和英文分隔符)组成;-文件中不能存在重复码(重复码将被系统自动过滤掉);-文件大小不能超过100M。
  6. 进入“配置虚拟商品库存”页面,填写“兑换码使用方法”,点击右上方“保存”。
  7. 查看总库存明细列表,状态列显示“待售”,点击操作列“上架”,选择上架的库存。
  8. 确认“兑换码数量”和“有效期”(可编辑),点击“确认上架”,并在弹出的提示窗口中点击“确定”,完成需上架库存的提交。
  9. 上架成功后,页面将跳转至商品营销列表,具体配置步骤请参见管理商品营销。说明如需配置营销商品,应确保商品已激活,否则将无法购买。