刚开始接触微信的时候一头雾水, 领导想要一个扫码获取微信用户信息的功能, 而且是扫的别人的二维码, 我是一阵忙活啊.
经过努力和尝试, 终于功夫不负有心人啊, 赶紧记录一下, 我用的是 ThinkPHP 编写的. 作者: 悦~ 博客园地址: https://www.cnblogs.com/nuanai/
第一步: 就是二维码的生成 作者: 悦~ 网址: https://www.cnblogs.com/nuanai/
1. 首先要确定第一个二维码, 因为既然是扫码, 肯定是要第一个二维码的, 也就是第一人才可以. 我将第一个二维码的唯一值 (id) 设置成零, 然后开始我的编写
2. 既然是二维码, 我用了 phpqrcode 二维码生成插件, 二维码的生成可以在本地编写, 查看效果后再上传服务器.
(1)从网上下载下 phpqrcode 插件包, 将它放到 ThinkPHP 的文件里, 路径如下: ThinkPHP\Library\Vendor , 截图如下:
(2)二维码的生成, 在调用显示二维码的控制器的方法中调用这个插件包, 然后设置下扫描后跳转的 URL 就好了, 代码如下:
- $url ="http://www.baidu.com";
- $level=3;
- $size=4;
- Vendor('phpqrcode.phpqrcode'); // 引入插件
- $errorCorrectionLevel = intval($level) ;// 容错级别
- $matrixPointSize = intval($size);// 生成图片大小
- // 生成二维码图片
- $object = new \QRcode();
- $path = "Public/ER/1.png"; // 本地文件存储路径
- $object->PNG($url, $path, $errorCorrectionLevel, $matrixPointSize, 2);
这只是实现生成二维码并且可以进入二维码指定的网址, 真正要实现的目的是扫带有参数的二维码, 获取微信用户的信息
下面就是怎么实现生成带有参数的二维码 作者: 悦~ 网址: https://www.cnblogs.com/nuanai/
3.(1)要用到微信的网页授权, 就要用到公众号的几个参数: 1 是 AppID 2 是 AppSecret 这是公众号申请成功后分配下来的
(2)利用这两个参数, 然后再配合获取 access_token 的值就可以了
代码如下(扫描后跳转到 getUserInfo 方法, 并且把唯一键值传过去):
- $tid = 0; // 传值的参数
- $level=3;
- $size=4;
- Vendor('phpqrcode.phpqrcode');
- $errorCorrectionLevel = intval($level) ;// 容错级别
- $matrixPointSize = intval($size);// 生成图片大小
- // 生成二维码图片
- $object = new \QRcode();
- $path = "Public/ER/" . $tid . ".png"; // 本地文件存储路径
- $object->PNG($url, $path, $errorCorrectionLevel, $matrixPointSize, 2);
- $appid='******'; // 公众号唯一标识
- $redirect_uri = urlencode ( 'http://www.****.net/index.php/Admin/Sindex/getUserInfo?id='.$tid ); // 这个是设置参数和授权后重定向的回调链接地址
- //snsapi_userinfo 弹出授权页面, 可通过 openid 拿到昵称, 性别, 所在地 snsapi_base , 不弹出授权页面, 直接跳转, 只能获取用户 openid
- $url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
下面是写跳转后的操作 作者: 悦~ 网址: https://www.cnblogs.com/nuanai/
(1)接收传过来的值
(2)取得 openid
(3)根据全局 access_token 和 openid 查询用户信息
(4)将信息写入数据库
获取 openid 或者其他的东西, 用到下面的方法, 可以快速截取到需要的东西
- function getJson($url){
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- $output = curl_exec($ch);
- curl_close($ch);
- return json_decode($output, true);
- }
接下来就是将上面的步骤逐一实现, 代码如下:
- public function getUserInfo()
- {
- $appid = "*****"; // 公众号唯一标识
- $secret = "*****"; // 应用秘钥
- //$code 是回调的时候地址上带的 只需要 get 方式接收就可以了
- $code = $_GET["code"];
- // 获取传过来的值
- $htjid = $_GET["id"];
- // 第一步: 取得 openid
- $oauth2Url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$secret&code=$code&grant_type=authorization_code";
- $OAuth2 = $this->getJson($oauth2Url);
- // 第二步: 根据全局 access_token 和 openid 查询用户信息
- $access_token = $OAuth2["access_token"];
- $openid = $OAuth2['openid'];
- $get_user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN";
- $userinfo = $this->getJson($get_user_info_url);
- // 写入数据库微信用户
- M()->startTrans();// 开启事务
- $n = M("zp_user"); // 写入的表
- $openid = $data['openid'] = $userinfo['openid']; // 微信用户 openid
- $data['sex'] = $userinfo['sex']; // 性别
- $data['headimgurl'] = $userinfo['headimgurl']; // 头像
- $data['province'] = $userinfo['province']; // 地区 sheng
- $data['city'] = $userinfo['city']; // 地区 shi
- $data['subscribe_time'] = time(); // 时间
- $data['qr_scene'] = $htjid; // 传过的值
- $data['nickname'] = $userinfo['nickname']; // 昵称
- $z = $n->lock(true)->add($data);
- if(!$z)
- {
- M()->rollback();// 回滚
- $this->error('添加错误!');
- }else{
- M()->commit();// 事务提交
- }
- }
到此, 就可以实现扫描二维码获取用户信息了, 并且将用户信息写入数据库
这是第一个二维码, 生成后, 就可以将 id 的参数值换成前面传过来的值, 也就是扫码的值 $tid = 0; // 传值的参数
如果想要自己的二维码页面好看的话, 比如想要把自己的微信昵称和二维码合成一张图片的话, 也是可以实现的, 这就要用到图片的合成了, 下次再说吧.
作者: 悦~ 网址: https://www.cnblogs.com/nuanai/
微信公众号实现扫码获取微信用户信息(网页授权)
来源: http://www.bubuko.com/infodetail-3016893.html