PC 网页内获取用户信息
授权流程

1.
2.
3.
4.
第一步:URL 拼接
https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=SCOPE&redirect_uri=ENCODED_URL
参数名 | 是否必须 | 描述 |
---|---|---|
app_id | 是 | 开发者应用的 APPID |
scope | 是 | 接口权限值,目前只支持 auth_user 和 auth_base 两个值 |
redirect_uri | 是 | 回调页面,是经过转义的url链接(url 必须以 http 或者 https 开头),比如:http%3A%2F%2Fexample.com 在请求之前,开发者需要先到开发者中心对 应应用内,配置授权回调地址。 |
state | 否 | 商户自定义参数,用户授权后,重定向到 redirect_uri 时会原样回传给商户。 为防止 CSRF 攻击,建议开发者请求授权时传入 state 参数,该参数要做到既不可预测,又可以证明客户端和当前第三方网站的登录认证状态存在关联,并且不能有中文。**说明:**参数由用户自定义拼接,拼接完成后将参数进行 base64 转码。最后将参数拼接为 state=XXXXX 即可,最大长度 100 位。 |
app_id
和 redirect_uri
:关于 redirect_uri 的说明

https://auth.example.com/authCallBack
,则 redirect_uri 内容需要 encode 处理,为 https%3A%2F%2Fauth.example.com%2FauthCallBack
。http://auth.example.com/authCallBack
、https://auth.example.com/authRedirect
、https://auth.example.com/
都可以进行 OAuth2.0 授权。但与(auth.example.com)关联的二三级域名,如:http://www.example.com/
、http://example.com/
无法进行 OAuth2.0 授权。关于 scope 的说明
scopes | 描述 | 包含的服务端 API 接口 |
---|---|---|
auth_base | 静默授权,不会发起授权浮窗,用户授权并自动跳转到回调页。用户感知为直接进入回调页面(通常是业务页面)。在支付宝客户端获取 auth_code,仅可用于 alipay.system.oauth.token(换取授权访问令牌接口)获取支付宝会员标识(user_id)。 | alipay.system.oauth.token |
auth_user | 主动授权,需要用户手动点击同意,用户同意后可获取用户的基本信息的(比如头像、昵称等),用于 网站支付宝登录 和 获取用户信息。 | alipay.system.oauth.tokenalipay.user.info.share |
PC 网页内授权页面示例:

第二步:获取 auth_code
http : //example.com/doc/toAuthPage.html?app_id=2014101500013658&source=alipay_wallet&scope=auth_user&auth_code=ca34ea491e7146cc87d25fca24c4cD11
术语解释
第三步:换取 access_token 和 userId
接口请求示例
package com.java.sdk.demo;
import com.alipay.v3.ApiException;
import com.alipay.v3.ApiClient;
import com.alipay.v3.util.model.AlipayConfig;
import com.alipay.v3.Configuration;
import com.alipay.v3.api.AlipaySystemOauthApi;
import com.alipay.v3.model.*;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AlipaySystemOauthApiToken {
public static void main(String[] args) throws ApiException {
ApiClient defaultClient = Configuration.getDefaultApiClient();
// 初始化alipay参数(全局设置一次)
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi.alipay.com");
alipayConfig.setAppId("<-- 请填写您的AppId,例如:2019091767145019 -->");
alipayConfig.setPrivateKey("<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->");
alipayConfig.setAlipayPublicKey("<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->");
defaultClient.setAlipayConfig(alipayConfig);
AlipaySystemOauthApi api = new AlipaySystemOauthApi();
AlipaySystemOauthTokenModel data = new AlipaySystemOauthTokenModel();
data.setCode("4b203fe6c11548bcabd8da5bb087a83b");
data.setGrantType("authorization_code");
data.setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");
try {
AlipaySystemOauthTokenResponseModel response = api.token(data);
} catch (ApiException e) {
AlipaySystemOauthTokenDefaultResponse errorObject = (AlipaySystemOauthTokenDefaultResponse) e.getErrorObject();
System.out.println("调用失败:" + errorObject);
}
}
}
请求参数说明
参数 | 参数名称 | 类型(长度范围) | 参数说明 | 是否可为空 | 样例 |
---|---|---|---|---|---|
grant_type | 授权类型 | String | 值为authorization_code 时,代表用 code 换取;值为 refresh_token 时,代表用 refresh_token 换取 | 不可空 | authorization_code |
code | 授权码 | String | 用户对应用授权后得到,即第二步中开发者获取到的 auth_code 值 | 与 refresh_token 二选一 | 4b203fe6c11548bcabd8da5bb087a83b |
refresh_token | 刷新令牌 | String | 刷新access_token时使用 | 与 code 二选一 | 201208134b203fe6c11548bcabd8da5bb087a83b |
同步响应结果示例
{
"access_token":"20120823ac6ffaa4d2d84e7384bf983531473993",
"refresh_token":"20120823ac6ffdsdf2d84e7384bf983531473993",
"user_id":"2088102150477652",
"re_expires_in":"3600",
"auth_start":"2010-11-11 11:11:11",
"expires_in":"3600"
}
同步响应参数说明
参数 | 参数名称 | 类型(长度范围) | 参数说明 | 是否可为空 | 样例 |
---|---|---|---|---|---|
access_token | 交换令牌 | String | 用于获取用户信息 | 不可空 | publicpBa869cad0990e4e17a57ecf7c5469a4b2 |
user_id | 用户的 userId | String | 支付宝用户的唯一 userId | 不可空 | 2088102104711111 |
expires_in | 令牌有效期 | String | 交换令牌的有效期,单位秒 | 不可空 | 300 |
re_expires_in | 刷新令牌有效期 | String | 刷新令牌有效期,单位秒 | 不可空 | 300 |
refresh_token | 刷新令牌 | String | 通过该令牌可以刷新 access_token | 不可空 | publicpB0ff17e364f0743c79b0b0d7f55e20bfc |
第四步:获取用户信息
接口请求示例
package com.java.sdk.demo;
import com.alipay.v3.ApiException;
import com.alipay.v3.ApiClient;
import com.alipay.v3.util.model.AlipayConfig;
import com.alipay.v3.Configuration;
import com.alipay.v3.api.AlipayUserInfoApi;
import com.alipay.v3.model.*;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AlipayUserInfoApiShare {
public static void main(String[] args) throws ApiException {
ApiClient defaultClient = Configuration.getDefaultApiClient();
// 初始化alipay参数(全局设置一次)
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi.alipay.com");
alipayConfig.setAppId("<-- 请填写您的AppId,例如:2019091767145019 -->");
alipayConfig.setPrivateKey("<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->");
alipayConfig.setAlipayPublicKey("<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->");
defaultClient.setAlipayConfig(alipayConfig);
AlipayUserInfoApi api = new AlipayUserInfoApi();
String authToken = null;
try {
AlipayUserInfoShareResponseModel response = api.share(authToken);
} catch (ApiException e) {
AlipayUserInfoShareDefaultResponse errorObject = (AlipayUserInfoShareDefaultResponse) e.getErrorObject();
System.out.println("调用失败:" + errorObject);
}
}
}
公共请求参数说明
参数 | 参数名称 | 类型(长度范围) | 参数说明 | 是否可为空 | 样例 |
---|---|---|---|---|---|
auth_token | 授权令牌 | String | 通过auth_code获取的access_token | 不可空 | publicpB9ea460ff5b5c468c9ccf5e967dc34963 |
同步响应结果示例
{
"province":"安徽省",
"gender":"F",
"user_id":"2088102104794936",
"city":"安庆",
"nick_name":"支付宝小二",
"avatar":"http://tfsimg.alipay.com/images/partner/T1uIxXXbpXXXXXXXX"
}
同步响应参数说明
参数 | 参数名称 | 类型(长度范围) | 参数说明 | 样例 |
---|---|---|---|---|
user_id | 支付宝用户id | String | 支付宝用户的会员 ID,2088 开头的 16 位数字。 | 2088102104794936 |
avatar | 用户头像 | String | 如果没有数据(用户未设置)时不会返回该信息,请做好容错。 | https://tfsimg.alipay.com/images/partner/T1k0xiXXRnXXXXXXXX |
nick_name | 用户昵称 | String | 如果没有数据(用户未设置)时不会返回该信息,请做好容错。 | 张三 |
结果码说明
同步返回结果码 | 含义 | 说明 |
---|---|---|
10000 | 业务处理成功 | |
40001~40006 | 业务处理失败 | 具体失败原因请参考 公共错误码。其它请参考 API 文档。 |
20000 | 业务出现未知错误或者系统异常 | 业务出现未知错误或者系统异常(请一定在确定本次调用结果后,发起重试),可调用查询接口发起查询确定结果。 |
消息通知
第一步:订阅消息
第二步:验签
第三步:反馈消息接收结果
success
表示消息获取成功,支付宝就会停止发送异步通知。如果返回 fail
或其他值,表示消息获取失败,支付宝会根据 投递重试策略 重新发送消息到应用网关地址。success
,验签失败返回 fail
,重新接收异步进行处理。响应值 | 描述 | 是否重试 |
---|---|---|
fail | 消息获取失败 | 重试 |
success | 消息获取成功 | 不重试 |
用户授权取消消息通知
消息示例
ISV_GATEWAY_URL?charset=GBK&biz_content=
{
"app_id":"2014072300007148","user_id":"2088102104711111","cancel_time":"1514210452731"
}
&msg_method=alipay.open.auth.userauth.cancelled&utc_timestamp=1516797622752&version=1.1&sign_type=RSA2¬ify_id=d275fec564e62af6bedbcee73f3f05fi5x&app_id=2013121700999429&sign=I+Y/lvqYUEEc10EPdpntRhFIQ==
接入沙箱
https://openauth-sandbox.dl.alipaydev.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=SCOPE&redirect_uri=ENCODED_URL
。修改于 2023-11-22 09:35:21