// 收据格式处理val data = JsonObject()data.addProperty("receipt-data", receipt.replace(" ", "+"))val entity = StringEntity(data.toString())entity.setContentEncoding("UTF-8")entity.setContentType("application/json")// 发送苹果校验val request = if  HttpPost(PURCHASE_CALLBACK_APPSTORE) request.entity = entityval client = HttpClientBuilder.create().build()// 解析校验结果val response = JsonParser().parse(EntityUtils.toString(client.execute(request).entity, "UTF-8")).asJsonObjectclient.close()
if(response["status"].asInt==0){
val re = response["receipt"].asJsonObjectval inApp = re["in_app"].asJsonArray// 判定inApp是否为空 inApp为空认为订单无效if (inApp.size() == 0) return false// 循环验证inAPP内的购买收据inApp.forEach {                    // 判定productId是否符合项目中的内购IDval productId = it.asJsonObject["product_id"].asString// 项目中不存在该内购ID收据无效,跳过本次校验val product = mProductRepo.findByIapId(productId) ?: return@forEach// 判断transactionId是否验证过val transactionId = it.asJsonObject["transaction_id"].asStringval tradeLog = mTradeLogRepo.findByTransactionId(transactionId)// transactionId校验过,跳过本次校验if (tradeLog != null) return@forEachtry { // 购买异常处理// 购买逻辑,内部校验服务订单内的商品ID是否和购买收据内的ID匹配purchaseSuccess(number, product.id)// 记录验单结果,以便跟踪addTradeLog(userId, number, receipt, response.toString(), transactionId, 0)} catch (e: Exception) {// 记录内部校验失败的记录,以便跟踪addTradeLog(userId, number, receipt, response.toString(), transactionId, 1)return@forEach}}
}else{// 记录验证失败的收据mRedisRepo.put(RedisRepo.KeyType.REJECT_RECEIPT, number, receipt)
}

目前网上大部分内购验单是粗暴的检验收据是否通过苹果校验,容易产生恶意刷单和漏单的情况,本人开发过程中也踩了不少坑。总结了自己认为较为完善的内购验单流程,由于技术有限,流程仅供参考,内部方法,类之类的就不贴出来了,如果有遗漏或者错误的地方,欢迎指正。

苹果IOS内购验单完整流程,in_app购买收据处理相关推荐

  1. JAVA项目之苹果IAP内购JAVA服务器验证流程详解

    1.前言 本博客是经历过多个项目检验的, 绝对真实, 适应于对苹果iap内购稍微有些了解的JAVA开发人员,  认真看,  定能完美解决苹果内购问题. 苹果IAP内购支付实际上是"将客户端支 ...

  2. ios内购返回html,iOS内购掉单问题处理方法

    iOS内购提供了两种模式,一种是单机(本地验证)模式,另一种是服务器端验证模式. 单机验证模式:适用于单机应用,安全性低,数据易被篡改. 服务器验证模式:应用服务器提交支付票据到苹果服务器验证,安全性 ...

  3. ios内购二次验证安全性问题_苹果IOS内购二次验证返回state为21002的坑

    项目是三四年前的老项目,之前有IOS内购二次验证的接口,貌似很久都没用了,然而最近IOS的妹子说接口用不了,让我看看啥问题.接口流程时很简单的,就是前端IOS在购买成功之后,接收到receipt后进行 ...

  4. 苹果 iOS 内购三步曲:App 内退款、历史订单查询、绑定用户防掉单

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? 转自:掘金 37手游iOS技术运营团队 https://juejin.cn/post/697473339 ...

  5. 苹果iOS内购三步曲:App内退款、历史订单查询、绑定用户防掉单!--- WWDC21

    一.前言 如果大家的 App 有使用 IAP 功能,那么可能会遇到用户反馈苹果充值成功,但是服务没有到账的情况,用户一般会提供这样的苹果收据: 用户反馈时提供的苹果收据中,有一个字段中 ORDER I ...

  6. PHP实现苹果(IOS)内购(IAP)

    反反复复经过多次重写(内部需要),发现苹果使用PHP来验证苹果内购数据是否正确并不是一件很难的事情.我把我的一些心得写出来,以供以后有这方面需求的小伙伴参考,以PHP语言为例,谁让PHP是最好的语言呢 ...

  7. 苹果iOS 内购 App 内退款 绑定 查询

    苹果后台给出推送退款的功能,是 server to server,所以我们需要将接收退款通知推送的接口填入苹果后台. 首先很多用户开发者不知道如何接受通知,其次必须要使用注册的域名,备案流程时间比较长 ...

  8. IOS内购流程从0-1手把手教会

    苹果掌握着可能是全球最重要的APP分发渠道,然而30%的抽成近年来也被人批评,现在苹果似乎也看到反对意见了,从2021年1月1日开始,部分小型企业的分成费用降低到15%. 据报道,苹果将于2021年1 ...

  9. Unity接入iOS内购

    1.内购种类 consumable:可消费的,如游戏中的金币,用完还可以再购买. non-consumable:不可销毁的,一次购买,永久生效.比如去广告,解锁游戏关卡,这种商品只能购买一次. sub ...

最新文章

  1. 动态滴定预测算法研究
  2. android sim iso,android – 意外的telephonyManager.getSimCountryIso()行为
  3. 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)
  4. mysql常用操作(一)
  5. mysql msdtc 不支持_IIS5.1安装后,不支持IIS的问题。(转)
  6. 苹果Mac Studio 3月18日发售 但法国一用户已提前收货
  7. Linux 下的终端
  8. 不可阻挡的PowerShell :Red Teamer告诉你如何突破简单的AppLocker策略
  9. 计算机常用汉字输入法的使用,计算机的基本操作汉字输入法--.ppt
  10. 如何将composer设置为全局变量?
  11. 4_1 古老的密码(UVa1339)排序
  12. 远程连接服务器出现 SQL Error (1130): Host IP is not allowed to connect to this MySQL server 错误...
  13. Delphi2010中向TRxRichEdit控件中插入OLE对象。
  14. OSI七(八)层结构 TCP/IP 4层结构
  15. Java基础面试题整理-50题(附答案)
  16. 6. LaTeX 参考文献的排版与引用
  17. 60.windbg----as、$u0(固定别名、自定义别名)
  18. vuepress-theme-reco@1.x 解决博客首页 与 仓库README不兼容问题
  19. python抢票软件源代码_自己写的一个抢票加速的Python小程序源码分享-----纯属娱乐...
  20. 机器学习——成绩预测

热门文章

  1. 【中科微北斗+GPS模块经纬度数据解析详细教程-附免费代码工程】
  2. 用机器学习制作超级马里的关卡
  3. Docker部署Nginx集群
  4. -Xms -Xmx -XX:PermSize -XX:MaxPermSize 的理解和区别
  5. Android常见的几个问题及解决方法
  6. Python和PHP有什么区别
  7. 《微信小程序案例4》bindtap点击事件使用自定义数据data-xxx传参方法
  8. 程序员们,曾经是否有个bug让你开始怀疑人生
  9. vt功能对计算机有影响吗,虚拟化是什么,CPU开启虚拟化和关闭虚拟化对电脑有影响吗?具体有什么影响,关闭虚拟化可以提高性能吗?...
  10. iphone 隐藏底部_如何在iPhone上的消息中隐藏联系人照片