ios 苹果内购订单验证 --- php实现
验证函数:
function appleVerify($receipt_data,$orderId = 0)
{
/*
* 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环境的验证服务
* $receipt_data 苹果返回的支付凭证
* 正式 : https://buy.itunes.apple.com/verifyReceipt
* 沙箱 : https://sandbox.itunes.apple.com/verifyReceipt
*/ $env = App::environment();
if($env == 'online'){
//线上环境
$url = 'https://buy.itunes.apple.com/verifyReceipt';
}else{
//沙盒环境
$url = 'https://sandbox.itunes.apple.com/verifyReceipt';
} $num = 0;
while (1){
$num ++; $response = Curl::to($url)
->withData(array('receipt-data' => $receipt_data))
->asJson(true)
->post(); if($response['status'] != 21005 || $num >= 3){
break;
}
} // $response = json_decode($response,true);
// $data['status']==0 成功
// $data['receipt']['in_app'][0]['transaction_id'] 苹果订单号
// $data['receipt']['in_app'][0]['product_id']; 商品价格
// $data['receipt']['in_app'][0]['purchase_date_ms'] $status = 0;
$purchaseTime = 0; if ($response['status'] == 0) {
$status = 1;
try{
$inapps = $response['receipt']['in_app'];
$purchaseTime = $inapps[0]['purchase_date_ms']; if(!empty($orderId)){
foreach ($inapps as $item){
if($orderId == $item['transaction_id']){
$purchaseTime = $item['purchase_date_ms'];
break;
}
}
} }catch (Exception $e){
return ['status'=>0,'purcaseTime' => 0];
}
} return ['status'=>$status,'purcaseTime' => $purchaseTime];
}
参数说明:
//$receipt_data : ios购买时苹果服务器返回的订单信息
//$orderId : 订单号,验证订单是返回的内购订单数据可能会有多条($response['receipt']['in_app']有多条数据),所以需要遍历每条记录,找到跟订单ID一样的那一条数据的购买时间。
$receipt_data="MIIbWQYJKoZIhvcNAQcCoIIbSjCCG0YCAQExCzAJBgUrDgMCGgUA......";
$orderId="1000000461350339";
返回数据:验证订单获取的数据 $response:(其中in_app有多个)。
{
  "receipt": {
    "receipt_type": "Production",
    "adam_id": 127345,
    "app_item_id": 12732445,
    "bundle_id": "com.frd.cros",
    "application_version": "62",
    "download_id": 6703453,
    "version_external_identifier": 829054,
    "receipt_creation_date": "2019-03-29 02:03:00 Etc/GMT",
    "receipt_creation_date_ms": "1553820000",
    "receipt_creation_date_pst": "2019-03-28 19:03:00 America/Los_Angeles",
    "request_date": "2019-04-03 07:04:10 Etc/GMT",
    "request_date_ms": "1554275050780",
    "request_date_pst": "2019-04-03 00:04:10 America/Los_Angeles",
    "original_purchase_date": "2017-10-27 19:28:27 Etc/GMT",
    "original_purchase_date_ms": "1509132507000",
    "original_purchase_date_pst": "2017-10-27 12:28:27 America/Los_Angeles",
    "original_application_version": "3",
    "in_app": [
      {
        "quantity": "1",
        "product_id": "com.wordguess.go.in2",
        "transaction_id": "270004425012",
        "original_transaction_id": "270000425012",
        "purchase_date": "2019-03-29 02:02:59 Etc/GMT",
        "purchase_date_ms": "1553879000",
        "purchase_date_pst": "2019-03-28 19:02:59 America/Los_Angeles",
        "original_purchase_date": "2019-03-29 02:02:59 Etc/GMT",
        "original_purchase_date_ms": "1553824979000",
        "original_purchase_date_pst": "2019-03-28 19:02:59 America/Los_Angeles",
        "is_trial_period": "false"
      },
      {
        "quantity": "1",
        "product_id": "com.fil.removeads10",
        "transaction_id": "2700005471",
        "original_transaction_id": "27005471",
        "purchase_date": "2017-11-16 16:44:08 Etc/GMT",
        "purchase_date_ms": "1510850648000",
        "purchase_date_pst": "2017-11-16 08:44:08 America/Los_Angeles",
        "original_purchase_date": "2017-11-16 16:44:08 Etc/GMT",
        "original_purchase_date_ms": "1510850648000",
        "original_purchase_date_pst": "2017-11-16 08:44:08 America/Los_Angeles",
        "is_trial_period": "false"
      }
    ]
  },
  "status": 0,
  "environment": "Production"
}
ios 苹果内购订单验证 --- php实现的更多相关文章
- ios 苹果内购订单验证 --- nodejs实现
		实现代码 function IosPlayVerify(data,orderid,cb) { itunesPost(data,function (error,responseData) { if (e ... 
- php苹果内购订单验证
		/** * 21000 App Store不能读取你提供的JSON对象 * 21002 receipt-data域的数据有问题 * 21003 receipt无法通过验证 * 21004 提供的sha ... 
- 苹果内购服务器验证之receipt返回多组in_app思考
		最近有部分用户反映,苹果内购充值失败,经过测试总结有几个关键点出现问题 1.app购买成功苹果没有返回票据,属于票据遗漏(取决于苹果服务器的响应状况),只能客户端进行监听刷新等处理 2.app连续购买 ... 
- IOS,苹果内购和添加广告
		内购——应用内购买 通过苹果应用程序商店有三种主要赚钱的方式: 直接收费(与国内大部分用户的消费习惯相悖) 广告(降低用户体验 应用程序名称带Lite可以添加广告) O2O -> Online推 ... 
- Android内购订单验证 --- nodejs实现
		主代码: function AndroidPlayVerify(inappPurchaseData, inappDataSignature) { let verify = crypto.createV ... 
- c++ boost 苹果内购 IAP验证
		// 1111.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include <cstdlib> #include <i ... 
- Android内购订单验证 --- php实现
		直接上代码: function googleVerify($sdata,$google_public_key) { $sdata = json_decode($sdata,true); $in_app ... 
- iOS:苹果内购实践
		iOS 苹果的内购 一.介绍 苹果规定,凡是虚拟的物品(例如:QQ音乐的乐币)进行交易时,都必须走苹果的内购通道,苹果要收取大约30%的抽成,所以不允许接入第三方的支付方式(微信.支付宝等),当然开发 ... 
- iOS开发苹果内购的介绍与实现
		1.iOS开发苹果内购的介绍 1.1 介绍 苹果规定,凡是虚拟的物品(例如:QQ音乐的乐币)进行交易时,都必须走苹果的内购通道,苹果要收取大约30%的抽成,所以不允许接入第三方的支付方式(微信.支付宝 ... 
随机推荐
- IIS 伪静态 脚本映射 配置方法
			首先,是IIS7.0的配置,由于Windows Server 2008操作系统默认的IIS版本为7.0,我们知道,IIS7.0与IIS6.0 核心注意的地方:先要将应用池设置为集成模式,修改OK后,再 ... 
- phpstorm 配置 webserver ,配置根目录
			原文链接 http://blog.csdn.net/pony_maggie/article/details/52367093 phpstorm自带了一个web server,我们可以直接在IDE ... 
- css中的伪元素,我今天记住了!o~yeah
			对于伪类和伪元素,我如果要区别它们,一般是使用css中的手册来区分,平常时候也没特意去记,需要用到时打开手册“哦,这个是伪元素,这个是伪类”,我个人觉的某些东西你把它存在网上,不一定要存在头脑中.带着 ... 
- adb使用wifi无线连接调试Android设备
			先上官方原文: Wireless usage adb is usually used over USB. However, it is also possible to use over Wi-Fi, ... 
- 关于如何等待一个元素的出现而不用一些笨拙粗暴的time.sleep()方法
			我相信这是一个非常大众化的需求,我们需要等待某一个元素的出现以此来让我们的脚本进入到下一个Step,这个等待方法最好能够设置超时时间,然后找到后迅速callback.我们也很幸运!如果你仔细看Sele ... 
- JSP 里 的 basePath
			Eclipse新建JSP页面的时候不会加上 base 这个变量,需要手动添加,经常忘记,MyEclipse 就不用管了会自动添加. 如果忘了下面代码直接copy即可: <% String pat ... 
- 监控系统-nagios
			https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/4/en/ install yum -y install nagios-4 ... 
- Gameplay Classes
			每个虚幻游戏类都是一个.h和一个.cpp组成. 类在虚幻中有便准的命名模式. 前缀: A继承于可量产的游戏性类.他们都是Actor,可以直接在游戏中生成. U继承于所有游戏性对象.不能在游戏中直接生成 ... 
- Codeforces 760B Frodo and pillows
			题目链接:http://codeforces.com/problemset/problem/760/B 题意:n个床位,m个枕头,第k个位置最多有多少个枕头,其中相邻之间的差<=1; 第k个位置 ... 
- 学习MyBatis之简单入门HelloWorld
			转:https://blog.csdn.net/gaomb_1990/article/details/78299784 一.准备 Eclipse:Luna Service Release 1 (4.4 ... 
