时间:2022-03-20 浏览量: 收藏
场景:用户扫描微信公众号的二维码,关注后自动登录网站,若已关注则直接登录。
逻辑:
1.系统生成带参数(此参数自定义为唯一值)的临时二维码(微信公众平台有提供该接口,可查看一下开发文档);
2.用户使用微信扫描该二维码,关注后微信服务器会将数据(自定义参数、openid...)返回到我们的服务器;
3.我们服务器将接收到的openid再次向微信服务器发起请求,获取该用户的信息(昵称、头像、地域、unionid(若绑定了微信开放平台,则有此参数));
4.我们将返回的用户信息存储到数据库,用作于登录。
准备工作:登录微信公众平台,在基本配置下,查看appid和设置appsecret、回调URL、token,小编这里使用的是测试账号,因为正式的要审核(收费300个大洋),如下图:
下面直接贴上小编写的一个类WeChat.class.php:
Class WeChat{ protected $appid; protected $secret; protected $accessToken; function __construct(){ $this->appid = "xxx"; $this->secret = "xxx"; $this->accessToken = $this->getAccessToken(); } /** * 获取access_token * token的有效时间为2小时,这里可以做下处理,提高效率不用每次都去获取, * 将token存储到缓存中,每2小时更新一下,然后从缓存取即可 * @return **/ private function getAccessToken(){ url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->secret; $res = json_decode($this->httpRequest($url),true); return $res['access_token']; } /** * POST或GET请求 * @url 请求url * @data POST数据 * @return **/ private function httpRequest($url, $data = ""){ $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)){ //判断是否为POST请求 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; } /** * 获取openID和unionId * @code 微信授权登录返回的code * @return **/ public function getOpenIdOrUnionId($code){ $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->secret."&code=".$code."&grant_type=authorization_code"; $data = $this->httpRequest($url); return $data; } /** * 通过openId获取用户信息 * @openId * @return **/ public function getUserInfo($openId){ $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$this->accessToken."&openid=".$openId."&lang=zh_CN"; $data = $this->httpRequest($url); return $data; } /** * 发送模板短信 * @data 请求数据 * @return **/ public function sendTemplateMessage($data = ""){ $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$this->accessToken; $result = $this->httpRequest($url, $data); return $result; } /** * 生成带参数的二维码 * @scene_id 自定义参数(整型) * @return **/ public function getQrcode($scene_id){ $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$this->accessToken; $data = array( "expire_seconds" => 3600, //二维码的有效时间(1小时) "action_name" => "QR_SCENE", "action_info" => array("scene" => array("scene_id" => $scene_id)) ); $result = $this->httpRequest($url, json_encode($data)); return $result; } /** * 生成带参数的二维码 * @scene_str 自定义参数(字符串) * @return **/ public function getQrcodeByStr($scene_str){ $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$this->accessToken; $data = array( "expire_seconds" => 3600, //二维码的有效时间(1小时) "action_name" => "QR_STR_SCENE", "action_info" => array("scene" => array("scene_str" => $scene_str)) ); $result = $this->httpRequest($url, json_encode($data)); return $result; } /** * 换取二维码 * @ticket * @return **/ public function generateQrcode($ticket){ return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".$ticket; } /** * 回调函数 **/ public function callback(){ $callbackXml = file_get_contents('php://input'); //获取返回的xml //下面是返回的xml //<xml><ToUserName><![CDATA[gh_f6b4da984c87]]></ToUserName> //微信公众号的微信号 //<FromUserName><![CDATA[oJxRO1Y2NgWJ9gMDyE3LwAYUNdAs]]></FromUserName> //openid用于获取用户信息,做登录使用 //<CreateTime>1531130986</CreateTime> //回调时间 //<MsgType><![CDATA[event]]></MsgType> //<Event><![CDATA[SCAN]]></Event> //<EventKey><![CDATA[lrfun1531453236]]></EventKey> //上面自定义的参数(scene_str) //<Ticket><![CDATA[gQF57zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyY2ljbjB3RGtkZWwxbExLY3hyMVMAAgTvM0NbAwSAOgkA]]></Ticket> //换取二维码的ticket //</xml> $data = json_decode(json_encode(simplexml_load_string($callbackXml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); //将返回的xml转为数组 if(count($data)){ $userInfo = $this->getUserInfo($data['FromUserName']); //获取用户信息 //这里把返回的数据写入数据库(注:务必将“EventKey”也存到数据表中,后面检测登录需用到此唯一值查询记录) //用于前台做检测该用户扫码之后是否有关注公众号,关注了就自动登录网站 //原理:前台通过自定义的参数(最好设成值唯一)查询数据标是否有此记录,若有则登录。 } } }
生成带参数的二维码index.php:
<?php header("Content-type:text/html;charset=utf-8"); require_once('WeChat.class.php'); $WeChat = new WeChat(); $scene_str = "lrfun1531453236"; //"lrfun" . time(); //这里建议设唯一值(如:随机字符串+时间戳) $result = json_decode($WeChat->getQrcodeByStr($scene_str), true); $qrcode = $WeChat->generateQrcode($result['ticket']); //生成二维码 echo "自定义参数:".$scene_str; echo "<br/><img src="$qrcode">";?> <script type="text/javascript" src="http://www.lrfun.com/statics/fun2/js/jquery.min.js"></script> <script type="text/javascript"> setInterval("checkLogin()", 2000); //每2秒发送一次请求 function checkLogin(){ $.post("checkLogin.php", {scene_str:"<?=$scene_str?>"}, function(data){ if(data){ //做逻辑判断,登录跳转 } },"Json"); } </script>
回调函数 callback.php:
// 调取回调函数 require_once('WeChat.class.php'); $WeChat = new WeChat(); $result = $WeChat->callback();
检测是否登录 checkLogin.php:
if(isset($_POST['scene_str']) && $_POST['scene_str']){ //根据scene_str查询数据库,是否有此记录 echo "true"; }else{ echo "false"; }
原文地址:http://www.lrfun.com/html/technology/PHP/2018/0714/134.html
RELATED RECOMMEND
2022-03-20
为贯彻落实《中华人民共和国反电信网络诈骗法》、《互联网信息服务管理办法》及《非经营性互联网信息服务备案管理办法》等法律法规要求,配合相关部门做好移动互联网信息服务管理,根据2023年8月4日工信部发布的《工业和信息化部关于开展移动互联网应用程序备案工作的通知》,微信公众平台ICP代备案管理系统将提供新增备案、变更备案、注销备案等服务,协助开发者完成微信小程序备案。现将备案相关事项通知如下:一、备案
2022-03-20
针对不同云服务器、虚拟主机,运行PHP的环境也有所不同,目前主要分为:Nginx、apache、IIS以及其他服务器。此文给大家分享如何隐藏ThinkPhp 伪静态URL中的index.php。【Nginx服务器】在原有的nginx重写文件里新增以下代码片段:location / { if (!-e $request_filename) { rewrite ^(.*)$ /in
2022-03-20
ThinkPhp多文件上传1、模板页面中代码<form action="{:url('uploads')}" method="post" enctype="multipart/form-data"> <p> File: <input type="fi
Copyright © 2012-2024 世敏网络 版权所有 闽ICP备18026760号-1 闽公网安备 35020502000640号 网站地图 Sitemap 关键词聚合