支付宝官方文档写的很详细,参见:https://opendocs.alipay.com/open/218/105329?pathHash=29c8f60b
用户进入商家 App。
商家对应页面引导用户进行免登或者授权操作。
商家通过支付宝客户端 SDK 唤起 APP 支付宝登录产品。
支付宝 SDK 自动判断用户当前环境是否已经安装了支付宝 App,如果有,唤起支付宝 App 内对应授权页面;如果用户未安装支付宝 App 则会引导用户安装支付宝。
用户在支付宝授权页面进行信息授权。
支付宝判断用户是否授权成功,如果成功则返回给商家对应授权用户的支付宝 authCode;如果用户授权失败,则本次服务结束。
商家使用 authCode 来换取 token。
商家如果仅使用支付宝 id 进行快速登录,则本次产品调用流程结束;商家如果需要更多授权支付宝用户的信息,则使用之前获取的 token 调用 支付宝用户信息查询接口 查询用户基本信息。
我们使用官方文档的流程,用支付宝沙箱环境完成这个流程
流程
1. 准备支付宝沙箱环境
参见:https://opendocs.alipay.com/open/09byox?pathHash=4e5b941b
支付宝沙箱:https://openhome.alipay.com/develop/sandbox/app
登录沙箱后,我们需要的信息为:
沙箱账号/密码
APPID、应用私钥、支付宝公钥
设置授权回调地址,当用户进行授权后,会回调此地址并传递 authCode 等
2. 获取 authCode
访问授权页面
https://openauth-sandbox.dl.alipaydev.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=auth_user&redirect_uri=REDIRECT_URI
scope:接口权限值,目前只支持 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 需和我们在沙箱中配置的一致。
注意:在上一步我们填写了回调地址,但请注意,支付宝调用回调地址是一个公网能够访问的地址,所以为了方便测试,有条件的话可以使用内网穿透。
3. 换取 authToken
有了 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; }
4. 获取用户信息
拿到 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("调用失败");
}
}