_appid = $app_id; $this->_appsecret = $app_secret; } /** * [DecryptData 检验数据的真实性,并且获取解密后的明文] * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @datetime 2017-12-30T18:20:53+0800 * @param [string] $encrypted_data [加密的用户数据] * @param [string] $iv [与用户数据一同返回的初始向量] * @param [string] $openid [解密后的原文] * @return [array|string] [成功返回用户信息数组, 失败返回错误信息] */ public function DecryptData($encrypted_data, $iv, $openid) { // 登录授权session $login_key = 'qq_user_login_'.$openid; $session_data = MyCache($login_key); if(empty($session_data)) { return DataReturn('session key不存在', -1); } // iv长度 if(strlen($iv) != 24) { return DataReturn('iv长度错误', -1); } // 加密函数 if(!function_exists('openssl_decrypt')) { return DataReturn('openssl不支持', -1); } $aes_cipher = base64_decode($encrypted_data); $result = openssl_decrypt($aes_cipher, "AES-128-CBC", base64_decode($session_data['session_key']), 1, base64_decode($iv)); $data = json_decode($result, true); if($data == NULL) { return DataReturn('请重试!', -1); } if($data['watermark']['appid'] != $this->_appid) { return DataReturn('appid不匹配', -1); } return DataReturn('success', 0, $data); } /** * [GetAuthSessionKey 根据授权code获取 session_key 和 openid] * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @datetime 2017-12-30T18:20:53+0800 * @param [string] $authcode [用户授权码] * @return [string|boolean] [失败false, 成功返回appid|] */ public function GetAuthSessionKey($authcode) { // 请求获取session_key $url = 'https://api.q.qq.com/sns/jscode2session?appid='.$this->_appid.'&secret='.$this->_appsecret.'&js_code='.$authcode.'&grant_type=authorization_code'; $result = $this->HttpRequestGet($url); if(empty($result)) { return DataReturn('授权接口调用失败', -1); } if(!empty($result['openid'])) { // 缓存SessionKey $key = 'qq_user_login_'.$result['openid']; // 缓存存储 MyCache($key, $result); return DataReturn('授权成功', 0, $result); } $msg = empty($result['errmsg']) ? '授权接口异常错误' : $result['errmsg']; return DataReturn($msg, -1); } /** * 公共获取access_token * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @date 2020-08-26 * @desc description */ public function GetAccessToken() { // 缓存key $key = $this->_appid.'_access_token'; $result = MyCache($key); if(!empty($result)) { if($result['expires_in'] > time()) { return $result['access_token']; } } // 网络请求 $url = 'https://api.q.qq.com/api/getToken?grant_type=client_credential&appid='.$this->_appid.'&secret='.$this->_appsecret; $result = $this->HttpRequestGet($url); if(!empty($result) && !empty($result['access_token'])) { // 缓存存储 $result['expires_in'] += time(); MyCache($key, $result); return $result['access_token']; } return false; } /** * [HttpRequestGet get请求] * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @datetime 2018-01-03T19:21:38+0800 * @param [string] $url [url地址] * @return [array] [返回数据] */ public function HttpRequestGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_URL, $url); $res = curl_exec($curl); curl_close($curl); return json_decode($res, true); } } ?>