商会资讯

 找回密码
 立即注册

QQ登录

只需一步,快速开始

用新浪微博连接

一步搞定

搜索
热搜: 活动 交友 discuz
查看: 7417|回复: 0
打印 上一主题 下一主题

api接口类封装

[复制链接]

109

主题

1

好友

3774

积分

管理员

Rank: 9Rank: 9Rank: 9

  • ta_mind
    mb_qb7
    2013-3-19 01:56
  • classn_01: 366 classn_02

    [LV.9]以坛为家II

    跳转到指定楼层
    楼主
    发表于 2017-9-30 09:06:28 |只看该作者 |正序浏览
    api接口类实现
    项目要求比较低,封装一下能用得上的可以拿去用
    /**
    * 接口类
    * @author amplam <343937632@qq.com>
    * @config
    * return array(
            //'配置项'=>'配置值'
            "appid"=>"test",
            'appsecert'    =>    'test',
            'appip'=>'',//允许访问的IP 为空不限制
        );
    * @Time:
    */


    namespace Common\Util;

    class  AppHelper{
        private $appid;
        private $appsecret;
        private $appip;
        public function  __construct(){
            $this->appsecret=C('appsecert');
            $this->appid=C('appid');
            $this->appip=C('appip');
        }
        /**
         * @param timeStamp 时间戳
         * @param appid  帐号
         * @param appkey  加密后的key
         * 获取token
         */
        public  function getToken($appid,$appkey,$timeStamp){
            //安全验证
            
            if ($this->appid!=$appid){
                return     $this->return_data('-502',"身份验证错误,或已经过期");
            }
            if (!$this->check_key($this->appid,$appkey,$timeStamp)){
                
                return     $this->return_data('-502',"身份验证错误,或已经过期");
            }
            $client_ip=get_client_ip();
            
            if ($this->appip && $client_ip!=$this->appip){
                //不合法的IP
                return $this->return_data('-502',"Wrongful IP");
            }
            
            $ori_str = S("token_".$this->appid.'_'.$this->appsecret);

            if($ori_str){
                //重新获取就把以前的token删除
                S($ori_str,null);
            }
       
            //这里是token产生的机制  您也可以自己定义
            $nonce = $this->createNoncestr(32);
            
            $tmpArr = array($nonce,$this->appid,$this->appsecret);
       
            sort($tmpArr, SORT_STRING);
            $tmpStr = implode( $tmpArr );
            $tmpStr = sha1( $tmpStr );
            // echo $tmpStr;
            //这里做了缓存 'a'=>b 和'b'=>a格式的缓存
            S("token_".$this->appid.'_'.$this->appsecret,$tmpStr,7200);
            S($tmpStr,"token_".$this->appid.'_'.$this->appsecret,7200);
            //存储tokenIP 防止抓包者使用
            S("token_".get_client_ip(),get_client_ip(),7200);
            return $this->return_data('200',"ok",$tmpStr);
        }
        /**
         * 检查权限
         * @param unknown $appid
         * @param unknown $appkey
         * @param unknown $timeStamp
         * @return boolean
         */
        private  function check_key($appid,$appkey,$timeStamp){
            $time_s = time () - $timeStamp;
            if ($time_s > 60*120) {
                //超过2个小时就过期
                return false;
            }
            
            //验证$appkey  md5 用户名+密码+时间戳
            $temp_appkey=md5($appid.$this->appsecret.$timeStamp);
            if ($temp_appkey!=$appkey){
                return false;
            }
            return true;
        }
       
        /**
         * 生成json格式
         * @param integer $code 状态码
         * @param string $msg 提示信息
         * @param array $data 数据
         */
        public  static  function  json($code,$msg="",$data=array()){
       
            if (!is_numeric($code)){
                return '';
            }
            $result=array(
                    'code'=>$code,
                    'msg'=>$msg,
                    'data'=>$data
            );
            echo  json_encode($result);
            exit();
        }
       
        /**
         * 返回数据结构
         * @param unknown $code
         * @param string $msg
         * @param unknown $data
         * @return void|string
         */
        public static function  return_data($code,$msg="",$data=array()){
            if (!is_numeric($code)){
                
                return '';
            }
            $result=array(
                    'code'=>$code,
                    'msg'=>$msg,
                    'data'=>$data
            );
            return $result;
        }
        /**
         *  作用:产生随机字符串,不长于32位
         */
       private  function createNoncestr( $length = 10 )
        {
            $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
            $str ="";
            for ( $i = 0; $i < $length; $i++ )  {
                $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
            }
            return $str;
        }
       

       
        /**
         * 返回数据到客户端
         * @access protected
         * @param mixed $data 要返回的数据
         * @param String $type 要返回数据格式
         * @return void
         */
        public function apiReturn($code,$msg="",$data=array(),$type='JSON') {
            $type=$type?$type:'JSON';
            $result=array(
                    'code'=>$code,
                    'msg'=>$msg,
                    'data'=>$data
            );
            switch (strtoupper($type)){
                case 'JSON' :
                    // 返回JSON数据格式到客户端 包含状态信息
                    header('Content-Type:application/json; charset=utf-8');
                    exit(json_encode($result));
                case 'XML'  :
                    // 返回xml格式数据
                    header('Content-Type:text/xml; charset=utf-8');
                    exit(xml_encode($result));
                case 'JSONP':
                    // 返回JSON数据格式到客户端 包含状态信息
                    header('Content-Type:application/json; charset=utf-8');
                    $handler  =   isset($_GET[C('VAR_JSONP_HANDLER')]) ? $_GET[C('VAR_JSONP_HANDLER')] : C('DEFAULT_JSONP_HANDLER');
                    exit($handler.'('.json_encode($result).');');
                case 'EVAL' :
                    // 返回可执行的js脚本
                    header('Content-Type:text/html; charset=utf-8');
                    exit($result);
                   
            }
        }
       
        /**
         * 检查token的合法性
         * @param unknown $token
         */
        public function check_token($token){
            $client_ip=get_client_ip();
            if ($this->appip&&$client_ip!=$this->appip){
                //不合法的IP
                $this->apiReturn('-502',"Wrongful IP");
            }
            if(!$token){
                $this->apiReturn('-404','invalid token');
            
            }else if(!S($token)){
                $this->apiReturn('-404','invalid token');
            }
            //ip判断
            if(!S("token_".$client_ip)){
                $this->apiReturn('-502','invalid token');
            }
        }
    }

    使用:
    <?php
    namespace Home\Controller;
    use Think\Controller;
    use Common\Util\AppHelper;
    class IndexController extends Controller {
        public function index(){
            $this->show('error');
        }
        public function  test(){
            $appHelper = new AppHelper();
            $token=$_REQUEST['token'];
            $appHelper->check_token($token);
            $type=$_REQUEST['type'];
            $data = array(
                'id'=>1,
                'username'=>'343937632@qq.com',
                'info'=>'122121'
            );
            if($data){
                $appHelper->apiReturn(200,'读取用户信息成功',$data,$type);
            }
        }
        /**
         * @param timeStamp 时间戳
         * @param appid  帐号
         * @param appkey  加密后的key
         * 获取token
         */
        public function get_token(){
            $appHelper = new AppHelper();
            $appid=$_REQUEST['appid'];
            $appkey=$_REQUEST['appkey'];
            $timeStamp=$_REQUEST['timeStamp'];
            if (!$appid||!$appkey||!$timeStamp){
                $appHelper->apiReturn("-100","参数错误");
            }
            $return_data= $appHelper->getToken($appid,$appkey,$timeStamp);
            $appHelper->apiReturn($return_data['code'],$return_data['msg'],$return_data['data']);
        }
       
        /**
         * 获取签到列表
         */
        public function get_register_list(){
            
        }
       
        /**
         *
         */
        public function get_order_list(){
            
        }

    }



    分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    分享分享0 收藏收藏0 转发到微博
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    回顶部