用户授权
客户端的授权流程
针对没有后台服务器的 App 类型,如移动平台的 App 应用,微信使用 OAuth2.0 的 Implicit Grant 方式授权,流程如下:
- 用户访问第三方应用,使用到分享至微信朋友圈的功能,应用检测到没有用户的授权信息,于是将用户引导至授权页面;
- 当用户未登录时,将要求先登录,否则继续下一步;
- 授权页面为一个对话框,显示应用信息以及请求的访问权限,并提示用户选择允许或拒绝;
- 对话框将重定向回应用,若授权成功则带上 Access Token,否则带上相应的错误码。
客户端授权流程得到的 Access Token 有效期为 2 小时,过期后需重新走授权流程。
服务器端的授权流程
服务端的授权流程为 OAuth2.0 定义的 Authentication Code Grant 的授权方式,我们推荐朋友圈应用使用服务端的授权流程。在该授权流程中,App 除了可以得到用户的 AccessToken 外还有 RefreshToken, RefreshToken 过期时间为一年。
服务端的授权流程如下:
- 当用户未登录时,将要求先登录,否则继续下一步;
- 授权页面为一个对话框,显示应用信息以及请求的访问权限,并提示用户选择允许或拒绝;
- 当用户允许后,微信将以重定向的方式回到App,并带上一个授权码,否则将提示失败;
- 第三方应用通过后台访问微信 API,通过授权码换取Access Token和Refresh Token。
通过服务端的授权流程得到的 AccessToken 有效期为 30 天,过期后使用 RefreshToken 即可换取新的 AccessToken。
授权连接
URL: https://open.weixin.qq.com/oauth
参数列表 | 参数含义 |
---|---|
appid | 从微信开放平台申请的AppId |
response_type | 返回类型,值为code或token之一 |
redirect_uri | 授权成功后的重定向页面,默认为App预留在微信的uri |
scope | 可选参数,所申请授权的资源域,以空格分开,目前仅支持并默认选择post_timeline |
state | 可选参数,自定义重定向uri的参数 |
服务端流程请求连接样例:
https://open.weixin.qq.com/oauth?appid=hello&response_type=code
用户成功授权后返回样例:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
用户拒绝授权的返回样例:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?error=access_denied
客户端流程请求连接样例:
https://open.weixin.qq.com/oauth?appid=hello&response_type=token
用户成功授权后返回样例:
HTTP/1.1 302 Found
Location: https://client.example.com/cb#access_token=ASDFBCDEFGHIJKLMN&expires_in=259200
用户拒绝授权的返回样例:
HTTP/1.1 302 Found
Location: https://client.example.com/cb#error=access_denied
API列表
名称 | 功能 |
---|---|
GET /token | 获取Access Token |
POST /media | 上传附件 |
GET /media/:media_id | 下载附件内容 |
POST /timeline | 发表到朋友圈 |
GET /token
URL: https://api.weixin.qq.com/token.format
用于通过授权code换取access token和refresh token,或用于通过refresh token换取新的access token。
参数列表 | 参数含义 |
---|---|
grant_type | 获取的token类型,authentication_code 或 refresh_token |
code | 当grant_type为authentication_code时填写,此为用户授权后得到的授权码 |
refresh_token | 当grant_type为refresh_token时填写 |
redirect_uri | 当grant_type为authentication_code时填写,需和oauth步骤所填写的redirect_uri相同 |
当应用走服务器端的授权流程时,通过该API使用授权码换取access token和refresh token,此时grant_type需设置为authentication_code,请求URL如下:
GET "https://api.weixin.qq.com/token?appid=wx1234hello" "&grant_type=authorization_code&code=4433222&redirect_Uri=" "http%3A//www.example.com/weixin_redirect"
返回样例:
{ "refresh_token" : "93Zkx2gyQVaeIbS1CTDFSZilrVyj1Q1Ts2UeArlEnbrP6bKDyWAz4WlIHu_ wwasdfLNNLfmn023mNA0nX", "access_token" : "3Zkx2gyQVaeIbS1CTDFSZilrVyj1Q1Ts2UeArlEnbrP6bKDyWAz4WlIHu_Lj JqUNdYDYlyxrGOw1ywdb4sAyahgskuUBvSSx6EO2oxowQmcwdC3YTDkSJPTF 6yoKpfZkY2mIGBeaMZKsXcfWoTP94g", "expires_in" : 7200 }
当access token过期时,可通过refresh token获取新的access token,请求样例:
GET "https://api.weixin.qq.com/token?appid=wx1234abcd" "&grant_type=refresh_token&secret=egs1mwxkfpt459" "&refresh_token=93Zkx2gyQVaeIbS1CTDFSZilrVyj1Q1Ts2UeArlEnbrP6bKDyWAz4WlIHu_wwasdfLNNLfmn023mNA0nX"
返回样例:
{ "access_token" : "K3Zkx2gyQVaeIbinDDmZ1CTDFSZilrVyj1Q1Ts2UeArlEnbrP6bKDyWAz4WlIHu_ LjJqUNdYDYlyxrGOw1ywdGGb4sAyahgskuUBvSSx6EO2oxowQmcwdC3YTDkSJPTF 6yoKpfZkY2mIGBeaMZKs", "expires_in" : 7200 }
POST /media
URL: https://api.weixin.qq.com/media.format
参数列表 | 参数含义 |
---|---|
type | 附件类型,目前仅支持image |
media[] | 附件内容 |
该API用于上传一个附件到微信服务器,成功后将得到一个媒体id(media_id)表示该附件,从而分享至用户朋友圈。
上传的图片大小限制为2M,如果原图宽度超过640px,微信服务器将对图片进行等比例缩放后存储。
请求样例(使用curl工具):
curl -F "media=@test.jpg" "https://api.weixin.qq.com/media?type=image&access_token=3Zkx2gyQVaeIbS1CTDFSZilrVyj1Q1Ts2UeArlEnbrP6bKDyWAz4WlIHu_LjJqUNdYDYlyxrGOw1ywdb4sAyahgskuUBvSSx6EO2oxowQmcwdC3YTDkSJPTF6yoKpfZkY2mIGBeaMZKsXcfWoTP94g"
返回样例:
{ "media_id" : "fPPPmh9EBsgdrqaSJvl6nPvchUfbDxN8lmGTMBN2BWABP_usGso5Qx7raSraaXAT", "type" : "image", "created_at" : 1335415865 }
GET /media/:media_id
URL: https://api.weixin.qq.com/media/:media_id.format
参数列表 | 参数含义 |
---|---|
media_id | 附件id |
该API用于下载媒体附件。
请求样例(使用curl工具):
curl "https://api.weixin.qq.com/media/fPPPmh9EBsgdrqaSJvl6nPvchUfbDxN8lmGTMBN2BWABP_usGso5Qx7raSraaXAT?access_token=3Zkx2gyQVaeIbS1CTDFSZilrVyj1Q1Ts2UeArlEnbrP6bKDyWAz4WlIHu_LjJqUNdYDYlyxrGOw1ywdb4sAyahgskuUBvSSx6EO2oxowQmcwdC3YTDkSJPTF6yoKpfZkY2mIGBeaMZKsXcfWoTP94g"
POST /timeline
URL: https://api.weixin.qq.com/timeline.format
参数列表 | 参数含义 |
---|---|
content_type | 指定消息的类型,必填,目前支持五类:text、photo、feed、video和music。 |
title | 一句话描述,当content_type是feed时为必填字段。 对于content_type为feed,该字段可以是文章标题; 对于content_type为music,该字段可以是歌曲名和歌手; 对于content_type为video,该字段可以是视频的名称。 |
media_list | media_id列表,content_type为feed、music和video时必填。多个media_id以“,”分隔。 当content_type为photo,最多可以提供9个media_id,多出部分会被抛弃。 当content_type为feed、music和video时,只可提供1个media_id作为消息的缩略图,多出部分会被抛弃。 |
media_url | 音乐文件地址,当content_type为music时必填。协议支持http和https,格式支持mp3和wav。 |
content_url | 内容链接,当content_type为feed、music和video时必填 |
coordinates | 经纬度,用“,”分隔,可选。数据格式为(latitude,longitude) |
该API用于分享内容至用户的朋友圈中,title或media_list两个参数至少选择其中之一。
请求示例 1(使用curl工具):
curl -d "title=hello&coordinates=10.00,10.00&media_list=fPPPmh9EBsgdrqaSJvl6nPvchUfbDxN8lmGTMBN2BWABP_usGso5Qx7raSraaXAT,fPPPmh9EBsgdrqaSJvl6nPvchUfbDxN8lmGTMBN2BWABP_usGso5Qx7raSraaXAT" "https://api.weixin.qq.com/timeline?access_token=3Zkx2gyQVaeIbS1CTDFSZilrVyj1Q1Ts2UeArlEnbrP6bKDyWAz4WlIHu_LjJqUNdYDYlyxrGOw1ywdb4sAyahgskuUBvSSx6EO2oxowQmcwdC3YTDkSJPTF6yoKpfZkY2mIGBeaMZKsXcfWoTP94g"
成功返回:
{ "id" : 11232109051049549826, "created_at" : 1333007682 }
失败返回:
{ "time" : 1338972300, "error" : { "msg": "content_url is missing", "code": 40329 } }
请求示例 2:
curl -d "title=Complcated&coordinates=24.00,114.00&media_list=L5JPCzX96wnwcE4Hthh&content_url=http%3A%2F%2Fy.qq.com%2Fi%2Fsong.html%23p%3D7B2273&media_url=http%3A%2F%2Fy.qq.com%2Fi%2Fsong.html%23p%3D7B2273&content_type=music" "https://api.weixin.qq.com/timeline?access_token=3Zkx2gyQVaeIbS1CTDFSZilrVyj1Q1Ts2UeArlEnbrP6bKDyWAz4WlIHu_LjJqUNdYDYlyxrGOw1ywdb4sAyahgskuUBvSSx6EO2oxowQmcwdC3YTDkSJPTF6yoKpfZkY2mIGBeaMZKsXcfWoTP94g"
请求示例2在微信朋友圈展示的效果图如下::