SDK_骁骑
SDK_骁骑
  • 发布:2015-12-30 18:46
  • 更新:3 天前
  • 阅读:28498

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

分类:HTML5+

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请求有效的商品详情。注意:IAP支付必须在调用payment.request方法之前,调用requestOrder方法,否则调用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 (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 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>  
4 关注 分享
Trust 515766519@qq.com 1844252358@qq.com 498763851@qq.com

要回复文章请先登录注册

1174958665@qq.com

1174958665@qq.com

1、非续期订阅类型的 不能获取吗?
2、如果 非续期订阅 和 消耗类型的 订单丢单了怎么处理,没有获取指定类型的接口吗?
3 天前
2505451091@qq.com

2505451091@qq.com

内购回调怎么写呢?result打印不出来呢,也不走
2019-06-11 14:02
15029488774@163.com

15029488774@163.com

回复 1024大于1M:
我qq 513238984 对于IOS内购支付 可付费请你做技术辅助
2019-06-01 18:47
842200016@qq.com

842200016@qq.com

订单参数怎么传进去的 @DCloud_App_Array,@DCloud_heavensoft
2018-12-19 15:45
842200016@qq.com

842200016@qq.com

回复 842200016@qq.com:
ios版本的
2018-12-19 15:13
842200016@qq.com

842200016@qq.com

@DCloud_App_Array 非企业级的app只能用内购支付吗
2018-12-19 14:45
similing4@163.com

similing4@163.com

restoreComplateRequest这个方法调用成功了但是trancs为什么没有数据只有一个[]空数组呢?
2018-10-19 19:44
970905469@qq.com

970905469@qq.com

回复 bishuihanshan:
我一直是获取订单信息失败,这是什么原因呢?
2018-08-06 11:55
bishuihanshan

bishuihanshan

restoreComplateRequest 这个一直是雪花等待,都没有返回啊
大家有收到返回的吗
2018-03-16 08:42
1024大于1M

1024大于1M

回复 1844252358@qq.com:
做出来了,你继续看电影,看直播
2017-11-03 10:16
1844252358@qq.com

1844252358@qq.com

回复 1024大于1M:
你你ios内购做好了吗?还在睡觉!
2017-10-24 14:58
1844252358@qq.com

1844252358@qq.com

回复 阿彬:
你ios内购做好了吗?
2017-10-24 14:47
1024大于1M

1024大于1M

回复 立扬:
你ios内购做好了吗?
2017-10-24 11:59
Sunaice

Sunaice

回复 小修的幻想:
解决了吗
2017-08-09 10:06
hlmystery@hotmail.com

hlmystery@hotmail.com

它给我返回 返回订单信息失败,http://ask.dcloud.net.cn/article/282 咋搞,itunes connect里面已经添加商品了,app也打包出来测试的
2017-07-24 16:55
阿彬

阿彬

这里只说了如果获取产品跟恢复产品,在itune connect 里面如果生成产品没有说,我购买产品成功后,如果返回服务器如何修改状态也没有说。
2017-07-18 15:34
阿彬

阿彬

我在channel里面也是获取不到appleiap,是不是我要打包安装到手机才会出现???
2017-07-15 13:23
啊啊啊啊sky

啊啊啊啊sky

请问下,hbuilder最终是能不能接入IOS 应用内支付的??
2017-06-19 11:16
小修的幻想

小修的幻想

苹果不让使用第三方SDK调用IAP支付,导致应用被打回,这种情况怎么处理?今天苹果APPSTORE REVIEW打电话说的。
2017-06-16 12:38
凌垚

凌垚

回复 天空晴朗:
你做好了苹果内购了吗?
2017-03-08 10:46
565220921@qq.com

565220921@qq.com

回复 SDK_骁骑:
我的目前也报这个错了,怎么解决啊,用的苹果沙盒测试账号支付完全没问题,换为正式账号就报这个错了。
2017-02-15 17:26
SDK_骁骑

SDK_骁骑 (作者)

回复 愉悦的筱恩:
检查一下itunes账号是否有测试的权限,或者商品为非消耗性商品重复购买了
2016-11-10 18:01
愉悦的筱恩

愉悦的筱恩

回复 SDK_骁骑:
payment_appleiap:-6
在文档中找不到这个报错
code:-100
2016-11-08 18:16
SDK_骁骑

SDK_骁骑 (作者)

回复 愉悦的筱恩:
打印一下错误的message看下详细的错误信息
2016-11-08 15:24
愉悦的筱恩

愉悦的筱恩

iap一直报-100.。。。怎么破@客服
2016-11-08 14:21
515766519@qq.com

515766519@qq.com

回复 立扬:
你做好了吗
2016-10-26 19:37
515766519@qq.com

515766519@qq.com

IAPOrders @ DCloud_SDK_骁骑 大神 这里面参数写什么
2016-10-26 19:14
立扬

立扬

回复 tinny100:
谢谢大神
2016-10-18 11:46
tinny100

tinny100

回复 立扬:
看你的支付涉及到什么东西,如果支付的商品时虚拟商品(类似:游戏币,视频等等),就必须用到苹果内支付(人家要收取提成的),如果是实物的话就可以不用苹果支付,微信或者支付宝都可以
2016-10-06 10:53
立扬

立扬

回复 SDK_骁骑:
谢谢亲,研究一下
2016-09-30 15:50
SDK_骁骑

SDK_骁骑 (作者)

回复 立扬:
支付申请的部分可以参考文档
http://www.cnblogs.com/XimuYouzi/archive/2016/04/17/5401749.html
2016-09-27 11:53
立扬

立扬

请问有完整示例么?官方的html5+例子不能用,没明白原理,是跟微信一样需要在微信平台申请接口,然后客户服务器端写接口程序,app端按上面代码即可么?@大神
2016-09-20 20:21
立扬

立扬

回复 天空晴朗:
请问,您那边解决了么
2016-09-20 15:13
立扬

立扬

回复 天空晴朗:
苹果端有支付的话,必须用应用内支付接口么?客户需求是用微信支付,我提交了几个版本都没有通过审核,请问是这个原因么(说明里提到支付)
2016-09-20 15:12
longgger@hotmail.com

longgger@hotmail.com

回复 天空晴朗:
同问
2016-09-13 11:09
天空晴朗

天空晴朗

谁有具体的 苹果内购实例啊,苹果内购没法做出来,无法通过审核,开发苹果的APP就没有意义了啊
2016-06-08 17:05
张益达啊

张益达啊

云端打包后测试,也还没有获取到appleiap 呢 代码也跟上边例子一样的
2016-03-21 08:48
DCloud_App_Array

DCloud_App_Array

在manifest.json中的plus->distribute->plugins->payment节点下添加“appleiap”相关的节点,并提交云端打包。
更多说明参考:
[http://ask.dcloud.net.cn/article/71](http://ask.dcloud.net.cn/article/71)
[http://ask.dcloud.net.cn/article/497](http://ask.dcloud.net.cn/article/497)
2016-03-07 15:15
旭仔

旭仔

获取不到 appleiap 的channel呢?其他的都可以得到!
2016-03-06 18:27