支付宝登录已申请,能否开发支付登录能力?
明确结论
申请“支付宝登录”后,可以先开发和联调授权流程,但提交申请并不代表应用已经获得全部会员信息的访问权限。
如果“获取会员信息”页面中的字段全部显示为不可用,通常是因为应用尚未取得相应接口或字段权限。能力仍在审核、签约配置未完成,或应用类型不支持该能力,也可能导致这种情况。
支付宝登录和支付宝支付是两套独立能力,需要分别申请。开通登录能力不会自动开通支付能力。
需要检查的配置
可以在支付宝开放平台中依次检查以下配置:
-
应用状态
应用需要完成创建和必要的主体认证。如果能力仍显示“申请中”“待补充材料”或“审核未通过”,就不能使用正式权限调用。
-
支付宝登录能力状态
检查该能力是否显示“已开通”或其他明确的可用状态。仅仅提交申请还不够。
-
接口权限
检查应用是否拥有以下接口或对应新版接口的调用权限:
alipay.system.oauth.tokenalipay.user.info.share
应用类型、开放平台页面版本和隐私政策不同,可申请的接口及返回字段也可能不同。具体权限以当前应用后台显示的内容为准。
-
授权回调地址
配置接收授权码
auth_code的回调地址。生产环境应使用稳定的 HTTPS 地址,实际传入的地址必须与后台配置一致。 -
应用密钥
完成应用公钥或支付宝公钥配置。服务端换取令牌和调用会员信息接口时,需要使用应用私钥签名。
-
应用资料和隐私材料
如果控制台要求补充资料,可能包括:
- 应用名称、图标和功能说明;
- 应用首页或实际使用场景;
- 用户协议;
- 隐私政策;
- 申请会员信息的用途说明;
- 对应业务页面截图或演示材料;
- 主体资质或行业资质。
是否需要提供这些资料,以及具体格式要求,应以能力申请页面和审核提示为准。
登录授权流程
通常需要完成以下流程:
用户进入业务页面
↓
跳转支付宝授权页面
↓
用户确认授权
↓
支付宝回调业务系统,并携带 auth_code
↓
服务端调用 alipay.system.oauth.token 换取 access_token
↓
服务端调用 alipay.user.info.share 获取已授权的会员信息
授权地址可以按以下形式构造:
https://openauth.alipay.com/oauth2/publicAppAuthorize.htm
?app_id=你的APP_ID
&scope=auth_user
&redirect_uri=URL编码后的回调地址
&state=随机状态值
需要注意:
redirect_uri必须经过 URL 编码;state应由服务端生成,并在回调时完成校验,以防止 CSRF;auth_code通常只能使用一次,而且有有效期。收到后应立即由服务端换取令牌;- 实际支持哪些
scope,应以当前能力文档和应用权限为准。
Java 服务端示例
下面的示例使用支付宝 Java SDK。类名可能随 SDK 版本调整,依赖版本应以开放平台当前文档为准。
使用授权码换取访问令牌:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
APP_ID,
APP_PRIVATE_KEY,
"json",
"UTF-8",
ALIPAY_PUBLIC_KEY,
"RSA2"
);
AlipaySystemOauthTokenRequest tokenRequest =
new AlipaySystemOauthTokenRequest();
tokenRequest.setGrantType("authorization_code");
tokenRequest.setCode(authCode);
AlipaySystemOauthTokenResponse tokenResponse =
alipayClient.execute(tokenRequest);
if (!tokenResponse.isSuccess()) {
throw new IllegalStateException(
tokenResponse.getCode() + ": " + tokenResponse.getSubMsg()
);
}
String accessToken = tokenResponse.getAccessToken();
取得 access_token 后,再读取会员信息:
AlipayUserInfoShareRequest userInfoRequest =
new AlipayUserInfoShareRequest();
AlipayUserInfoShareResponse userInfoResponse =
alipayClient.execute(userInfoRequest, accessToken);
if (!userInfoResponse.isSuccess()) {
throw new IllegalStateException(
userInfoResponse.getCode() + ": " + userInfoResponse.getSubMsg()
);
}
String userId = userInfoResponse.getUserId();
String nickName = userInfoResponse.getNickName();
String avatar = userInfoResponse.getAvatar();
即使接口调用成功,nickName、avatar 等字段也不一定会返回。具体返回范围取决于用户授权、应用权限、账号状态和支付宝当前的数据合规策略。
字段全部不可用时如何排查
如果后台中的会员字段显示为灰色或标记为不可用,可以按以下顺序排查:
- 检查能力申请是否已经通过审核;
- 查看页面是否要求补充隐私政策、应用场景或资质材料;
- 确认当前查看的
APP_ID与申请登录能力时使用的是同一个; - 确认该应用类型是否支持这项能力;
- 检查应用是否已获得
alipay.user.info.share或对应会员信息接口的调用权限; - 在沙箱或开发环境中测试用授权码换取令牌;
- 根据接口返回的
code、sub_code和sub_msg,判断问题出在权限、签名、令牌还是参数; - 如果控制台没有补充资料的入口,但能力仍然不可用,可以携带
APP_ID、能力申请状态截图和接口错误信息,咨询支付宝开放平台技术支持。
注意事项
- 登录能力用于完成支付宝账号授权登录,不能代替当面付、手机网站支付或 App 支付等支付产品。
- 不要在浏览器或客户端中保存应用私钥,也不要让前端直接调用需要签名的开放接口。
access_token、refresh_token和会员标识属于敏感数据,应妥善保存,避免写入公开日志。- 不要将昵称或手机号作为用户的唯一标识。应优先使用接口实际返回的稳定用户标识,并按照当前开放平台关于
user_id、open_id的规则设计账号绑定。 - 当前端页面显示字段不可用时,增加请求参数无法绕过权限限制。必须完成相应的能力申请或资料审核。
备注:内容仅供参考。
