Correction status:Uncorrected
Teacher's comments:
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/6/1 0001 * Time: 上午 9:52 */ namespace app\index\controller; use think\Controller; use think\facade\Request; //注意驼峰规则命名的控制器在url中访问中间是要加 _ 下划线的 略坑 不知道为什么这么设计 class Weixin extends Controller { public function __construct() { parent::__construct(); $this->model = model('WeixinModel');//这块控制器名字写错了 难怪出不来。。。。 } //验证签名 public function check() { $valid = $this->model->checkToken(); if (is_bool($valid) && !$valid) { exit('signature error'); } $xmldata = file_get_contents("php://input"); file_put_contents('D://location0.txt',$xmldata); file_put_contents("c:\xmldata.txt",$xmldata); $postObj = simplexml_load_string($xmldata, 'SimpleXMLElement', LIBXML_NOCDATA); $data = (array)$postObj; // 事件推送 if(isset($data['MsgType']) && $data['MsgType'] == 'event'){ // // 关注 // if($data['Event'] == 'subscribe'){ // $this->model->subscribe($data); // } // // 取消关注 // if($data['Event'] == 'unsubscribe'){ // $this->model->unsubscribe($data); // } // file_put_contents('D://location1.txt',$xmldata); // if($data['Event'] == 'LOCATION'){ // file_put_contents('D://location.txt', var_export($data,true)); // self::locationinfo($data); // exit('success'); // } file_put_contents('D://location1.txt',$xmldata); switch ($data['Event']){ case 'subscribe': $this->model->subscribe($data); break; case 'unsubscribe': $this->model->unsubscribe($data); break; case 'LOCATION': file_put_contents('D://location.txt', var_export($data,true)); if (isset($data['Latitude'])){ $this->model->locationinfo($data); exit('success'); } break; } } exit(input('get.echostr')); } //获取access_token public function access_token(){ $res = $this->model->getAccessToken(); if (is_bool($res) && !$res){ return "token获取失败"; } return $res; } public function set_bottom_menu(){ $res = $this->model->SetBottomMenu(); exit($res); } //认证获取code public function auth(){ $appid=config('app.appid'); $redirect = 'http://a8286a29.ngrok.io/index.php/index/weixin/userinfo'; $url_code = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri='.urlEncode($redirect).'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect'; file_put_contents("c:\url_code.txt",$url_code); header('Location:'.$url_code); } //认证获取code之后 这里获取返回code 并验证网页授权 public function userinfo(){ // 获取code // $code = input('get.code'); $code = Request::get('code'); dump($code,true,"code:"); file_put_contents("c:\b.txt",$code); // 第二步:通过code换取网页授权access_token $res = $this->model->auth_access_token($code); $auth_access_token = $res['access_token']; dump($auth_access_token,true,"auth_access_token:"); $openid = $res['openid']; // 第三步:拉取用户信息(需scope为 snsapi_userinfo) $userinfo = $this->model->get_userinfo($auth_access_token,$openid); dump($userinfo); $this->model->setnickname($openid,$userinfo); $this->view->assign('openid',$userinfo['openid']); $this->view->assign('userinfo',$userinfo); return $this->view->fetch(); } public function get_location(){ $opts = array('http'=>array('header' => "User-Agent:MyAgent/1.0\r\n")); $context = stream_context_create($opts); $res = file_get_contents('http://a8286a29.ngrok.io/index.php/index/weixin/location',false,$context); // $res = file_get_contents("http://e45191e0.ngrok.io/index.php/index/weixin/location"); exit($res); } public function location(){ $data['appid'] = config('app.appid'); $data['timestamp'] = time(); $data['nonceStr'] = md5(time().rand(1,999)); //获取本地access_token(注意这个跟web授权的access_token不是同一个); $res = $this->model->getAccessToken(); if (is_bool($res)){ exit("获取token失败"); } $access_token =$res; $jsapi_ticket = $this->model->jsapi_ticket($access_token); if (is_bool($jsapi_ticket)){ return utf8_encode("获取jsapi_ticket失败"); } // 2、构造签名字符串 $params['noncestr'] = $data['nonceStr']; // $params['jsapi_ticket'] = $jsapi_ticket; $params['jsapi_ticket'] = $jsapi_ticket['ticket']; $params['timestamp'] = $data['timestamp']; $params['url'] = 'http://a8286a29.ngrok.io/index.php/index/weixin/get_location'; ksort($params); $str= urldecode(http_build_query($params)); // 防止url字符转义 // 3、生成签名 $data['signature'] = sha1($str); // $this->view->assign("data", $data); $this->view->assign("appid", $data['appid']); $this->view->assign("noncestr",$data['nonceStr']); $this->view->assign("jsapi_ticket",$jsapi_ticket['ticket']); $this->view->assign("timestamp",$data['timestamp']); $this->view->assign("signature",$data['signature']); return $this->view->fetch(); } }
点击 "运行实例" 按钮查看在线实例
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/6/1 0001 * Time: 上午 9:52 */ namespace app\index\model; use think\facade\Request; use think\facade\Config; use think\Model; use think\Facade\Cache; class WeixinModel extends Model { protected $table = 'user'; protected $pk = 'uid'; public function checkToken() { // $signature = input('get.signature'); // $timestamp = input('get.timestamp'); // $nonce = input('get.nonce'); // $echostr = input('get.echostr'); // $Token = config('app.token'); $signature = Request::param('signature'); $timestamp = Request::param('timestamp'); $nonce = Request::param('nonce'); $echostr = Request::param('echostr'); $Token = Config::get('app.token'); // file_put_contents("E:\php\phpStudy_tools\myphp_www\PHPTutorial\WWW\php\WeiXin\a.txt","signature ".$signature." timestamp ".$timestamp." nonce ".$nonce." echostr ".$echostr); $tmpArr = array($timestamp, $nonce, $Token); sort($tmpArr, SORT_STRING); $tmpStr = implode($tmpArr); $tmpStr = sha1($tmpStr); if ($tmpStr != $signature) { return false; } return true; } // 关注 public function subscribe($data) { file_put_contents("C:/guanzhu.txt", var_export($data,true)); // 检查用户是否已存在 // $user = Db::name('user')->where(array('openid'=>$data['FromUserName']))->find(); $user = WeixinModel::where('openid', $data['FromUserName'])->find(); if ($user == null) { $dataUser = [ 'openid' => $data['FromUserName'], 'sub_status' => 1, 'add_time' => time() ]; WeixinModel::insertGetId($dataUser); } else { $dataUser = [ 'openid' => $data['FromUserName'], 'sub_status' => 1, 'add_time' => time() ]; WeixinModel::update($dataUser,function ($query) use ($data){ $query->where("openid",$data['FromUserName']); }); } } public function setnickname($openid,$userinfo){ $user = WeixinModel::where('openid',$openid)->find(); if ($user!=null){ $dataUser = [ 'nickname' => $userinfo['nickname'], ]; WeixinModel::update($dataUser,function ($query) use ($openid){ $query->where("openid",$openid); }); } } // 取消关注 public function unsubscribe($data) { file_put_contents("C:/cacle.txt", var_export($data,true)); $user = WeixinModel::where('openid', $data['FromUserName'])->find(); if ($user == null) { $dataUser = [ 'openid' => $data['FromUserName'], 'sub_status' => 1, 'add_time' => time() ]; WeixinModel::insertGetId($dataUser); } else { $dataUser = [ 'openid' => $data['FromUserName'], 'sub_status' => 0, 'add_time' => time() ]; WeixinModel::update($dataUser,function ($query) use ($data){ $query->where("openid",$data['FromUserName']); }); } } public function getAccessToken($iscache = true) { $key = 'access_token'; if (!$iscache) { Cache::rm($key); } $data = Cache::get($key); if ($data && $iscache) { return $data; } $appid = Config::get('app.appid'); $appsecret = config('app.appsecret'); $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $appid . '&secret=' . $appsecret; $res = http_get($url); $res = json_decode($res, true); if (!isset($res['access_token'])) { return false;/*'获取token失败'$res['errmsg']*/ } Cache::set($key, $res['access_token'], ($res['expires_in'] - 100)); return $res['access_token']; } public function SetBottomMenu() { $access_token = self::getAccessToken(); $url = ' https://api.weixin.qq.com/cgi-bin/menu/create?access_token=' . $access_token; $data = '{ "button":[ { "type":"view", "name":"首页", "url":"http://m.php.cn/" }, { "type":"view", "name":"视频", "url":"http://m.php.cn/" }, { "name":"接口DEM0", "sub_button":[ { "type":"view", "name":"用户信息", "url":"http://a8286a29.ngrok.io/index.php/index/weixin/auth" }, { "type":"view", "name":"用户地理位置", "url":"http://a8286a29.ngrok.io/index.php/index/weixin/get_location" }] }] }'; $res = http_Post($url, $data); return $res; } // 网页授权access_token public function auth_access_token($code) { $appid = config('app.appid'); $appsecret = config('app.appsecret'); $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $appsecret . '&code=' . $code . '&grant_type=authorization_code'; $res = http_get($url); $res = json_decode($res, true); if (!isset($res['access_token'])) { return false; } return $res; } // 拉取用户信息 public function get_userinfo($auth_access_token, $openid) { $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $auth_access_token . '&openid=' . $openid . '&lang=zh_CN'; $res = http_get($url); $res = json_decode($res, true); return $res; } public function locationinfo($data){ $user = WeixinModel::where('openid', $data['FromUserName'])->find(); if ($user!=null){ $dataUser = [ 'lat' => $data['Latitude'], 'lng' => $data['Longitude'] ]; WeixinModel::update($dataUser,function ($query) use ($data){ $query->where("openid",$data['FromUserName']); }); } } public function jsapi_ticket($access_token){ if (!isset($access_token)){ return false; } $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi"; $res = http_Get($url); $res = json_decode($res,true); if (isset($res['ticket'])){ return $res; }else{ return false; } } }
点击 "运行实例" 按钮查看在线实例