微信网页授权_微信公众号网页授权 - CSDN
  • 微信登录测试公众号...[外链图片转存失败(img-wdxQ6mON-1562227242378)(./images/problemRecord/img1.png “修改网页授权获取用户基本信息接口”)] 修改OAuth2.0网页授权 [外链图片转存失败(img-DI38A2Uw-156...
    1. 用微信登录测试公众号平台

    地址:微信公众平台

    1. 用微信扫描二维码关注测试公众号

    2. 修改网页授权获取用户基本信息接口,如图:

      修改网页授权获取用户基本信息接口

    3. 修改OAuth2.0网页授权

      修改OAuth2.0网页授权

    注意:
    不能有http:// 等协议头;

    地址是项目的地址,开发时测试用的就是项目启动后那个页面的地址,上线后就是线上页面的地址,还要注意下面的回调的页面地址要在这个地址的域名下,

    如;当前地址是10.88.32.55:8080,回调的地址就可以是http://10.88.32.55:8080/aa.html, http://10.88.32.55:8080/bb/cc.html

    1. 代码实现网页授权,拿到用户code
      const AppId = 'wx0d9cdf54debed1ce';  // 测试公众号平台的APPID,第1步那个链接里
      const { code = '' } = qs.parse(window.location.search); // 获取当前页面地址中的code参数的值
      const local = (window.location.href);  // 对当前地址用encodeURIComponent进行编码
    
      // 如果code是'',说明还没有授权,访问下面连接,用户同意授权,获取code
      if (code === '') {
        window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${AppId}
        &redirect_uri=${local}&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect`;
      } else {
        this.weixinCode = code;  // 能拿到code,说明用户已同意授权,拿到coed
        console.log('获取微信code:', this.weixinCode);
      }
    

    参考链接: 参考

    注:redirect_uri等于的这个参数是授权后回调的页面地址,这个回调后的地址,必须要在AppId等于的这个测试公众号下设置的那个授权回调页面域名的域名下才行(上面3.4步)

    本地测试时,AppId设置成自己的微信申请的测试公众号AppId,公众号上面设置的地址是(10.88.32.55:8080),这个时候,第一次访问当前页面(http://10.88.32.55:8080),由于没有code,先去访问https://open.weixin.qq.com/connect/oauth2/authorize?appid=${AppId} &redirect_uri=${local}&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect这个页面拿到code,回调的是当前页面地址,即http://10.88.32.55:8080,在设置的授权回调页面域名的域名下,所以不会报 “redirect_uri参数错误”的错

    同理,上线时,AppId需要换成上线的那个AppId,这里的回调地址是进入页面的当前地址,但这时的地址不再是开发时本地测试的那个地址了,所以需要在上线的那个AppId的公众平台上重新设置授权回调页面域名,保证回调的地址在这个设置的这个地址域名下,就不会报错了

    如:当忘记改AppId,此时还是在用自己本地开发测试时的AppId(设置的授权回调页面域名还是10.88.32.55:8080),但是上线了,上线后回调的地址不再是http://10.88.32.55:8080,而是上线后的地址,此时这个地址已经不在10.88.32.55:8080域名下了,所以就会报“redirect_uri参数错误”的错

    这里可能有点绕,如果是下次看到,记得多读两次,始终注意这一句话redirect_uri等于的回调地址,要在代码中设置的 Appid这个公众号中 设置的授权回调页面域名 的域名下


    附:

    做web前端开发写微信浏览器上浏览的页面时,很多时候会要求只能在微信端访问页面,
    或者比如说访问上面的获取code的这个链接(这个链接只能在微信端访问,在其他浏览器上访问会提示用户在微信端访问而不是打开访问的页面)

    这种情况下,开发时就没法用PC端的浏览器来调试了,如何做到能在PC端调试页面,这时就可以使用微信web开发者工具来调试,在PC端模拟微信访问

    下载地址:微信web开发者工具

    本地开发测试时,第5步的Appid用的是谁的微信号申请的测试公众号Appid,登录微信web开发者工具就用这个的微信号登录,不然会报错,错误提示好像是“未关注该测试号”,好像是这个

    如果是只是调试公众号的页面,最好下载微信web开发者工具,而不是微信开发者工具,虽然微信开发者工具还能调试小程序等,但是用它来调试公众号页面,点击页面时是错位的,根本没法用,如果即想调试公众号页面,又要调试小程序,还是用微信开发者工具吧

    下载地址:微信开发者工具

    一个折中的办法:用微信开发者工具想要调试公众号的一些页面,有些不要求只能在微信上访问的页面,可以点击在浏览器上访问,然后在本地的浏览器上进行调试

    展开全文
  • 微信公众平台开发之微信网页授权开发是子恒老师《微信公众平台开发》视频教程的第10部。详细讲解了用php进行微信网页授的开发。内容包含构造授权uri,实现网页授权,优化微信网页授,获取用户信息等等。
  • 微信网页授权登录

    2016-11-17 14:00:28
    微信网页授权登录 日期:2016-11-14 作者:normanyang 功能:用于纪录微信网页授权步骤(前提条件:公众号为服务号,且通过认证) 微信网页授权api说明网址:...

    微信网页授权登录

    日期:2016-11-14

    作者:normanyang

    功能:用于纪录微信网页授权步骤(前提条件:公众号为服务号,且通过认证)

    微信网页授权api说明网址:https://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html

    相关说明:目前微信api有两种方式获取用户信息。第一种是用户管理获取用户基本信息(包括UnionID机制),这个前提是用户必须事先已经关注公众号,通过获取基础access_token和openID来获取用户信息。第二种是以snsapi_userinfo为scope发起的网页授权,来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

    一、什么是OAuth2.0

    OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站、移动或桌面应用上存储的私密的资源(如用户个人信息、照片、视频、联系人列表),而无需将用户名和密码提供给第三方应用。

    OAuth 2.0OAuth协议的下一版本,但不向后兼容OAuth 1.0 OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。

    OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。

    二、微信公众平台OAuth2.0授权

    微信公众平台OAuth2.0授权详细步骤如下:

    1. 引导用户进入授权页面

    2. 用户点击授权页面URL,将向服务器发起请求

    3. 服务器询问用户是否同意授权给微信公众账号(scopesnsapi_base时无此步骤)

    4. 用户同意(scopesnsapi_base时无此步骤)

    5. 服务器将CODE通过回调传给微信公众账号

    6. 微信公众账号获得CODE

    7. 微信公众账号通过CODE向服务器请求Access Token

    8. 服务器返回Access TokenOpenID给微信公众账号

    9. 微信公众账号通过Access Token向服务器请求用户信息(scopesnsapi_base时无此步骤)

    10. 服务器将用户信息回送给微信公众账号(scopesnsapi_base时无此步骤)


    使用的AppIdAppSecret在公众平台基本配置中,可以找到。


    如果用户在微信中(Web微信除外)访问公众号的第三方网页,公众号开发者可以通过此接口获取当前用户基本信息(包括昵称、性别、城市、国家)。利用用户信息,可以实现体验优化、用户来源统计、帐号绑定、用户身份鉴权等功能。请注意,“获取用户基本信息接口是在用户和公众号产生消息交互时,才能根据用户OpenID获取用户基本信息,而网页授权的方式获取用户基本信息,则无需消息交互,只是用户进入到公众号的网页,就可弹出请求用户授权的界面,用户授权后,就可获得其基本信息(此过程甚至不需要用户已经关注公众号。)”

    在微信公众号请求用户网页授权之前,开发者需要先到公众平台网站的我的服务页中配置授权回调域名。请注意,这里填写的域名不要加http://


    配置授权回调页面域名

    点击右侧的修改。


    授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 

    http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权

     

    具体而言,网页授权流程分为四步:

    1   、引导用户进入授权页面同意授权,获取code

    2 、通过code换取网页授权access_token(与基础支持中的access_token不同)

    3 、如果需要,开发者可以刷新网页授权access_token,避免过期

    4、通过网页授权access_token和openid获取用户基本信息

    下面详细说明这些步骤:

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

    在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认带有scope参数中的snsapi_base和snsapi_userinfo),

    引导关注者打开如下页面:

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect (若提示“该链接无法访问”,

    请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。)

    参数说明:

    参数

    是否必须

    说明

    appid

    公众号的唯一标识

    redirect_uri

    授权后重定向的回调链接地址,请使用urlencode对链接进行处理

    response_type

    返回类型,请填写code

    scope

    应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息

    state

    重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值

    #wechat_redirect

    无论直接打开还是做页面302重定向时候,必须带此参数

    用户同意授权后

    如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。若用户禁止授权,则重定向后不会带上code参数,

    仅会带上state参数redirect_uri?state=STATE

    code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

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

    首先请注意,这里通过code换取的网页授权access_token,与基础支持中的access_token不同。公众号可通过下述接口来获取网页授权access_token。

    如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。

    获取code后,请求以下链接获取,请求方法:GET

    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"

    }

    参数

    描述

    access_token

    网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同

    expires_in

    access_token接口调用凭证超时时间,单位(秒)

    refresh_token

    用户刷新access_token

    openid

    用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID

    scope

    用户授权的作用域,使用逗号(,)分隔

     

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

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

    第三步:刷新access_token(如果需要)

    由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token拥有较长的有效期(7天、30天、60天、90天),当refresh_token失效的后,需要用户重新授权。

    请求方法:GET

    获取第二步的refresh_token后,请求以下链接获取access_token:  https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

     

    参数

    是否必须

    说明

    appid

    公众号的唯一标识

    grant_type

    填写为refresh_token

    refresh_token

    填写通过access_token获取到的refresh_token参数

    返回说明:

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

    {

      "access_token":"ACCESS_TOKEN",

       "expires_in":7200,

      "refresh_token":"REFRESH_TOKEN",

       "openid":"OPENID",

       "scope":"SCOPE"

    }

    参数

    描述

    access_token

    网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同

    expires_in

    access_token接口调用凭证超时时间,单位(秒)

    refresh_token

    用户刷新access_token

    openid

    用户唯一标识

    scope

    用户授权的作用域,使用逗号(,)分隔

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

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

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

    如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

    httpGET(请使用https协议)

    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

    注意:这里调用的接口千万不要用下面这个:

    http请求方式: GET

    https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN(这个接口是用基础access_tokenopenID

    获取用户信息,前提是用户必须已经关注该公众号)

    参数说明

    参数

    描述

    access_token

    网页授权接口调用凭证,注意:此access_token与基础支持的

    access_token不同

    openid

    用户的唯一标识

    lang

    返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

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

    {

       "openid":" OPENID",

       " nickname": NICKNAME,

       "sex":"1",

       "province":"PROVINCE"

       "city":"CITY",

       "country":"COUNTRY",

        "headimgurl":    "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",

         "privilege":[

         "PRIVILEGE1"

         "PRIVILEGE2"

        ],

        "unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"

    }

     

    参数

    描述

    openid

    用户的唯一标识

    nickname

    用户昵称

    sex

    用户的性别,值为1时是男性,值为2时是女性,值为0时是未知

    province

    用户个人资料填写的省份

    city

    普通用户个人资料填写的城市

    country

    国家,如中国为CN

    headimgurl

    用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。

    若用户更换头像,原有头像URL将失效。

    privilege

    用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)

    unionid

    只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:获取用户个人信息(UnionID机制)

     

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

    {"errcode":40003,"errmsg":"invalid openid "}

    展开全文
  • 微信网页授权登录demo

    2018-12-22 19:20:48
    第一步:用户同意授权,获取code ...在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面: ...

     

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

    在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:

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

    尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问

    参考链接(请在微信客户端中打开此链接体验):
    scope为snsapi_base
    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect
    scope为snsapi_userinfo
    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
    

    尤其注意:跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。

    参数说明

    参数 是否必须 说明
    appid 公众号的唯一标识
    redirect_uri 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
    response_type 返回类型,请填写code
    scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
    state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
    #wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

    用户同意授权后

    如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。

    code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
    

    错误返回码说明如下:

    返回码 说明
    10003 redirect_uri域名与后台配置不一致
    10004 此公众号被封禁
    10005 此公众号并没有这些scope的权限
    10006 必须关注此测试号
    10009 操作太频繁了,请稍后重试
    10010 scope不能为空
    10011 redirect_uri不能为空
    10012 appid不能为空
    10013 state不能为空
    10015 公众号未授权第三方平台,请检查授权状态
    10016 不支持微信开放平台的Appid,请使用公众号Appid

     

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

    首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。

    尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

    请求方法

    获取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" }
    
    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
    scope 用户授权的作用域,使用逗号(,)分隔

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

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

     

    第三步:刷新access_token(如果需要)

    由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。

    请求方法

    获取第二步的refresh_token后,请求以下链接获取access_token:
    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
    
    参数 是否必须 说明
    appid 公众号的唯一标识
    grant_type 填写为refresh_token
    refresh_token 填写通过access_token获取到的refresh_token参数

    返回说明

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

    { "access_token":"ACCESS_TOKEN",
    "expires_in":7200,
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID",
    "scope":"SCOPE" }
    
    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 用户唯一标识
    scope 用户授权的作用域,使用逗号(,)分隔

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

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

     

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

    如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

    请求方法

    http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
    

    参数说明

    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    openid 用户的唯一标识
    lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

    返回说明

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

    {    "openid":" OPENID",
    " nickname": NICKNAME,
    "sex":"1",
    "province":"PROVINCE"
    "city":"CITY",
    "country":"COUNTRY",
    "headimgurl":    "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
    "privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],
    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
    }
    
    参数 描述
    openid 用户的唯一标识
    nickname 用户昵称
    sex 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
    province 用户个人资料填写的省份
    city 普通用户个人资料填写的城市
    country 国家,如中国为CN
    headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
    privilege 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
    unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。

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

    {"errcode":40003,"errmsg":" invalid openid "}
    

     

    附:检验授权凭证(access_token)是否有效

    请求方法

    http:GET(请使用https协议) https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
    

    参数说明

    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    openid 用户的唯一标识

    返回说明
    正确的JSON返回结果:

    { "errcode":0,"errmsg":"ok"}
    

    错误时的JSON返回示例:

    { "errcode":40003,"errmsg":"invalid openid"}

     

    class weixin {
    
        private $token = '';
        private $appid = '';
        private $appkey = '';
        private $weObj = '';
    
        /**
         * 构造函数
         *
         * @param unknown $app            
         * @param string $access_token            
         */
        public function __construct($conf) {
            $this->token = $conf['token'];
            $this->appid = $conf['app_id'];
            $this->appsecret = $conf['app_secret'];
    
            $config['token'] = $this->token;
            $config['appid'] = $this->appid;
            $config['appsecret'] = $this->appsecret;
    
            $this->weObj = new Wechat($config);
        }
    
        /**
         * 授权登录地址
         */
        public function act_login($info, $url){
            // 微信浏览器浏览
            if (is_wechat_browser() && ($_SESSION['user_id'] === 0 || empty($_SESSION['openid']))) {
                return $this->weObj->getOauthRedirect($url, 1);
            }
            else{
                show_message("请在微信内访问或者已经登录。", L('relogin_lnk'), url('login', array(
                    'referer' => urlencode($this->back_act)
                        )), 'error');
            }
        }
    
        /**
         * 登录处理
         */
        public function call_back($info, $url, $code, $type){
            if (!empty($code)) {
                $token = $this->weObj->getOauthAccessToken();
                $userinfo = $this->weObj->getOauthUserinfo($token['access_token'], $token['openid']);
                $_SESSION['wechat_user'] = empty($userinfo) ? array() : $userinfo;
    			if(!empty($userinfo)){
    				//公众号信息
    				$wechat = model('Base')->model->table('wechat')->field('id, oauth_status')->where(array('type'=>2, 'status'=>1, 'default_wx'=>1))->find();
    				$this->update_weixin_user($userinfo, $wechat['id'], $this->weObj);
    			}else{
    				return false;
    			}
                if(!empty($_SESSION['redirect_url'])){
                    return array('url'=>$_SESSION['redirect_url']);
                }
                return true;
            } else {
                return false;
            }
        }
    
        /**
         * 更新微信用户信息
         *
         * @param unknown $userinfo          
         * @param unknown $weObj            
         */
        public function update_weixin_user($userinfo, $wechat_id = 0, $weObj)
        {
            $time = time();
            $ret = model('Base')->model->table('wechat_user')->field('openid, ect_uid')->where('openid = "' . $userinfo['openid'] . '"')->find();
            if (empty($ret)) {
                //微信用户绑定会员id
                $ect_uid = 0;
                //查看公众号是否绑定
                if($userinfo['unionid']){
                    $ect_uid = model('Base')->model->table('wechat_user')->field('ect_uid')->where(array('unionid'=>$userinfo['unionid']))->getOne();
                }
    
                //未绑定
                if(empty($ect_uid)){
                    // 设置的用户注册信息
                    $register = model('Base')->model->table('wechat_extend')
                        ->field('config')
                        ->where('enable = 1 and command = "register_remind" and wechat_id = '.$wechat_id)
                        ->find();
                    if (! empty($register)) {
                        $reg_config = unserialize($register['config']);
                        $username = msubstr($reg_config['user_pre'], 3, 0, 'utf-8', false) . time().mt_rand(1, 99);
                        // 密码随机数
                        $rs = array();
                        $arr = range(0, 9);
                        $reg_config['pwd_rand'] = $reg_config['pwd_rand'] ? $reg_config['pwd_rand'] : 3;
                        for ($i = 0; $i < $reg_config['pwd_rand']; $i ++) {
                            $rs[] = array_rand($arr);
                        }
                        $pwd_rand = implode('', $rs);
                        // 密码
                        $password = $reg_config['pwd_pre'] . $pwd_rand;
                        // 通知模版
                        $template = str_replace(array(
                            '[$username]',
                            '[$password]'
                        ), array(
                            $username,
                            $password
                        ), $reg_config['template']);
                    } else {
                        $username = 'wx_' . time().mt_rand(1, 99);
                        $password = 'ecmoban';
                        // 通知模版
                        $template = '默认用户名:' . $username . "\r\n" . '默认密码:' . $password;
                    }
                    // 会员注册
                    $domain = get_top_domain();
                    if (model('Users')->register($username, $password, $username . '@' . $domain, array('parent_id'=>intval($_GET['u']))) !== false) {
                        model('Users')->update_user_info();
                    } else {
                        die('授权失败,如重试一次还未解决问题请联系管理员');
                    }
                    $data1['ect_uid'] = $_SESSION['user_id'];
                }
                else{
                    //已绑定
                    $username = model('Base')->model->table('users')->field('user_name')->where(array('user_id'=>$ect_uid))->getOne();
                    $template = '您已拥有帐号,用户名为'.$username;
                    $data1['ect_uid'] = $ect_uid;
                }
                
                // 获取用户所在分组ID
                $group_id = $weObj->getUserGroup($userinfo['openid']);
                $group_id = $group_id ? $group_id : 0;
    
                $data1['wechat_id'] = $wechat_id;
                $data1['subscribe'] = 0;
                $data1['openid'] = $userinfo['openid'];
                $data1['nickname'] = $userinfo['nickname'];
                $data1['sex'] = $userinfo['sex'];
                $data1['city'] = $userinfo['city'];
                $data1['country'] = $userinfo['country'];
                $data1['province'] = $userinfo['province'];
                $data1['language'] = $userinfo['country'];
                $data1['headimgurl'] = $userinfo['headimgurl'];
                $data1['subscribe_time'] = $time;
                $data1['group_id'] = $group_id;
                $data1['unionid'] = $userinfo['unionid'];
                
                model('Base')->model->table('wechat_user')->data($data1)->insert();
            } else {
                //开放平台有privilege字段,公众平台没有
                unset($userinfo['privilege']);
                model('Base')->model->table('wechat_user')->data($userinfo)->where(array('openid'=> $userinfo['openid']))->update();
                $new_user_name = model('Base')->model->table('users')->field('user_name')->where(array('user_id'=>$ret['ect_uid']))->getOne();
                ECTouch::user()->set_session($new_user_name);
                ECTouch::user()->set_cookie($new_user_name);
                model('Users')->update_user_info();
            }
            $_SESSION['openid'] = $userinfo['openid'];
            setcookie('openid', $userinfo['openid'], gmtime() + 86400 * 7);
        }
    
    }
    

     

    展开全文
  • 微信网页授权

    2018-09-12 14:33:48
    微信网页授权 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。 关于网页授权回调域名的说明 1、在微信公众号请求用户网页授权之前,开发者需要...

    微信网页授权

    如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

    关于网页授权回调域名的说明

    1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;

    2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权

    3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可

    关于网页授权的两种scope的区别说明

    1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)

    2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

    3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

    关于网页授权access_token和普通access_token的区别

    1、微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;

    2、其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。

    关于UnionID机制

    1、请注意,网页授权获取用户基本信息也遵循UnionID机制。即如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。

    2、UnionID机制的作用说明:如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为同一用户,对同一个微信开放平台下的不同应用(移动应用、网站应用和公众帐号),unionid是相同的。

    关于特殊场景下的静默授权

    1、上面已经提到,对于以snsapi_base为scope的网页授权,就静默授权的,用户无感知;

    2、对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知。

    具体而言,网页授权流程分为四步:

    1、引导用户进入授权页面同意授权,获取code

    2、通过code换取网页授权access_token(与基础支持中的access_token不同)

    3、如果需要,开发者可以刷新网页授权access_token,避免过期

    4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

    目录

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

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

    3 第三步:刷新access_token(如果需要)

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

    5 附:检验授权凭证(access_token)是否有效

     

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

    在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:

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

    尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问

    参考链接(请在微信客户端中打开此链接体验):
    scope为snsapi_base
    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect
    scope为snsapi_userinfo
    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
    

    尤其注意:跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。

    参数说明

    参数 是否必须 说明
    appid 公众号的唯一标识
    redirect_uri 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
    response_type 返回类型,请填写code
    scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
    state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
    #wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

    下图为scope等于snsapi_userinfo时的授权页面:

    用户同意授权后

    如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。

    code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
    

    错误返回码说明如下:

    返回码 说明
    10003 redirect_uri域名与后台配置不一致
    10004 此公众号被封禁
    10005 此公众号并没有这些scope的权限
    10006 必须关注此测试号
    10009 操作太频繁了,请稍后重试
    10010 scope不能为空
    10011 redirect_uri不能为空
    10012 appid不能为空
    10013 state不能为空
    10015 公众号未授权第三方平台,请检查授权状态
    10016 不支持微信开放平台的Appid,请使用公众号Appid

     

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

    首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。

    尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

    请求方法

    获取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" }
    
    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
    scope 用户授权的作用域,使用逗号(,)分隔

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

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

     

    第三步:刷新access_token(如果需要)

    由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。

    请求方法

    获取第二步的refresh_token后,请求以下链接获取access_token:
    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
    
    参数 是否必须 说明
    appid 公众号的唯一标识
    grant_type 填写为refresh_token
    refresh_token 填写通过access_token获取到的refresh_token参数

    返回说明

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

    { "access_token":"ACCESS_TOKEN",
    "expires_in":7200,
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID",
    "scope":"SCOPE" }
    
    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 用户唯一标识
    scope 用户授权的作用域,使用逗号(,)分隔

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

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

     

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

    如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

    请求方法

    http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
    

    参数说明

    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    openid 用户的唯一标识
    lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

    返回说明

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

    {    "openid":" OPENID",
    " nickname": NICKNAME,
    "sex":"1",
    "province":"PROVINCE"
    "city":"CITY",
    "country":"COUNTRY",
    "headimgurl":    "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
    "privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],
    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
    }
    
    参数 描述
    openid 用户的唯一标识
    nickname 用户昵称
    sex 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
    province 用户个人资料填写的省份
    city 普通用户个人资料填写的城市
    country 国家,如中国为CN
    headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
    privilege 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
    unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。

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

    {"errcode":40003,"errmsg":" invalid openid "}
    

     

    附:检验授权凭证(access_token)是否有效

    请求方法

    http:GET(请使用https协议) https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
    

    参数说明

    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    openid 用户的唯一标识

    返回说明
    正确的JSON返回结果:

    { "errcode":0,"errmsg":"ok"}
    

    错误时的JSON返回示例:

    { "errcode":40003,"errmsg":"invalid openid"}
    展开全文
  • 微信开发网页授权

    2016-09-26 16:22:36
    一、什么是OAuth2.0 官方网站:http://oauth.net/  ... 权威定义:OAuth is An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.... O

    一、什么是OAuth2.0

    官方网站:http://oauth.net/   http://oauth.net/2/

    权威定义:OAuth is An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications. 

    OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站、移动或桌面应用上存储的私密的资源(如用户个人信息、照片、视频、联系人列表),而无需将用户名和密码提供给第三方应用。

    OAuth 2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0。 OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。

    OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。

    新浪微博API目前也使用OAuth 2.0。

    原文:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html

    二、微信公众平台OAuth2.0授权

    微信公众平台OAuth2.0授权详细步骤如下:

    1. 用户关注微信公众账号。
    2. 微信公众账号提供用户请求授权页面URL。
    3. 用户点击授权页面URL,将向服务器发起请求
    4. 服务器询问用户是否同意授权给微信公众账号(scope为snsapi_base时无此步骤)
    5. 用户同意(scope为snsapi_base时无此步骤)
    6. 服务器将CODE通过回调传给微信公众账号
    7. 微信公众账号获得CODE
    8. 微信公众账号通过CODE向服务器请求Access Token
    9. 服务器返回Access Token和OpenID给微信公众账号
    10. 微信公众账号通过Access Token向服务器请求用户信息(scope为snsapi_base时无此步骤)
    11. 服务器将用户信息回送给微信公众账号(scope为snsapi_base时无此步骤)

     

     

    使用的AppId和AppSecret在开发者中心-开发者ID中,可以找到。

     

     

    1. 配置授权回调页面域名

    进入微信公众平台后台后,依次进入开发者中心-权限表,找到网页授权获取用户基本信息

     

     

    点击右侧的修改。原文:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html

    关于网页授权回调域名的说明

    1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的开发者中心页配置授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加http://等协议头;
    2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.htmlhttp://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.comhttp://music.qq.comhttp://qq.com无法进行OAuth2.0鉴权
    3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可
    

    这里我们填写方倍工作室的一个百度应用二级域名为 mascot.duapp.com

    原文:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html

    如果你的网址没有被列入过黑名单,就会在顶部出现

    然后,域名配置就成功了。

     

    2. 用户授权并获取code

    在域名根目录下,新建一个文件,命名为oauth2.php,其内容为

    复制代码
    <?php
    if (isset($_GET['code'])){
        echo $_GET['code'];
    }else{
        echo "NO CODE";
    }
    ?>
    复制代码

    先了解下请求授权页面的构造方式:

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

    参数说明

    参数 必须 说明
    appid 公众号的唯一标识
    redirect_uri 授权后重定向的回调链接地址
    response_type 返回类型,请填写code
    scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息
    state 重定向后会带上state参数,开发者可以填写任意参数值
    #wechat_redirect 直接在微信打开链接,可以不填此参数。做页面302重定向时候,必须带此参数

    关于网页授权的两种scope的区别说明

    1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
    2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
    3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。
    

    关于特殊场景下的静默授权

    1、上面已经提到,对于以snsapi_base为scope的网页授权,就静默授权的,用户无感知;
    2、对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知。
    

    应用授权作用域:由于snsapi_base只能获取到openid,意义不大,所以我们使用snsapi_userinfo。
    回调地址:填写为刚才上传后的oauth2.php的文件地址,
    state参数:随便一个数字,这里填1

    构造请求url如下:

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect

    把这个链接发送到微信中,以便在微信浏览器中打开,这里使用A链接封装如下:

    OAuth2.0网页授权演示 
    <a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect">点击这里体验</a>
    技术支持 方倍工作室

    在微信中显示如下

    点击绑定后,弹出应用授权界面

    选择允许,点击

    跳转到auth2.php页面,执行

    echo $_GET['code']

    界面上显示的就是code,这时候通过右上角按钮中的复制链接,得到链接如下:

    http://mascot.duapp.com/oauth2.php?code=00b788e3b42043c8459a57a8d8ab5d9f&state=1

    我们成功得到了code了。

    注意:如果在绑定的时候出现这样的界面,就说明参数不对,需要回头检查一下参数

     

    3. 使用code换取access_token

    换取网页授权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

    code:在这里填写为上一步获得的值

    构造请求url如下:

    https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx8888888888888888&secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&code=00b788e3b42043c8459a57a8d8ab5d9f&grant_type=authorization_code

    可以在浏览器中直接执行这条语句:

    得到如下json数据:

    复制代码
    {
        "access_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw",
        "expires_in": 7200,
        "refresh_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5CZPAwZksiuz_6x_TfkLoXLU7kdKM2232WDXB3Msuzq1A",
        "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
        "scope": "snsapi_userinfo,"
    }
    复制代码

    数据格式解读如下:

    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
    scope 用户授权的作用域,使用逗号(,)分隔

    于是,我们成功的通过code换取到了access_token,以及refresh_token。

    关于网页授权access_token和普通access_token的区别

    1、微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;
    2、其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。
    


    刷新access_token
    官方文档中提到了刷新access_token的功能,但这不是必须要做的,初次使用可以先忽略。
    
    
    url请求方法如下:
    
    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
    参数说明
    参数 是否必须 说明
    appid 公众号的唯一标识
    grant_type 填写为refresh_token
    refresh_token 填写通过access_token获取到的refresh_token参数
    构造如下:
    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=wx8888888888888888&grant_type=refresh_token&refresh_token=OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5CZPAwZksiuz_6x_TfkLoXLU7kdKM2232WDXB3Msuzq1A
    在浏览器中执行得到前面同样格式的json数据
    复制代码

    方倍:感觉refresh token是个没有意义的东西,使用code能获得且必须这样获得access token和openid,继而获得用户基本信息,那根本就没有刷新access token的必要。个人意见,仅供参考。。。

     

     

    4. 使用access_token获取用户信息

    请求方法:

    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

    参数说明

    参数 描述
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    openid 用户的唯一标识

    构造url如下:

    https://api.weixin.qq.com/sns/userinfo?access_token=OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw&openid=oLVPpjqs9BhvzwPj5A-vTYAX3GLc

    可以在浏览器中直接执行这条语句:

    得到如下json数据:

    复制代码
    {
        "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
        "nickname": "刺猬宝宝",
        "sex": 1,
        "language": "简体中文",
        "city": "深圳",
        "province": "广东",
        "country": "中国",
        "headimgurl": "http://wx.qlogo.cn/mmopen/utpKYf69VAbCRDRlbUsPsdQN38DoibCkrU6SAMCSNx558eTaLVM8PyM6jlEGzOrH67hyZibIZPXu4BK1XNWzSXB3Cs4qpBBg18/0",
        "privilege": []
    }
    复制代码

    参数解读:

    参数 描述
    openid 用户的唯一标识
    nickname 用户昵称
    sex 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
    province 用户个人资料填写的省份
    city 普通用户个人资料填写的城市
    country 国家,如中国为CN
    headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
    privilege 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)

    这与我个人的微信信息是一致的

     

    至此,在不输入我的账号及密码的情况下,微信公众账号近宝获得了我的个人信息,这些信息包括昵称、性别、国家、省份、城市、个人头像以及特权列表。

    一个完整的OAuth2认证就完成了。

     

    三、详细演示

    扫描关注下列微信公众账号“方倍工作室”的二维码,回复“授权”。

    弹出获取到的结果

     

    具体而言,网页授权流程分为四步:

    1、引导用户进入授权页面同意授权,获取code
    2、通过code换取网页授权access_token(与基础支持中的access_token不同)
    3、如果需要,开发者可以刷新网页授权access_token,避免过期
    4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
    

    参考链接:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html

    微信公众平台-网页授权获取用户基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html#.E7.AC.AC.E4.B8.80.E6.AD.A5.EF.BC.9A.E7.94.A8.E6.88.B7.E5.90.8C.E6.84.8F.E6.8E.88.E6.9D.83.EF.BC.8C.E8.8E.B7.E5.8F.96code

    展开全文
  • 转自 http://www.cnblogs.com/0201zcr/p/5133062.html   1、OAuth2.0  OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,... ...每一个令牌授权...
  • 微信公众号网页授权登录: 前端时间做了一个微信公众号的项目,就是微信公众号的菜单点击我的个人中心,就向用户授权登录 获取用户的信息,进行业务逻辑的操作,微信公众号官方文档,这是我写的文章,里面有很多...
  • 第一步在微信公众平台中找到网页授权       然后再填写授权回调页面,这里的页面如同手册里面一样 以xxx.xxxxx.com 即可 而且此处的域名一定要和代码中回调地址在同一个域名之下。       关于...
  • 步骤一:申请微信开发者测试账号 https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&amp;amp;amp;amp;amp;t=sandbox/index 步骤二:需要一个服务器,用来获取你要的信息,我使用的是阿里云 ...
  • 大家都知道,微信公众号不同于企业微信(原企业号),一个公众号只有一个应用,只能配一个服务器地址。另一个不同就是,在刷新access_token时,公众号的access_token会更新,旧的会失效。因此,微信平台建议使用一个...
  • 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。 现在,我们要实现一个微信内网页,通过微信访问网页时,网页会展示微信用户的个人信息。因为涉及...
  • 转载:https://yii.im/posts/the-security-about-wechat-web-oauth/本文其实有一点标题党,因为微信网页授权本身并没有什么安全问题,有安全问题的是一些不恰当的打开...认识微信网页授权微信网页授权(官方文档)是公...
  • 微信网页授权调试

    2019-07-12 11:55:29
    使用场景:在微信网页授权流程(前端篇)中谈到微信授权的基本流程,现在开发完成,服务也部署完成。由于开发的网页是嵌在微信内置浏览器里,在手机端调试有诸多不便,因为微信专门提供了web开发者工具用来调试,它是一...
  • C#实现微信网页授权

    2019-08-28 10:13:50
    本文属于个人原创作品、个人总结,谢绝转载、抄袭。如果您有疑问或者希望沟通交流,可以联系QQ:865562060。 一、背景 近期实现微信招聘公众号的需求,需要在微信用户...具体而言,微信网页授权流程分为四步: ...
  • asp.net下微信网页授权

    2016-10-25 15:55:10
    微信网页授权我相信做微信开发的小伙伴都可能遇见过这样的问题1.我们要明白微信网页授权主要是用来做什么? 用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信 息, 进 而实现...
  • 微信网页授权登录官方文档 微信网页授权登录的方法–推荐文章一 微信网页授权登录的方法–推荐文章二 总结: 微信授权方式(scope的属性值控制): 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能...
  • H5微信网页授权

    2018-11-03 14:27:56
    1.微信网页授权:用于获取用户针对于公众号的唯一标识openid。但只能添加一个域名,通常把它设置为一级域名。网页授权回调域名,首先,在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - ...
  • 微信打开的话,发起微信网页授权登陆,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数; 2.通过code参数加上AppID和AppSecret等,通过API换取access_token; 3....
  • 关于跨域请求的问题,参见:http://www.ruanyifeng.com/blog/2016/04/cors.html2.微信网页授权的问题微信网页授权,我们最终得到用户对微信公众号的标识openid但是,微信授权的回调域名只能填写一个(坑),如果想对...
1 2 3 4 5 ... 20
收藏数 17,730
精华内容 7,092
关键字:

微信网页授权