最近跟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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。