支付宝官方文档写的很详细,参见:https://opendocs.alipay.com/open/218/105329?pathHash=29c8f60b

用户进入商家 App。
商家对应页面引导用户进行免登或者授权操作。
商家通过支付宝客户端 SDK 唤起 APP 支付宝登录产品。
支付宝 SDK 自动判断用户当前环境是否已经安装了支付宝 App,如果有,唤起支付宝 App 内对应授权页面;如果用户未安装支付宝 App 则会引导用户安装支付宝。
用户在支付宝授权页面进行信息授权。
支付宝判断用户是否授权成功,如果成功则返回给商家对应授权用户的支付宝 authCode;如果用户授权失败,则本次服务结束。
商家使用 authCode 来换取 token。
商家如果仅使用支付宝 id 进行快速登录,则本次产品调用流程结束;商家如果需要更多授权支付宝用户的信息,则使用之前获取的 token 调用 支付宝用户信息查询接口 查询用户基本信息。
我们使用官方文档的流程,用支付宝沙箱环境完成这个流程
参见:https://opendocs.alipay.com/open/09byox?pathHash=4e5b941b
支付宝沙箱:https://openhome.alipay.com/develop/sandbox/app
登录沙箱后,我们需要的信息为:
沙箱账号/密码
APPID、应用私钥、支付宝公钥
设置授权回调地址,当用户进行授权后,会回调此地址并传递 authCode 等

访问授权页面
https://openauth-sandbox.dl.alipaydev.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=auth_user&redirect_uri=REDIRECT_URIscope:接口权限值,目前只支持 auth_user(获取用户信息、网站支付宝登录)、auth_base(用户信息授权)、auth_ecard(商户会员卡)、auth_invoice_info(支付宝闪电开票)、auth_puc_charge(生活缴费)五个值;多个scope时用”,”分隔,如scope为”auth_user,auth_ecard”时,此时获取到的access_token,既可以用来获取用户信息,又可以给用户发送会员卡。
将此链接中的 APPID 及 REDIRECT_URI 换成我们准备好数据,让后在浏览器中访问此地址即可进入授权页面,授权成功后,支付宝会调用我们填写的回调地址传递 authCode 等信息。此链接中的 REDIRECT_URI 需和我们在沙箱中配置的一致。
注意:在上一步我们填写了回调地址,但请注意,支付宝调用回调地址是一个公网能够访问的地址,所以为了方便测试,有条件的话可以使用内网穿透。
有了 authCode 我们就可以传递给后端,由后端调用支付宝 API 获取 authToken
下载 SDK
参见:https://opendocs.alipay.com/open/54/103419
implementation group: 'com.alipay.sdk', name: 'alipay-sdk-java', version: '4.40.418.ALL'<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.40.418.ALL</version>
</dependency>获取 authToken
public static void test1(String authCode) throws AlipayApiException {
// 初始化SDK
AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
// 构造请求参数以调用接口
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
// 设置授权码
request.setCode(authCode);
// 设置授权方式
request.setGrantType("authorization_code");
AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
System.out.println(response.getBody());
if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
}
private static AlipayConfig getAlipayConfig() {
String privateKey = "应用私钥";
String alipayPublicKey = "支付宝公钥";
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi-sandbox.dl.alipaydev.com/gateway.do");
alipayConfig.setAppId("APPID");
alipayConfig.setPrivateKey(privateKey);
alipayConfig.setFormat("json");
alipayConfig.setAlipayPublicKey(alipayPublicKey);
alipayConfig.setCharset("UTF-8");
alipayConfig.setSignType("RSA2");
return alipayConfig;
}拿到 authToken 后,我们就可以拿到用户的信息
public static void test2(String authToken) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
AlipayUserInfoShareResponse response = alipayClient.execute(request, authToken);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
}