老大要收保护费,我等小弟那也没办法呀。。。是的,我说的就是苹果内购!

1.先上php验证函数:

/*** 验证AppStore内付* @param  string $receipt_data 付款后凭证* @return array 验证是否成功*/
function validate_apple_pay($receipt_data)
{/***  0    receipt provided is valid.* 21000 App Store不能读取你提供的JSON对象* 21002 receipt-data域的数据有问题* 21003 receipt无法通过验证* 21004 提供的shared secret不匹配你账号中的shared secret* 21005 receipt服务器当前不可用* 21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送* 21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务* 21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务*/function acurl($receipt_data, $sandbox = 0){//小票信息$POSTFIELDS = array("receipt-data" => $receipt_data);$POSTFIELDS = json_encode($POSTFIELDS);//正式购买地址 沙盒购买地址$url_buy = "https://buy.itunes.apple.com/verifyReceipt";$url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt";$url = $sandbox ? $url_sandbox : $url_buy;//简单的curl$ch = curl_init($url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS);$result = curl_exec($ch);curl_close($ch);return $result;}// 验证参数if (strlen($receipt_data) < 20) {$result = array('status' => false,'message' => '非法参数');return $result;}// 请求验证$html = acurl($receipt_data);$data = json_decode($html, true);// 如果是沙盒数据 则验证沙盒模式if ($data['status'] == '21007') {// 请求验证$html = acurl($receipt_data, 1);$data = json_decode($html, true);$data['sandbox'] = '1';}if (isset($_GET['debug'])) {exit(json_encode($data));}// 判断是否购买成功if (intval($data['status']) === 0) {$order = $data['receipt']['in_app'];//所有的订单的信息$k = count($order) - 1;$need = $order[$k];//需要的那个订单$result = array('status' => true,'message' => '购买成功','product_id' => substr($need['product_id'], 19),  //商品价格'transaction_id' => $need['transaction_id']  //苹果订单号);} else {$result = array('status' => false,'message' => '购买失败 status:' . $data['status']);}return $result;
}
2.IOS发过来的支付凭证作为参数传入validate_apple_pay()函数即可;支付凭证的json格式如下:
   {“status”:0,
“environment”: “Sandbox”,
“receipt”: {“receipt_type”:“ProductionSandbox”,
“adam_id”: 0,
“app_item_id”: 0,
“bundle_id”: “com . christ . diandeng”,
“application_version”: “1”,
“download_id”: 0,
“version_external_identifier”: 0,
“receipt_creation_date”: “2018 - 05 - 07 10:54:48 Etc / GMT”,
“receipt_creation_date_ms”: “1525690488000”,
“receipt_creation_date_pst”: “2018 - 05 - 07 03:54:48 America / Los_Angeles”,
“request_date”: “2018 - 05 - 07 13:22:40 Etc / GMT”,
“request_date_ms”: “1525699360048”,
“request_date_pst”: “2018 - 05 - 07 06:22:40 America / Los_Angeles”,
“original_purchase_date”: “2013 - 08 - 01 07:00:00 Etc / GMT”,
“original_purchase_date_ms”: “1375340400000”,
“original_purchase_date_pst”: “2013 - 08 - 01 00:00:00 America / Los_Angeles”,
“original_application_version”: “1.0”,
“in_app”: [
{
“quantity”:“1”,
“product_id”: “com . christ . diandeng6”,
“transaction_id”: “1000000396341988”,
“original_transaction_id”: “1000000396341988”,
“purchase_date”: “2018 - 05 - 07 10:53:05 Etc / GMT”,
“purchase_date_ms”: “1525690385000”,
“purchase_date_pst”: “2018 - 05 - 07 03:53:05 America / Los_Angeles”,
“original_purchase_date”: “2018 - 05 - 07 10:53:05 Etc / GMT”,
“original_purchase_date_ms”: “1525690385000”,
“original_purchase_date_pst”: “2018 - 05 - 07 03:53:05 America / Los_Angeles”,
“is_trial_period”: “false”
},
{
“quantity”:“1”,
“product_id”: “com . christ . diandeng208”,
“transaction_id”: “1000000396342867”,
“original_transaction_id”: “1000000396342867”,
“purchase_date”: “2018 - 05 - 07 10:54:29 Etc / GMT”,
“purchase_date_ms”: “1525690469000”,
“purchase_date_pst”: “2018 - 05 - 07 03:54:29 America / Los_Angeles”,
“original_purchase_date”: “2018 - 05 - 07 10:54:29 Etc / GMT”,
“original_purchase_date_ms”: “1525690469000”,
“original_purchase_date_pst”: “2018 - 05 - 07 03:54:29 America / Los_Angeles”,
“is_trial_period”: “false”
}
]
}
}
3.然后写我们自己的接口,如下:
 // paypal 苹果支付回调接口public function paypal_app(){try {//苹果内购的验证收据$receipt_data = I('post.apple_receipt');$user_id = I('post.user_id');// 1.验证支付状态$result = validate_apple_pay($receipt_data);if ($result['status']) {// 2.验证通过 此处可以是修改数据库订单状态等操作$PayLogic = new PayLogic();$this->data = $recharge= $PayLogic->getSaveRecharge($user_id,$result['product_id'],$result['transaction_id']);$this->data['status'] = 1;$this->data['message'] = $result['message'];} else {// 3.验证不通过$this->data['status'] = 0;$this->data['message'] = $result['message'];}} catch (\Exception $e) {$this->error_code = $e->getCode();$this->error_msg = $e->getMessage();}return $this->getReturnJson($this->error_code, $this->error_msg, $this->data);}
至此,整个php后端的验证就结束了,这里有几个坑(其实还有没发现的坑):
1.ios传过来的支付凭证,最好是已经加密了(如base64加密),这样安全些,后端这边负责接收即可;
2.价格不需要ios传过来,后端自己从验证函数获取即可;
3.注意in_app,里面可能会有多个未结束的订单,如何避免重复插入订单数据呢?这里就用到了苹果
那边的订单号:transaction_id,我们再插入之前便要判断数据表中是否已有,如果有了,便不插入;如果没有再插入。
4.至于ios每次调用,我们该插入in_app里的哪一条呢?我这里用的是最新的那一条,不过也可以使用遍历。参考其他相关材料:
1:苹果应用内购买(IAP),服务器端开发处理流程2:php苹果内购订单验证3.注意的坑:iOS In-App Purchase(IAP)内购服务端二次验证注意事项4.在tp中的应用:thinkphp整合系列之苹果AppStore内购付款的服务器端php验证

苹果内购-后端注意事项相关推荐

  1. 【iOS内购支付】Uniapp拉起苹果内购支付注意事项、实现步骤以及踩过的坑(手把手教程)

    前言 Hello!又是很长时间没有写博客了,因为最近又开始从事新项目,也是第一次接触关于uniapp开发原生IOS应用的项目,在这里做一些关于我在项目中使用苹果内购支付所实现的方式以及要注意的事项,希 ...

  2. java+uniapp苹果内购

    苹果内购后端代码 苹果内购官网地址 1.注册app,填写协议.税务和银行业务 注册app,需要唯一设置Bundle identifier,然后详细填写协议.税务和银行业务 2.内购商品的添加 我的Ap ...

  3. PHP后端处理苹果内购对接

    苹果内购流程: iOS App上次苹果商店审核对于虚拟金币类必须要用苹果支付,不能使用第三方支付,苹果支付还要3/7分成,呵呵... 1.前六步有IOS端处理,最终获取购买凭证 2.POST请求,发送 ...

  4. Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解

    这是第二篇 Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程 这是前面的第一篇,详细的说明了怎样添加内购项目以及填写银行信息提交以及沙盒测试员的添加使用以及需要我们注意的东西,结 ...

  5. Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程

    事前准备 最近给游戏添加了苹果的内购,这一块的东西也是刚刚做完,总结一下,其实这里不管是游戏还是我们普通的App添加内购这一块的东西都是差不多的,多出来的部分就是我们Lua和OC的交互的部分,以前刚开 ...

  6. uniapp苹果内购总结

    uniapp苹果内购总结 1.创建App内购项目,设置好税务和银行卡等配置信息 2.HbuilderX 勾选Apple应用内支付 对于app内有虚拟物品交易的,一律需要接上苹果支付, uniapp支付 ...

  7. 苹果内购 服务器端验证

    针对苹果内购,看了 大量的 其他blog和阅读官方文档才发现,其实 苹果内购服务器做的工作很少, 此文档   写于2018年10月,只针对此时苹果返回的数据结构  内容解析. 基本上所有的 操作都可以 ...

  8. 苹果内购和 Apple Pay

    作者:CC老师_MissCC 链接:http://www.jianshu.com/p/e3bc47e81785 來源:简书 苹果内购 1.什么是内购? 如果你购买的商品,是在本app中使用和消耗的,就 ...

  9. postman关闭ssl验证_【第5期】springboot:苹果内购服务端验证

    ​苹果内购: 只要你在苹果系统购买APP中虚拟物品(虚拟货币,VIP充值等),必须通过内购方式进行支付,苹果和商家进行三七开 验证模式有两种: Validating Receipts With the ...

最新文章

  1. Cisco BFD双向转发检测技术部署案例
  2. 颇有微词 小模式 大蓝海 by 曹继忠 - 2013中国SEO排行榜
  3. keil 安装 for NRF52832
  4. 基于OMAPL138/C6748 + SPARTAN-6 77GHz汽车防撞雷达信号处理平台设计
  5. Git清除仓库所有历史记录
  6. 如何读懂 MySQL rw-lock 锁的统计信息
  7. 数据压缩作业——浊音,清音,爆破音时频分析
  8. 中国电子学会C++软件编程一级—六级历年真题模拟题题库260题及参考答案第六版 (星卯教育)TB
  9. 谢耳朵用的MIT人工智能情绪探测器,你也可以拥有
  10. 2D Skinned Mesh(3D的完全翻版 带旋转)
  11. MJ:世界黑客大师赛的故事
  12. java日志,需要知道的几件事(commons-logging,log4j,slf4j,logback)
  13. 在uni-app中如何使用一键登录,如何使用手机号一键登录
  14. Oracle使用默认用户登陆时,conn sys/密码 as sysdba,密码怎么是什么都行啊?
  15. zookeeper日志删除
  16. 消息队列中:消息可靠性、重复消息、消息积压、利用消息实现分布式事务
  17. 电影网网站优化-图片适配篇
  18. 图片后门恶意捆绑工具FackImageexploer
  19. 《剑指offer》第二章——关于面试官王海波的思考
  20. “智能”人工 身高计算器

热门文章

  1. 做生意多少利润才算正常,超过多少利润算暴利?
  2. 工业自动化流水线上的机器视觉检测应用 (三):视觉定位
  3. java引入包_java如何导入包
  4. FPGA配置芯片EPCS读写操作--STM32读写
  5. java策略模式案例_java策略模式典型案例
  6. 论文阅读(二):Decomposing Motion and Content for Video Generation
  7. java通过netty实现心跳机制_Netty4服务端心跳机制
  8. php apk包信息,php提取apk包信息
  9. Verilog入门——Quartus2基础使用
  10. MySQL复习笔记【上】