• 功能:主要用于在用户通过手机端微信访问第三方H5页面时获取用户的身份信息(openId,昵称,头像,所在地等。。)可用来实现微信登录、微信账号绑定、用户身份鉴权等功能。     开发前的准备: 1、需要有一个公众号,...


    功能:主要用于在用户通过手机端微信访问第三方H5页面时获取用户的身份信息(openId,昵称,头像,所在地等。。)可用来实现微信登录、微信账号绑定、用户身份鉴权等功能。

     
     

    开发前的准备:

    1、需要有一个公众号,拿到AppID和AppSecret;
    2、进入公众号开发者中心页配置授权回调域名。具体位置:接口权限-网页服务-网页账号-网页授权获取用户基本信息-修改
         注意,这里仅需填写全域名(如www.qq.com、www.baidu.com),勿加 http:// 等协议头及具体的地址字段; 
         本文以 lovebread.tunnel.qydev.com 域名为例:
    3、如果嫌手机上测试麻烦,可以使用微信官方提供的web开发者工具直接在浏览器中进行调试。
        前提是需要在微信公众号中绑定开发者账号:登录公众号-开发者工具-进入web开发者工具-绑定web开发者微信账号
        使用说明及下载地址:https://mp.weixin.qq.com/wiki?action=doc&id=mp1455784140&t=0.7272727088156665&token=&lang=zh_CN#6

    微信开发资料收集

    https://github.com/liyiorg/weixin-popular

    https://github.com/borball/weixin-sdk


    网页授权获取用户基本信息


        @Test
        public void testAuthenticationUrl(){
            String url = MpOAuth2s.defaultOAuth2s().authenticationUrl("http://wxtest.gzriver.com/oS-I8EwVL9X.view", "snsapi_userinfo");
            System.out.println(url);
            Assert.assertNotNull(url);
        }
    通过转发形式微信验证页面
    	@RequestMapping(value = { "/xxx" })
    	public ModelAndView testOrder(HttpSession httpSession) {
    		ModelAndView modelView = new ModelAndView();
    		
    		String url = MpOAuth2s.defaultOAuth2s().authenticationUrl(StringUtils.generateWechatAuthUrl("xxx"),
    					"xxx");
    			// 转到微信验证页面
    			return new ModelAndView("redirect:" + url);
    		}


    通过url访问得到code
    {
    	state = ,
    	code = 011ARkch0yXcSC1zgUah07uhch0ARkcp
    }


    展开全文
  • 微信网页授权文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 本人使用的是公众平台... ... 一,微信网页授权流程(微信文档都有) ...二,前端获取code 禁忌:不要发送请求获取微信的co...

    微信网页授权文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

    本人使用的是公众平台测试账号进行的代码测试。(开发 —》开发者工具—》公众平台测试账号)

    如何配置可参考文章 微信公众平台测试账户开通

    一,微信网页授权流程(微信文档都有)

    二,前端获取code

    禁忌:不要发送请求获取微信的code,会报跨域,需要把它当成页面打开

    变化的是appid,redirect_url,responese_type,scope, 

    其中redirect_url很关键,获取成功code之后,页面会重定向你设置的redirect_url

        var wxappid = 'wxcd3e32942e4b220a';
        var redirecturi = 'https%3a%2f%2fweixin.cenozon.cn'
        var url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + wxappid + '&redirect_uri=' + redirecturi + '&response_type=code&scope=snsapi_base&state=123#wechat_redirect'
        window.location.href = url

    在重定向后的页面获取到code ,可以看到这个时候code是在地址上返回给我们的。

    截取链接地址上的code,拿到code,给后端换取token

            const url = window.location.search;
            const start = window.location.search.indexOf('code=');
            const end = window.location.search.indexOf('&');
            const code = url.substring(start + 5,end)

    完整的页面逻辑

    1.先判断是否有用户唯一标示,没有的话就去获取code

    1.先判断页面链接上是否有code,没有进行授权登陆

    2.有code,就传给后端,获取信息 ,缓存用户唯一标示

    展开全文
  • 1、申请微信公众号--服务号(略) 2、使用 AppID和AppSecret调用本接口来获取access_token。  具体操作步骤微信官方问答:...

    1、申请微信公众号--服务号(略)


    2、使用 AppID和AppSecret调用本接口来获取access_token。

       具体操作步骤微信官方问答:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183&token=&lang=zh_CN


    3、获取用户的Openid

    获取用户openid有两种方式,一种是用户发送消息,微信服务器会把openid推送给开发者,另一种是通过OAuth2.0网页授权获取用户openid,今天讲的是通过网页授权获取用户openid。

    网页授权获取用户openid需在微信公众平台后台开发者中心授权回调域名。

    1、登陆微信公众平台后台。

    2、进入开发者中心 


    点击修改


    这里填写你的域名,如www.devdo.net,不要加http://等协议头。

    根据微信开发者文档说明,关于网页授权有两种scope

    1. 以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
    2. 以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

    我们只需要获取用户openid,所以scope就选择为snsapi_base,对于以snsapi_base为scope的网页授权,就静默授权的,用户无感知;这样的好处是不需要用户点击授权按钮进行授权。

    第一步:用户同意授权,获取code

    首先,需要获取获取code,通过下面方式访问,即可返回code,appid是微信开发者的appid,redirect_uri是获取code后需要跳转的页面,跳转后code会追加到redirect_uri后台,如redirect_uri=http://www.devdo.net?p=123,那么获取code后跳转的结果为http://www.devdo.net?p=123&code=codevalue。  

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=$uri&response_type=code&scope=snsapi_base&state=123#wechat_redirect

        第二步:通过code换取网页授权access_token

        首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来     获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程       即到此为止。
        由于我们采用的是snsapi_base式的网页授权,所以要获取openid,进行到这一步就完成了,返回的参数中自带openid。
        请求方法
    
    
    1. 获取code后,请求以下链接获取access_token:
    2. https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
    参数说明
    参数 是否必须 说明
    appid 公众号的唯一标识
    secret 公众号的appsecret
    code 填写第一步获取的code参数
    grant_type 填写为authorization_code
       返回说明

       正确时返回的JSON数据包如下:

    1. {
    2. "access_token":"ACCESS_TOKEN",
    3. "expires_in":7200,
    4. "refresh_token":"REFRESH_TOKEN",
    5. "openid":"OPENID",
    6. "scope":"SCOPE",
    7. "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
    8. }
    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
    scope 用户授权的作用域,使用逗号(,)分隔
    unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。

        错误时微信会返回JSON数据包如下(示例为Code无效错误):

    1. {"errcode":40029,"errmsg":"invalid code"}


    4、通过 access_token 和 openid获取用户的个人信息。

    具体步骤微信官方文档:https://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html


    本文转自:http://blog.csdn.net/qingshuiputeng/article/details/57946907

    展开全文
  • 前段时间开发微信公众号网页授权,虽然网上已经有很多关于这方面的博客或者教程,但是第一次开发还是遇到挺多坑的,以下分享一下我的踩坑填坑之路。 一、测试号相关配置 首先在你公司申请的测试号上配置好相关信息...

    前段时间开发微信公众号网页授权,虽然网上已经有很多关于这方面的博客或者教程,但是第一次开发还是遇到挺多坑的,以下分享一下我的踩坑填坑之路。

    一、测试号相关配置

    首先在你公司申请的测试号上配置好相关信息,这里直接上图吧:

    URL与Token都是要后台配置好的,直接叫后台给过来就好啦,域名一定要和URL的域名保持一致。

    然后,在体验接口权限表里面找到网页帐号--网页授权获取用户基本信息,点击修改:

     配置授权回调的域名,至于什么是OAuth2.0,大家自行百度吧。这里的域名也要与上面的域名一致。配置成功会有通过安全监测的提示,这里不上截图了。

    二、获取code

    配置好以上回调域名等后,就可以写代码了。首先是获取code,需要打开如下页面:

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。

    其中,这些参数说明在微信JSSDK说明文档里面都有说明,如下图:

     配置好参数后,进入这个页面微信会返回code在回调的url里给我们:

    然后,我们只需去url里截取这个code即可,但是我们发现这个code并不是跟在url的最后面,所以一开始我用vue的this.$route.query.code方法行不通,得用js进行截取,以下是我的代码:

    methods: {
    getCode () { // 非静默授权,第一次有弹框
                    this.code = ''
                    var local = window.location.href // 获取页面url
                    var appid = 'wx65adcf075369****' 
                    this.code = this.getUrlCode().code // 截取code
                    if (this.code == null || this.code === '') { // 如果没有code,则去请求
                        window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${encodeURIComponent(local)}&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect`
                    } else {
                        // 你自己的业务逻辑
                    }
                },
    getUrlCode() { // 截取url中的code方法
                    var url = location.search
                    this.winUrl = url
                    var theRequest = new Object()
                    if (url.indexOf("?") != -1) {
                        var str = url.substr(1)
                        var strs = str.split("&")
                        for(var i = 0; i < strs.length; i ++) {
                            theRequest[strs[i].split("=")[0]]=(strs[i].split("=")[1])
                        }
                    }
                    return theRequest
                }
    }

    我的代码逻辑是先判断有没有code,没有才去获取,encodeURIComponent(),是对回调url进行编码,这个微信JSSDK说明文档里面都有说明。拿到code以后,传给后台,让后台去获取用户信息再传给前端。我们拿到用户信息后,比如openId,头像等,可以用localStorage缓存起来,这样就不用每次都去请求code,每次都去后台拿信息了。所以,我们可以在mounted钩子函数里面这样处理:

    mounted() {
            if(!window.localStorage.getItem('openId')){ // 如果缓存localStorage中没有微信openId,则需用code去后台获取
                this.getCode()
            } else {
                // 别的业务逻辑
            }
        }
    
     
    展开全文
  • 微信授权登录并获取用户信息接口开发  近排在做微信接口开发,所以总结一下微信授权登录并获取用户信息 这个接口的开发流程。 一、首先你的微信公众号要获得相应的AppID和AppSecret,申请微信登录且通过...

    微信授权登录并获取用户信息接口开发

      近排在做微信接口开发,所以总结一下微信授权登录并获取用户信息 这个接口的开发流程。

    一、首先你的微信公众号要获得相应的AppID和AppSecret,申请微信登录且通过审核后,才可开始接入流程。

    二、授权流程

    1、流程说明

     

    (1). 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

     

     

    (2). 通过code参数加上AppID和AppSecret等,通过API换取access_token;

     

    (3). 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

    2、获取access_token时序图:

    三、开发(我的用是CI框架,其实用什么框架都一样,MVC模式就行了)

    1、请求CODE

      weixin.php

    复制代码
     1 <?php
     2     class weixinController extends CI_Controller {
     3         public $userInfo;
     4         public $wxId;
     5 
     6 
     7         public function __construct(){
     8             parent::__construct();
     9 
    10             //只要用户一访问此模块,就登录授权,获取用户信息
    11             $this->userInfo = $this->getWxUserInfo();
    12         }
    13     
    14 
    15         /**
    16          * 确保当前用户是在微信中打开,并且获取用户信息
    17          *
    18          * @param string $url 获取到微信授权临时票据(code)回调页面的URL
    19          */
    20         private function getWxUserInfo($url = '') {
    21             //微信标记(自己创建的)
    22             $wxSign = $this->input->cookie('wxSign');
    23             //先看看本地cookie里是否存在微信唯一标记,
    24             //假如存在,可以通过$wxSign到redis里取出微信个人信息(因为在第一次取到微信个人信息,我会将其保存一份到redis服务器里缓存着)
    25             if (!empty($wxSign)) {
    26                 //如果存在,则从Redis里取出缓存了的数据
    27                 $userInfo = $this->model->redisCache->getData("weixin:sign_{$wxSign}");
    28                 if (!empty($userInfo)) {
    29                     //获取用户的openid
    30                     $this->wxId = $userInfo['openid'];
    31                     //将其存在cookie里
    32                     $this->input->set_cookie('wxId', $this->wxId, 60*60*24*7);
    33                     return $userInfo;
    34                 }
    35             }
    36 
    37             //获取授权临时票据(code)
    38             $code = $_GET['code'];
    39             if (empty($code)) {
    40                 if (empty($url)) {
    41                     $url = rtirm($_SERVER['QUERY_STRING'], '/');
    42                     //到WxModel.php里获取到微信授权请求URL,然后redirect请求url
    43                     redirect($this->model->wx->getOAuthUrl(baseUrl($url)));
    44                 }
    45             }
    46 
    47 
    48         }
    49 
    50 
    51 
    52 
    53 
    54 
    55 
    56 
    57 
    58 
    59 
    60 
    61     }
    62 ?>
    复制代码

       Wxmodel.php

    复制代码
     1 <?php
     2     class WxModel extends ModelBase{
     3         public $appId;
     4         public $appSecret;
     5         public $token;
     6 
     7         public function __construct() {
     8             parent::__construct();
     9 
    10             //审核通过的移动应用所给的AppID和AppSecret
    11             $this->appId = 'wx0000000000000000';
    12             $this->appSecret = '00000000000000000000000000000';
    13             $this->token = '00000000';
    14         }
    15 
    16         /**
    17          * 获取微信授权url
    18          * @param string 授权后跳转的URL
    19          * @param bool 是否只获取openid,true时,不会弹出授权页面,但只能获取用户的openid,而false时,弹出授权页面,可以通过openid获取用户信息
    20          *   
    21         */
    22        public function getOAuthUrl($redirectUrl, $openIdOnly, $state = '') {
    23         $redirectUrl = urlencode($redirectUrl);
    24         $scope = $openIdOnly ? 'snsapi_base' : 'snsapi_userinfo';
    25         $oAuthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->appId}&redirect_uri={$redirectUrl}&response_type=code&scope=$scope&state=$state";
    26         return $oAuthUrl;
    27        }
    复制代码

     

    这里附上请求参数说明和返回值说明

      请求参数说明:

     

      响应返回值说明:

     

      当请求成功,会redirect到请求参数中的redirect_uri的值中去,其实又回到weixin.php的$this->userInfo = $this->getWxUserInfo();这行去,然后再一次进入到getWxUserInfo()方法,此时

    1
    2
    //获取授权临时票据(code)
    $code $_GET['code'];

     这行也已经能获取得到code的值了。接着进行第二步。

     

    2、通过code获取access_token

      weixin.php

    复制代码
     1 <?php
     2     class weixinController extends CI_Controller {
     3         public $userInfo;
     4         public $wxId;
     5 
     6 
     7         public function __construct(){
     8             parent::__construct();
     9 
    10             //只要用户一访问此模块,就登录授权,获取用户信息
    11             $this->userInfo = $this->getWxUserInfo();
    12         }
    13     
    14 
    15         /**
    16          * 确保当前用户是在微信中打开,并且获取用户信息
    17          *
    18          * @param string $url 获取到微信授权临时票据(code)回调页面的URL
    19          */
    20         private function getWxUserInfo($url = '') {
    21             //微信标记(自己创建的)
    22             $wxSign = $this->input->cookie('wxSign');
    23             //先看看本地cookie里是否存在微信唯一标记,
    24             //假如存在,可以通过$wxSign到redis里取出微信个人信息(因为在第一次取到微信个人信息,我会将其保存一份到redis服务器里缓存着)
    25             if (!empty($wxSign)) {
    26                 //如果存在,则从Redis里取出缓存了的数据
    27                 $userInfo = $this->model->redisCache->getData("weixin:sign_{$wxSign}");
    28                 if (!empty($userInfo)) {
    29                     //获取用户的openid
    30                     $this->wxId = $userInfo['openid'];
    31                     //将其存在cookie里
    32                     $this->input->set_cookie('wxId', $this->wxId, 60*60*24*7);
    33                     return $userInfo;
    34                 }
    35             }
    36 
    37             //获取授权临时票据(code)
    38             $code = $_GET['code'];
    39             if (empty($code)) {
    40                 if (empty($url)) {
    41                     $url = rtirm($_SERVER['QUERY_STRING'], '/');
    42                     //到WxModel.php里获取到微信授权请求URL,然后redirect请求url
    43                     redirect($this->model->wx->getOAuthUrl(baseUrl($url)));
    44                 }
    45             }
    46             /***************这里开始第二步:通过code获取access_token****************/
    47             $result = $this->model->wx->getOauthAccessToken($code);
    48 
    49             //如果发生错误
    50             if (isset($result['errcode'])) {
    51                 return array('msg'=>'授权失败,请联系客服','result'=>$result);
    52             }
    53 
    54             //到这一步就说明已经取到了access_token
    55             $this->wxId = $result['openid'];
    56             $accessToken = $result['access_token'];
    57             $openId = $result['openid'];
    58 
    59             //将openid和accesstoken存入cookie中
    60             $this->input->set_cookie('wx_id', $this->wxId, 60*60*24*7);
    61             $this->input->set_cookie('access_token', $accessToken);
    复制代码

      WxModel.php

    复制代码
     1 <?php
     2     class WxModel extends ModelBase{
     3         public $appId;
     4         public $appSecret;
     5         public $token;
     6 
     7         public function __construct() {
     8             parent::__construct();
     9 
    10             //审核通过的移动应用所给的AppID和AppSecret
    11             $this->appId = 'wx0000000000000000';
    12             $this->appSecret = '00000000000000000000000000000';
    13             $this->token = '00000000';
    14         }
    15 
    16 
    17         /**
    18          * 获取微信授权url
    19          * @param string 授权后跳转的URL
    20          * @param bool 是否只获取openid,true时,不会弹出授权页面,但只能获取用户的openid,而false时,弹出授权页面,可以通过openid获取用户信息
    21          *   
    22         */
    23         public function getOAuthUrl($redirectUrl, $openIdOnly, $state = '') {
    24             $redirectUrl = urlencode($redirectUrl);
    25             $scope = $openIdOnly ? 'snsapi_base' : 'snsapi_userinfo';
    26             $oAuthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->appId}&redirect_uri={$redirectUrl}&response_type=code&scope=$scope&state=$state#wechat_redirect";
    27             return $oAuthUrl;
    28         }
    29 
    30 
    31         /**
    32         * 获取access_token
    33         */
    34         public function getoAuthAccessToken($code) {
    35             return json_decode(file_get_contents("https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->AppId}&secret={$this->AppSecret}&code={$authCode}&grant_type=authorization_code",true);
    36         }
    复制代码

    这里附上参数说明

      请求参数说明:

     

      响应返回值说明:

      当返回错误时是这样子的:

     

    3、通过access_token调用接口(获取用户信息)
      获取access_token后,进行接口调用,有以下前提:

      (1)access_tokec有效且未超时;

      (2)微信用户已授权给第三方应用账号相应的接口作用域(scope)。

      

      以下是获取用户信息的代码

      weixin.php

    复制代码
     1 <?php
     2     class weixinController extends CI_Controller {
     3         public $userInfo;
     4         public $wxId;
     5 
     6 
     7         public function __construct(){
     8             parent::__construct();
     9 
    10             //只要用户一访问此模块,就登录授权,获取用户信息
    11             $this->userInfo = $this->getWxUserInfo();
    12         }
    13     
    14 
    15         /**
    16          * 确保当前用户是在微信中打开,并且获取用户信息
    17          *
    18          * @param string $url 获取到微信授权临时票据(code)回调页面的URL
    19          */
    20         private function getWxUserInfo($url = '') {
    21             //微信标记(自己创建的)
    22             $wxSign = $this->input->cookie('wxSign');
    23             //先看看本地cookie里是否存在微信唯一标记,
    24             //假如存在,可以通过$wxSign到redis里取出微信个人信息(因为在第一次取到微信个人信息,我会将其保存一份到redis服务器里缓存着)
    25             if (!empty($wxSign)) {
    26                 //如果存在,则从Redis里取出缓存了的数据
    27                 $userInfo = $this->model->redisCache->getData("weixin:sign_{$wxSign}");
    28                 if (!empty($userInfo)) {
    29                     //获取用户的openid
    30                     $this->wxId = $userInfo['openid'];
    31                     //将其存在cookie里
    32                     $this->input->set_cookie('wxId', $this->wxId, 60*60*24*7);
    33                     return $userInfo;
    34                 }
    35             }
    36 
    37             //获取授权临时票据(code)
    38             $code = $_GET['code'];
    39             if (empty($code)) {
    40                 if (empty($url)) {
    41                     $url = rtirm($_SERVER['QUERY_STRING'], '/');
    42                     //到WxModel.php里获取到微信授权请求URL,然后redirect请求url
    43                     redirect($this->model->wx->getOAuthUrl(baseUrl($url)));
    44                 }
    45             }
    46             /***************这里开始第二步:通过code获取access_token****************/
    47             $result = $this->model->wx->getOauthAccessToken($code);
    48 
    49             //如果发生错误
    50             if (isset($result['errcode'])) {
    51                 return array('msg'=>'授权失败,请联系客服','result'=>$result);
    52             }
    53 
    54             //到这一步就说明已经取到了access_token
    55             $this->wxId = $result['openid'];
    56             $accessToken = $result['access_token'];
    57             $openId = $result['openid'];
    58 
    59             //将openid和accesstoken存入cookie中
    60             $this->input->set_cookie('wx_id', $this->wxId, 60*60*24*7);
    61             $this->input->set_cookie('access_token', $accessToken);
    62 
    63             /*******************这里开始第三步:通过access_token调用接口,取出用户信息***********************/
    64             $this->userInfo = $this->model->wx->getUserInfo($openId, $accessToken);
    65 
    66             //自定义微信唯一标识符
    67             $wxSign =substr(md5($this->wxId.'k2a5dd'), 8, 16);
    68             //将其存到cookie里
    69             $this->input->set_cookie('wxSign', $wxSign, 60*60*24*7);
    70             //将个人信息缓存到redis里
    71             $this->library->redisCache->set("weixin:sign_{$wxSign}", $userInfo, 60*60*24*7);
    72             return $userInfo;
    73         }
    74 
    75 
    76 
    77 
    78 
    79 
    80 
    81 
    82 
    83 
    84 
    85 
    86     }
    87 ?>
    复制代码

      WxModel.php

    复制代码
      1 <?php
      2     class WxModel extends ModelBase{
      3         public $appId;
      4         public $appSecret;
      5         public $token;
      6 
      7         public function __construct() {
      8             parent::__construct();
      9 
     10             //审核通过的移动应用所给的AppID和AppSecret
     11             $this->appId = 'wx0000000000000000';
     12             $this->appSecret = '00000000000000000000000000000';
     13             $this->token = '00000000';
     14         }
     15 
     16 
     17         /**
     18          * 获取微信授权url
     19          * @param string 授权后跳转的URL
     20          * @param bool 是否只获取openid,true时,不会弹出授权页面,但只能获取用户的openid,而false时,弹出授权页面,可以通过openid获取用户信息
     21          *   
     22         */
     23         public function getOAuthUrl($redirectUrl, $openIdOnly, $state = '') {
     24             $redirectUrl = urlencode($redirectUrl);
     25             $scope = $openIdOnly ? 'snsapi_base' : 'snsapi_userinfo';
     26             $oAuthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->appId}&redirect_uri={$redirectUrl}&response_type=code&scope=$scope&state=$state#wechat_redirect";
     27             return $oAuthUrl;
     28         }
     29 
     30 
     31         /**
     32         * 获取access_token
     33         */
     34         public function getoAuthAccessToken($code) {
     35             return json_decode(file_get_contents("https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->AppId}&secret={$this->AppSecret}&code={$authCode}&grant_type=authorization_code",true);
     36         }
     37 
     38         /**
     39         * 获取用户信息  
     40         */
     41         public function getUserInfo($openId, $accessToken) {
     42             $url = 'https://api.weixin.qq.com/sns/userinfo';
     43             //获取用户微信账号信息
     44             $userInfo = $this->callApi("$url?access_token=$accessToken&openid=$openId&lang=zh-CN");
     45 
     46             if ($userInfo['errcode']) {
     47                 return array('msg'=>'获取用户信息失败,请联系客服', $userInfo);
     48             }
     49 
     50             $userInfo['wx_id'] = $openId;
     51 
     52             return $userInfo;
     53         }
     54 
     55         /**
     56          * 发起Api请求,并获取返回结果
     57          * @param string 请求URL
     58          * @param mixed 请求参数 (array|string)
     59          * @param string 请求类型 (GET|POST)
     60          * @return array        
     61          */
     62         public function callApi($apiUrl, $param = array(), $method = 'GET') {
     63             $result = curl_request_json($error, $apiUrl, $params, $method);
     64             //假如返回的数组有错误码,或者变量$error也有值
     65             if (!empty($result['errcode'])) {
     66                 $errorCode = $result['errcode'];
     67                 $errorMsg = $result['errmsg'];
     68             } else if ($error != false) {
     69                 $errorCode = $error['errorCode'];
     70                 $errorMsg = $error['errorMessage'];
     71             }
     72 
     73             if (isset($errorCode)) {
     74                 //将其插入日志文件
     75                 file_put_contents("/data/error.log", "callApi:url=$apiUrl,error=[$errorCode]$errorMsg");
     76 
     77                 if ($errorCode === 40001) {
     78                     //尝试更正access_token后重试
     79                     try {
     80                         $pos = strpos(strtolower($url), 'access_token=');
     81                         if ($pos !==false ) {
     82                             $pos += strlen('access_token=');
     83                             $pos2 = strpos($apiUrl, '&' ,$pos);
     84                             $accessTokened = substr($apiUrl, $pos, $pos2 === false ? null : ($pos2 - $pos));
     85                             return $this->callApi(str_replace($accessTokened, $this->_getApiToken(true), $apiUrl), $param, $method);
     86                         }
     87                     }catch (WeixinException $e) { 
     88 
     89                     }
     90                 }
     91                 //这里抛出异常,具有的就不详说了
     92                 throw new WeixinException($errorMessage, $errorCode);
     93             }
     94             return $result;
     95         }
     96 
     97         /**
     98         * 获取微信 api 的 access_token 。 不同于 OAuth 中的 access_token ,参见  http://mp.weixin.qq.com/wiki/index.php?title=%E8%8E%B7%E5%8F%96access_token
     99         *
    100         * @param bool 是否强制刷新 accessToken
    101         */
    102         private function _getApiToken($forceRefresh = false) {
    103             //先查看一下redis里是否已经缓存过access_token
    104             $accessToken = $this->library->redisCache->get('Weixin:AccessToken');
    105             if($forceRefresh || empty($accessToken)) {
    106                 $result = $this->callApi("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appId}&secret={$this->appSecret}");
    107                 $accessToken = $result['access_token'];
    108                 $expire = max(1, intval($result['expires_in']) - 60);
    109                 //将access_token缓存到redis里去
    110                 $this->library->redisCache->set('Weixin:AccessToken', $accessToken, $expire);
    111             }
    112             return $accessToken;
    113         }
    114 
    115 
    116 
    117 
    118 
    119 
    120 
    121 ?>
    复制代码

      Common.php

    复制代码
      1 <?php
      2     /**
      3      *   发起一个HTTP(S)请求,并返回json格式的响应数据
      4      *   @param array 错误信息  array($errorCode, $errorMessage)
      5      *   @param string 请求Url
      6      *   @param array 请求参数
      7      *   @param string 请求类型(GET|POST)
      8      *   @param int 超时时间
      9      *   @param array 额外配置
     10      *   
     11      *   @return array
     12      */ 
     13     public function curl_request_json(&$error, $url, $param = array(), $method = 'GET', $timeout = 10, $exOptions = null) {
     14         $error = false;
     15         $responseText = curl_request_text($error, $url, $param, $method, $timeout, $exOptions);
     16         $response = null;
     17         if ($error == false && $responseText > 0) {
     18             $response = json_decode($responseText, true);
     19 
     20             if ($response == null) {
     21                 $error = array('errorCode'=>-1, 'errorMessage'=>'json decode fail', 'responseText'=>$responseText);
     22                 //将错误信息记录日志文件里
     23                 $logText = "json decode fail : $url";
     24                 if (!empty($param)) {
     25                     $logText .= ", param=".json_encode($param);
     26                 }
     27                 $logText .= ", responseText=$responseText";
     28                 file_put_contents("/data/error.log", $logText);
     29             }
     30         }
     31         return $response;
     32     }
     33 
     34     /**
     35     *  发起一个HTTP(S)请求,并返回响应文本
     36     *   @param array 错误信息  array($errorCode, $errorMessage)
     37     *   @param string 请求Url
     38     *   @param array 请求参数
     39     *   @param string 请求类型(GET|POST)
     40     *   @param int 超时时间
     41     *   @param array 额外配置
     42     *   
     43     *   @return string
     44     */
     45     public function curl_request_text(&$error, $url, $param = array(), $method = 'GET', $timeout = 15, $exOptions = NULL) {
     46         //判断是否开启了curl扩展
     47         if (!function_exists('curl_init')) exit('please open this curl extension');
     48 
     49         //将请求方法变大写
     50         $method = strtoupper($method);
     51 
     52         $ch = curl_init();
     53         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
     54         curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
     55         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     56         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
     57         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
     58         curl_setopt($ch, CURLOPT_HEADER, false);
     59         if (isset($_SERVER['HTTP_USER_AGENT'])) curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
     60         if (isset($_SERVER['HTTP_REFERER'])) curl_setopt($ch, CURLOPT_REFERER, $_SERVER['HTTP_REFERER']);
     61         curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
     62         switch ($method) {
     63             case 'POST':
     64                 curl_setopt($ch, CURLOPT_POST, true);
     65                 if (!empty($param)) {
     66                     curl_setopt($ch, CURLOPT_POSTFIELDS, (is_array($param)) ? http_build_query($param) : $param);
     67                 }
     68                 break;
     69             
     70             case 'GET':
     71             case 'DELETE':
     72                 if ($method == 'DELETE') {
     73                     curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
     74                 }
     75                 if (!empty($param)) {
     76                     $url = $url.(strpos($url, '?') ? '&' : '?').(is_array($param) ? http_build_query($param) : $param);
     77                 }
     78                 break;
     79         }
     80         curl_setopt($ch, CURLINFO_HEADER_OUT, true);
     81         curl_setopt($ch, CURLOPT_URL, $url);
     82         //设置额外配置
     83         if (!empty($exOptions)) {
     84             foreach ($exOptions as $k => $v) {
     85                 curl_setopt($ch, $k, $v);
     86             }
     87         }
     88         $response = curl_exec($ch);
     89 
     90         $error = false;
     91         //看是否有报错
     92         $errorCode = curl_errno($ch);
     93         if ($errorCode) {
     94             $errorMessage = curl_error($ch);
     95             $error = array('errorCode'=>$errorCode, 'errorMessage'=>$errorMessage);
     96             //将报错写入日志文件里
     97             $logText = "$method $url: [$errorCode]$errorMessage";
     98             if (!empty($param)) $logText .= ",$param".json_encode($param);
     99             file_put_contents('/data/error.log', $logText);
    100         }
    101 
    102         curl_close($ch);
    103 
    104         return $response;
    105 
    106 
    107 
    108     }
    109 
    110 
    111 
    112 
    113 
    114 
    115 
    116 
    117 
    118 
    119 
    120 
    121 
    122 ?>
    复制代码

      

      通过以上三步调用接口,就可以获取到用户的微信账号信息了。

      大家可以认真看看代码, 里面很多地方我都带上了注释,很容易理解。希望想学习的朋友可以认真看看。

      

     

      如果此博文有哪里讲得让人难以理解的,欢迎留言交流,如文章有解释出的地方,欢迎指出。

      

      如果您觉得能在此博文学到新知识,请在下方为我顶一个,如文章有解释错的地方,欢迎指出。

       互相学习,共同进步!

     

    展开全文
  • 先用微信sdk的定位功能,获取用户的经纬度  2.把经纬度通过百度地图接口转换经纬度  3.通过百度地图接口,通过转换后的经纬度获取对应的位置信息 一.微信公众好SDK使用 步骤一:绑定域名 先登录微信公众...
  • 小程序可以通过两种方式获取用户信息,并且获取信息之后,推荐直接存到小程序的全局变量中,后续直接在全局变量中读取,无需在重新获取。 方法一: 使用 appId 新建小程序模板,在创建时,勾选中“建立普通...
  • 前端微信h5开发

    2019-02-11 15:28:40
    需要获取微信用户头像、性别、昵称需要获取微信用户头像、性别、昵称 测试结果需要生成图片,用户可直接长按保存图片 分享 首先说下前两点: 申请公众号(需要公众平台的账号密码) 需要注册成为当前该...
  • 并且需要先获取到全局access_token,这里不对全局access_token的获取做详细讲解,可以参考微信公众号开发文档获取,access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。...
  • 近来,倒霉的后台跟我说让我拿个openid做微信支付使用,寻思很简单,开始干活。 首先引导用户打开如下链接,只需要将appid修改为自己的就可以,redirect_url写你的重定向url ...redirect_uri=REDIRECT_URI&...
  • 参考 https://blog.csdn.net/qq_35430000/article/details/79299529 转载于:https://www.cnblogs.com/lizihao/p/10339886.html
  • 如果用户微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。1. 关于OAuth2.0的说明官方网站:http://oauth.net/  http://oauth.net/2/权威定义:OAuth is An ...
  • 前几天做了一个H5页面项目,它是依托于微信服务号的网页....两个的区别是scope属性的属性值不同,scope= scopr_base是静默授权也就是不弹出页面,直接获取用户信息,scope=scope_userinfo是非静默授权,用户需要同意...
  • 微信H5授权获取code,拿取用户信息 ##如果用户微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。 这是微信给的说明文档,但实际上,我们首先要做的是去微信...
  • 如果用户微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。拉取用户信息所需步骤如下: 引导用户进入授权同意页面同意授权,获取code。 通过code换取网页...
  • 最近公司需要做一个微信公众号,作为一个前端,我首当其冲,首先需要做一个 “微信和系统用户绑定”的功能;主要步骤为: 1.获取微信openid; 2.通过openid获取用户信息;无用户信息需要绑定 3.输入手机并确认...
  • 微信中访问一些HTML5网页时,我们常看到是否允许访问用户公开信息的提示。如果用户点击“允许”,网页就可以获取用户的头像以及昵称等信息。 如果把在网址拷贝出来,然后在非微信环境打开,就会看到“请在...
  • 这几天在做一个公司的项目 h5的微信开发项目,碰到一个微信的授权之后从后台获取openid 保存cookie,当用户点击微信自带浏览器返回首页之后的问题。前提条件:a.微信正确之后会返回code 值,前端通过将code值返回...
  • 目录 ...【微信开发】常见的openid/unionid/session_key/access_token究竟是个啥? 官方API文档:微信网页开发-网页授权 1.开发前准备工作 开发前的准备工作很简单,登录微信公众号后台 ...
  • springboot项目,h5页面通过微信公众号获取微信用户信息 最近本人有一个项目需求,微信公众号里点击一个菜单进入一个商城购物系统。 对于在微信公众号还是小白的我来说难度有点大,但是做完后发现也就这样,用多了就...
1 2 3 4 5 ... 20
收藏数 16,879
精华内容 6,751