美文网首页
Java支付宝授权第三方登陆

Java支付宝授权第三方登陆

作者: Felix_Fang | 来源:发表于2019-01-20 18:30 被阅读0次

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

    创建应用.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();
    

    相关文章

      网友评论

          本文标题:Java支付宝授权第三方登陆

          本文链接:https://www.haomeiwen.com/subject/mwtfjqtx.html