炫意html5
最早CSS3和HTML5移动技术网站之一

IOS 应用内支付(IAP)接口使用说明

IOS平台最新集成了苹果官方提供的应用内支付(In-App Purchase),新的插件是在plus.payment的基础上进行了扩展,但是在使用方法上与原有的支付API的使用流程稍有区别,下面对IAP插件的使用方法进行说明

HBuilder 里的调试基座默认不带IAP支付通道,如果需要调试IAP需要使用开发证书生成一个自定义调试基座,用来实现IAP的开发和调试。
自定义调试基座使用方法请参考文档http://ask.dcloud.net.cn/article/12723

手机用户可以在“设置->通用->访问限制->App 内购买项目”中关闭支付,如果用户关闭了IAP,开发者将获取不到ID为“appleiap”的支付通道。

IAP支付对PaymentChannel对象进行了扩展添加了以下几个方法
方法
requestOrder 向Appstore请求有效的商品详情
restoreComplateRequest 向Appstore发送请求获取已经购买商品(非消耗型项目和订阅项目)的支付信息,获取成功以后会返回一个的已购商品收据列表。

下面对应用内支付的使用方法进行说明,文中API的参数及使用实例请参考http://www.html5plus.org/doc/zh_cn/payment.html

购买商品接口使用方法

  1. 首先调用plus.payment.getChannels获取支付通道,IAP支付通道的ID为“appleiap”
  2. 调用ID为“appleiap”的PaymentChannel对象的requestOrder方法,像Appstore请求有效的商品详情。注意:需先调用requestOrder方法然后在调用payment.request方法,否则直接调用payment.request将会报错。
  3. 调用plus.payment.request方法发起支付请求,传入statement的参数为JSON对象,可以设置如下参数
    productid String(必选)要支付的商品的标识(必须是调用requestOrder返回的有效的商品标识)
    username String(可选)购买商品用户的用户名
    quantity String (可选)购买商品的数量,如果不填写默认为1

示例:

<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>Hello H5+</title>
<script type="text/javascript">
var iapChannel;
var IAPOrders = ['io.dcloud.payTest1', 'io.dcloud.payTest2'];
function plusReady() { //uni-app中将此function里的代码放入vue页面的onLoad生命周期中
// 获取支付通道
plus.payment.getChannels(function(channels) {
for (var i in channels) {
if (channels[i].id == 'appleiap') {
iapChannel = channels[i];
iapChannel.requestOrder(IAPOrders, function(event) {
for (var index in event) {
var OrderItem = event[index];
outLine("Title:" + OrderItem.title + "Price:" + OrderItem.price + "Description:" + OrderItem.description + "ProductID:" + OrderItem.productid);
}
}, function(errormsg) {
outLine("获取支付通道失败:" + errormsg.message);
});
}
}
}, function(e) {
outLine("获取支付通道失败:" + e.message);
});
}
document.addEventListener('plusready', plusReady, false); //uni-app不需要此代码
function pay(id) {
plus.payment.request(iapChannel, {
"productid": id,
"username": "appusername",
"quantity": 2
}, function(result) {
alert(JSON.stringify(result));
}, function(e) {
plus.nativeUI.alert("更多错误信息请参考支付(Payment)规范文档:http://www.html5plus.org/#specification#/specification/Payment.html", null, "支付失败:" + e.code);
});
}
</script>
</head>
</html>

注意:uni-app的App端,同样支持plus的api,但不需要等plus ready再使用,而是可以直接使用plus的api

恢复已购项目接口使用方法

  1. 首先调用plus.payment.getChannels获取支付通道,IAP支付通道的ID为“appleiap”
  2. 调用ID为“appleiap”的PaymentChannel对象的restoreComplateRequest方法

示例:

<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>Hello H5+</title>
<script type="text/javascript">
var iapChannel;
var IAPOrders = ['io.dcloud.payTest1', 'io.dcloud.payTest2'];
function plusReady() { //uni-app中将此function里的代码放入vue页面的onLoad生命周期中
// 获取支付通道
plus.payment.getChannels(function(channels) {
for (var i in channels) {
if (channel[i].id == 'appleiap') {
iapChannel = channel[i];
iapChannel.requestOrder(IAPOrders, function(event) {
for (var index in event) {
var OrderItem = event[index];
outLine("Title:" + OrderItem.title + "Price:" + OrderItem.price + "Description:" + OrderItem.description + "ProductID:" + OrderItem.productid);
}
}, function(errormsg) {
outLine("获取支付通道失败:" + errormsg.message);
});
}
}
}, function(e) {
outLine("获取支付通道失败:" + e.message);
});
}
document.addEventListener('plusready', plusReady, false);//uni-app不需要此代码
function getPayedTrances() {
iapChannel.restoreComplateRequest({
"username": "waipptt"
},function(trancs){
outLine(“获取已经购买项目成功:” + JSON.stringify(trancs));
}, function(errormsg){
outLine("获取支付通道失败:" + errormsg.message);
});
}
</script>
</head>
</html>

FAQ

Q:Appstore审核报PGPay SDK不允许上架的问题
A:数字类产品(比如购买会员等不需要配送实物的商品),Apple规定必须使用苹果IAP应用内支付,给Apple分成30%。打包的时候不要勾选微信或支付宝等其他支付方式。如果你提交的包里包含了微信支付宝等支付的sdk,即使没使用,Appstore也会认为你有隐藏方式,以后会绕过iap,不给Apple分成,因此拒绝你的App上线。云打包时,manifest里选上支付模块,但sdk配置里去掉微信支付和支付宝支付。很多开发者的Android版是包含微信和支付宝支付的,此时注意分开判断。

回答

炫意HTML5 » IOS 应用内支付(IAP)接口使用说明

Java基础教程Android基础教程