123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369 |
- <?php
- /**
- * Created by PhpStorm.
- * User: kang www.lmlm.cn
- * Date: 2015/11/14
- * Time: 0:21
- */
- namespace common\library;
- use Yii;
- use yii\base\Object;
- use yii\web\Cookie;
- /**
- * 微信处理类
- * Class WeChat
- * @package common\libary
- */
- class WeChat extends Object{
- public function init(){
- // define("TOKEN",Yii::$app->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;
- }
- }
|