验证函数:

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实现的更多相关文章

  1. ios 苹果内购订单验证 --- nodejs实现

    实现代码 function IosPlayVerify(data,orderid,cb) { itunesPost(data,function (error,responseData) { if (e ...

  2. php苹果内购订单验证

    /** * 21000 App Store不能读取你提供的JSON对象 * 21002 receipt-data域的数据有问题 * 21003 receipt无法通过验证 * 21004 提供的sha ...

  3. 苹果内购服务器验证之receipt返回多组in_app思考

    最近有部分用户反映,苹果内购充值失败,经过测试总结有几个关键点出现问题 1.app购买成功苹果没有返回票据,属于票据遗漏(取决于苹果服务器的响应状况),只能客户端进行监听刷新等处理 2.app连续购买 ...

  4. IOS,苹果内购和添加广告

    内购——应用内购买 通过苹果应用程序商店有三种主要赚钱的方式: 直接收费(与国内大部分用户的消费习惯相悖) 广告(降低用户体验 应用程序名称带Lite可以添加广告) O2O -> Online推 ...

  5. Android内购订单验证 --- nodejs实现

    主代码: function AndroidPlayVerify(inappPurchaseData, inappDataSignature) { let verify = crypto.createV ...

  6. c++ boost 苹果内购 IAP验证

    // 1111.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include <cstdlib> #include <i ...

  7. Android内购订单验证 --- php实现

    直接上代码: function googleVerify($sdata,$google_public_key) { $sdata = json_decode($sdata,true); $in_app ...

  8. iOS:苹果内购实践

    iOS 苹果的内购 一.介绍 苹果规定,凡是虚拟的物品(例如:QQ音乐的乐币)进行交易时,都必须走苹果的内购通道,苹果要收取大约30%的抽成,所以不允许接入第三方的支付方式(微信.支付宝等),当然开发 ...

  9. iOS开发苹果内购的介绍与实现

    1.iOS开发苹果内购的介绍 1.1 介绍 苹果规定,凡是虚拟的物品(例如:QQ音乐的乐币)进行交易时,都必须走苹果的内购通道,苹果要收取大约30%的抽成,所以不允许接入第三方的支付方式(微信.支付宝 ...

随机推荐

  1. 了解委托(Delegate)

    委托是一种全新面向对象语言特性,运行在.Net平台 基于委托,开发事件驱动程序变得非常简单 使用委托可以大大简化多线程变成的难度 理解委托 int a:   //定义变量 a=100://给变量赋值 ...

  2. [学习心得][Introduction to ASP.NET Core 1.0]4-1 Creating a Form

    原视频地址https://mva.microsoft.com/en-US/training-courses/introduction-to-asp-net-core-1-0-16841?l=eYlqd ...

  3. Struts2_模块包含

    <include file="login.xml"/> 包含其他的模块. 项目开发中,分模块协调开发有用. 链接: http://pan.baidu.com/s/1bo ...

  4. 批处理实现虚拟WIFI

    类似于360免费WiFi那个软件,可以PC发射WiFi(需要有无线网卡). 源码如下: @Echo off title Windows7 虚拟Wifi----By yllinux mode con c ...

  5. Microsoft EDP(enterprise database protection)配置策略中的三种Rule template

    搭建Microsoft EDP环境: Microsoft 10 insider preview,Microsoft Intune,ie10(要安装插件silverlight) 这里暂时只说在进行配置策 ...

  6. selenium使用谷歌浏览器自带手机模拟器运行H5网页

    背景:最开始用手机模拟H5页面跑自动化,发现经常因为app连接或者网络原因等一系列情况,导致M版(H5页面)用例跑不通,想通过浏览器自带的手机模拟器运行,保证稳定性 浏览器自带的模拟器如下图: 代码实 ...

  7. 将TIMESTAMP类型的差值转化为秒的方法

    两个TIMESTAMP之差得到的是INTERVAL类型,而有时我们只需要得到两个时间相差的秒数,如果变成INTERVAL之后,想要获取这个值会非常麻烦. 比较常见的方法是使用EXTRACT来抽取获得的 ...

  8. 反射java

    所谓反射(Refection),其实就是程序自己能够检查自身信息,就像程序会通过镜子反光来看自己本身一样.反射使得 Java语言具有了“动态性”,即程序首先会检查某个类中的方法.属性等信息,然后再动态 ...

  9. [转] JAVA中读取网络中的图片资源导入到EXCEL中

    需求 导出人员的信息并且加上人员的照片至EXCEL中 完整的代码 //创建一个表格 HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb ...

  10. 将matlab处理结果保存为图像文件

    imwrite(testIm, 'Data/Test/testIm.bmp', 'BMP');