商会资讯

标题: api接口类封装 [打印本页]

作者: admin    时间: 2017-9-30 09:06
标题: api接口类封装
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(){
        
    }

}








欢迎光临 商会资讯 (http://smellage.com/) Powered by Discuz! X2.5