Flutter 接入iOS苹果内购支付踩坑过程
如何配置内购商品
坑1:项目与价格配置
苹果内购支付和我们平时接入支付宝或者微信支付有很大的差别。
- 苹果内购支付的价格只能选择,不能直接设置。如图:
- 苹果内购支付是通过配置项目的模式来实现支付的。我们应该把每个项目看作一个配置在苹果后台的商品,而不仅仅是一个支付配置。这样苹果内购比较好理解一点。
- 项目的类型有很多种,每一种作用不同,甚至还会影响审核
- 第一次配置好一个项目后,需要重新提一个版本后才能生效的。所以,第一次只能通过沙盒测试了。
坑2:内购项目类型
- 消耗型商品
可以消耗使用的商品, 比如游戏中的金币, 钻石等, 可以用来购买应用内虚拟物品的货币。 - 非消耗型商品
无法被消耗的商品,比如一些教育型APP中的课程, 再比如一些赛车游戏中的赛道, 这类商品需要在审核添加恢复购买按钮, 用于用户购买过后再误删除或其他原因卸载APP后的恢复流程, 否则提交审核会被拒绝。 - 非续期订阅
此类商品与消耗型商品类似, 比如一个月的会员, 一个季度的会员等,与消耗型商品的差异在于, 这类商品在验证凭证时需要传递共享秘钥 - 自动续期订阅
这类商品和其他商品的流程也有些许不同, 应用比如视频APP中的连续包月会员, 此类商品到期会自动扣费, 服务器的验证逻辑也会有所不同
在国内用的比较多的类型应该是消耗型商品,我们一般都是通过自己的服务器来处理支付逻辑的。而使用订阅类型商品还要处理一些其他的逻辑。
注意:所有的消耗型商品就需要实现 “恢复购买” 功能的,否则过不了审核。
消耗型支付流程
坑3:苹果内购漏单问题处理
苹果内购支付和微信/支付宝支付的流程有一个很大的不同。
微信/支付宝支付的结果通过notify_url 回调支付结果到自己的服务器。这样就能极大的保证了用户支付成功后,后台是能够接受到支付结果的。
而苹果内购支付成功后还需要客户端请求服务器的验证的接口,验证成功后才能判断支付有效。这个过程中容易因为网络闪退等问题导致漏单情况。漏单情况的处理
针对上面的分析,我们需要在购买前让后台产生一个订单。在得知苹果支付成功后,将订单和苹果返回的验证数据保存到本地。最后请求后台接口进行验证,验证通过了再删除本地的验证数据。否者下次打开APP要自动进行验证。
坑4:测试时只能使用沙盒来测试,即使是TestFlight上也是沙盒测试
说不上很坑,只是开发完不能通过实际支付来测试,让人心里没底。实际测试要上线之后测,出问题了也只能是重新提一个版本来修改了。不过让人值得安慰的是在沙盒没问题上线了一般也没问题的。
坑5:实际支付测试
由于苹果内购要收取30%的手续费。那么实际支付测试就不能用产品的实际金额来支付了。只能配置1元的商品来进行测试。而问题就是小额的支付,苹果的扣款延时可能比较大。我们就遇到连续的支付三次后,商品购买成功了。不过绑定的支付宝没有扣款提醒。还以为漏扣钱了,结果几个小时后才扣款。
Flutter 苹果内购组件flutter_inapp_purchase 的使用
- 下载依赖
flutter_inapp_purchase: ^3.0.1
- 初始化组件与监听
var result = await FlutterInappPurchase.instance.initConnection;//设置结果监听// 更新购买订阅消息_purchaseUpdatedSubscription =FlutterInappPurchase.purchaseUpdated.listen((productItem) {print('purchase-updated: $productItem');if(productItem.transactionStateIOS == TransactionState.purchased) {//todo}else{closeProgressDialog();}});// 购买报错订阅消息_purchaseErrorSubscription =FlutterInappPurchase.purchaseError.listen((purchaseError) {print('purchase-error: $purchaseError');closeProgressDialog();});
- 获取苹果服务器上的项目列表,即使用不上,支付之前也要获取一次,否者支付失败。
List<IAPItem> items =
await FlutterInappPurchase.instance.getProducts( ['0001', '0002', '0003'] );
- 拉起苹果支付
var result = FlutterInappPurchase.instance.requestPurchase(‘0001’);
- 获取需要 “恢复购买” 的列表,消耗型商品需要处理
List<PurchasedItem> items =
await FlutterInappPurchase.instance.getAvailablePurchases();
如果创建的是消耗型商品,常用的方法就这些了。
总结
苹果内购并不复杂,只是对于第一次接触苹果内购的人来说,很多配置都莫名其妙的。不过你后面理解了就会焕然大悟。
所以,我这篇文章并不是一个很细致的教程,不过是把一些坑和一些对苹果支付的理解写下来罢了。不过,我相信你看完这篇文章后,再去做苹果内购会顺很多。
Flutter 接入iOS苹果内购支付踩坑过程相关推荐
- java(jfinal) 接入ios苹果内购(连续包月订阅),服务端将二次验证。
大致流程: 1.ios端进行支付,然后收到苹果的一串数据(也叫收据),然后ios端将其转码为BASE64编码的字符串. 2.ios端请求服务端接口,将数据传给服务端,服务端拿到数据后,通过一系列处理后 ...
- 【iOS内购支付】Uniapp拉起苹果内购支付注意事项、实现步骤以及踩过的坑(手把手教程)
前言 Hello!又是很长时间没有写博客了,因为最近又开始从事新项目,也是第一次接触关于uniapp开发原生IOS应用的项目,在这里做一些关于我在项目中使用苹果内购支付所实现的方式以及要注意的事项,希 ...
- 虚拟产品之苹果内购支付/支付宝支付/微信支付的区别
1.支付宝支付: 同步通知,异步业务逻辑处理. 直接配置异步请求接口. 2.微信支付: 同步通知,异步业务逻辑处理. 直接配置异步请求接口. 3.苹果内购支付: 同步通知,同步业务逻辑处理. 需要io ...
- uni app ios 苹果内购
app ios 苹果内购 的步骤 1,准备工作先要uniapp 开发ios 内购需要准备的沙盒 测试账号,在苹果手机登录沙盒账号 也就是把自己的Apple ID退出登录沙盒账号,manifest.js ...
- iOS 苹果内购 In-App Purchase 踩过的坑
项目里面要接苹果支付,结果我研究了一个小时的apple pay,结果经理说是苹果内购,当时就感觉被耍了!好了,那就说说In-App Purchase这个吧,前面所有的准备工作经理做完了,我只是码代码, ...
- php 苹果支付验证,IOS苹果内购 PHP后端验证票据
大体流程: 1.IOS端需要在iTunes Connect上面添加配置一些内购商品,并审核通过,每个内购商品有自己的唯一标识product_id. 2.PHP后端要有一套与之对应的内购商品.IOS应用 ...
- IOS苹果内购 PHP后端验证票据
大体流程: 1.IOS端需要在iTunes Connect上面添加配置一些内购商品,并审核通过,每个内购商品有自己的唯一标识product_id. 2.PHP后端要有一套与之对应的内购商品.IOS应用 ...
- iOS苹果内购流程(Apple Pay)
好文:https://github.com/lintide/ApplePayDemo 苹果内购流程 字数631 阅读133 评论1 喜欢6 1.登录开发者中心[开发者中心链接](https://dev ...
- 苹果内购支付验签(php)
苹果支付成功后走php验证支付结果 传receipt支付凭证 ( 自动订阅:所以需要增加一个参数: password: 秘钥, 就可以了, 但是官方文档说秘钥仅仅用在自动续订上面 大家叫后台加个验证, ...
- iOS苹果内购详细步骤
一.设置协议等相关 1.点击协议.税务和银行业务. 点击协议.税务和银行业务.png 2.点击 Request Contracts 下面的 Request,一直点击直到主协议界面. Request.p ...
最新文章
- 目标检测中特征融合技术(YOLO v4)(上)
- 确认和回调_【短线回调,确认突破点】
- 前端相关html和css
- 鸿蒙智慧电视,华为的鸿蒙电视与智能电视有什么区别
- postgresql存图片字段类型_PostgreSQL让人着迷的多态性,另辟蹊径省时又省力
- linux mkswap -p参数,Linux基础命令---mkswap
- DAY8-Nessus漏洞扫描
- 【李宏毅2020 ML/DL】P106 More about Life Long Learning
- 宝塔linux搭建环境注意事项
- 面试常被问的65个问题及回答技巧(请收藏)
- 两种方法,给你的Safari浏览器添加必应/有道/谷歌网页即时翻译插件
- 基于能量采集的认知无线电时间和功率分配(一)——知识扫盲
- 多多客API SDK【拼多多开放平台】
- 大地高、正高、正常高以及GPS测高等若干问题
- Flutter 2.10 开发Windows桌面应用快速入门
- Rockchip | 启动引导的各个阶段及其对应固件
- 南京信息工程大学计算机考研资料汇总
- volatility 基本用法
- 到底cms企业建站系统是什么?为什么要做cms系统?
- c语言动态分配输出学生成绩,C语言之:结构体动态分配内存(利用结构体数组保存不超过10个学生的信息,每个学生的信息包括:学号、姓名和三门课(高数、物理和英语 )的成绩和平均分(整型)。)...
热门文章
- 高考作文《细雨闲花》
- html外链自动加nofollow,WordPress文章/页面外链自动添加nofollow属性的方法
- GAN-cls:具有匹配感知的判别器
- python象棋博弈算法_python做中国国粹——象棋
- 欧阳娜娜玩起“创可贴”,这次造型可以跟周冬雨相提并论了
- 【毕业设计】基于stm32的智能扫地机器人设计与实现 - 单片机 物联网
- 156 13.67用matlab答案,matlab数学实验习题全部答案(胡良剑)
- K-S检验两样本分布是否相同
- Spring Boot-入门
- python计算金星凌日