首页
时事
归档
壁纸
更多
留言
关于
邻里
Search
1
使用必应Bing每日图片做网站背景(自动)
2,987 阅读
2
vue的输入值校验规则整理
1,661 阅读
3
VUE `ERR_CONNECTION_TIMED_OUT`的解决办法
1,628 阅读
4
好站推荐-https://wangchujiang.com/linux-command/
1,598 阅读
5
微信支付开发前准备(小程序、公众号、App、H5)
1,582 阅读
文章
图说
代码
吐槽
登录
Search
标签搜索
Linux
laravel
windows
TYPO3
php
shell脚本
git
微信
好站
vue
第三方登录
centos
linxu
centos7
thinkPHP
微信支付
api
MySQL
桌面
必应首图
Beer
累计撰写
114
篇文章
累计收到
22
条评论
首页
栏目
文章
图说
代码
吐槽
页面
时事
归档
壁纸
留言
关于
邻里
搜索到
3
篇与
第三方登录
的结果
2019-03-13
微信扫码登录到系统方式(一):PHP实现微信扫描带参数的二维码登录
前段时间,公司有个项目,想让用户在登录系统的时候就关注公众号,但是现在让用户强制关注是违规的,只能另寻他法,然后,就找到了“微信扫描带参数二维码事件”,下面分享下配置微信服务器首先在你系统中新建一个文件,写入以下内容,确保文件可以被浏览器访问,该文件所在页面不能有任何其他内容输出,并记录你的文件访问链接,还有比较重要的一点,记录下你设置的token等会在配置微信服务器时要用// 微信服务器回调 public function wxcallbackAction() { // file_put_contents('checkSignature.log', date('Y-m-d H:i:s') . '===get===' . \json_encode($_GET) . chr(10) . chr(10),FILE_APPEND | LOCK_EX); if($this->checkSignature()){ echo $_GET["echostr"]; } exit; } private function checkSignature() { $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = 'yourtoken';//注意:这块是你自定义的token,等会在配置微信服务器时要用 $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } }然后登录微信公众平台后,依次找到基本配置->微信服务器配置->修改配置->启用配置,配置时,URL是你刚才新建的文件的浏览器访问路径,TOKEN是你刚才新建的文件中自定义的token,设置完成后提交,token验证失败的话不会保存官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5 1.4生成微信带参数的二维码前端发起(使用js轮询发起请求,生成二维码,扫描后登录等)<script type="text/javascript"> var t2 =''; $(function() { var rand = parseInt(Math.random() * (999999999 - 10000000 + 1) + 10000000); //生成随机数做为二维码的参数 (用来判断扫码的用户) //生成二维码 $.post("后台用于生成二维码的链接",{str:rand},function(result){ console.log(result); var obj = JSON.parse(result); var sign = obj.scene_str; var src = "https://mp.weixin.qq.com/cgi-bin/showqrcode"+obj.src; $('#wxewm').attr('src',src); $('input[name=sign]').val(sign); }); //轮询扫码后的登录 t2 = window.setInterval("login()",1000);//使用字符串执行方法 //window.clearTimeout(t1);//去掉定时器 setTimeout("end()",30000); }) //如果超过一定时间不扫码,停止轮询,提示过期 function end(){ $('#wxewm').hide(); //隐藏二维码 window.clearTimeout(t2); //停止轮询 $('#notice').show(); //提示二维码过期 } //不停发送请求,获取扫码人的信息,如果扫码了获取信息停止轮询 function login(){ var code =$('input[name=sign]').val(); $.post("你将要进行数据处理的页面",{str:code},function(result){ console.log(result); var obj = JSON.parse(result); var user_name = obj.user_name; var pass = obj.pass; if(pass){ window.clearTimeout(t2); //跳转到登录后的页面 window.location.href="https://www.baidu.com"; } }); } </script>PHP后端进行数据处理public function get_access_token() //获取token { $appid= '你的公众号APPID'; $secret='你的公众号APPSECRET'; $data = json_decode(file_get_contents("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret")) ; return $data->access_token; } public function build_qrcode() //生成带参数二维码 { $str = $_POST['str']; $access_token=$this->get_access_token(); // scene_id 参数 $data = '{ "expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": { "scene": { "scene_id":'.$str.' } } }'; $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$access_token; $obj = json_decode(httpRequest($url, 'POST', $data)); $ticket=$obj->ticket; return json_encode(['src'=>"?ticket=$ticket",'scene_str'=>$str]); } // 登录数据处理 public function login() { //$GLOBALS["HTTP_RAW_POST_DATA"]; //这个貌似在PHP7以后用不了了; $postStr = file_get_contents("php://input"); //换成这种方式收数据 $postObj = json_decode($this->xmlToArrayOrObject($postStr, true),true); // 取出openID $openid = $postObj['FromUserName']; $EventKey = $postObj['EventKey']; $user=db('fe_users')->field('id')->where(['openid'=>$openid])->find(); if(!$user['id']){ $access_token=$this->get_access_token(); $wxinfo =json_decode (file_get_contents('https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token . '&openid=' . $openid), true); } // 添加session成功后返回值,在前端进行跳转 return json_encode(['code'=>1,'msg'=>'登录成功','url'=>'http://www.yoururl.com']); } /** * 作用:将xml转为object/array */ public function xmlToArrayOrObject($xml,$flag=true) { if (!$flag) { //将XML转为object $xml_data = simplexml_load_string($xml,'SimpleXMLElement', LIBXML_NOCDATA); }else{ //将XML转为array $xml_data = json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement', LIBXML_NOCDATA)), true); } return $xml_data; }
2019年03月13日
648 阅读
0 评论
0 点赞
2019-03-13
web网站接入Gitee第三方登录
web网站接入Gitee第三方登录官方文档地址API文档:https://gitee.com/api/v5/swagger#/getV5ReposOwnerRepoStargazers?ex=noOAuth文档:https://gitee.com/api/v5/oauth_doc创建应用如何创建应用就不说了,与github类似,OAuth2 获取 AccessToken 认证步骤应用通过 浏览器 或 Webview 将用户引导到码云三方认证页面上( GET请求 )https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code用户对应用进行授权码云认证服务器通过回调地址{redirect_uri}将 用户授权码 传递给 应用服务器 或者直接在 Webview 中跳转到携带 用户授权码的回调地址上,Webview 直接获取code即可({redirect_uri}?code=abc&state=xyz)应用服务器 或 Webview 使用 access_token API 向 码云认证服务器发送post请求传入 用户授权码 以及 回调地址( POST请求 ) https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}码云认证服务器返回 access_token应用通过 access_token 访问 Open API 使用用户数据。当 access_token 过期后(有效期为一天),你可以通过以下 refresh_token 方式重新获取 access_token( POST请求 )https://gitee.com/oauth/token?grant_type=refresh_token&refresh_token={refresh_token}通过access_token获取用户信息GET请求 模拟http get请求https://gitee.com/api/v5/user?access_token={access_token}奉上源码// 用户登录 public function gitee() { if (isset($_GET['code'])) { $access_token_url = 'https://gitee.com/oauth/token'; $params = array( 'grant_type' => 'authorization_code', 'code' => $_GET['code'], 'client_id' => self::GITEE_CLIENT_ID, 'redirect_uri' => 'https://www.whongbin.cn/admin/oauth/gitee.html', 'client_secret' => self::GITEE_CLIENT_SECRET ); $res = json_decode(getHttpResponsePOST($access_token_url, $params),true); $access_token = $res['access_token']; if ($access_token) { $info_url = 'https://gitee.com/api/v5/user?access_token='.$access_token; $info = json_decode(getHttpResponseGET($info_url),true); // 处理数据 } } } 上面代码中的curl请求在这篇文章中已经贴出来了 web网站接入GitHub第三方登录(踩坑)
2019年03月13日
725 阅读
0 评论
0 点赞
2019-02-27
web网站接入GitHub第三方登录(踩坑)
web网站接入GitHub第三方登录(踩坑)博客已近上线了几个月了,但是一直没有做用户登录,这两天想了下,干脆直接用第三方登录吧,最终决定用QQ,Gitee,GitHub三种方式登录,下面是我的踩坑纪录和实现源码,分享出来官方文档地址https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/创建应用,获取Client ID,Client Secret,Authorization callback URL进入后,找到左侧 Developer settings填写你的应用信息,保存即可保存后,纪录下面的两个值和你填写的回调地址更新有朋友在使用下面代码的时候说报错了,然后我才发现我的文章内容没有写完整 [aru_85] ,惭愧,特在此表示歉意并且更新下本篇文章内容,保证尽量少的出现问题2018-10-18日更新在使用下面代码的时候,请先执行以下命令(对Windows无爱,仅Linux),#安装第三方类库 composer require sy-records/oauth-login安装完成后在控制器中引用use Auth\GithubConnect;编写代码,获取数据1. 入口重定向接口:https://github.com/login/oauth/authorize?client_id=yourclientid&redirect_uri=yourredirect_uri<a href="https://github.com/login/oauth/authorize?client_id=yourclientid&redirect_uri=yourredirect_uri">github登录</a>重定向至下面页面2. 根据code获取access_token回调页面中处理获取access_token接口:https://github.com/login/oauth/access_token// 用户登录 if (isset($_GET['code'])) { $access_token_url = 'https://github.com/login/oauth/access_token'; $params = array( 'client_id' => self::GITHUB_CLIENT_ID, 'client_secret' => self::GITHUB_CLIENT_SECRET, 'code' => $_GET['code'], ); $access_token = getHttpResponsePOST($access_token_url, $params); }取到的access_token数据格式是stringaccess_token=e72e16c7e42f292c6912e7710c838347ae178b4a&token_type=bearer3. 根据access_token获取用户信息获取用户信息接口:https://api.github.com/user在这我用的是curl进行http请求,if ($access_token) { $info_url = 'https://api.github.com/user?'.$access_token; $data = array(); parse_str($access_token,$data); $token = $data['access_token']; $url = "https://api.github.com/user?access_token=".$token; $headers[] = 'Authorization: token '.$token; $headers[] = "User-Agent: 木木彡博客"; $result = getHttpResponseGET($info_url,[],$headers); $info = json_decode($result,true); if (isset($info['id'])) { // 处理获取到的数据 } }4. 开发过程中的坑上面步骤中,第一步和第二步都没问题,但是到第三部时,看我代码你会发现,我在curl请求时添加了header,这个header必须填写,这可能是github的严格的验证机制吧,其中1、Authorization填写内容是你获取到的access_token,例:"Authorization: token e72e16c7e42f292c6912e7710c838347ae178b4a";2、User-Agent填写内容是你的应用名称,如我的应用名称是木木彡博客,例:"User-Agent: 木木彡博客"5. 处理数据完整代码// 用户登录 public function github() { if (isset($_GET['code'])) { $access_token_url = 'https://github.com/login/oauth/access_token'; $params = array( 'client_id' => self::GITHUB_CLIENT_ID, 'client_secret' => self::GITHUB_CLIENT_SECRET, 'code' => $_GET['code'], ); $access_token = getHttpResponsePOST($access_token_url, $params); if ($access_token) { $info_url = 'https://api.github.com/user?'.$access_token; $data = array(); parse_str($access_token,$data); $token = $data['access_token']; $url = "https://api.github.com/user?access_token=".$token; $headers[] = 'Authorization: token '.$token; $headers[] = "User-Agent: 木木彡博客"; $result = getHttpResponseGET($info_url, $headers); $info = json_decode($result,true); if (isset($info['id'])) { $Oauth = new OauthModel(); $num = $Oauth->github($info); if ($num==3) { // 登录成功 $this->redirect('index/index'); } } } } } /** * 远程获取数据,POST模式 * @param $url 指定URL完整路径地址 * @param $param 请求的数据 * return 远程输出的数据 */ function getHttpResponsePOST($url = '', $param = array()) { if (empty($url) || empty($param)) { return false; } $ch = curl_init();//初始化curl curl_setopt($ch, CURLOPT_URL,$url);//抓取指定网页 curl_setopt($ch, CURLOPT_HEADER, 0);//设置header curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_POST, 1);//post提交方式 curl_setopt($ch, CURLOPT_POSTFIELDS, $param); $data = curl_exec($ch);//运行curl curl_close($ch); return $data; } /** * 远程获取数据,GET模式 * 注意: * @param $url 指定URL完整路径地址 * @param $header 头部 * return 远程输出的数据 */ function getHttpResponseGET($url,$header=null) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); if(!empty($header)){ curl_setopt($curl, CURLOPT_HTTPHEADER, $header); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); // echo curl_getinfo($curl); curl_close($curl); unset($curl); return $output; }
2019年02月27日
667 阅读
0 评论
0 点赞