多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
获取身份令牌 ![](https://img.kancloud.cn/8d/13/8d13dd63eabc5c7b40c8636882804e46_542x174.png) 访问携带身份令牌(令牌有时间限制,失效再次获取) ![](https://img.kancloud.cn/61/17/61171f51c39cfddf0e0f329499b266ba_586x140.png) 微信小程序已经有了一个身份认证体系,我们没必要自己再设计账号密码体系,我们可以结合微信小程序的认证体系做自己的权限设计 所以小程序获取令牌时不需要发送帐号密码,而是把小程序生成的Code发送给微信服务器,微信服务器接受到Code并响应openid(身份标识)和session_key,小程序接受到微信服务器的openid后发送给我们的API服务器 openid是用户在微信小程序的唯一标识,并且不会过期,非常重要,所以不建议将openid发送到客户端,而是存储到API服务器,然后用有实效的令牌代替openid发送到客户端验证 ![](https://img.kancloud.cn/0d/fd/0dfd30381fac3ee9772efc3b0778630c_770x398.png) 小程序 ![](https://img.kancloud.cn/f1/b3/f1b37d35af29aa72af7544651bdb9ad2_718x260.png) 例子 1、拿到code ![](https://img.kancloud.cn/15/3a/153ad9f37ba9c428d45846efee187fd7_665x420.png) code: ![](https://img.kancloud.cn/8d/c0/8dc0246bea7c11552b812a1c0e7d87c1_357x35.png) 2、拿到code再利用接口拿到openid:$data的值如图 ![](https://img.kancloud.cn/7b/0f/7b0f426d2a7f3a33d270184077490a3b_336x69.png) ~~~ function getToken($code){ $token=get($code); return [ 'token'=>$token ]; } function get($code){ $url="https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code"; //拿到数据并转为数组 $data=json_decode(curl_get($url), true); if(empty($data)){ throw new Exception('error'); }else{ if(array_key_exists('errorcode', $data)){ //error }else{ //拿到openid(需要在user表里新建openid字段),没有拿到就新增用户 $openid=$data['openid']; $user=model('user')->where(['openid'=>$openid])->find(); if(!$user){ $uid = model('user')->insertGetId(['openid'=>$openid]);//用户不存在新增 }else{ $uid = $user->id; } //$data的值:[session_key: "DXQxBd1pEYCIJOcem7v2pg==", openid: "oBEq45dg2N1EyhmqqJbWc6SGcFhw"] $cacheValue=$data; $cacheValue['uid']=$uid; $cacheValue['scope']=16; $token=grantToken($cacheValue); } } } function curl_get($url, &$httpCode = 0) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //不做证书校验,部署在linux环境下请改为true curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); $file_contents = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return $file_contents; } 生成token令牌并保存缓存的数据 /** * 生成令牌 并以令牌为key以$cachevalue为值缓存起来,再返回token grantToken调用 * @param array $cachevalue 准备好的要缓存的数据 * [session_key=> "DXQxBd1pEYCIJOcem7v2pg==", openid=> "oBEq45dg2N1EyhmqqJbWc6SGcFhw","uid"=>1, "scope"=>16] * @return string 返回生成的token令牌 */ function grantToken($cacheValue){ $key=generateTken(); $value=json_encode($cacheValue); //缓存数据 $request=cache($key,$value,7200); return $key; } //生成token令牌 function generateTken(){ //32个字符组成的随机字符串 $randChars=getRandChar(32); //$_SERVER['REQUEST_TIME'] 带毫秒 //date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME']) $timestamp=$_SERVER['REQUEST_TIME_FLOAT']; //自定义的salt 可放在配置文件 $salt="HHsTieBu377mJtKr"; //用三组字符串进行加密更安全 return md5($randChars.$timestamp.$salt); } function getRandChar($length) { $str = null; $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; $max = strlen($strPol) - 1; for ($i = 0; $i < $length; $i++) { $str .= $strPol[rand(0, $max)]; } return $str; } ~~~