首页 > 程序开发 > 微信开发 > 微信开发之获取openid
网站建设、切图、企业建站、微信开发 联系QQ:404658186 tel:18716186715
2015
08-06

微信开发之获取openid

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

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

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

2、进入开发者中心

QQ截图20150806085225

点击“修改”

QQ截图20150806085334

 

这里填写你的域名,如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。

请求方法

获取code后,请求以下链接获取access_token: 
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数据包如下:

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

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

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

一个获取openid的函数,公供参考。

function GetUserOpenid($uri,$appid,$appsecret){

        if(!isset($uri) && !isset($appid)){
            return false;
            exit;
        }

        if(session('wx_openid')){
            if(isset($_GET['code'])){
                //code参数已有,获取openid;  
                $url_get='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$appsecret.'&code='.$_GET['code'].'&grant_type=authorization_code';
                $res=json_decode(curlGet($url_get));
                session('wx_openid',$res->openid);//保存openid。
                header("location:".$uri); //获取openid后跳转到指定页面。
            }else{
                //无code参数,先获取code
                $uri=urlencode($uri);//这里需要urlencode一下
                $redurl='https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri='.$uri.'&response_type=code&scope=snsapi_base&state=0101010#wechat_redirect'; 
                header("location:".$redurl);
            }
        }
    }

这里的openid已经保存到session中,你可以直接取出使用,php的curl请参考php-curl

最后编辑:
作者:码农一号
这个作者貌似有点懒,什么都没有留下。
捐 赠如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!

留下一个回复

你的email不会被公开。

*