Blogger Information
Blog 33
fans 0
comment 0
visits 25860
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
thinkphp整合系列之苹果AppStore内购付款的服务器端php验证
非常缪
Original
971 people have browsed it

如果要演一部霸道总裁的剧;
我想这主角必须非苹果莫属了;

苹果的霸道实在是出了名的;
这不;如果是非实物的交易;
现在你不给苹果交个过路费;
那都是立马被审核处死的节奏;
好了;以上仅为吐槽;
正题;

这里要讲的就是AppStore内购的服务器端验证;
在app中支付的过程那是由IOS程序猿完成的;
IOS会把支付凭证发给我们;
作为服务器端;
我等php需要做的就是对支付结果的验证;
写着是thinkphp整合系列;
其实脱离thinkphp别的框架也能很便利的使用;
因为我是给写成函数了的

/**
* 验证AppStore内付
* @param  string $receipt_data 付款后凭证
* @return array                验证是否成功
*/function validate_apple_pay($receipt_data){
   /**
    * 21000 App Store不能读取你提供的JSON对象

    * 21003 receipt无法通过验证
    * 21004 提供的shared secret不匹配你账号中的shared secret
    * 21005 receipt服务器当前不可用
    * 21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送
    * 21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务
    * 21008 recei是生产receipt,但却发至Sandbox环境的验证服务
    */
   function acurl($receipt_data, $sandbox=0){
       //小票信息
       $POSTFIELDS = array("receipt-data" => $receipt_data);
       $POSTFIELDS = json_encode($POSTFIELDS);

       //正式购买地址
       $url_buy     = "https://buy.itunes.apple.com/verifyReceipt";
       $url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt";
       $url = $sandbox ? $url_sandbox : $url_buy;


       $ch = curl_init($url);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
       curl_setopt($ch, CURLOPT_POST, 1);
       curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS);
       $result = curl_exec($ch);
       curl_close($ch);
       return $result;
   }

   if (strlen($receipt_data)<20){
       $result=array(
           'status'=>false,
           'message'=>'非参数'
           );
       return $result;
   }
   // 请求验证
   $html = acurl($receipt_data);
   $data = json_decode($html,true);


   if($data['status']=='21007'){
       // 请求验证
       $html = acurl($receipt_data, 1);
       $data = json_decode($html,true);
       $data['sandbox'] = '1';
   }

   if (isset($_GET['debug'])) {
       exit(json_encode($data));
   }
   
   // 判断否购成功
   if(intval($data['status'])===0){
       $result=array(
           'status'=>true,
           'message'=>'购成功'
           );
   }else{
       $result=array(
           'status'=>false,
           'message'=>'购买败 status:'.$data['status']
           );
   }
   return $result;}
PHPCopy

使用方法也非常简单;
发过来的支付凭证作为参数传入validate_apple_pay()函数即可;
但是既然挂上了thinkphp整合;
那就给个示例吧;
/Application/Api/Controller/AppstoreController.class.php

<?phpnamespace Api\Controller;use Common\Controller\HomeBaseController;/**
* paypal支付
*/class AppstoreController extends HomeBaseController{
   
   // 回调
   public function result(){
       //苹果内购的验证收据
       $receipt_data = I('post.apple_receipt');
       // 验证支付状态
       $result=validate_apple_pay($receipt_data);
       if($result['status']){
           // 验证通过 此处可以是修改数据库订单状态等操作
           
       }else{
           // 验证不通过
       }
  


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!