一、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不可混用,接口参数和文档要区分清楚。

五、官方文档参考

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等参数传给服务端服务端用这些参数调用米大师支付接口