PHP 苹果支付校验

最近跟iOS这边对接苹果支付,商品等信息由前端访问谷歌服务器获取,支付等都由前端完成,后端则需要校验前端传过来的参数,通过后入库处理
苹果支付后返回给iOS的数据,有一串很长的base64的数据,后端只需要获取这串数据来校验

   /**IOS内购验证票据
     * @param string $receipt_data 付款后凭证
     * @param bool $sandbox 是否为沙盒
     * @param bool $transactions 仅对包含自动续订的应用收据使用此字段
     * @return mixed
     */
    public function validate_applepay($receipt_data,$sandbox=true,$transactions=false)
    {
        $jsonData = array('receipt-data' => $receipt_data, 'password' => config('apple_pay')['password'],'exclude-old-transactions'=>$transactions);
        $post_json = json_encode($jsonData);
        $url=$sandbox===true?"https://sandbox.itunes.apple.com/verifyReceipt":"https://buy.itunes.apple.com/verifyReceipt";
        $client=new Client(['verify' => false]);
        $response=   $client->post($url,[
            'body'=>$post_json,
            'headers'  => [
                'Content-Type' => 'application/json'
            ]
        ]);
        $result= $response->getBody()->getContents();;
        $res= json_decode($result, true);
     if (intval($res['status']) == 0) {  //验证成功
            $apple_pay = config('apple_pay');
            $products = array_keys($apple_pay['products']);
            $product_id = $res['receipt']['in_app'][0]['product_id'];
            if (!in_array($product_id, $products)) {
                $this->error='不是系统内部的商品ID';
                return false;
            }
            if ($res['receipt']['bundle_id']!= $apple_pay['bundle_id']) {
                $this->error='bundle_id 不一致';
                return false;
            }
            $info = $this->getOne($res['receipt']['in_app'][0]['transaction_id']);
            if ($info){
                $this->error='交易号重复';
                return false;
            }
            return true;
        } elseif (intval($res['status']) == 21007) {
            return  $this->validate_applepay($receipt_data,true);
        } else {
            $this->error=self::code[$res['status']];
            return false;
        }
    }

校验通过后,苹果返回的状态码

 Const code=[
        21000=>'App Store无法读取你提供的JSON数据',
        21002=>'收据数据不符合格式',
        21003=> '收据无法被验证',
        21004=> '你提供的共享密钥和账户的共享密钥不一致',
        21005=> '收据服务器当前不可用',
        21006=> '收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中',
        21007=>'收据信息是测试用(sandbox),但却被发送到产品环境中验证',
        21008=>'收据信息是产品环境中使用,但却被发送到测试环境中验证'
    ];

校验通过的返回的数据

    "receipt":{
        "receipt_type":"ProductionSandbox",
        "adam_id":0,
        "app_item_id":0,
        "bundle_id":"com.xxx.xxx",
        "application_version":"2",
        "download_id":0,
        "version_external_identifier":0,
        "receipt_creation_date":"2020-07-03 03:05:51 Etc/GMT",
        "receipt_creation_date_ms":"1593745551000",
        "receipt_creation_date_pst":"2020-07-02 20:05:51 America/Los_Angeles",
        "request_date":"2020-07-09 03:26:37 Etc/GMT",
        "request_date_ms":"1594265197186",
        "request_date_pst":"2020-07-08 20:26:37 America/Los_Angeles",
        "original_purchase_date":"2013-08-01 07:00:00 Etc/GMT",
        "original_purchase_date_ms":"1375340400000",
        "original_purchase_date_pst":"2013-08-01 00:00:00 America/Los_Angeles",
        "original_application_version":"1.0",
        "in_app":[
            {
                "quantity":"1",
                "product_id":"xxxx",
                "transaction_id":"1000000687969364",
                "original_transaction_id":"1000000687969364",
                "purchase_date":"2020-07-03 03:05:51 Etc/GMT",
                "purchase_date_ms":"1593745551000",
                "purchase_date_pst":"2020-07-02 20:05:51 America/Los_Angeles",
                "original_purchase_date":"2020-07-03 03:05:51 Etc/GMT",
                "original_purchase_date_ms":"1593745551000",
                "original_purchase_date_pst":"2020-07-02 20:05:51 America/Los_Angeles",
                "is_trial_period":"false"
            }]
    },
    "status":0,
    "environment":"Sandbox"
}

作者:seahonest
链接:https://www.jianshu.com/p/02a4fa66b9cf
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者: 执着小钟

执着小钟

发表评论