苹果内购的坑

苹果的凭证查询的数据如果是消耗性只能查询一次,如果是订阅型也会有时效性,订阅型如果是同一组会保留一个原始订单号(第一次购买该组订阅的订单号),很多坑需要自己发掘,下面是基本的代码处理

public  function arraySort($arr,$key,$type='asc',$subscript=0){

        $keyArr = []; // 初始化存放数组将要排序的字段值
        foreach ($arr as $k=>$v){
            $keyArr[$k] = $v[$key]; // 循环获取到将要排序的字段值
        }
        if($type == 'asc'){
            asort($keyArr); // 排序方式,将一维数组进行相应排序
        }else{
            arsort($keyArr);
        }
        foreach ($keyArr as $k=>$v){
            $newArray[$k] = $arr[$k]; // 循环将配置的值放入响应的下标下
        }
        $newArray = array_merge($newArray); // 重置下标
        return $newArray[$subscript]; // 数据返回
    }




$receipt = '凭证';
$password = '密码';
$jsonItem = json_encode(['receipt-data' => $receipt,'password'=>$password ]);
 //$url= 'https://buy.itunes.apple.com/verifyReceipt';      //正式
        $url = 'https://sandbox.itunes.apple.com/verifyReceipt';  //测试
 $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  //这两行一定要加,不加会报SSL 错误
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        $response = curl_exec($ch);
        $errno = curl_errno($ch);
        $errmsg = curl_error($ch);
        curl_close($ch);
        $result= json_decode($response, true);
if($result['status'] == 21007)
{
 $url= 'https://buy.itunes.apple.com/verifyReceipt';      //正式
$ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  //这两行一定要加,不加会报SSL 错误
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        $response = curl_exec($ch);
        $errno = curl_errno($ch);
        $errmsg = curl_error($ch);
        curl_close($ch);
        $result= json_decode($response, true);
}
if ($result['status'] !== 0) {
            //验证失败 返回app错误状态,可以记录日志
exit;
}
 $receiptitem = $result['latest_receipt_info'];
 $item = $this->arraySort($receiptitem, 'purchase_date', 'desc');
$orderThird = $item['transaction_id'];                //本次订阅的订单号
        $orderThirdFirst = $item['original_transaction_id'];  //这个是原始订单号

你可能感兴趣的:(苹果内购的坑)