微信/OAuth实现方法

首先你得是服务号,并且是经过认证的.这样微信会给你很多第三方接口的权限,如果是订阅号或者没有认证的服务号那就不用想了!

一开始你需要进入微信公众平台开启开发模式,并且填写oauth2的回调地址,地址填写你项目的域名就可以了.比如:www.baidu.com或zhidao.baidu.com.如果你的项目在二级域名就写二级域名

前端url授权地址,在url中填写appid与你项目中方法中的oauth的地址,具体在下面的代码中可以看到.

基本流程

首先需要登录微信公众号管理后台,配置允许跳转的域名。该域名必须是2级域名,不支持1级域名。所以数量有限,需要规划好。比如配置了a.exmaple.com为跳转域名,就无法再跳转到b.example.com了。如果这里配置错误的话,用户在跳转时,会得到一个语焉不详的错误提示“redirect_uri参数错误”,如果看到这个提示的话,多半就是OAuth配置的问题

配置之后,就可以使用微信的OAuth机制了,域名以a.example.com为例,假设实际的地址是a.example.com/abc.html,那么要配置成:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_uri=http%3a%2f%2fa.example.com%2fabc.html&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

然后用户在微信中打开访问此地址,微信就会提示用户鉴权,如果用户同意的话,则会跳转到redirect_uri指定的实际地址:

http://a.example.com/abc.html?code=CODE&state=STATE

然后:
1. 将code发到自己的服务器上
2. 通过code可以换到access_token和open_id
3. 用access_token和open_id,可以查到用户的基本信息

这里有几点容易产生误解:

  1. 试图从前台页面通过ajax来换取access_token和open_id不可行,跨域问题
  2. 这里虽然也叫access_token,但是与后台通过app_id和app_secret换到的access_token完全不是一个东西,不要搞混
  3. 后台的API,也有获取用户基本信息的接口,但那个需要用户关注了公众号才能调用;而这个OAuth接口,只要用户同意授权,即使没有关注也可以调用,所以更加灵活

最后调用成功后,可以得到以下响应:

{
    "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"
}

订阅号如何使用OAuth服务

当前微信限制了只有服务号才能使用OAuth。如果是订阅号的话,可以“借用”服务号来部分满足需求。虽然服务号得到的open_id并不是订阅号的open_id,但是可以用来区分是否是“同一个”用户。比如一个网页需要计数,可以通过这种方式标识出当前访问的用户

另外,如果订阅号和服务号已经在微信开放平台绑定到同一账号,那么union_id是一样的。不过现在大部分接口还是需要以open_id为参数,所以如果只知道union_id而不知道open_id,并没有太大用

union_id机制

如果一个产品同时有订阅号、服务号、APP,又需要打通用户数据,识别出是同一个人,就需要用到union_id机制。在这种情况下,同一个用户相对订阅号、服务号、APP分别会有一个open_id,但是union_id是一样的,于是可以利用union_id建立关联关系。

id
union_id
dingyue_open_id
service_open_id
app_open_id
user_id

比如用上面这张表,无论用哪一个open_id,都能找到对应的其他open_id,以及业务系统中的user_id

一、什么是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时无此步骤)

1. 在授权方注册应用信息 #

var appInfo = {
                  appid: 'zhufengpeixun',
                  name: '珠峰大前端网校',
                  description: '学习前端',
                  secret: '123456',
                  redirectUri: 'http://127.0.0.1:8080/callback?1=1'
                }

2. 获取Authorization Code #

应用请求用户的授权时,要先跳转到此页面,由授权服务器判断此用户是否登陆,如果未登陆要求登陆,如果已登陆则显示授权界面询问用户是否授权此应用访问对应的资源,当用户点击确定授权的按钮后生成authorization_code并跳转回应用提供的URL.

请求地址 #

/authorize

请求方法 #

GET

请求参数 #

参数 是否必须 含义
client_id 必须 申请QQ登录成功后,分配给应用的appid
redirectUri 必须 成功授权后的回调地址

3. 通过Authorization Code获取Access Token #

请求地址 #

/token

请求方法 #

GET

请求参数 #

参数 是否必须 含义
code 必须 上一步返回的authorization code
client_id 必须 应用ID
client_secret 必须 应用秘钥

返回说明:
如果成功返回,即可在返回包中获取到Access Token。 如:

参数说明 描述
access_token 授权令牌,Access_Token

4. 获取用户信息 #

请求地址 #

/userInfo

请求方法 #

GET

请求参数 #

参数 是否必须 含义
access_token 必须 access_token

返回说明:
如果成功返回,即可在返回包中获取到用户信息,如


微信授权登录并获取用户基本信息

  微信授权使用的是OAuth2.0授权的方式。主要有以下简略步骤

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

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

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

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

详细的步骤如下:

  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时无此步骤)

用户授权并获取code

  在域名(前面配置的回调域名)根目录下,新建一个文件,命名为oauth.php(名字随便你取,下面的redirect_uri做相应修改即可)该php实现的功能也很简单,只是将url上的code参数取出来并打印出来而已,方便我们进行接下来的操作。

~~~

未经允许不得转载:WEB前端开发 » 微信/OAuth实现方法

赞 (0)