PHP苹果内购验证步骤

/**
     * 验证返回的状态码
     * 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环境的验证服务
     */
    public function verify(){
        
        $receipt = "票据";
        $transaction_id = "当前交易单号";
        $product_id = "购买的套餐名称";
        //查询该笔交易是否已存在,防止app验证失败后重试时重复插入
        $map['transaction_id'] = $transaction_id;
        $order = Db::name('info')->where($map)->find();
        if($order){            
                //如果没验证通过继续验证,已通过验证则返回成功
                                
        }else{
            //保存交易信息
            
            //验证票据
            $result = $this->iosverify($receipt);
            //沙盒模式
            if($result['status'] == 21007){
                $result = $this->iosverify($receipt,true);
            }
        }

        if(!is_array($result)){//大概率是超时
            ajaxmsg("",3);
        }
        if($result['status'] == 0){//验证成功
            if($result['receipt']['bundle_id']!="包名"){
                ajaxmsg("bundle_id fail",0);
            }
            //查找当前交易信息
            $ctransaction = [];
            foreach($result['receipt']['in_app'] as $k => $v){
                if($v['product_id'] == $product_id && $v['transaction_id'] == $transaction_id){
                    $ctransaction = $v;
                }
            }
            //当订购一个套餐后再次订购此套餐可能会出现这种情况,非常规操作
            if(empty($ctransaction)){
                ajaxmsg("",2);
            }
               //开启事务
               //更新用户VIP时间
               //更新info表vipstatus状态为1,特别要更新original_transaction_id字段(用来标识用户,回调时要用),从$ctransaction获取
               //提交事务
        }else{            
            ajaxmsg("",0);
        }

    }
//验证票据
protected function iosverify($receipt,$sandbox=false){
        if($sandbox){
            $url = 'https://sandbox.itunes.apple.com/verifyReceipt';//测试环境
        }else{
            $url = 'https://buy.itunes.apple.com/verifyReceipt'; //正式环境
        }

        $params = json_encode(array("receipt-data" =>$receipt,"password"=>"苹果秘钥"));
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $params);        
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, false);
        $data = curl_exec($curl);
        $errono = curl_errno($curl);
        curl_close($curl);
        $data = json_decode($data,true);
        if(!is_array($data)){//开发过程中经常遇到curl 35错误码,或者28超时
            return $errono;
        }
        return $data;
    }

注意:

1,请求苹果验证的时候可能会遇到请求非常慢的情况,有时会几十秒才返回。原因未知,可能是因为苹果服务器不稳定造成的。

2,可能会一开始支付后有回调,但突然就没有了回调的情况。如果排查自己代码后确定没问题,那就是苹果的问题。本人遇到过当天请求十几次没回调,第二天回调才出现。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P P PHP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值