微信网页第三方登陆 代码

1.登陆的html页面代码

<a href="weixin.redirect_uri">微信登陆</a>

2.跳转到的控制器方法代码

CJUL是常量,就是你在开放平台上注册的重定向网址

跳换到后重定向到的地址是微信的一个重定向地址

https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

带了你在开放平台上注册的网址redirect_uri和appid 并且scope为snsapi_login

参数 是否必须 说明
appid 应用唯一标识
redirect_uri 重定向地址,需要进行UrlEncode
response_type 填code
scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
state 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
class  PhoneController extends CommonController{    

        //加载首页
        public function Index(){

            //通过授权跳转网页进入
            if(isset($_GET[‘code‘])){

                $code = $_GET[‘code‘];

                //通过code换取网页授权access_token
                $access_token = $this->get_code_access_token($code);

                //检验授权凭证(access_token)是否有效
                $data = $this->checkAvail($access_token[‘access_token‘],$access_token[‘openid‘]);

                if($data[‘errcode‘] != ‘0‘ || $data[‘error_msg‘] != ‘ok‘){

                    //刷新access_token
                    $access_token = $this->refresh_access_token($access_token[‘refresh_token‘]);

                }

                //得到拉取用户信息(需scope为 snsapi_userinfo)
                $userinfo = $this->get_user_info($access_token[‘access_token‘],$access_token[‘openid‘]);

                require ‘view/index.html‘;

            }elseif(isset($_GET[‘page‘])){

                //网页端入口
                require ‘view/index.html‘;

            }else{

                echo "NO CODE";
            }

        }

               //跳转到微信的认证页
        public function redirect_uri(){
            $url =  $this->get_authorize_url(CJURL,‘1‘);

            header(‘location:‘.$url);
        }
}

3.调用的底层代码

<?php 

    class CommonController{

        //http get
        public function httpRequest($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);

            if($output == false){
                return ‘curl error:‘.curl_error($ch);
            }

            curl_close($ch);

            return $output;
        }

        //curl获取参数
        //https 中的 get  和  post
        public function https_request($url,$data=null){

            $curl = curl_init();

            curl_setopt($curl,CURLOPT_URL,$url);

            curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
            curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);

            //不为空,使用post传参数,否则使用get
            if($data){

                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;
        }

        //获取接口票据access_token
        public function get_token(){

            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".APPSECRET;

            $json = $this->https_request($url);

            $arr = json_decode($json,true);

            return $arr[‘access_token‘];
        }

        /*获取授权后重定向的回调链接地址,请使用urlencode对链接进行处理
         * @param string $redirect_uri
         * @param string $state
         **/
        public function get_authorize_url($redirect_uri = ‘‘, $state = ‘‘){

            $redirect_uri = urlencode($redirect_uri);
            return "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".APPID."&redirect_uri={$redirect_uri}&response_type=code&scope=snsapi_base&state={$state}#wechat_redirect";
        }

        /**
         *加载网页授权通过code获取access_token
         *
         * @param string $code
         **/
        public function get_code_access_token($code){

            //第一步:用户同意授权,获取code
            // 第二步:通过code换取网页授权access_token,与接口票据不一样
            $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".APPID."&secret=".APPSECRET."&code={$code}&grant_type=authorization_code";

            $access_token = $this->https_request($access_token_url);

            $arr = json_decode($access_token,true);

            return $arr;
        }

        /**
         * 刷新access_token(如果需要)
         *
         **/
        public function refresh_access_token($refresh_token){

            //三步:刷新access_token(如果需要)
            $refresh_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=".APPID."&grant_type=refresh_token&refresh_token={$refresh_token}";

            $access_token = $this->https_request($refresh_url);

            return json_decode($access_token,true);

        }

       /**
        * 获取授权后的微信用户信息
        *
        * @param string $access_token
        * @param string $open_id
           **/
           public function get_user_info($access_token = ‘‘, $open_id = ‘‘){

               // 第四步:拉取用户信息(需scope为 snsapi_userinfo)

            if($access_token && $open_id){

                $info_url = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$open_id}&lang=zh_CN";

                $info_data = $this->https_request($info_url);

                return json_decode($info_data, TRUE);

            }

            return FALSE;
        }

        /**
         *检验授权凭证(access_token)是否有效
         * @param string $access_token
         * @param string $open_id
         **/
        public function checkAvail($access_token=‘‘,$openid=‘‘){

             if($access_token && $open_id){

                 $avail_url = "https://api.weixin.qq.com/sns/auth?access_token={$access_token}&openid={$openid}";

                 $avail_data = $this->https_request($avail_url);

                return json_decode($avail_data, TRUE);
             }

              return FALSE;
        }

        //获取自定义菜单创建接口
        public function setcustomMenu(){

            $access_token = $this->get_token();

            $menuurl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$access_token}";

            $jsonmenu = ‘{
                 "button":[
                 {
                      "type":"view",
                      "name":"抽奖",
                      "url":"http://akira.weixin-sandbox.ciicgat.com/index.php?c=Phone&a=Index&page=Page"
                  },
                  {
                         "type":"click",
                       "name":"赞一下",
                       "key":"点赞"
                  },
                  {
                       "name":"上网",
                       "sub_button":[
                       {
                           "type":"view",
                           "name":"搜搜",
                           "url":"http://www.soso.com/"
                        },
                        {
                           "type":"view",
                           "name":"腾讯",
                           "url":"http://v.qq.com/"
                        },
                        {
                           "type":"view",
                           "name":"百度",
                           "url":"http://www.baidu.com/"
                        }]
                   }]
             }‘;

            //在直接访问接口的时候已经改变了微站上面的信息
            $result = $this->https_request($menuurl,$jsonmenu);

            var_dump($result);
        }

        /**
         *openid
         *用户说的内容
         *获取和你聊天的用户的基本信息形成列表
         **/
        public  function  getUserInfo($openid,$text){

            $access_token = $this->get_token();
            //http请求方式:GET
            $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={$access_token}&openid={$openid}&lang=zh_CN";
            //请求获取用户信息的接口,返回这个openid对应的用户信息,json格式
            $jsoninfo = $this->httpRequest($url);
            //将json转为php数组
            $user = json_decode($jsoninfo,true);

            $this->insertuser($user);

            $this->insertmessage($openid,$text,0,‘text‘);
        }

        /*
         *将用户的数据写入数据库
         */
        public function insertuser($arr){

            $user = new Model(‘user‘);

            $user->ctime = $arr[‘subscribe_time‘];

            $user->add($arr);
        }

        /**
         *第一个参数: $openid 用户的编号
         *第二个参数: $text 用户消息和公众号数据标记  1 表示公众号 0 表示用户消息
         **/
        public function insertmessage($openid,$text,$who,$mtype="text"){

            $message = new Model(‘message‘);

            $message->openid = $openid;
            $message->mess = $text;
            $message->who = $who;
            $message->utime = time();
            $message->mtype = $mtype;

            $message->add();

            $sql = "upadte user set utime=".time()." where openid = ‘{$openid}‘";

            $user = new Model(‘user‘);
            $user->query($sql);
        }

        //获取带参数的二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码

         /**
          *微信获取二维码ticket
          *@param string $type
          *@param string $time
          **/
        public function getTicket($type="temporary",$time="604800"){

            /*
            http请求方式: POST
            URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
            POST数据格式:json

            临时二维码请求说明
            POST数据例子:{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}

            永久二维码请求说明
            POST数据例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}
            或者也可以使用以下POST数据创建字符串形式的二维码参数:
            {"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "123"}}}
            */

            if((int)($time) > 604800){
                $time = 604800;
            }

            //获取token
            $token = $this->get_token();

            //临时
            $temporary_qrcode = ‘{"expire_seconds": ‘.$time.‘, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}‘;

            //永久
            $permanent_qrcode = ‘{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}‘;

            //永久字符串
            $permanent_str_qrcode = ‘{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": 123}}}‘;

            //获取类型判定
            $code = $type.‘_qrcode‘;
            $qrcode = $$code;

            //请求ticket
            $ticket_url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={$token}";

            $ticket = $this->https_request($ticket_url,$qrcode);

            return $ticket;
        }

        /**
         *凭借ticket到指定URL换取二维码
         **/
        public function getQrcode(){

            //本接口无须登录态即可调用    TICKET进行UrlEncode
            // HTTP GET请求(请使用https协议)
            // https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
            $ticket = json_decode($this->getTicket(),true);

            $qrcode_url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".urlencode($ticket[‘ticket‘]);

            echo  $qrcode_url;

            $qrcode = $this->https_request($qrcode_url);

            // header("");
        }

        /*
         * 微信不接收\u***格式的json内容需要对json字符串处理
         * 仅支持发送text消息,其他类型消息自己添加代码
         * @param string msgtype
         * @param array
         * @return string
         */
        function my_json_encode($type, $p){

            if (PHP_VERSION >= ‘5.4‘){

                $str = json_encode($p, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
            }
            else{

                switch ($type){

                    case ‘text‘:
                        isset($p[‘text‘][‘content‘]) && ($p[‘text‘][‘content‘] = urlencode($p[‘text‘][‘content‘]));
                        break;
                }
                $str = urldecode(json_encode($p));
            }
            return $str;
        }

        //中文分词函数,只要传一句话,就可以分词出来
        public function fci($text){
            $text = iconv(‘UTF-8‘,‘GBK//IGNORE‘,$text);
            $text = urlencode($text);
            $result = file_get_contents("http://akira.weixin-sandbox.ciicgat.com/index.php?w=".$text);
            $result = iconv("GBK","UTF-8//IGNORE",$result);
            return explode(" ",$result);
        }

    }

 ?>
时间: 2024-10-19 21:04:35

微信网页第三方登陆 代码的相关文章

微信网页 第三方登录原理详解

本文主要介绍微信网页 第三方登录原理,这里整理了详细的资料及接口说明和参数说明,有需要的小伙伴可以参考下 微信开放平台和公众平台的区别 1.公众平台面向的时普通的用户,比如自媒体和媒体,企业官方微信公众账号运营人员使用,当然你所在的团队或者公司有实力去开发一些内容,也可以调用公众平台里面的接口,比如自定义菜单,自动回复,查询功能.目前大多数微信通过认证之后,都在做这个事情. 2.开放平台面向的开发者和第三方独立软件开发商.我觉得开发平台最大的开放就是微信登录.当年腾讯没有花大力气去做统一登录这个

微信网页第三方登录原理

微信开放平台和公众平台的区别 1.公众平台面向的时普通的用户,比如自媒体和媒体,企业官方微信公众账号运营人员使用,当然你所在的团队或者公司有实力去开发一些内容,也可以调用公众平台里面的接口,比如自定义菜单,自动回复,查询功能.目前大多数微信通过认证之后,都在做这个事情. mp.weixin.qq.com 2.开放平台面向的开发者和第三方独立软件开发商.我觉得开发平台最大的开放就是微信登录.当年腾讯没有花大力气去做统一登录这个事情,导致目前各个网站都要弄一套登录机制.好在他们现在认清了局势.开发者

微信开发微信网页授权登陆不成功的问题

最近一直在研究围绕微信平台的相关开发,其中踩到了不少坑,特来此记录一番,也方便交流.真想吐槽为什么微信弄个开放平台还要加一个公众平台呢?两边文档还不一样.类似的功能还得写两次.上网查了下,果然有人在喷微信文档多次误导第三方sdk写错了:) 上次接到一个任务,PC网站要支持微信第三方登陆功能.一直以为是在服务号那边做相应的配置和处理,看的是这边的文档 .尝试了多次都是提示scope没有相关权限,授权地址格式如下: [javascript] https://open.weixin.qq.com/co

微信网页授权登陆的一次查错误经历

最近一直在研究围绕微信平台的相关开发,其中踩到了不少坑,特来此记录一番,也方便交流.真想吐槽为什么微信弄个开放平台还要加一个公众平台呢?两边文档还不一样.类似的功能还得写两次.上网查了下,果然有人在喷微信文档多次误导第三方sdk写错了:) 上次接到一个任务,PC网站要支持微信第三方登陆功能.一直以为是在服务号那边做相应的配置和处理,看的是这边的文档 .尝试了多次都是提示scope没有相关权限,授权地址格式如下: https://open.weixin.qq.com/connect/oauth2/

微信网页版登陆实现

1. 每打开一次微信网页版页面的时候会随机生成一个含有唯一 uid 的二维码,每次刷新页面都会不一样(这个可以保证一个 uid 只可以绑定一个账号和密码,如果一个 uid 可以绑定多个账号和密码,那么很可能你的电脑会登陆别人的微信哦): 确实返回了唯一 id,但目的是为了识别用户身份,而且实际上打开这个页面的时候浏览器已经和 Server 创建了一个长连接等待确认信息. 查看 http://wx.qq.com 的源码可以轻易看出来,其实这个页面加载完毕的同时,也已经把很多登录后才需要的相关资源都

微信扫码登录asp微信扫码登陆代码

网站接入微信扫码登录并获取用户基本信息(完美绕过微信开放平台) 电脑版网站实现微信扫码登录,注册会员还要设密码太麻烦,会员也记不住密码,采用微信扫码登录网站更方便,会员无需设密码,用他的微信做为系统登录用户名,全程自动操作更方便.源码是用asp写的,mdb的数据库,微信扫描电脑网页上的二维码实现登录. 只需要用微信扫一下二维码,这个网站就可以展示你的微信昵称和头像,免去注册账号和输入密码登录的步骤,还免去设置头像和昵称的步骤,所以是挺方便的.我这个asp写好的代码和微信开放平台不同,微信开放平台

微信公众号开发简单的网页授权登陆获取用户基本信息

由于业务需要,近期在做微信公众号开发,其中一个模块是微信用户点击个人中心访问可以得到次微信用户的头像昵称国家省份等基本信息. 但由于业务需求,这块功能暂时用不上了,但这功能的实现毕竟是自己花费几天时间搞出来的,觉得以后会用的上,暂且记录一下实现过程. 首先:获取用户信息的过程属于微信网页授权登陆,再做这一块之前请先阅读微信开发文档以熟悉基本的开发过程: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 微信开发文档

微信网页版朋友圈在哪?怎么找不到

之前ytkah有介绍了微信网页版,确实方便了很多,直接浏览器就可以操作,不用安装其他程序.用过的朋友都在问微信网页版朋友圈在哪?现在我们一起来找找吧 如下图所示,左侧:第一行的右上角是菜单,分别是发起聊天.关闭桌面通知.关闭声音.意见反馈.退出:第二行是搜索框,可以搜索微信好友.公众号.聊天记录:第三行是微信聊天列表.公众号列表.通讯录列表:右侧:聊天窗口.公众号文章显示.通讯录显示 比较遗憾,微信网页版朋友圈这个功能确实找不到,也许微信团队原本就没打算把它加进去,本着极简的原则,让你提高效率,

第三方登陆:微信官方登陆

微信官方登陆 一.首先进入微信授权登陆之前的一个验证,在微信开放平台注册开发者账号,并拥有一个已经审核通过的移动应用,获得相应的AppID和AppSecrect,申请微信通过审核后(如下如)可开始植入工程的相关流程. 二.下载最新的SDK,链接如下:iOS SDK下载 下载下来的SDK如下图: 1.libWeChatSDK.a  : 静态库,直接拖入工程中使用的: 2.README.txt : 重要内容,一些最新SDK版本的说明和安装配置 3.WechatAuthSDK.h :授权SDK 4.W