使用PHP仿微信公众平台生成Access_Token验证
2年前
阅读 4087
评论 0
喜欢 0
####核心代码如下:
```php
/**
* title : API-模仿微信公众平台,发送签名验证 - 平台
* team : JunPHP
* TMP-auth : PHP后端 - 冯俊豪
* VP -auth : 无
* Start-time : 2016-9-22 13:37
* Last-time : 2016-9-22 13:37
*/
header("Content-type: text/html; charset=utf-8");//声明PHP编码
class Api{
private $txt = 'Z1X2C3V4B5N6M7A8S9D0FGHJKLQWERTYUIOP';
private $Randomkey = 'Z1X2C3V4B5Np6oMi7uAy8tSr9eDw0qFlGkHjJhKgLfQdWsEaRmTnYbUvIcOxPz';
private $STR;//数据格式实例
/**
* 生成签名 - 并发送验证
* @param string $token 签名TOKEN
* @param string $url 签名核验地址
* @return boolean
*/
public function Sign($url,$token) {
//系统时间戳
$time = date('Y-m-d h:i:s');
//随机数
$rand = rand(100000000,9999999999);
//将token、time、rand三个参数进行字典序排序
$tmpArr = array($token, $time, $rand);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
//echo $tmpStr;
$tmpStr = sha1( $tmpStr );
//echo $tmpStr;
//随机字符串,需要返回对比是否核验成功
$echostr = rand(100000,9999999).'哈喽,我是小黄牛';
//URL参数
$data = "time=$time&rand=$rand&sign=$tmpStr&echostr=$echostr";
//echo $url;
$return = self::Post($url,$data);
//验证核验结果
if($return === $echostr){
return true;
}
return false;
}
/**
* 使用File_get 代替CURL
*/
private static function Post($url,$post=NULL){
$options = array(
'http' => array(
'method' => 'POST',
'header' =>"Content-type: application/x-www-form-urlencoded",
'content' => $post
)
);
return file_get_contents($url, false, stream_context_create($options));
}
/**
* 生成应用ID
* @return syring 16位应用ID
*/
public function Application_ID(){
$str = '';
for ($i = 0; $i < 17; $i++) {
$str .= $this->txt[mt_rand(0,35)];
}
return $str;
}
/**
* 生成应用 access_token
* @return syring 16位应用ID
*/
public function Access_Token(){
$str = '';
for ($i = 0; $i < 255; $i++) {
$str .= $this->Randomkey[mt_rand(0,60)];
}
return $str;
}
/**
* 验证开发者是否已经通过签名认证
* @param string $_GET access_token
* @return boolean
*/
private function SignatureVerification(){
$DB = new Model('Application');
$access_token = isset($_GET['access_token']) ? $_GET['access_token'] : '';
$info = $DB->field('id')->where("accesstoken = '$access_token' and authentication = 1")->find();
if($info){
return true;
}
return false;
}
/**
* 获取应用ID返回access_token
* @param string $_GET apiid 开发者ID
* @return boolean
*/
public function ApiId(){
$this->Type();
$apiid = isset($_GET['apiid']) ? $_GET['apiid'] : '';
$DB = new Model('Application');
$info = $DB->field('accesstoken')->where("pid = '$apiid'")->find();
if($info){
$this->STR->response(0,'请求正常',$info['accesstoken']);
}
$this->STR->response(-1,'请求失败');
}
/**
* 发送请求,更新access_token
* @param string $_GET access_token 现在的access_token值
* @return boolean
*/
public function Num(){
$this->Type();
$DB = new Model('Application');
$access_token = isset($_GET['access_token']) ? $_GET['access_token'] : '';
$API = $DB->field('num')->where("accesstoken = '$access_token'")->find();
if($API['num'] > 0){
$array = array(
'time'=> time(),
'num' => $API['num']-1,
'accesstoken' => $this->Access_Token()
);
$info = $DB->data($array)->upd("accesstoken = '$access_token'");
if($info){
$this->STR->response(0,'请求正常','Access_Token更新成功');
}
}
$this->STR->response(-1,'请求失败');
}
/**
* 返回数据格式
* @param string $_GET fromat 数据返回格式(默认Json)
*/
private function Type(){
//URL参数
$fromat = isset($_GET['fromat']) ? $_GET['fromat'] : 'Xml';
//首字母转换大写
$resultClass = ucwords($fromat);
//引入对应的返回格式类
require_once($resultClass . '.api.php');
$this->STR = new $resultClass();
}
/**
* 统一API分流
* @param string $_GET access_token 实时发送的access_token
*/
public function ApiShunt(){
$this->Type();
$access_token = isset($_GET['access_token']) ? $_GET['access_token'] : '';
//验证开发者是否没通过签名认证
if (!$this->SignatureVerification()) {
$this->STR->response(1,'尚未进行签名认证','需要登录API管理中心进行签名认证,才能调用API接口~!');
}
/**********************认证成功**************************/
//1.验证access_token是否正确
//操作API管理表
$DB = new Model('Application');
$API = $DB->where("accesstoken = '$access_token'")->find();
if (!$access_token) {
$this->STR->response(2,'Access_Token不正确','Access_Token不正确,请自行检查或重新获取!');
}
//2.验证接口是否已经超过有效期
//开发者表
$DB2 = new Model('Manager');
$pid = $API['pid'];
$MAR = $DB2->field('time,num')->where("pid = '$pid'")->find();
//当前时间戳是否大于 过期时间戳
if ( time() > ($API['time']+$MAR['time']) ) {
$this->STR->response(3,'Access_Token已经过期','Access_Token已经过期,请重新获取!');
}
//3.验证接口是否已经超过当天可调用次数
if ($API['num'] <= 0) {
$this->STR->response(4,'API当天可用次数已用完','Access_Token当天已失效,请重新获取!');
}
//4.调用接口分流-我这里没做api权限,有兴趣的朋友可以自行扩展,就跟AUTH-RABC差不多
/*
switch($i){
case 1: $this->API方法1; break;
case 2: $this->API方法3; break;
case 3: $this->API方法3; break;
……
}
*/
$this->STR->response(0,'请求正常',array('title'=>'您好,欢迎测试小黄牛API接口!','desc'=>'此教程并未将access_token分表处理,也未做中控延时处理(参考微信),用户量大的朋友可以自行解决'));
}
}
```
使用PHP仿微信公众平台生成Access_Token验证,案例下载地址如下:
[使用PHP仿微信公众平台生成Access-Token验证 - 20160924110946.zip ](https://www.junphp.com/Blog/JunUE/php/dwfile/20160924110946.zip "使用PHP仿微信公众平台生成Access-Token验证 - 20160924110946.zip ")
####API测试使用流程:
1. 注册开发者账号
2. 登录开发者中心
3. 填写签名认证信息
4. 数字签名认证通过
5. 根据URL传递开发者应用ID,获取Access_Token
6. 根据URL传递Access_Token 调用数据API
7. 根据URL传递Access_Token 更新出新的Access_Token 保护秘钥安全
© 著作权归作者所有