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

  1. 用户进入商家 App。

  2. 商家对应页面引导用户进行免登或者授权操作。

  3. 商家通过支付宝客户端 SDK 唤起 APP 支付宝登录产品。

  4. 支付宝 SDK 自动判断用户当前环境是否已经安装了支付宝 App,如果有,唤起支付宝 App 内对应授权页面;如果用户未安装支付宝 App 则会引导用户安装支付宝。

  5. 用户在支付宝授权页面进行信息授权。

  6. 支付宝判断用户是否授权成功,如果成功则返回给商家对应授权用户的支付宝 authCode;如果用户授权失败,则本次服务结束。

  7. 商家使用 authCode 来换取 token。

  8. 商家如果仅使用支付宝 id 进行快速登录,则本次产品调用流程结束;商家如果需要更多授权支付宝用户的信息,则使用之前获取的 token 调用 支付宝用户信息查询接口 查询用户基本信息。

我们使用官方文档的流程,用支付宝沙箱环境完成这个流程

流程

1. 准备支付宝沙箱环境

参见:https://opendocs.alipay.com/open/09byox?pathHash=4e5b941b

支付宝沙箱:https://openhome.alipay.com/develop/sandbox/app

登录沙箱后,我们需要的信息为:

  1. 沙箱账号/密码

  2. 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

  1. 下载 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>
  1. 获取 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("调用失败");
    }
}