每一年都奔走在自己热爱里

没有人是一座孤岛,总有谁爱着你

SpringBoot+Vue实现第三方支付宝登录(二)

1. 支付宝登录授权流程

网站支付宝登录的授权流程遵照 OAuth2.0 协议,具体请见下图。其中,申请获取用户信息功能时默认可获取的用户信息包含支付宝用户 ID、昵称、性别、省份、城市、用户头像信息。

  1. 首先,按照规则拼接授权页面的链接引导用户登录并授权给商家;

  2. 用户授权后,开放平台会将用户浏览器重定向到商家设置的 returnUrl(该 URL 需与商家在开放平台设置的授权回调地址保持一致),同时会带上 auth_code 参数;

  3. 商家在获取 auth_code 后,调用开放平台接口 alipay.system.oauth.token(换取授权访问令牌接口),使用 auth_code 换取授权访问令牌 access_token;

  4. 此时,商家就可以拿着 access_token,通过商户后台发起对开放平台 alipay.user.info.share(支付宝会员授权信息查询接口)的调用,获取用户授权的信息。

本步骤的作用

  登录 开放平台控制台 获取创建应用的 APPID

  接入支付宝登录前,网站需首先进行申请,获得对应的appid,以保证后续流程中可正确对网站与用户进行验证与授权。

注意:appidappkey信息进行保密,不要随意泄漏。

2. 放置“支付宝登录”按钮

本步骤的作用

  在网站页面上放置“支付宝登录”按钮,并为按钮添加前台代码,实现点击按钮即弹出支付宝登录对话框 。

2.1 下载“支付宝登录”按钮图片,并将按钮放置在页面合适的位置

  可以到阿里矢量图库下载更多图标:阿里巴巴矢量图标库 。

2.2 把“支付宝登录”按钮添加到页面

2.2.1 效果演示

2.2.2 前端代码(Vue)

  为了实现上述效果,应该为“支付宝登录”按钮图片添加如下前台登录页面代码:

<div style="line-height: 22px;margin:0 0 8px 0;color: #9b9b9b;">
        <span style="vertical-align:middle">第三方登录:</span>
        <img :src="qqIcon" width="22" height="22" style="vertical-align:middle;margin-left: 8px" title="QQ">
        <img :src="baiduIcon" width="22" height="22" style="vertical-align:middle;margin-left: 8px" title="百度">
        <img :src="weiboIcon" width="22" height="22" style="vertical-align:middle;margin-left: 8px" title="微博">
        <img :src="zhifubaoIcon" width="22" height="22" style="vertical-align:middle;margin-left: 8px" title="支付宝">
        <img :src="giteeIcon" width="22" height="22" style="vertical-align:middle;margin-left: 8px" title="Gitee">
        <img :src="githubIcon" width="22" height="22" style="vertical-align:middle;margin-left: 8px" title="GitHub">
</div>

2.2.3 后端代码(Java)

1. 支付宝登录配置文件信息:

# 支付宝登录配置
zhifubao.appID = 66666666 ( 替换成你的 )
zhifubao.redirectURI = https://www.youyoushop.work/zhiFuBaoCallback ( 替换成你的 )
zhifubao.authorizeURL = https://openauth.alipay.com/oauth2/publicAppAuthorize.htm
zhifubao.gateway = https://openapi.alipay.com/gateway.do
zhifubao.appPrivateKey = MIIujfisdfasdf33232ufsdf0d8fsad ( 替换成你的私钥 )
zhifubao.alipayPublicKey = MIIBIjANBgkqhkiG9w0BAQEFfffffffasdfasdfaer3fsadfbovsgdTUqaUKhF ( 替换成你的公钥 )

2. 读取配置文件信息常量类:

package com.liyh.constants;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

/**
 * 支付宝登陆常量配置类
 *
 * @author Liyh
 */
@Data
@Configuration
@PropertySource("classpath:config.properties")
public class ZhiFuBaoConstants {

    @Value("${zhifubao.appID}")
    private String appID;

    @Value("${zhifubao.redirectURI}")
    private String redirectURI;

    @Value("${zhifubao.authorizeURL}")
    private String authorizeURL;

    @Value("${zhifubao.gateway}")
    private String gateway;

    @Value("${zhifubao.appPrivateKey}")
    private String appPrivateKey;

    @Value("${zhifubao.alipayPublicKey}")
    private String alipayPublicKey;

}

3. Conteoller(获取支付宝登录的url)

@ApiOperation("获得跳转到支付宝登录页的url")
@GetMapping("/getZhiFuBaoCode")
public ResponseEntity<Object> getZhiFuBaoCode() throws Exception {
    // 授权地址 ,进行Encode转码
    String authorizeURL = zhiFuBaoConstants.getAuthorizeURL();

    // 回调地址 ,回调地址要进行Encode转码
    String redirectUri = zhiFuBaoConstants.getRedirectURI();

    //用于第三方应用防止CSRF攻击
    String uuid = UUID.randomUUID().toString().replaceAll("-", "");
    // 保存到Redis
    redisUtils.set(ZHIFUBAOSTATE + "-" + uuid, uuid, expiration, TimeUnit.MINUTES);

    // https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?
    // app_id=appid
    // &scope=auth_user
    // &redirect_uri=redirectUri
    // &state=init

    // 拼接url
    StringBuilder url = new StringBuilder();
    url.append(authorizeURL);
    url.append("?app_id=" + zhiFuBaoConstants.getAppID());
    // 转码
    url.append("&redirect_uri=" + URLEncodeUtil.getURLEncoderString(redirectUri));
    url.append("&state=" + uuid);
    url.append("&scope=auth_user");

    return ResponseEntity.ok(url);
}

3. 使用Authorization_Code获取Access_Token(官方文档:地址

本步骤的作用

  通过用户验证登录和授权,获取Access Token,为下一步获取用户的OpenID做准备。

  同时,Access Token是应用在调用OpenAPI访问和修改用户数据时必须传入的参数。

3.1 简介

  适用于需要从web server访问的应用,例如Web网站。

对于应用而言,需要进行两步:

  1. 获取Authorization Code。

  2. 通过Authorization Code获取Access Token。

3.2 获取Authorization Code

示例代码

https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?
app_id=66666
&scope=auth_user
&redirect_uri=redirectUri
&state=asdfsdf

请求参数

参数 是否必须 含义
app_id  必须 开发者应用的app_id,相同支付宝账号下,不同的app_id获取的token切忌混用。
scope  必须 接口权限值,目前只支持auth_user(获取用户信息、网站支付宝登录)、auth_base(用户信息授权)、auth_ecard(商户会员卡)、auth_invoice_info(支付宝闪电开票)、auth_puc_charge(生活缴费)五个值;多个scope时用”,”分隔,如scope为”auth_user,auth_ecard”时,此时获取到的access_token,可以用来获取用户信息
redirect_uri 必须 授权回调地址,是经过URLENCODE转义 的url链接(url必须以http或者https开头); 在请求之前,开发者需要先到开发者中心对应应用内,配置授权回调地址。 redirect_uri与应用配置的授权回调地址域名部分必须一致。
state 自定义参数,用户授权后,重定向到redirect_uri时会原样回传给商户。 为防止CSRF攻击,建议开发者请求授权时传入state参数,该参数要做到既不可预测,又可以证明客户端和当前第三方网站的登录认证状态存在

返回说明

1. 如果用户成功登录并授权,则会跳转到指定的回调地址,并在redirect_uri地址后带上Authorization Code和原始的state值。如:  

http://example.com/doc/toAuthPage.html?app_id=2014101500013658&source=alipay_wallet&scope=auth_user&auth_code=ca34ea491e7146cc87d25fca24c4cD11

注意:此code会在10分钟内过期。

2. 如果用户在登录授权过程中取消登录流程,对于PC网站,登录页面直接关闭。

错误码说明

  接口调用有错误时,会返回code和msg字段,以url参数对的形式返回,value部分会进行url编码(UTF-8)。

  PC网站接入时,错误码详细信息请参见:PC网站接入时的公共返回码

3.3 通过Authorization Code获取Access Token

请求说明

  支付宝登录和qq等第三方登录方式不一样,需要使用支付宝的依赖

<!--支付宝依赖-->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.1.0</version>
</dependency>

请求参数

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");

接口实例代码:

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); 
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setCode("2e4248c2f50b4653bf18ecee3466UC18");
request.setGrantType("authorization_code");
try {
    AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);
    System.out.println(oauthTokenResponse.getAccessToken());
} catch (AlipayApiException e) {
    //处理异常
    e.printStackTrace();
}

4. 通过Access Token 获取用户信息

本步骤的作用

  通过输入在上一步获取的Access Token,得到对应用户的信息。

请求参数:

AlipayClient alipayClient = new DefaultAlipayClient(zhiFuBaoConstants.getGateway(), zhiFuBaoConstants.getAppID(), zhiFuBaoConstants.getAppPrivateKey(), "json", "GBK", zhiFuBaoConstants.getAlipayPublicKey(), "RSA2");

接口实例代码:

AlipayClient alipayClient = new DefaultAlipayClient(
        "https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", "GBK",
        ALIPAY_PUBLIC_KEY);
    AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
    String token =/* 获取步骤3中的token */;
    AlipayUserInfoShareResponse response = alipayClient.execute(request, token);
    if (response.isSuccess()) {
        System.out.println("调用成功");
        System.out.println(ReflectionToStringBuilder.toString(response));
        String userId = response.getUserId();
    } else {
        System.out.println("调用失败");
        System.out.println(response.getSubCode() + ":" + response.getSubMsg());
    }

返回数据:

{
  "alipay_user_info_share_response": {
    "code": "10000",
    "msg": "Success",
    "user_id": "2088102104794936",
    "avatar": "http://tfsimg.alipay.com/images/partner/T1uIxXXbpXXXXXXXX",
    "province": "安徽省",
    "city": "安庆",
    "nick_name": "支付宝小二",
    "gender": "F"
    },
  "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
}

5. 测试网站(地址),需要的小伙伴可以测试

5.1 每个人做的项目需求不同,可能会出现不同的问题,文章仅供参考

5.2 SpringBoot+Vue实现第三方支付宝登录(一)

5.3 其他第三方登录方式:第三方登录汇总

6. 源码购买

6.1 简洁版源码(淘宝店铺:爱创客网络

只包含登录,第三方登录,跳转首页(没有菜单!),技术框架:SpringBoot+SpringSecurity+Mysql+Redis+Vue+ElementUI等

6.2 完整版本源码淘宝店铺:爱创客网络

测试地址(测试地址是完整版的):www.youyoushop.work

包含登录,注册,第三方登录,完整的系统管理模块,系统工具模块,系统监控模块,系统日志模块,个人中心等,技术框架:SpringBoot+SpringSecurity+Mysql+Redis+Vue+ElementUI等

posted @ 2022-02-21 09:57  helloliyh  阅读(1516)  评论(0编辑  收藏  举报