小蚂蚁学习APP接口开发(9)—— APP版本升级的接口实例

    今天的笔记主要来记录最后两个知识要点之一,APP客户端版本升级的接口开发。

    APP的开发主要由伟大而神圣的用户来更新,更新的流程应该是这样的:

开启APP——请求初始化接口init.php——检测是否需要更新---否——首页

                                                                                       ---是——更新

在初始化接口的时候,需要客户端发送几个数据:

    app_id            客户端id,比如: 1,安卓手机 2,iphone手机

    version_id        大版本号id

    version_mini     小版本号id

    did                    用户客户端信息(客户端工程师会获取这个数据)

    encrypt_did       did加密后的字符串(did 加上 APP设备数据表中的key,然后md5)

使用一个html表单来模拟一下APP客户端post发送过来的请求数据:

<!doctype html>
<html>
	<head>
		<title>
			模拟手机APP提交的POST数据,用户请求初始化接口init.php
		</title>
	</head>
	<body>
		<form action="./init.php" method="post">
			app_id		<input type="text" name='app_id' ><br/>
			version_id	<input type="text" name="version_id"><br/>
			<!--did客户端的开发工程师会获取到-->
			did	        <input type="text" name="did" value="123"><br/>
			version_mini    <input type="text" name="version_mini"><br/>
			encrypt_did	<input type="text" name="encrypt_did" value="e10adc3949ba59abbe56e057f20f883e"><br/>
			<input type="submit" />
		</form>
	</body>
</html>

     忘了说还需要数据库表了,这里需要两张表。一张是记录升级版本信息的表,记录着设备的id,版本号信息,下载地址等。另外一张表是记录的设备的信息,比如安卓手机的信息,安卓pad的信息等等,版本信息表中有一个外键app_id,关联的就是设备信息表的主键。

    设备信息表,记录了各种客户端的信息
    CREATE TABLE IF NOT EXISTS `app_table` (
      `app_id` smallint(6) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `name` varchar(10) NOT NULL COMMENT '设备名称',
      `is_encryption` tinyint(1) NOT NULL COMMENT '是否加密',
      `key` varchar(10) NOT NULL COMMENT '加密key',
      `image_size` text NOT NULL COMMENT '按照json来存储',
      `create_time` int(11) NOT NULL COMMENT '添加时间',
      `update_time` int(11) NOT NULL COMMENT '修改时间',
      `status` tinyint(1) NOT NULL COMMENT '状态 1正常0删除',
      PRIMARY KEY (`app_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='app设备表' AUTO_INCREMENT=2 ;
    
    版本升级信息表,存放了各种版本的信息
    CREATE TABLE IF NOT EXISTS `version_upgrade` (
      `id` smallint(4) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `app_id` smallint(4) NOT NULL COMMENT '客户端设备id',
      `version_id` smallint(4) NOT NULL COMMENT '大版本号id',
      `version_mini` mediumint(8) NOT NULL COMMENT '小版本号',
      `version_code` varchar(10) NOT NULL COMMENT '版本标识1.2',
      `type` tinyint(4) NOT NULL COMMENT '是否升级1是0否',
      `apk_url` varchar(255) NOT NULL COMMENT '下载链接地址',
      `upgrade_point` varchar(255) NOT NULL COMMENT '升级提示',
      `status` tinyint(4) NOT NULL,
      `create_time` int(11) NOT NULL COMMENT '添加时间',
      `update_time` int(11) NOT NULL COMMENT '修改时间',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='软件升级信息表' AUTO_INCREMENT=2 ;

    为处理请求的init.php创建一个基础类,在基础类的方法check()中,进行各种判断,比如:该客户端设备是否存在,是否需要加密处理,是否有权限更新等等。

<?php 

/***********************************
*
*	版本升级接口开发的基础类
*	学php的小蚂蚁
*	博客 http://my.oschina.net/woshixiaomayi/blog
*
************************************/

//载入之前写好的接口响应类
//代码内容请参考 http://my.oschina.net/woshixiaomayi/blog/517384
require_once('./response.php');
//载入之前写好的db类
//代码内容请参考 http://my.oschina.net/woshixiaomayi/blog/518295
require_once('./db.php');

class common{

	//post提交过来的数据
	public $param;
	//该客户端设备的信息详情
	public $app;
	//数据库连接资源
	public $connect;

	//确认设备的版本信息,权限等
	public function check(){
		//post提交过来的数据整合,一行太长了,分开来写\(^o^)/~
		$app_id	=	isset($_POST['app_id'])?$_POST['app_id']:'';
		$this	->	param['app_id']	=	$app_id;
		$version_id	=	isset($_POST['version_id'])?$_POST['version_id']:'';
		$this	->	param['version_id']	=	$version_id;
		$did	=	isset($_POST['did'])?$_POST['did']:'';
		$this	->	param['did']	=	$did;
		$version_mini	=	isset($_POST['version_mini'])?$_POST['version_mini']:'';
		$this	->	param['version_mini']	=	$version_mini;
		$encrypt_did	=	isset($_POST['encrypt_did'])?$_POST['encrypt_did']:'';
		$this	->	param['encrypt_did']	=	$encrypt_did;

		//判断app_id和version_id数据类型是否正确
		if(!is_numeric($app_id) or !is_numeric($version_id)){
			return Response::show(400,'数据不合法');
		}

		//判断是否需要加密处理
		$this->app=$this->getApp();
		if(!$this->app){
			return Response::show(400,'该app不存在');
		}

		/*
			判断是否有权限,判断权限的方式,1,是否需要加密处理 
			2,发送过来的encrypt_did是否和服务端生成的值一致
		*/
		if($this->app['is_encryption'] && $this->param['encrypt_did'] != md5($did . $this->app['key'])){
			return Response::show(405,'你没有权限');
		}
	}

	//获取该设备信息
	public function getApp(){
		//这几天这一段都写烂了,就不写注释了
		try{
			$this->connect =	Db::getInstance()->connect();
		}catch(Exception $e){
			//返回给APP的错误提示
			return Response::show(400,'mysql not connect');
		}

		$sql="select * from app_table where app_id=".$this->param['app_id'];
		
		$result=mysql_query($sql,$this->connect);
		return mysql_fetch_assoc($result);
	}

	//获取新版本信息
	public function getVersionUpgrade($app_id){

		$sql="select * from version_upgrade where app_id=".$app_id." order by create_time desc limit 1";
		$result=mysql_query($sql,$this->connect);
		$result=mysql_fetch_assoc($result);
		return $result;
	}
}

 ?>

    创建init.php,将数据发送到这个脚本做处理即可,最后返回的数据可以确定,该客户端是否需要/能够升级版本。

<?php 

/********************************
*
*   版本升级接口逻辑
*   学php的小蚂蚁
*   博客 http://my.oschina.net/woshixiaomayi/blog
*
***************************/

//载入基础类,进行版本判断
require_once('./common.php');

class Init extends Common{

	public function index(){
		//本方法在基类中,确实数据的正确性	
		$this->check();
		/*
			获取新版本信息,和APP发送过来的版本信息进行对比
			如果是最新版本,不升级
			如果是老版本,升级
		*/
		$version_grade=$this->getVersionUpgrade($this->param['app_id']);
		//检测是否拿到版本信息
		if($version_grade){
			/*
				判断type类型看能否升级,并且判断客户端是不是最新版本
				如果可以更新,添加键值is_upload = 1
				不能更新,is_upload	= 0
				APP工程师根据返回的is_upload的值进行相应的操作
			*/
			if ($version_grade['type'] && $this->param['version_id'] < $version_grade['version_id']) {
				$version_grade['is_upload']=$version_grade['type'];	
			}else{
				$version_grade['is_upload']=0;
			}
			return Response::show(200,'获取版本成功',$version_grade);
		}else{
			return Response::show(400,'获取新版本失败');
		}
	}
	
}	

$obj	=	new Init();
$obj	->	index();
 
?>

    APP客户端版本升级的接口,基本上就完成了,明天再把APP客户端错误日志接口的笔记写一下,APP接口开发的内容就结束了。学习这个也花费了不少时间   (~ ̄▽ ̄)~


你可能感兴趣的:(PHP,APP版本升级接口)