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"
}

 

转载于:https://www.cnblogs.com/cj8988/p/10648932.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 PHP 代码实现 iOS订单验证的示例: ```php <?php // 定义 app id 和 app secret $app_id = 'your_app_id'; $app_secret = 'your_app_secret'; // 获取验证请求参数 $receipt = $_POST['receipt']; $password = $_POST['password']; // 发送验证请求到 Apple 服务器 $url = 'https://buy.itunes.apple.com/verifyReceipt'; // 正式环境 //$url = 'https://sandbox.itunes.apple.com/verifyReceipt'; // 沙盒环境 $data = json_encode(array('receipt-data' => $receipt, 'password' => $password)); $options = array( 'http' => array( 'header' => "Content-type: application/json\r\n", 'method' => 'POST', 'content' => $data ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); // 解析验证结果 $response = json_decode($result, true); if ($response['status'] == 0) { // 验证成功 $latest_receipt_info = $response['latest_receipt_info']; $transaction_id = $latest_receipt_info[0]['transaction_id']; $product_id = $latest_receipt_info[0]['product_id']; $purchase_date = $latest_receipt_info[0]['purchase_date']; // TODO: 在这里处理订单验证成功后的逻辑 } else { // 验证失败 $error_code = $response['status']; $error_message = $response['status_message']; // TODO: 在这里处理订单验证失败后的逻辑 } ?> ``` 以上代码中,首先定义了 app id 和 app secret,然后获取了验证请求参数 receipt 和 password,接着发送验证请求到 Apple 服务器,并解析验证结果。如果验证成功,可以获取到订单的相关信息,如 transaction_id、product_id 和 purchase_date 等,可以在这里处理订单验证成功后的逻辑;如果验证失败,可以获取到错误码和错误信息,可以在这里处理订单验证失败后的逻辑。需要注意的是,验证请求需要发送到正式环境或者沙盒环境,根据实际情况选择相应的 URL 即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值