以下是腾讯QQ和微信账号体系中access_token、refresh_token、pay_token的获取流程和使用指南,分别说明:
一、access_token 获取流程与使用
1. QQ账号体系
获取流程
用户在客户端发起QQ授权登录,跳转到QQ授权页面。用户同意授权后,QQ会回调你的redirect_uri,并带上code参数。服务器用code换取access_token(以及refresh_token、openid等)。
接口示例:
GET https://graph.qq.com/oauth2.0/token?
grant_type=authorization_code
&client_id=YOUR_APPID
&client_secret=YOUR_APPKEY
&code=CODE
&redirect_uri=REDIRECT_URI
返回示例:
access_token=FE04************************CCE2&expires_in=7776000&refresh_token=88E4************************BE14
使用指南
access_token用于调用QQ开放平台的API(如获取用户信息)。有效期一般为3个月(7776000秒)。每次调用API时都要带上access_token参数。
2. 微信账号体系
获取流程
用户在客户端发起微信授权登录,跳转到微信授权页面。用户同意授权后,微信会回调你的redirect_uri,并带上code参数。服务器用code换取access_token(以及refresh_token、openid等)。
接口示例:
GET https://api.weixin.qq.com/sns/oauth2/access_token?
appid=APPID
&secret=SECRET
&code=CODE
&grant_type=authorization_code
返回示例:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
使用指南
access_token用于调用微信开放平台的API(如获取用户信息)。有效期一般为2小时(7200秒)。每次调用API时都要带上access_token参数。
二、refresh_token 获取流程与使用
1. QQ账号体系
在用code换access_token时,接口会一并返回refresh_token。refresh_token有效期一般为3个月。当access_token过期时,可用refresh_token换取新的access_token。
接口示例:
GET https://graph.qq.com/oauth2.0/token?
grant_type=refresh_token
&client_id=YOUR_APPID
&client_secret=YOUR_APPKEY
&refresh_token=REFRESH_TOKEN
2. 微信账号体系
在用code换access_token时,接口会一并返回refresh_token。refresh_token有效期一般为30天。当access_token过期时,可用refresh_token换取新的access_token。
接口示例:
GET https://api.weixin.qq.com/sns/oauth2/refresh_token?
appid=APPID
&grant_type=refresh_token
&refresh_token=REFRESH_TOKEN
返回示例:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
三、pay_token 获取流程与使用(主要针对QQ/手Q支付)
1. 获取流程
pay_token是用户在QQ登录后,由客户端SDK获取到的支付专用token。一般通过QQ SDK的接口获取(如mqq.app.getPayToken),由客户端传递给服务端,服务端再用于调用腾讯支付相关接口。
注意:
pay_token有时效性,通常为1小时。仅在需要调用米大师等支付接口时使用。
2. 使用指南
服务端在调用腾讯支付相关接口时,需要传递pay_token参数。pay_token只能用于当前用户、当前会话,不能跨用户、跨会话使用。pay_token安全性要求高,严禁泄露给第三方,建议只在服务端使用。
四、常见注意事项
access_token、refresh_token、pay_token都属于敏感凭证,必须加密传输,严禁泄露。access_token过期后,优先用refresh_token刷新,避免让用户重新授权。pay_token仅用于支付相关接口,且有效期短,需及时校验。access_token和refresh_token的有效期不同,注意定期刷新和失效处理。微信和QQ的access_token、refresh_token不可混用,接口参数和文档要区分清楚。
五、官方文档参考
QQ互联 access_token 说明微信开放平台 access_token 说明米大师支付文档
以下是腾讯QQ和微信账号体系中access_token、refresh_token、pay_token的获取流程和使用指南,分别说明:
一、access_token 获取流程与使用
1. QQ账号体系
获取流程
用户在客户端发起QQ授权登录,跳转到QQ授权页面。用户同意授权后,QQ会回调你的redirect_uri,并带上code参数。服务器用code换取access_token(以及refresh_token、openid等)。
接口示例:
GET https://graph.qq.com/oauth2.0/token?
grant_type=authorization_code
&client_id=YOUR_APPID
&client_secret=YOUR_APPKEY
&code=CODE
&redirect_uri=REDIRECT_URI
返回示例:
access_token=FE04************************CCE2&expires_in=7776000&refresh_token=88E4************************BE14
使用指南
access_token用于调用QQ开放平台的API(如获取用户信息)。有效期一般为3个月(7776000秒)。每次调用API时都要带上access_token参数。
2. 微信账号体系
获取流程
用户在客户端发起微信授权登录,跳转到微信授权页面。用户同意授权后,微信会回调你的redirect_uri,并带上code参数。服务器用code换取access_token(以及refresh_token、openid等)。
接口示例:
GET https://api.weixin.qq.com/sns/oauth2/access_token?
appid=APPID
&secret=SECRET
&code=CODE
&grant_type=authorization_code
返回示例:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
使用指南
access_token用于调用微信开放平台的API(如获取用户信息)。有效期一般为2小时(7200秒)。每次调用API时都要带上access_token参数。
二、refresh_token 获取流程与使用
1. QQ账号体系
在用code换access_token时,接口会一并返回refresh_token。refresh_token有效期一般为3个月。当access_token过期时,可用refresh_token换取新的access_token。
接口示例:
GET https://graph.qq.com/oauth2.0/token?
grant_type=refresh_token
&client_id=YOUR_APPID
&client_secret=YOUR_APPKEY
&refresh_token=REFRESH_TOKEN
2. 微信账号体系
在用code换access_token时,接口会一并返回refresh_token。refresh_token有效期一般为30天。当access_token过期时,可用refresh_token换取新的access_token。
接口示例:
GET https://api.weixin.qq.com/sns/oauth2/refresh_token?
appid=APPID
&grant_type=refresh_token
&refresh_token=REFRESH_TOKEN
返回示例:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
三、pay_token 获取流程与使用(主要针对QQ/手Q支付)
1. 获取流程
pay_token是用户在QQ登录后,由客户端SDK获取到的支付专用token。一般通过QQ SDK的接口获取(如mqq.app.getPayToken),由客户端传递给服务端,服务端再用于调用腾讯支付相关接口。
注意:
pay_token有时效性,通常为1小时。仅在需要调用米大师等支付接口时使用。
2. 使用指南
服务端在调用腾讯支付相关接口时,需要传递pay_token参数。pay_token只能用于当前用户、当前会话,不能跨用户、跨会话使用。pay_token安全性要求高,严禁泄露给第三方,建议只在服务端使用。
四、常见注意事项
access_token、refresh_token、pay_token都属于敏感凭证,必须加密传输,严禁泄露。access_token过期后,优先用refresh_token刷新,避免让用户重新授权。pay_token仅用于支付相关接口,且有效期短,需及时校验。access_token和refresh_token的有效期不同,注意定期刷新和失效处理。微信和QQ的access_token、refresh_token不可混用,接口参数和文档要区分清楚。
下面继续详细补充access_token、refresh_token、pay_token的实际开发细节、常见问题、最佳实践和安全建议。
一、access_token、refresh_token、pay_token 的生命周期与刷新机制
1. access_token 生命周期
微信:2小时(7200秒),过期后需刷新。QQ互联:3个月(7776000秒),过期后需刷新。注意:access_token一旦过期,所有依赖它的API调用都会失败,需及时刷新。
2. refresh_token 生命周期
微信:30天,过期后用户需重新授权。QQ互联:3个月,过期后用户需重新授权。注意:refresh_token只能用于刷新access_token,不能直接调用API。
3. pay_token 生命周期
QQ/手Q支付:通常1小时,过期后需重新获取。注意:pay_token只在支付相关接口使用,且仅限当前用户、当前会话。
二、实际开发中的token管理建议
1. 存储建议
access_token:存储在服务端数据库或缓存(如Redis),关联用户ID和过期时间。refresh_token:同样存储在服务端,便于access_token过期时自动刷新。pay_token:只在支付流程中临时存储,支付完成后应立即销毁。
2. 刷新机制
每次API调用前,检查access_token是否过期。若已过期,自动用refresh_token刷新,刷新成功后更新数据库。若refresh_token也过期,提示用户重新授权登录。
3. 多端同步
用户在多端(如App、Web)登录时,建议每端独立管理token,避免token串用。若需多端同步,需做好token的隔离和安全校验。
三、常见问题与排查
问题表现可能原因排查建议access_token失效超时、被刷新、被撤销检查过期时间、刷新逻辑refresh_token失效超时、用户解绑、权限变更检查refresh_token有效期pay_token无效超时、用户切换账号检查pay_token获取和传递API返回invalid tokentoken被篡改、传错、过期检查token来源和有效性
四、最佳实践与安全建议
全程HTTPS:所有token相关接口必须使用HTTPS,防止中间人攻击。服务端校验:所有token的校验和刷新操作应在服务端完成,客户端只做最小授权。最小权限原则:只申请和使用必要的scope权限,避免token被滥用。定期清理:定期清理无效、过期的token,防止数据库膨胀。异常处理:API调用返回token失效时,自动触发刷新或重新授权流程,提升用户体验。日志监控:对token的获取、刷新、失效等操作做好日志,便于问题追踪。
五、代码示例(伪代码)
1. access_token 刷新逻辑(以微信为例)
def get_valid_access_token(user_id):
token_info = db.get_token_info(user_id)
if token_info['access_token_expire'] > now():
return token_info['access_token']
else:
# 用refresh_token刷新
resp = requests.get('https://api.weixin.qq.com/sns/oauth2/refresh_token', params={
'appid': APPID,
'grant_type': 'refresh_token',
'refresh_token': token_info['refresh_token']
})
data = resp.json()
if 'access_token' in data:
db.update_token(user_id, data['access_token'], data['expires_in'], data['refresh_token'])
return data['access_token']
else:
# refresh_token也失效,需重新授权
raise Exception('Need re-auth')
2. pay_token 获取与使用(伪流程)
客户端通过QQ SDK获取pay_token客户端将pay_token、openid等参数传给服务端服务端用这些参数调用米大师支付接口