php仿公众号,使用PHP仿微信公众平台生成Access_Token验证

使用PHP仿微信公众平台生成Access_Token验证

6cd5e4fd49658da7be73f2e8e3760c00.png

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 保护秘钥安全

© 著作权归作者所有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值