【第三方互联】12、支付宝(Alipay)授权第三方登录

【第三方互联】12、支付宝(Alipay)授权第三方登录我们创建了支付宝开放平台的网页&移动应用,审核通过后,我们需要拿到appid,支付宝公钥,私钥进项开发一、添加应用信息至项目环境中我们保存了appid、应用私钥、支付宝公钥、支付宝回调地址等信息,这里的公钥为支付宝开放平台为我们生成的“支付宝公钥”二、引入Maven依赖<!–支付宝SDK–><dependency> <g………

我们创建了支付宝开放平台的网页&移动应用,审核通过后,我们需要拿到appid,支付宝公钥,私钥进行开发

一、应用信息

添加应用信息至项目环境中
配置信息
我们保存了 appid、应用私钥、支付宝公钥、支付宝回调地址等信息,这里的公钥为支付宝开放平台为我们生成的“支付宝公钥

二、引入 Maven 依赖

<!-- 支付宝SDK -->
<dependency>
	<groupId>com.alipay.sdk</groupId>
	<artifactId>alipay-sdk-java</artifactId>
	<version>4.9.28.ALL</version>
</dependency>
<!-- alibaba的fastjson -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.51</version>
</dependency>

其余依赖请自行添加

三、登录按钮

在页面放置 “支付宝” 授权登录的 DOM 元素

<a th:href="@{alipay/auth}" class="link" title="支付宝登录"><i class="iconfont icon-zhifubao"></i></a>

这里使用的是阿里的 iconfont 图标

四、接口类

创建 “支付宝” 授权登录的 Controller,AlipayController.java

1、从配置文件中获取 “支付宝” 配置信息

/** * 微博授权中提供的 appid 和 appkey */
@Value("${alipay.oauth.appid}")
public String APPID;
@Value("${alipay.oauth.callback-url}")
public String CALL_BACK_URL;
@Value("${alipay.oauth.private-key}")
public String PRIVATE_KEY;
@Value("${alipay.oauth.public-key}")
public String PUBLIC_KEY;

2、登录按钮点击后的接口

/** * 请求授权页面 */
@GetMapping(value = "/auth")
public String qqAuth(HttpSession session) { 
   
    // 用于第三方应用防止CSRF攻击
    String uuid = UUID.randomUUID().toString().replaceAll("-", "");
    session.setAttribute("state", uuid);

    // Step1:获取Authorization Code
    String url = "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?scope=auth_user" +
            "&app_id=" + APPID +
            "&redirect_uri=" + URLEncoder.encode(CALL_BACK_URL) +
            "&state=" + uuid;

    return "redirect:" + url;
}

接口文档中建议我们在授权登录时传入一个加密的数据防止被攻击,我们传入了UUID,最后重定向到授权页面
授权界面
3、当该用户点击“授权”按钮,同意授权后,就会回调到我们在应用中填写的回调地址里去

/** * 授权回调 */
@GetMapping(value = "/callback")
public String qqCallback(HttpServletRequest request) throws Exception { 
   
    // 获取session
    HttpSession session = request.getSession();
    // 得到auth_code
    String authCode = request.getParameter("auth_code");
    // 我们放在地址中的状态码
    String state = request.getParameter("state");
    String uuid = (String) session.getAttribute("state");
    // 验证信息我们发送的状态码
    if (null != uuid) { 
   
        // 状态码不正确,直接返回登录页面
        if (!uuid.equals(state)) { 
   
            return "redirect:" + url;
        }
    }

    // Step2:通过auth_code获取Access Token 以及 user_id
    JSONObject tokenJson = AlipayHttpClient.getAccessToken(APPID, PRIVATE_KEY, PUBLIC_KEY, authCode);
    // Step3:通过auth_code获取用户信息
    JSONObject userJson = AlipayHttpClient.getUserInfo(APPID, PRIVATE_KEY, PUBLIC_KEY, tokenJson.getString("accessToken"));
   	/** * 获取到用户信息之后,就该写你自己的业务逻辑了 */
    return "redirect:" + "success";
}

以上代码,从我自己的项目中拷贝而来,如果你直接使用,你需要对其业务代码进行修改

五、网络请求方法

第四步代码中所用到的网络接口方法,我放在了 AlipayHttpClient.java 文件中,主要有两个方法

/** * auth_code换取access_token与user_id * * @param appid * @param privateKey 私钥 * @param publicKey 公钥 * @param authCode 授权码 * @return * @throws AlipayApiException */
public static JSONObject getAccessToken(String appid, String privateKey, String publicKey, String authCode) throws AlipayApiException { 
   
    // 返回对象
    JSONObject res = new JSONObject();
    /** * 支付宝网关(固定) * APPID 即创建应用后生成 * 开发者私钥,由开发者自己生成 * 参数返回格式,只支持json * 编码集,支持GBK/UTF-8 * 支付宝公钥,由支付宝生成 * 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2 */
    AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", appid, privateKey, "json", "UTF-8", publicKey, "RSA2");
    // 请求对象
    AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
    // 第一步获取到的:auth_code
    request.setCode(authCode);
    // 授权类型
    request.setGrantType("authorization_code");
    // 发起请求
    AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);
    // 拿到 access_token
    res.put("accessToken", oauthTokenResponse.getAccessToken());
    // 拿到 user_id
    res.put("userId", oauthTokenResponse.getUserId());
    return res;
}

/** * 使用 access_token 获取用户信息 * * @param appid * @param privateKey 私钥 * @param publicKey 公钥 * @param accessToken 令牌 * @throws AlipayApiException */
public static JSONObject getUserInfo(String appid, String privateKey, String publicKey, String accessToken) throws AlipayApiException { 
   
    // 返回对象
    JSONObject res = new JSONObject();
    /** * 支付宝网关(固定) * APPID 即创建应用后生成 * 开发者私钥,由开发者自己生成 * 参数返回格式,只支持json * 编码集,支持GBK/UTF-8 * 支付宝公钥,由支付宝生成 */
    AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", appid, privateKey, "json", "UTF-8", publicKey, "RSA2");
    // 请求对象
    AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
    // 传入token,发起请求
    AlipayUserInfoShareResponse response = alipayClient.execute(request, accessToken);
    // 请求成功
    if ("10000".equals(response.getCode())) { 
   
        res.put("code", 1);
        res.put("user", response);
    }
    // 请求失败
    else { 
   
        res.put("code", 0);
        res.put("msg", "获取用户信息失败");
    }
    return res;
}

最终我们获取到用户的信息是一个 AlipayUserInfoShareResponse 对象,该对象包含了该用户的所有信息,建议观看源代码

以上,就是完成 “支付宝” 授权登录的过程,相比起腾讯QQ新浪微博的第三方授权登录,支付宝需要用到接口加签的操作,但我们使用支付宝平台提供的工具也很容易

六、总结

授权登录总结
如您在阅读中发现不足,欢迎留言!!!

下一篇:

【第三方互联】十三、码云(Gitee)授权第三方登录

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/39245.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注