php 苹果内购支付

来源:互联网 发布:软件开发企业资质证书 编辑:程序博客网 时间:2024/04/29 22:17
  1. /**  
  2.  * 验证AppStore内付  
  3.  * @param  string $receipt_data 付款后凭证  
  4.  * @return array                验证是否成功  
  5.  */   
  6. function validate_apple_pay($receipt_data){   
  7.     /**  
  8.      * 21000 App Store不能读取你提供的JSON对象  
  9.      * 21002 receipt-data域的数据有问题  
  10.      * 21003 receipt无法通过验证  
  11.      * 21004 提供的shared secret不匹配你账号中的shared secret  
  12.      * 21005 receipt服务器当前不可用  
  13.      * 21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送  
  14.      * 21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务  
  15.      * 21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务  
  16.      */   
  17.     function acurl($receipt_data$sandbox=0){   
  18.         //小票信息   
  19.         $POSTFIELDS = array("receipt-data" => $receipt_data);   
  20.         $POSTFIELDS = json_encode($POSTFIELDS);   
  21.     
  22.         //正式购买地址 沙盒购买地址   
  23.         $url_buy     = "https://buy.itunes.apple.com/verifyReceipt";   
  24.         $url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt";   
  25.         $url = $sandbox ? $url_sandbox : $url_buy;   
  26.     
  27.         //简单的curl   
  28.         $ch = curl_init($url);   
  29.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   
  30.         curl_setopt($ch, CURLOPT_POST, 1);   
  31.         curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS);   
  32.         $result = curl_exec($ch);   
  33.         curl_close($ch);   
  34.         return $result;   
  35.     }   
  36.     // 验证参数   
  37.     if (strlen($receipt_data)<20){   
  38.         $result=array(   
  39.             'status'=>false,   
  40.             'message'=>'非法参数'   
  41.             );   
  42.         return $result;   
  43.     }   
  44.     // 请求验证   
  45.     $html = acurl($receipt_data);   
  46.     $data = json_decode($html,true);   
  47.     
  48.     // 如果是沙盒数据 则验证沙盒模式   
  49.     if($data['status']=='21007'){   
  50.         // 请求验证   
  51.         $html = acurl($receipt_data, 1);   
  52.         $data = json_decode($html,true);   
  53.         $data['sandbox'] = '1';   
  54.     }   
  55.     
  56.     if (isset($_GET['debug'])) {   
  57.         exit(json_encode($data));   
  58.     }   
  59.         
  60.     // 判断是否购买成功   
  61.     if(intval($data['status'])===0){   
  62.         $result=array(   
  63.             'status'=>true,   
  64.             'message'=>'购买成功'   
  65.             );   
  66.     }else{   
  67.         $result=array(   
  68.             'status'=>false,   
  69.             'message'=>'购买失败 status:'.$data['status']   
  70.             );   
  71.     }   
  72.     return $result;   
  73. }  
  74. 使用方法也非常简单; 就是把IOS发过来的支付凭证作为参数传入validate_apple_pay()函数即可; 但是既然挂上了thinkphp整合; 那就给个示例吧; /Application/Api/Controller/AppstoreController.class.php  
  75. <?php   
  76. namespace Api\\Controller;   
  77. use Common\\Controller\\HomeBaseController;   
  78. /**  
  79.  * paypal支付  
  80.  */   
  81. class AppstoreController extends HomeBaseController{   
  82.        
  83.     // 支付回调   
  84.     public function result(){   
  85.         //苹果内购的验证收据   
  86.         $receipt_data = I('post.apple_receipt');    
  87.         // 验证支付状态   
  88.         $result=validate_apple_pay($receipt_data);   
  89.         if($result['status']){   
  90.             // 验证通过 此处可以是修改数据库订单状态等操作   
  91.                
  92.         }else{   
  93.             // 验证不通过   
  94.         }   
  95.     }   
  96.    
  97. }  
原创粉丝点击