Java支付宝授权第三方登陆

蚂蚁金服开放平台
注册开发者,创建应用
审核的时候我是写项目上线(服务器)的网关和回调地址,审核通过后改本地测试网关和地址。
网关是(ip)地址+项目名称+gateway.do

15570722-2f2deb66f8a2b8dd.png
创建应用.png

配置一些固定的东西:这里需要注意的一个应用公钥和支付宝公钥,在创建应用的时候配置应用公钥会相应产生一个支付宝公钥。我们需要填写的是支付宝公钥和应用私钥

    /**个人回调地址*/
    public static final String REDIRECT_URI = "";
    /**支付宝网关(固定)*/
    public static final String URL = "https://openapi.alipay.com/gateway.do";
    /**APPID 即创建应用后生成*/
    public static final String APP_ID = "";
    /**开发者私钥,由开发者自己生成*/
    public static final String APP_PRIVATE_KEY = "";
    /**参数返回格式,只支持json*/
    public static final String FORMAT = "json";
    /**编码集,支持GBK/UTF-8*/
    public static final String CHARSET = "UTF-8";
    /**支付宝公钥,由支付宝生成*/
    public static final String ALIPAY_PUBLIC_KEY = "";
    /**商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2*/
    public static final String SIGN_TYPE = "RSA2";
    /**
     *  接口权限值,目前只支持auth_user和auth_base两个值-->>
     * auth_base:以auth_base为scope发起的网页授权,是用来获取进入页面的用户的userId的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(通常是业务页面)。
     * auth_user:以auth_user为scope发起的网页授权,是用来获取用户的基本信息的(比如头像、昵称等)。但这种授权需要用户手动同意,用户同意后,就可在授权后获取到该用户的基本信息。若想获取用户信息,scope的值中需要有该值存在,如scope=auth_user,auth_base。
     */
    public static final String SCOPE = "auth_user";

pom的配置:SDK下载地址

<!-- alipay sdk -->
        <dependency>
          <groupId>com.alipay.sdk</groupId>
          <artifactId>alipay-sdk-java</artifactId>
          <version>${alipay-sdk.version}</version>
        </dependency>

首先是一个授权登录,这里你只能获取userId和其他的一些信息,并不能获取详细的用户名称头像等信息,主要区别是请求的地址不同。

stringBuilder
.append("https://openauth.alipay.com/oauth2/appToAppAuth.htm?app_id="+AlipayConstant.APP_ID)
.append("&redirect_uri="+AlipayConstant.REDIRECT_URI);      

回调:

    public Result alipayBusinessLogin(HttpServletRequest request) throws AlipayApiException {
        String appId = request.getParameter("app_id");
        String source = request.getParameter("source");
        String appAuthCode = request.getParameter("app_auth_code");
        // 使用app_auth_code换取app_auth_token
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConstant.URL, // 支付宝网关(固定)
                AlipayConstant.APP_ID, // APPID 即创建应用后生成
                AlipayConstant.APP_PRIVATE_KEY, // 开发者私钥,由开发者自己生成
                AlipayConstant.FORMAT, // 参数返回格式,只支持json
                AlipayConstant.CHARSET, // 编码集,支持GBK/UTF-8
                AlipayConstant.ALIPAY_PUBLIC_KEY, // 支付宝公钥,由支付宝生成
                AlipayConstant.SIGN_TYPE); // 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
        AlipayOpenAuthTokenAppRequest aoataRequest = new AlipayOpenAuthTokenAppRequest();
        // 设置请求参数 使用app_auth_code换取app_auth_token
        aoataRequest.setBizContent("{\"grant_type\":\"authorization_code\",\"code\":\"" + appAuthCode + "\"}");
        // 发送请求得到响应
        AlipayOpenAuthTokenAppResponse aoataResponse = alipayClient.execute(aoataRequest);
        if (!aoataResponse.isSuccess()) {
            throw new RuntimeException("获取app_auth_token失败!" + aoataResponse.getSubMsg());
        }
        // 根据appAuthToken换取用户信息
        AlipayOpenAuthTokenAppQueryRequest aoataqRequest = new AlipayOpenAuthTokenAppQueryRequest();
        aoataqRequest.setBizContent("{\"app_auth_token\":\"" + aoataResponse.getAppAuthToken() + "\"}");
        AlipayOpenAuthTokenAppQueryResponse appQueryResponse = alipayClient.execute(aoataqRequest);
        if (!appQueryResponse.isSuccess()) {
            throw new RuntimeException("获取用户授权信息失败!" + appQueryResponse.getSubMsg());
        }
        // 用户授权成功 获取授权信息
        String userId = appQueryResponse.getUserId();
        String appID = appQueryResponse.getAuthAppId();
        String body = appQueryResponse.getBody();
        System.out.println(userId);
        System.out.println(appID);
        System.out.println(body);
        return null;
    }

下面授权能获取用户详细信息,名称头像等:
官方文档
第一步:URL拼接与scope详解
url拼接规则:https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=SCOPE&redirect_uri=ENCODED_URL

stringBuilder
.append("https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id="+AlipayConstant.APP_ID)
.append("&scope="+AlipayConstant.SCOPE)//接口权限值,目前只支持auth_user和auth_base两个值
.append("&redirect_uri="+AlipayConstant.REDIRECT_URI);

回调:

        // 第二步:获取auth_code
        String auth_code = request.getParameter("auth_code");

        // 第三步:使用auth_code换取接口access_token及用户userId
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConstant.URL, // 支付宝网关(固定)
                AlipayConstant.APP_ID, // APPID 即创建应用后生成
                AlipayConstant.APP_PRIVATE_KEY, // 开发者私钥,由开发者自己生成
                AlipayConstant.FORMAT, // 参数返回格式,只支持json
                AlipayConstant.CHARSET, // 编码集,支持GBK/UTF-8
                AlipayConstant.ALIPAY_PUBLIC_KEY, // 支付宝公钥,由支付宝生成
                AlipayConstant.SIGN_TYPE); // 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
        AlipaySystemOauthTokenRequest asotRequest = new AlipaySystemOauthTokenRequest();
        asotRequest.setCode(auth_code);
        asotRequest.setGrantType("authorization_code");
        AlipaySystemOauthTokenResponse asotResponse = alipayClient.execute(asotRequest);
        String accessToken = asotResponse.getAccessToken();
        //String asotUserId = asotResponse.getUserId();跟下面的userAuthsId是一样的

        // 第四步:调用接口获取用户信息
        AlipayUserInfoShareRequest requestUser = new AlipayUserInfoShareRequest();
        AlipayUserInfoShareResponse userinfoShareResponse = alipayClient.execute(requestUser,
                asotResponse.getAccessToken());
        String nickname = userinfoShareResponse.getNickName();
        String avatar = userinfoShareResponse.getAvatar();
        String userAuthsId = userinfoShareResponse.getUserId();
        String email = userinfoShareResponse.getEmail();

猜你喜欢

转载自blog.csdn.net/weixin_34239592/article/details/86921280