php实现微信网站获取用户信息的功能
php实现微信网站获取用户信息的功能,服务号获取信息经测试没得问题,订阅号这个未测试,希望测试过了的朋友能够回复指导一下。
<?php use think\Controller; use think\Db; /** * 作者 http://www.5atl.com * */ class Weilogin extends Controller { /** * 参考资料详见 https://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html */ /** * 订阅号 */ // private $appid = 'wx149978cf463*****e'; // private $secret = '33f0d0314477c77fdd8d85***f'; /** * 服务号 */ private $appid = 'wx9916a5a3d3e*****c'; private $secret = 'e6d756b57d54d27cc03****17e63'; private $token = ''; private $openid = ''; private $reflash = ''; /** * 授权接口 * * @param unknown $appid * @param unknown $jumpto */ public function index() { $weichatflat = true;'http://***********'; // 放获取微信信息的跳转链接 $bind = input('bind'); // 用作绑定还是登录 $url = ''; if ($weichatflat == true) { // 服务号使用 $jumpto = 'http://**********/weilogin/getinfo?bind=' . $bind; $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $this->appid . '&redirect_uri=' . $jumpto . '&response_type=code&scope=snsapi_userinfo&state=' . $bind . '#wechat_redirect'; } else { // 订阅号服务号都可以使用 $jumpto = 'http://**********/weilogin/getopenid?bind=' . $bind; $url = $weichatflat . '/get-weixin-code.html?appid=' . $this->appid . '&redirect_uri=' . $jumpto . '&response_type=code&scope=snsapi_base&state=' . $bind . '#wechat_redirect'; } return redirect($url); } /** * 获取微信id */ public function getOpenid() { $bind = input('bind'); // 用作绑定还是登录 $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $this->appid . '&secret=' . $this->secret . '&code=' . input('code') . '&grant_type=authorization_code'; $json = file_get_contents($url); $json = json_decode($json, true); return $this->bindUserBase($json, $bind); } /** * 订阅号登录或绑定 * @param unknown json带的值openid * @param unknown 绑定还是登录 * @return \think\response\Redirect */ public function bindUserBase($json, $bind) { if ($bind == 0) { $hasUser = Db::name('**************')->where('wxid', $json['openid'])->find(); session('oa_cid', $hasUser['cid']); // 公司id session('oa_uid', $hasUser['mid']); // 用户ID session('oa_username', $hasUser['username']); // 用户名 session('oa_portrait', $hasUser['face']); // 用户头像 session('oa_pmid', $hasUser['pmid']); // 上级id return redirect(url('index/index')); } else { $mid = session('oa_uid'); $param['wxid'] = $json['openid']; Db::name('************')->save($param, [ 'mid' => $mid ]); $this->success('绑定微信成功', url('index/index')); } } /** * 根据公众号appid获取用户的基本信息 * * @param unknown $appid * @return mixed */ public function getInfo() { $bind = input('bind'); // 用作绑定还是登录 // 1. 拿到token $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $this->appid . '&secret=' . $this->secret . '&code=' . input('code') . '&grant_type=authorization_code'; $reback = file_get_contents($url); $json = json_decode($reback, true); $this->token = $json['access_token']; $this->openid = $json['openid']; $this->reflash = $json['refresh_token']; // 2. token是否过期 // $url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token=' . $this->token . '&openid=' . $this->openid; // $reback = file_get_contents($url); // $json = json_decode($reback, true); // 3. token过期后重新拿刷新,跟步骤1一样的结果 // if (array_key_exists('errcode', $json) && $json['errcode'] == 40001) { // $url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=' . $this->appid . '&grant_type=refresh_token&refresh_token=' . $this->reflash; // $reback = file_get_contents($url); // $json = json_decode($reback, true); // // 新的token和openid // $this->token = $json['access_token']; // $this->openid = $json['openid']; // $this->reflash = $json['refresh_token']; // } // 4. 拿详细信息了 $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $this->token . '&openid=' . $this->openid . '&lang=zh_CN'; $reback = file_get_contents($url); $json = json_decode($reback, true); if (array_key_exists('errcode', $json)) { $this->error($reback . '<br/>token=' . $this->token . '<br/>openid=' . $this->openid, null, null, 10); } // 5.绑定信息获登录 return $this->bindUserInfo($json, $reback, $bind); } /** * 服务号登录还是绑定 * @param unknown $json openid, * @param unknown $reback * @param unknown $bind * @return \think\response\Redirect */ public function bindUserInfo($json, $reback, $bind) { if ($bind == 0) { $hasUser = Db::name('********')->where('wxid', $json['openid'])->find(); if ($hasUser == null) { $this->error('对不起,您的账号还未绑定微信,请使用OA账号的鞥路', url('login/index')); } session('oa_cid', $hasUser['cid']); // 公司id session('oa_uid', $hasUser['mid']); // 用户ID session('oa_username', $hasUser['username']); // 用户名 session('oa_portrait', $hasUser['face']); // 用户头像 session('oa_pmid', $hasUser['pmid']); // 上级id return redirect(url('index/index')); } else { $mid = session('oa_uid'); $param['face'] = $json['headimgurl']; $param['wxid'] = $json['openid']; $param['wxinfo'] = $reback; Db::name('********')->where('mid', $mid)->update($param); $this->success('绑定微信成功', url('index/index')); } } } ?>