_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 = 'wechat_user_login_'.$openid; $session_data = GS($login_key); if($session_data === false) { return 'session key不存在'; } $aes_key = base64_decode($session_data['session_key']); if(strlen($iv) != 24) { return 'iv长度错误'; } $aes_iv = base64_decode($iv); $aes_cipher = base64_decode($encrypted_data); $result = openssl_decrypt($aes_cipher, "AES-128-CBC", $aes_key, 1, $aes_iv); $data = json_decode($result, true); if($data == NULL) { return '解析失败,请重试!'; } if($data['watermark']['appid'] != $this->_appid ) { return 'appid不匹配'; } // 缓存存储 $data_key = 'wechat_user_info_'.$openid; SS($data_key, $data); return $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.weixin.qq.com/sns/jscode2session?appid='.$this->_appid.'&secret='.$this->_appsecret.'&js_code='.$authcode.'&grant_type=authorization_code'; $result = $this->HttpRequestGet($url); if(!empty($result['openid'])) { // 从缓存获取用户信息 $key = 'wechat_user_login_'.$result['openid']; // 缓存存储 SS($key, $result); return $result['openid']; } return false; } /** * [MiniQrCodeCreate 二维码创建] * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @datetime 2018-01-02T19:53:10+0800 * @param [array] $params [输入参数] * @return [string] [成功返回文件流, 失败则空] */ public function MiniQrCodeCreate($params) { // 参数校验 if(empty($params['path'])) { return '页面地址不能为空'; } $params['width'] = empty($params['width']) ? 1000 : intval($params['width']); // 获取access_token $access_token = $this->GetMiniAccessToken(); if($access_token === false) { return ''; } // 网络请求 $url = 'https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token='.$access_token; $data = [ 'path' => $params['path'], 'width' => $params['width'], ]; return $this->HttpRequestPost($url, json_encode($data), false); } /** * [GetMiniAccessToken 获取access_token] * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @datetime 2018-01-02T19:53:42+0800 */ private function GetMiniAccessToken() { // 缓存key $key = $this->_appid.'_access_token'; $result = GS($key); if($result !== false) { if($result['expires_in'] > time()) { return $result['access_token']; } } // 网络请求 $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->_appid.'&secret='.$this->_appsecret; $result = $this->HttpRequestGet($url); if(!empty($result['access_token'])) { // 缓存存储 $result['expires_in'] += time(); SS($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] [返回数据] */ private 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); } /** * [HttpRequestPost curl模拟post] * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @datetime 2017-09-25T09:10:46+0800 * @param [string] $url [请求地址] * @param [array] $data [发送的post数据] * @param [array] $is_parsing [是否需要解析数据] * @return [array] [返回的数据] */ private function HttpRequestPost($url, $data, $is_parsing = true) { $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); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_POST, true); $res = curl_exec($curl); if($is_parsing === true) { return json_decode($reponse, true); } return $res; } } ?>