所有支付宝开放平台的读、写用户信息,均需要经过用户的许可才允许开发者使用,用户授权基于国际标准的 oauth2.0 授权机制,基于此机制开发者可以获取支付宝用户信息、给用户发会员卡等。
- scope:授权范围,一个 scope 表示开发者需要请求用户授权的权限范围,一个 scope 包含至少一个 openapi 接口或者 jsapi 接口,一次授权可以组合多个 scope 做组合授权。
- auth_code:授权码,与 jsapi 获取到的 authcode 相同,临时的用户授权凭证。
- access_token:访问令牌,也称 auth_token(授权令牌)。
以获取用户信息举例,整体的接入流程如下(若需要授权其它信息,只需要在调用 my.getauthcode 的时候,scopes 参数使用不同的 scope 即可)。
scopes 列表
scopes | 说明 | 包含的 openapi 接口 |
---|---|---|
auth_base | 静默授权,不会弹出授权浮窗;在支付宝客户端获取 auth_code,传入服务端,并在服务端直接调用 alipay.system.oauth.token(换取授权访问令牌接口)获取支付宝会员唯一标识:user_id(open_id)。 注意:在静默授权的场景下,直接调用 alipay.system.oauth.token(换取授权访问令牌接口)。 |
alipay.system.oauth.token(换取授权访问令牌接口) |
auth_user | 主动授权,需要用户手动点击同意,用户同意后,用于 网站支付宝登录、获取用户信息、商家会员卡。 | alipay.system.oauth.token(换取授权访问令牌接口)、alipay.user.info.share(支付宝会员授权信息查询接口) |
第一步:客户端获取 authcode
通过调用 my.getauthcode 获取用户授权,在 success 回调中可以获取到 authcode。
authcode 使用规则
- auth_code 单次有效,不可重复使用。
- 有效期为 3 分钟到 24 小时(开放平台规则会根据具体的业务场景动态调整 auth_code 的有效期,但是不会低于 3 分钟,同时也不会超过 24 小时),超过有效期的 auth_code 即使未使用也将自动失效。
- 用户的每次授权动作都会生成一个新的 auth_code。
- 基于安全考虑,请开发者在获取 auth_code(用户授权码)后应尽快调用 alipay.system.oauth.token(换取授权访问令牌接口)换取 access_token(访问令牌)。
js 示例代码:
my.getauthcode({
scopes: ['auth_user'],
// 主动授权:auth_user,静默授权:auth_base或者其它scope。如需同时获取用户多项授权,可在 scopes 中传入多个 scope 值。
success: (res) => {
if (res.authcode) {
// 认证成功
// 调用自己的服务端接口,让服务端进行后端的授权认证,并且利用session,需要解决跨域问题
my.request({
url: 'https://isv.com/auth', // 该url是开发者的服务地址,实现的功能是服务端拿到authcode去开放平台进行token验证
data: {
authcode: res.authcode,
},
success: () => {
// 授权成功并且服务器端登录成功
},
fail: () => {
// 根据自己的业务场景来进行错误处理
},
});
}
},
});
第二步:服务端获取 access_token、user_id(open_id)
服务端调用 alipay.system.oauth.token(换取授权访问令牌接口)换取授权访问令牌,开发者可通过获取到的 auth_code 换取 access_token(授权令牌) 和 user_id(open_id) (用户支付宝 id)。
auth_code 作为换取 access_token 的票据,每次用户授权完成,回调地址中的 auth_code 将不一样,auth_code 只能使用一次,一天未被使用自动过期。
示例代码
alipayclient alipayclient = new defaultalipayclient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","gbk","alipay_public_key","rsa2");
alipaysystemoauthtokenrequest request = new alipaysystemoauthtokenrequest();
request.setgranttype("authorization_code");
request.setcode("4b203fe6c11548bcabd8da5bb087a83b");
alipaysystemoauthtokenresponse response = alipayclient.execute(request);
if(response.issuccess()){
system.out.println("调用成功");
} else {
system.out.println("调用失败");
}
重要入参说明
术语解释:refresh_token,刷新令牌,用于在授权令牌过期后刷新重新获取新的授权令牌,刷新令牌也有有效期。
- granttype:授权类型,支持如下类型:
- authorization_code:用户授权,此类型下 code 参数中传入用户授权码 auth_code 换取用户授权令牌 access_token,无需传入 refresh_token。
- refresh_token:刷新令牌,此类型下传入有效的 refresh_token 用于刷新授权令牌,无需传入 code。
- code:用户授权码,通过小程序接口获取到的 auth_code 参数。
响应示例
{
"alipay_system_oauth_token_response": {
"user_id": "2088102150477652",
"open_id": "074a1cctg1lelxke4xqc0zgndid0nxi95b5lsnpazwyoco5",
"access_token": "20120823ac6ffaa4d2d84e7384bf983531473993",
"expires_in": "3600",
"refresh_token": "20120823ac6ffdsdf2d84e7384bf983531473993",
"re_expires_in": "3600",
"auth_start": "2010-11-11 11:11:11"
},
"sign":"eritjkeijkjhkkkkkkkhjereeeeeeeeeee"
}
重要响应参数说明
- user_id(open_id):支付宝用户唯一标识。
- access_token:访问令牌。通过该令牌调用需要授权类接口。
- expires_in:访问令牌的有效时间,单位是秒。
- refresh_token:刷新令牌。通过该令牌可以刷新 access_token。
- re_expires_in:刷新令牌的有效时间,单位是秒。
- auth_start:授权开始时间,作为有效期计算的起点。
注意: 若接口同步响应有 alipay_user_id
请忽略,该字段已废除。用户支付宝 id 为接口响应 user_id(open_id)
值。
调用服务端业务接口
在获取到 access_token 后,即可以继续使用该 token 调用 openapi 的授权类接口(例如 alipay.marketing.card.open(会员卡开卡接口)等),请注意 token 的权限范围和时效性。
说明: access_token 即为服务端接口 公共请求参数 中的 auth_token。
如下示例仅演示接口调用流程,为了创造更良好的支付宝小程序用户体验,小程序 不允许首屏弹窗引导用户授权。需要在用户充分了解小程序的业务内容后再引导用户授权,建议将小程序授权环节放在业务流程中。
获取用户授权的演示效果请查看以下示例,实际返回的授权码以真机调试为准。
授权码 auth_code
- 说明: auth_code 一次有效,auth_code 有效期为 3 分钟到 24 小时(开放平台规则会根据具体的业务场景动态调整 auth_code 的有效期,但是不会低于 3 分钟,同时也不会超过 24 小时),超过有效期的 auth_code 即使未使用也将无法使用。 用户的每次授权动作都会生成一个新的 auth_code。
- 建议: 基于安全考虑,开发者在获取 auth_code(用户授权码)后应尽快调用 alipay.system.oauth.token(换取授权访问令牌接口)换取 access_token(访问令牌)。
授权 scope
- 说明: scope 为公开的资源,其使用不需要签约,但是其包含的接口是否需要签约请查看具体的功能包或者接口定义。开发者可以在授权请求中包含一个或者多个用户授权范围,每个授权范围称为一个 scope,一个 scope 包含若干个开放平台接口,请求的多个 scope 通过英文逗号分隔。 授权的流程是通用的,在不同的业务场景需要授权的范围不同,需要根据具体产品接入文档中指定的 scope 替换本文中的 scope 参数。
- scope 有效期: 这里的 scope 有效期和前面的 auth_code 有效期是两个概念。 scope 的有效期会影响开发者最终获取到的 access_token 和 refresh_token 的有效期,不同 scope 的有效期请查看具体的产品文档。
- 建议: 为了产品体验考虑请按需请求需要的 scope,过多的授权范围容易导致用户放弃授权。建议在做产品的登录场景中使用 auth_base 或者 auth_user 做用户引流,后续根据需要具体业务需要引导用户请求特定 scope 的用户授权。
access_token
- 有效期:
- access_token 取决于授权时指定的 scope 的有效期,如果授权时指定多个 scope,最终的 access_token 的有效期取决于有效期最短的 scope。
- access_token 截止时间=(授权时间点) (授权后调用 alipay.system.oauth.token(换取授权访问令牌接口)返回的 expires_in)。
- 注意:用户可以取消授权,取消后 access_token 即失效,无法使用。
- 令牌存储要求:
- 确保 access_token 的安全保存。
- 根据 appid uid 单个 scope 为索引保存 access_token,否则会因为 appid 令牌混用和不同 scope 的令牌相互覆盖导致接口调用报错,若前后多次授权范围相同,仅保存授权截止时间最长的 access_token 即可。授权截止时间 = 授权时间点 alipay.system.oauth.token(换取授权访问令牌接口)返回的 expires_in。
refresh_token
- 说明: 用 auth_code 调用 alipay.system.oauth.token(换取授权访问令牌接口)获取 access_token 时会返回一个 refresh_token(刷新令牌),在 refresh_token 有效期内可以通过 refresh_token 同样调用 alipay.system.oauth.token 刷新一个新的 access_token。
- 有效期:
- refresh_token 取决于授权时指定的 scope 的有效期。如果授权时指定多个 scope,最终的 refresh_token 的有效期取决于有效期最短的 scope。
- refresh_token 截止时间 =(第一次获得该 refresh_token 的时间 alipay.system.oauth.token(换取授权访问令牌接口)返回的 re_expires_in)。
- 使用:
- 使用 refresh_token 调用 alipay.system.oauth.token(换取授权访问令牌接口)。
- 刷新后可以得到一个新的 access_token,access_token 截止时间重新计算(对应可以看到 expires_in 不会变),原来的 accesss_token 会立即失效;同时会得到一个新的 refresh_token,原来的 refresh_token 会失效,新 refresh_token 截止时间不会重新计算(对应可以看到 re_expires_in 会减少)。
注意: 用户可以取消授权,取消后 refresh_token 即使在有效期内也无法使用。
q:小程序如何实现用户授权?
a:小程序 不支持 使用拼接授权链接进行授权,建议使用 my.getauthcode 实现用户授权、用户登录等。
q:先调用 my.getauthcode,再调用 my.getopenuserinfo 会出现两次授权窗口,是否有方法可以实现只出现一个授权弹框?
a:正常获取会员基础信息是需要弹窗两次进行授权确认的,一次是 my.getauthcode 获取用户授权码的授权框,一次是 my.getopenuserinfo 中获取用户基础信息的授权框。
my.getauthcode 使用静默授权方法(令 scopes 为 auth_base)即可实现只出现一个授权弹框。示例代码如下:
my.getauthcode({
scopes: ['auth_base'],
success: (res) => {
my.alert({
content: res.authcode,
});
},
});
q:为什么小程序获取会员基础信息根据 auth_code 获取 access_token 时提示 appid 无效?
a:开发者获取 auth_code 关联的 appid 需要与调用接口换取 token 时配置的小程序 appid 相同。开发者可以进入 查找自己的应用 appid。
q:为什么使用获取到的 access_token 时报错 aop.invalid-auth-token(无效的访问令牌 )?
a:参数设置的 auth_token 有误或已失效,alipay.system.oauth.token(换取授权访问令牌接口)获取的 access_token 有效时间,查看接口返回的 expires_in 参数显示的值。
q:my.getauthcode 可以在小程序 onload 的时候使用吗?
a:可以,但是必须是静默授权。小程序审核禁止一进入就强制弹授权框。
q:为什么 my.getauthcode 获取用户信息和手机号,报错 isv.insufficient-isv-permissions?
a:
- 报错描述:isv 权限不足,建议在开放平台控制台检查对应功能是否已经添加。
- 报错原因:此报错的含义就是没有对应接口权限。
- 凯发app官方网站的解决方案:
- 查看配置的账号是否有当前接口权限或代理的商家是否有当前接口权限。
详情可查看 如何确认是否完成签约。若没有请先完成签约,签约相关问题可咨询商服服务热线:4007585858 咨询。 - 若是服务商,检查授权令牌(app_auth_token)是否有对应的接口权限。
- 如在沙箱调试出现,请确认请求网关为沙箱 openapi 网关:
https://openapi.alipaydev.com/gateway.do
,并且请求的 app_id 为沙箱的 app_id。 - 通过该应用 appid 查看该应用是否已经上线,目前必须已完成上线的应用才可以在正式环境调用接口。
- 查看配置的账号是否有当前接口权限或代理的商家是否有当前接口权限。