/**
* 验证返回的状态码
* 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,可能会一开始支付后有回调,但突然就没有了回调的情况。如果排查自己代码后确定没问题,那就是苹果的问题。本人遇到过当天请求十几次没回调,第二天回调才出现。