params['wechat']['token']); } /** * 微信接口配置响,应ToKen验证 * @throws Exception */ public function checkToken(){ //$echoStr = $_GET["echostr"]; $echoStr = Yii::$app->request->get('echostr'); if($this->checkSignature()){ echo $echoStr; } } /** * 根据access_token. 获取用户信息。 * @param $accessObj * @return jsonObj */ public function getUserInfo($accessObj){ // $accessObj = $this->getAccess_token($code); // var_dump(isset($accessObj)); //https://api.weixin.qq.com/cgi-bin/user/info?access_token=$token&openid=$openid $url = "https://api.weixin.qq.com/sns/userinfo"; $url .="?access_token=".$accessObj->access_token; $url .="&openid=".$accessObj->openid; $url .= "&lang=zh_CN"; $userjson = $this->getHtml($url); $userObj = json_decode($userjson); // 设置cookie // $cookies = Yii::$app->response->cookies; // $cookies->add(new Cookie(['name'=>'personinfo','value'=>$userObj->openid])); return $userObj; } public function getUserInfo1(){ // $accessObj = $this->getAccess_token($code); // var_dump(isset($accessObj)); //https://api.weixin.qq.com/cgi-bin/user/info?access_token=$token&openid=$openid // $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=". Yii::$app->params['wechat']['appID']; $url ="https://open.weixin.qq.com/connect/qrconnect?appid=". Yii::$app->params['wechat']['appID']."&redirect_uri=http://www.baidu.com&response_type=code&scope=snsapi_login&state=2014#wechat_redirect"; $userjson = $this->getHtml($url); $userObj = json_decode($userjson); // 设置cookie // $cookies = Yii::$app->response->cookies; // $cookies->add(new Cookie(['name'=>'personinfo','value'=>$userObj->openid])); return $userObj; } /** * $code获取小程序用户openid,unionid * @return mixed */ public function getApiSns($code){ $url = "https://api.weixin.qq.com/sns/jscode2session?appid=".Yii::$app->params['wechatapi']['appid']."&secret=".Yii::$app->params['wechatapi']['secret']."&js_code=".$code."&grant_type=authorization_code"; $userjson = $this->getHtml($url); $userObj = json_decode($userjson); return $userObj; } /** * 未关注公众号时,返回关注状态和openid * 有关注公众号时,返回用户基本信息和关注状态 * @param $token * @param $openid * @return mixed */ public function getUser($token,$openid){ $url = "https://api.weixin.qq.com/cgi-bin/user/info"; $url .="?access_token=".$token; $url .="&openid=".$openid; $url .= "&lang=zh_CN"; $userjson = $this->getHtml($url); $userObj = json_decode($userjson); return $userObj; } /** * 拉取关注用户列表 * @param $token * @param $openid * @return mixed */ public function Userlist($token,$openid){ $url = 'https://api.weixin.qq.com/cgi-bin/user/get'; $url .="?access_token=".$token; $url .="&next_openid=".$openid; $userjson = $this->getHtml($url); $userObj = json_decode($userjson); return $userObj; } /** * 验证ToKen * @return bool * @throws Exception */ public function checkSignature() { $signature = Yii::$app->request->get("signature"); $timestamp = Yii::$app->request->get("timestamp"); $nonce = Yii::$app->request->get("nonce"); $token = Yii::$app->params['wechat']['token']; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } /** * 获取授权用户信息 第一步。 * 生成授权URL. * 用户访问URL,授权后,跳转domain.com?code=CODE&state=100 * 1.CODE可用于获取用户access_token 并获取用户信息 * @param $redurl 跳转URL * @param bool $scope 授权作用域(默认snsapi_userinfo) * @param int $state 设置状态(默认100) * @return string */ public function markUrl($redurl,$scope=false,$state=100){ $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.Yii::$app->params['wechat']['appID']; $url .="&redirect_uri=".urlencode($redurl); $url .= "&response_type=code"; $url .= "&scope=".($scope?'snsapi_base':'snsapi_userinfo'); $url .= "&state=".$state; $url .= "#wechat_redirect"; return $url; } /** * 获取授权用户信息。第二步, * 通过code换取网页授权access_token * @param $code 授权Code * @return string 返回 */ public function getAccess_token($code){ $getUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".Yii::$app->params['wechat']['appID']; $getUrl .= "&secret=".Yii::$app->params['wechat']['appsecret']; $getUrl .= "&code=$code&grant_type=authorization_code"; $resultJson = $this->getHtml($getUrl); $results = json_decode($resultJson); if(isset($results->openid) && isset($results->access_token)){ $cookies = Yii::$app->response->cookies; $cookies->add(new Cookie(['name'=>'acc_openid','value'=>$results->openid])); // $cookies->add(new Cookie(['name'=>'accesstoken','value'=>$results->access_token])); // Yii::$app->cache->set('acc_openid',$results->openid,60*60); Yii::$app->cache->set('access_token',$results->openid,60*60); }else{ return false; } return $results; } /** * 获取授权用户信息 刷新TOKEN * @param $refresh_token */ private function refresh_Token($refresh_token){ $url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token?appid='.Yii::$app->params['wechat']['appID']; $url .= "&grant_type=refresh_token&refresh_token=$refresh_token"; // Yii::$app->cache->set('token',$refresh_token); // Yii::$app->cache->set('refresh_time',time()); } /** * 生成签名 JS 库中使用 * @param $noncestr 随机数 * @param $timestamp 时间戳 * @param $url 当前页面的URL * @return signature 签名 */ public function getsignature($noncestr,$timestamp,$url){ //$access_token = Yii::$app->request->cookies->getValue('access_token'); $access_token = Yii::$app->cache->get('access_token'); if(empty($access_token)){ $access_token = $this->gzAccess_token(); // $array_data = ['name'=>'access_token','expire'=>time()+3600,'value'=>$access_token]; // Yii::$app->response->cookies->add(new Cookie($array_data)); // Yii::$app->response->cookies->add(new Cookie(['name'=>'jsapi_ticket','value'=>''])); Yii::$app->cache->set('access_token',$access_token,60*60); Yii::$app->cache->set('jsapi_ticket',""); } $ticket = Yii::$app->request->cookies->getValue('jsapi_ticket'); if(empty($ticket)){ $ticket = $this->getjsapi_ticket($access_token); // $array_data = ['name'=>'jsapi_ticket','expire'=>time()+3600,'value'=>$ticket]; // Yii::$app->response->cookies->add(new Cookie($array_data)); Yii::$app->cache->set('jsapi_ticket',$ticket,60*60); } $string1 = "jsapi_ticket=$ticket&noncestr=$noncestr×tamp=$timestamp&url=$url"; $signature = sha1($string1); return $signature; } public function getTicket() { //$access_token = Yii::$app->request->cookies->getValue('access_token'); $access_token = Yii::$app->cache->get('access_token'); if(empty($access_token)){ $access_token = $this->gzAccess_token(); // $array_data = ['name'=>'access_token','expire'=>time()+3600,'value'=>$access_token]; // Yii::$app->response->cookies->add(new Cookie($array_data)); // Yii::$app->response->cookies->add(new Cookie(['name'=>'jsapi_ticket','value'=>''])); Yii::$app->cache->set('access_token',$access_token,60*60); Yii::$app->cache->set('jsapi_ticket',""); } //$ticket = Yii::$app->request->cookies->getValue('jsapi_ticket'); $ticket = Yii::$app->cache->get('jsapi_ticket'); if(empty($ticket)){ $ticket = $this->getjsapi_ticket($access_token); // $array_data = ['name'=>'jsapi_ticket','expire'=>time()+3600,'value'=>$ticket]; // Yii::$app->response->cookies->add(new Cookie($array_data)); Yii::$app->cache->set('jsapi_ticket',$ticket,60*60); } return $ticket; } public function getsignature2($noncestr,$timestamp,$url){ $access_token = Yii::$app->request->cookies->getValue('access_token'); // Yii::$app->response->send(); if(empty($access_token)){ $access_token = $this->gzAccess_token(); $array_data = ['name'=>'access_token','expire'=>time()+3600,'value'=>$access_token]; Yii::$app->response->cookies->add(new Cookie($array_data)); Yii::$app->response->cookies->add(new Cookie(['name'=>'jsapi_ticket','value'=>''])); // $ticket = $this->getjsapi_ticket($access_token); // $array_data = ['name'=>'jsapi_ticket','expire'=>time()+3600,'value'=>$ticket]; // Yii::$app->response->cookies->add(new Cookie($array_data)); } $ticket = Yii::$app->request->cookies->getValue('jsapi_ticket'); if(empty($ticket)){ $ticket = $this->getjsapi_ticket($access_token); $array_data = ['name'=>'jsapi_ticket','expire'=>time()+3600,'value'=>$ticket]; Yii::$app->response->cookies->add(new Cookie($array_data)); } $string1 = "jsapi_ticket=$ticket&noncestr=$noncestr×tamp=$timestamp&url=$url"; $signature = sha1($string1); return $signature; } /** * 获取Access_token * 有获取次数限制 */ public function gzAccess_token(){ $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".Yii::$app->params['wechat']['appID']."&secret=".Yii::$app->params['wechat']['appsecret']; $resultJson = $this->https_request($url); $results = json_decode($resultJson); return $results->access_token; } /** * 获取jsapi_ticket */ protected function getjsapi_ticket($access_token){ $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$access_token&type=jsapi"; $resultJson = $this->https_request($url); $results = json_decode($resultJson); if(!isset($results->ticket)){ Yii::$app->cache->set('access_token',''); return ''; } return $results->ticket; } protected function getHtml($url){ $ch = curl_init(); $timeout = 5; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $result = curl_exec($ch); curl_close($ch); return $result; } /** * 判断返回值是为正确的。 * @param $result 返回值转json * @return bool */ public function isSuccess($result){ if(isset($result->errors)){ return false; } return true; } /** * * 是否微信浏览器 */ public function isWecha() { $user_agent = $_SERVER['HTTP_USER_AGENT']; if (strpos($user_agent, 'MicroMessenger') === false) { return false; } return true; } public function https_request($url, $data = NULL) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); if (!empty($data)) { curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return $output; } }