A. iOS 内购(IAP) 简单总结
IAP(In-App Purchase),是指苹果App Store的应用内购买,是苹果为APP内购买虚拟商品或服务提供的一套交易系统。
在APP内需要付费使用的产品功能或虚拟商品、服务。例如在斗鱼上充鱼翅、在视频APP上冲会员、在王者农药里买皮肤等....这些购买的商品或服务只能在APP内消费使用的适用IAP。反之,在京东或淘宝买东西、在滴滴上打车等...这些购买的商品或服务只能在APP外使用的情况是不适用IAP的。
IAP是一套商品交易系统,而非简单的支付系统。每一个购买项目都需要在App的itunes connect后台创建一个商品,提交给苹果审核,审核通过后,购买项目才会生效。
在创建IAP商品时,主要有四中类型:
3.2.2 商品的购买
B. iOS实现App内购步骤以及注意事项
1、在开发者账号设置协议、打开itunes Connect,选择协议,税务和银行业务。
2、点击Request Contracts(申请合同)下面的,request,点了几个确定和下一步后回到主界面。
Contact info:联系人信息
Bank info:银行信息
Tax info:税务信息
3、首先设置联系人信息,点击Contact info下面的 Set up(设置),点击Add New Contract(增加先的联系方式)。
4、填写详情,填写完成后点击save(保存)。
5、在下面的所有项目中都选择刚刚填写的信息,选择后点击右下角的done(完成),你可以创建很多联系人,在不同的职务选择不同的联系人。因为我是独立开发,所以我全部填写的我自己。
6、设置银行信息,点击Back info下面的Set up,弹出页面,点击Add Bank Account(添加银行账号)
6.1、选择china,后点击next。
6.2、填写了CNAPS Code后点击Next
查询现代化支付行号
6.3、会弹出你的银行卡开户地的信息,确认一下点击next
6.4、填写银行卡信息,注意:户主名只能写拼音,比如:李三(Li San)。填完后点击Next
6.5、弹出确定信息页面,在下面打钩后点击Save
6.6、点击了save后就可以在弹出的页面中选择刚刚填写的卡了。选择后点击Save
7、设置税务信息,点击Tax info下面的Set up,此时联系人信息已经变成可以编辑状态,银行信息为浏览状态。
7.1、弹出的界面中,税务分为三种 U.S Tax Forms: 美国税务、Australia Tax Forms:澳大利亚税务、Canada Tax Forms: 加拿大税务
这里我选择的美国税务,就是第一个
弹出第一个选择,点击submit(提交)后,弹出第二个选择
弹出第二个选择,选择后点击submit
弹出第三个页面,填写的资料后点击提交,记得勾选页面上的几个复选框
在提交成功后,状态就变成processing成功
1.进入到项目的APP信息页面,点击功能,在弹出的页面点击App内购买项目后面的➕。
2.在弹出的新对话框中选择你需要哪一种服务,由于我的项目需要兑换成消耗的金币,所以我选择第一个。选择后点击创建。
3.开始填写内购项目信息。填完后点击右上角的存储(所有信息必须填写完整)。
4.点击存储后,内购列表就会有刚刚创建的内购条目。
1.点击用户和职能
2.点击沙盒测试员,然后点击左边的➕按钮
3.设置好信息点击右上角存储就可以,记住里面的邮箱和密码用于支付的时候登陆Apple id
注意:
1.必须用真机测试。
2.测试的时候必须退出自己的apple ID。弹出页面后登陆沙盒的测试apple id。
// 1.首先导入支付包#import Storekit
http://www.cocoachina.com/bbs/read.php?tid-1694080.html
https://blog.csdn.net/darling_shadow/article/details/51538267 [iOS]应用内支付(内购)的个人开发过程及坑!
http://www.jianshu.com/p/86ac7d3b593a APP内购集成详解
C. iOS 内购漏单问题解决参考方案
不久前,有用户反映,大概意思是这样:苹果扣款成功了,但是没有发放应得的内购产品,这钱花哪去了?
这是一个严重的漏单问题,已经得到了及时解决,现写篇文章总结一下。
IAP:是指In-App Purchase,顾名思义,一种应用内的支付(内购)。但IAP不是特指苹果的内购支付方式,应用也可以有其自己的内购支付方式。
这里来说一下Apple的IAP。下图是苹果内购的支付流程图。
支付流程解释
1.客户端向Appstore请求购买产品,Appstore验证产品成功后,从客户端的Apple账户中扣费。
2.Appstore向客户端返回一段receipt-data(票据),里面记录了本次交易的证书和签名信息。
3.客户端向我们可以信任的服务器(后台)提供receipt-data
4.服务器对receipt-data进行一次base64编码
5.把编码后的receipt-data发往itunes.appstore进行验证
6.itunes.appstore返回验证结果给服务器
7.服务器对商品购买状态以及商品类型,向客户端发放相应的道具与推送数据更新通知
以上七个步骤实际上是一个很安全的支付流程了。那问题会出在哪里呢?
IAP built-in Model(本地验证) :此种方式跳过来3-7步,在第2步中拿到票据直接向itunes.appstore请求验证票据,根据票据的结果来修改数据。有一些单机游戏因为不涉及后台服务器会采取此种方式,但由此单来的不安全也很明显,比如一些越狱的手机会很容易对此进行一些数据操作。这里暂不做讨论。
IAP Server Model(服务器验证) :如果把数据放在服务器做校验(如实走完1-7的流程),就不用担心客户端出现伪造票据等问题。但是这样还会出现问题。
想象一下,如果得到票据说明苹果已经扣款成功,就在这时向服务器发送票据验证的时候出现来异常,这个时候可能网络突然断了,未把票据发送的服务器验证,导致明明已经扣了款,却没有收到相应的内购产品,出现了漏单问题。
所以如何解决此问题?解决流程如下
D. Flutter iOS 苹果IAP(内购)实现步骤及问题总结(全网最全)
点击 “协议、税务和银行业务”
内购用的是付费应用程序,先签署《付费应用程序协议》,同意后状态变更为“用户信息待处理”,等待审核。
状态更改完毕后,点击“开始设置税务、银行业务和联系信息”。
(1)添加银行账户,按照要求填写相关内容即可。
(2)选择报税表,并填写。所有与 Apple 有商业合作者必选都是美国,若有其他需求,可以多选。
继续填写,首先认证公司基本信息,选择所有人类型,确认无误后认证条款处打对勾
Part I 部分,继续核对公司相关信息,选填内容可不填。
Part III 部分,签署税务条约,设置利益限制条款的种类,选填内容可不填。此部分如果需要可勾选上下图勾选框,不需要可不勾选,我们这个项目没有用到part III 部分,所以没有勾选。
Part XXX 部分,确认之前填写的信息,勾选完毕后,提交
(3)填写联系信息,共5个。高级管理、财务、技术、法务、营销。只需要提供5个人的基本信息即可。
https://appstoreconnect.apple.com/apps/1604297713/appstore/addons?m=
只可使用一次的产品,使用之后即失效,必须再次购买。
示例: 钓鱼 App 中的鱼食。
只需购买一次,不会过期或随着使用而减少的产品。
示例: 游戏 App 的赛道。
允许用户在固定时间段内购买动态内容的产品。除非用户选择取消,否则此类订阅会自动续期。
示例: 每月订阅提供流媒体服务的 App。
允许用户购买有时限性服务的产品。此 App 内购买项目的内容可以是静态的。此类订阅不会自动续期。
示例: 为期一年的已归档文章目录订阅。
App 内购买项目的截屏,即所售项目的示意图。例如,如果 App 内购买项目是一本图书,您可以提交图书的截屏。您也可以提交购买页的截屏。该截屏仅用于 Apple 审核,不会在 App Store 中显示。
截屏要求如下:
iOS 至少需要 640 x 920 像素
Apple tvOS 需要 1920 x 1080 像素
macOS 需要 1280 x 800 像素
App 审核图像上传后,可以替换,但无法移除。当您的 App 内购买项目处于审核中时,您无法更新截屏。
https://appstoreconnect.apple.com/access/testers
沙箱账号是不能直接在App Store进行登录的,只能在点击了购买商品之后,在弹出的登录框进行登录 。
验证是否已登录沙箱测试账号:
设置--iTunes Store与App Store,页面拉到最底部,会看到沙箱账户项会列出你已登录的沙箱测试账号!
操作方法一:打开App Store应用首页滑到最下方--选中AppleID--注销
操作方法二:设置--iTunes Store与App Store--选中AppleID--注销
checks if the client can make payments(检测App是否能支付)
getAvailablePurchases
Get all non-consumed purchases 获取未消费的商品
打印信息查询;
原因:
没有先执行getProcts,直接执行requestPurchase方法,要先拉取商品列表,再执行购买操作.
问题描述;
1.漏单必须要处理,玩家花RMB购买的东西却丢失了,是绝对不能容忍的。所谓的漏单就是玩家已经正常付费,却没有拿到该拿的道具。
解决:只要购买成功,便将购买记录(receipt等账单信息)保存下来,然后将账单信息传送给我们游戏服务器,游戏服务器获得账单后,和苹果服务器验证,账单有效的话,回馈给游戏服务器处理,游戏服务器处理后,返回给游戏客户端处理,处理完毕,将本地保存的购买记录删除。
https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html 官方文档:向苹果校验支付凭证
21000 App Store无法读取你提供的JSON数据
21002 收据数据不符合格式
21003 收据无法被验证
21004 你提供的共享密钥和账户的共享密钥不一致
21005 收据服务器当前不可用
21006 收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中
21007 收据信息是测试用(sandbox),但却被发送到产品环境中验证 【请求sandbox校验支付凭证】
21008 收据信息是产品环境中使用,但却被发送到测试环境中验证
消耗类型: 例如:金币、道具等。
非续订订阅: non-renewable subscription 例如:VIP
您的首个 App 内购买项目必须以新的 App 版本提交。请创建您的 App 内购买项目,然后前往 App 的“App Store”页,从“App 内购买项目”中进行选择,点按“提交”。 了解更多
在上传二进制文件并提交首个 App 内购买项目以供审核后,您可以使用下表提交其他 App 内购买项目。
唐巧-iOS应用内付费(IAP)开发步骤列表
未完~待续
当使用内购购买过商品之后没有把这个交易关闭,所以再次去购买商品后就会调用以前已经购买成功的交易去购买因为已经购买过,才会有这个提示
原因:添加内购项目时,信息填写不完整,app审核图像未上传
处理方法:上传app审核图片( 合适的尺寸 ),点击提交,状态改为正在准备审核中。
这个是内购选择类型不匹配原因导致。
购买成功之后,Apple会返回以下四个数据给应用
Reference
Review the updated Paid Applications Schele.
游客身份解决方案:即不登录也要能购买
1)服务器端做一个苹果审核机制,审核期间游客身份可以进行一切行为,一旦审核通过,修改服务端即可达到强制用户登录进行内购买的目的(这个有点。。。)
2)游客可以进行内购买,购买时以设备UUID为准,生成一个游客账号,将购买信息保存在服务器和本地,当用户登录正式账户后判断此设备是否进行过内购,有的话提示用户将游客身份购买的权益与现有账号绑定,如果绑定,游客权益则迁移到正式账户,如果不迁移,则游客身份和正是账户是两个独立账户,正式账户不享有游客身份的权益(我用的这个)
内购游客模式解决方案
iOS内购规则
E. iOS苹果内购(详细步骤)
iOS苹果内购(详细步骤)
iOS 内付费(in-app purchase)--非消耗品的购买与恢复
恢复购买官方地址
苹果内购商品信息获取
Unity苹果(iOS)内购接入(Unity内置IAP)
# Unity3d发布IOS(包含u3d自带IAP内购)的流程-小白篇(三)-u3d配置ios内购部分
每次支付行为或每笔交易被认为是一个SKPaymentTransation,只有当SKPaymentTransation被finishTransaction:,这次支付(交易)行为才算是正常结束了。即使这次支付途中被中断,其实也并没有丢失。假设支付没有完成 App 就退出了(比如崩溃),那么当下次 App 重启之后,只要设置了监听addTransactionObserver:,之前被中断的支付就会接着进行。
第1步,这个过程中 App 进程因为某种原因被 kill 了,其实支付行为还在系统后台进行着,苹果自己做的,很有可能扣款成功。但是这时候没法为用户充值虚拟货币。
第2步,App 端与自己服务器端通信失败;自己服务器端与 AppStore 服务器之间的通信失败。
针对第一种情况,可以在 App 一启动就设置监听,如果有未完成的支付,则会回调- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;这个方法,在这个方法里调用接口充值。
至于第二种情况,App 端需要做接口重试,设置一个重试的逻辑。
在发起支付请求之后,苹果返回商品列表,先请求服务器下单接口,成功之后,将订单信息保存在钥匙串,然后发起支付,在支付状态的回调当中, 成功了就去做服务器的验签操作,验证成功,关闭事物,并将订单信息删除,支付完成
app启动时监听掉单情况, 如果有掉单情况,回走事物更新的回调,然后再回调里,通过钥匙串拿出订单相关信息,然后获取支付凭证,重新向服务器发起验单的流程。
钥匙串保存订单信息作用:为了拿到订单的相关信息作为参数来请求服务器验签接口。
F. iOS苹果内购(详细步骤)
1.进入开发者平台,点击如下图所示:
设置
2.查看付费同意条款
添加这3个信息
4.添加银行账户
5.选择报税表
默认美国
6.根据报税表填写报税情况,根据自己实际情况,在这里我们需要选择NO,后面选了几个勾,以为可以,后面报错了!
三者必须填写 注意 :这里可以随便填写。
7.填写联系人,这几个部分可以填写同一人
2.选择内购项目类型
根据功能选择
3.设置产品价格及名称
4.显示信息
5.审核信息
注意:这些信息都要填完整,否则会提示元数据丢失。
内购项目
添加账号
在需要购买的控制器内
四.注意事项
1.内购必须用真机测试
2.测试时必须退出App Store自己的Apple ID,登录沙盒的测试Apple ID .
3.本身请求美国服务器就慢,为防止审核人员误解,我们需要在购买时加载动画。
G. iOS 内购掉单 补单 解决整理
1、苹果内购的流程图(由服务器校验苹果单据)
①原生app发起内购
②->支付完成后可获得一个单据
③->获取单据后调用我们自己后台服务器接口(服务器接口调用苹果接口进行校验,然后处理修改账号金额的操作)
④->调用完后台服务器接口后返回结果给app进行数据刷新
2、掉单出现的位置
①就目前来说,因为我是用的沙盒环境下测试,所以没有真实的付款流程,所以①这块发生丢单情况的还没遇到过,网上有小伙伴反映在实际支付过程中①过程可能产生丢单,明明支付了钱,但是在app收不到内购充钱成功的回调...这里不做探究
③
对app开发来说,最常见丢单情况出现在③的位置,因为在我们获取到内购成功的单据后,需要我们自己再自行调用服务器接口,如果用户在这时候关网、强行关闭app,就中断调用过程!
④
我们自己后台服务器接口返回超时
///待续...
H. iOS苹果内购(详细步骤)
1. iOS苹果内购(详细步骤)
2. iOS开发-微信/支付宝/内购封装
3. ios 内购详解(2019)
4. iOS内购规则
5. iOS开发支付篇——内购(IAP)详解
6. ios 记录支付宝集成遇到的坑及解决方法
7. iOS集成封装三方支付支付宝、微信、银联、Apple Pay
8. iOS-H5支付(微信、支付宝)原生封装
9. iOS支付封装(微信/支付宝)