目录 
1.安全性 
2.授权码sign算法 
3.登录场景access_user_token算法 
4.token唯一性支持 
5.API一次性请求支持 
6.高可用 
7.Restful API 
8.web登录和APP登录异同处 
9.阿里大于短信验证解决客户端APP复杂登录场景 
10.API接口版本解决方案 
11.APP本地时间和服务器时间一致解决方案 
12.不可预知的API内部异常解决方案 
13.APP版本升级方案 
14.利用七牛云解决图片处理基础服务能力 
15.基础类库的封装 
16.PHP设计模式的穿透 
17.部分模块提供多种解决方案最后选择最优的方案 
18.PHP和ajax的异步数据交互
 
1、restful api 
数据结构格式 
3. HTTP状态码使用TK自带的json实现 
3. status 业务状态码 
4. message 提示信息 
5. data 数据层 
通用化API接口数据封装
 
function show($status, $message, $data=[], $httpCode=200) {
    $data = [        'status' => $status,        'message' => $message,        'data' => $data,
    ];    return json($data, $httpCode);
}
不可预知的内部异常api数据输出解决方案 
config配置exception_handle填写异常类路径
 
class ApiHandleException extends  Handle {
    /**
     * http 状态码
     * @var int
     */
    public $httpCode = 500;    public function render(\Exception $e) {
        // 还原正常报错,上线后为flase(服务端开发)
        if(config('app_debug') == true) {            return parent::render($e);
        }        if ($e instanceof ApiException) {            $this->httpCode = $e->httpCode;
        }        return  show(0, $e->getMessage(), [], $this->httpCode);
    }
}class ApiException extends Exception {
    public $message = '';    public $httpCode = 500;    public $code = 0;    /**
     * @param string $message
     * @param int $httpCode
     * @param int $code
     */
    public function __construct($message = '', $httpCode = 0, $code = 0) {
        $this->httpCode = $httpCode;        $this->message = $message;        $this->code = $code;
    }
}
2、APP-API数据安全解决方案 
解决方式就是各种的加密:MD5 AES(对称加密) RSA(非对称,效率较低) 
sign (有效时间,唯一性)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/**
 
     * 生成每次请求的sign
 
     * @param array $data
 
     * @return string
 
     */
 
    public static function setSign($data = []) {
 
        // 1 按字段排序
 
        ksort($data);        // 2拼接字符串数据  &
 
        $string = http_build_query($data);        // 3通过aes来加密
 
        $string = (new Aes())->encrypt($string);        return $string;
 
    }/**
 
     * 检查sign是否正常
 
     * @param array $data
 
     * @param $data
 
     * @return boolen
 
     */
 
    public static function checkSignPass($data) {
 
        $str = (new Aes())->decrypt($data['sign']);        if(empty($str)) {            return false;
 
        }        // diid=xx&app_type=3
 
        parse_str($str, $arr);        if(!is_array($arr) || empty($arr['did'])
 
            || $arr['did'] != $data['did']
 
        ) {            return false;
 
        }        // 有效时间:时间间隔不能超过60s
 
        if(!config('app_debug')) {            if ((time() - ceil($arr['time'] / 1000)) > config('app.app_sign_time')) {                return false;
 
            }            //echo Cache::get($data['sign']);exit;
 
            // 唯一性判定
 
            if (Cache::get($data['sign'])) {                return false;
 
            }
 
        }        return true;
 
    }/**
 
     * 检查每次app请求的数据是否合法
 
     */
 
    public function checkRequestAuth() {
 
        // 首先需要获取headers
 
        $headers = request()->header();        // todo
 
 
 
        // sign 加密需要 客户端工程师 , 解密:服务端工程师
 
        // 1 headers body 仿照sign 做参数的加解密
 
        // 2
 
        //  3
 
 
 
        // 基础参数校验
 
        if(empty($headers['sign'])) {            throw new ApiException('sign不存在', 400);
 
        }        if(!in_array($headers['app_type'], config('app.apptypes'))) {            throw new ApiException('app_type不合法', 400);
 
        }        // 需要sign
 
        if(!IAuth::checkSignPass($headers)) {            throw new ApiException('授权码sign失败', 401);
 
        }
 
        Cache::set($headers['sign'], 1, config('app.app_sign_cache_time'));        // 1、文件  2、mysql 3、redis
 
        $this->headers = $headers;
 
    }
 
APP和服务器端时间一致性解决方案 
解决1:获取服务端时间,客户端拿到服务端正确时间进行对比。 
解决2:初始化app时传输时间戳,客户端时间=服务端时间戳+差值 
3、API接口文档编写(API入参,出参的格式) 
API接口地址 请求方式 post入参格式 出参格式 http code 
4、APP版本升级业务开发 
表的设计 
CREATE TABLE ent_version ( 
id int(10) unsigned NOT NULL, 
app_type varchar(20) NOT NULL DEFAULT ” COMMENT ‘app类型 比如 ios android’, 
version int(8) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘内部版本号’, 
version_code varchar(20) NOT NULL DEFAULT ” COMMENT ‘外部版本号比如1.2.3’, 
is_force tinyint(1) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘是否强制更新0不,1强制更新’, 
apk_url varchar(255) NOT NULL DEFAULT ” COMMENT ‘apk最新地址’, 
upgrade_point varchar(500) NOT NULL DEFAULT ” COMMENT ‘升级提示’, 
status tinyint(1) NOT NULL DEFAULT ‘0’ COMMENT ‘状态’, 
create_time int(10) unsigned NOT NULL DEFAULT ‘0’, 
update_time int(10) unsigned NOT NULL DEFAULT ‘0’ 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 
5、登录开发 
1.1APP登录业务开发介绍 
一般app有两种状态:登录态和未登录态 
为什么要做登录?挖掘用户、互动、交流 
如何做APP登录?模仿其他App登录 
其他登录方式:免密手机号验证码、账号密码 
第三方登录方式:qq授权、微信授权、微博授权 
1.2App登录表结构的设计 
CREATE TABLE ent_user ( 
id int(10) unsigned NOT NULL COMMENT ‘主键’, 
username varchar(20) NOT NULL DEFAULT ” COMMENT ‘用户名’, 
password char(32) NOT NULL DEFAULT ” COMMENT ‘密码’, 
phone varchar(11) NOT NULL DEFAULT ” COMMENT ‘手机号’, 
token varchar(100) NOT NULL DEFAULT ” COMMENT ‘令牌’, 
time_out int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘令牌失效时间’, 
image varchar(200) NOT NULL DEFAULT ” COMMENT ‘头像’, 
sex tinyint(1) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘性别0男 1女’, 
signature varchar(200) NOT NULL DEFAULT ” COMMENT ‘个性签名’, 
create_time int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘注册时间’, 
update_time int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘登录时间’, 
status tinyint(1) NOT NULL DEFAULT ‘0’ COMMENT ‘状态是否锁定’ 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
1.3阿里大于云通信服务平台介绍 
什么是阿里大于 
阿里大于提供了包括短信、语音等个性化的服务 
1.4发送短信验证码功能开发
 
1.5App登录token唯一性算法 
App调用登录,服务端返回加密的token信息,每次app请求接口都需要带token 
App生成唯一的token并加密:token=token+13位时间戳 
1.6App按密码方式登录 
用户名和密码都需要加密传输给服务端
 
6、APP端异常、性能监控及定位分析 
APP端异常基本情况: 
Crach 在使用App的过程中突然发生闪退现象 
卡顿 出现画面的卡顿 
Exception 程序出现的异常 
ANR 出现提示无响应弹框(Android) 
数据收集方案: 
建立异常性能表,开发API接口 
id 主键 
app_type app类型 
version_code 版本号 
Model 设备机型 
Did 设备id 
type 异常类型 
Description 描述 
Line 出错的行数 
create_time 创建时间 
成熟的解决方案: 
使用第三方平台,app客户端接入sdk即可统计数据,如:友盟统计 
7、APP消息推送服务解决方案 
轮询法:APP定时向服务端发送http请求是否有消息