SpringBoot项目接入支付宝第三方登录

今年大四毕业,由于新冠肺炎疫情的原因,开学和毕业答辩的时间都进行了推迟,因此有较多的时间对毕设项目做修改和调整,便在项目中接入微信和支付宝的第三方登录。在此需要说明,微信和支付宝的开发者平台大体一致,但是接入功能审核条件不尽相同。对于微信开发者而言,申请第三方登录不但要求你要有自己的域名,还要填写《微信开放平台网站信息登记表》并盖章等,条件相对苛刻。对于支付宝开发者而言,申请第三方登录仅需要有个人服务器即可。对于“一穷二白”开发者,什么都没有的话问题也不大,通过修改HOST和配置Nginx等,也可以借别人的账号,达到移花接木的效果。

先讲一下大致的接入流程,然后再讲具体的操作。

  1. 先注册支付宝开发者平台用户,然后创建申请“网页&移动应用”。
  2. 在注册成功后,你可以拿到 app_id,redirect_uri,private_key,public_key 等。
  3. 编写支付宝回调地址功能。

该博客针对接入支付宝第三方登录功能的实现需要你具有SpringMVC的基础,如果你的是web.xml之类的老项目可以参考其他博客。本人就是因为在百度的时候发现都是老项目的接入,所以在此讨论一下新项目的接入方法。同时也要求你有一个云服务器,如果没有,可以私信我,讨论一下“移花接木大法”心得。以下链接是支付宝的官方接入教程,流程图如下:

支付宝官方接入教程说明:https://opendocs.alipay.com/open/263/105809

SpringBoot项目接入支付宝第三方登录_第1张图片

一,注册支付宝开发者平台用户

1. 通过如下链接,支付宝扫码登录后填写相关个人信息,然后即可注册成功,再次点击如下链接即可跳转到开发者中心控制台。

https://openhome.alipay.com/platform/developerIndex.htm

2. 点击创建应用 ---> 创建网页&移动应用 ---> 选择自定义接入类型 。然后填写应用的相关信息即可。需要注意应用头像必须是类似与商务logo的,我尝试过很多次审核均不通过,最终网站找了个类似商务logo才行。其次是 “网址url” 这里填写你项目连接,比如我的服务器IP:123.456.789.012,项目端口:8080,项目登录页是 /project/login。即我填写的 网址url 是:http://123.456.789.012:8080/project/zfbLogin。这个网址URL是当用户点击确定登录的时候,支付宝的回调地址。

SpringBoot项目接入支付宝第三方登录_第2张图片

3. 设置接口加签方式,根据提示下载“支付宝密钥生成器”生成公钥字符。点击确定跳出来的东西中,保存支付宝公钥,后续也能看到。

SpringBoot项目接入支付宝第三方登录_第3张图片

SpringBoot项目接入支付宝第三方登录_第4张图片

二、设置访问链接

用户点击支付宝登录的时候实际上一个a标签跳转链接,HTML代码如下,注意,http://123.456.789.012:8080/project/zfbLogin,回调地址的“/”和“:”需要用转义字符代替。

支付宝登录

SpringBoot项目接入支付宝第三方登录_第5张图片

三、完成回调接口功能

在开发之前,需要确定你有如下参数

1. 支付宝三方登录网关(ZFB_SERVER_URL),页面可以看到,大家都是一样的为 https://openapi.alipay.com/gateway.do

2. 支付宝APP_ID(ZFB_APP_ID),即APP_ID。

3. 应用授权私钥(应用授权私钥),即 支付宝密钥生成器 生成的应用私钥

4. 支付宝登录公钥(ZFB_PUBLIC_KEY),即 上面第一节第3点中,点击确定跳出来的支付宝公钥

接口相关代码如下:

@RequestMapping("zfbLogin")
public String zfbLogin(){
	// 获取AuthCode 等,具体可以获取哪些数据参考支付宝官方接口文档,这里只需要使用auth_code
	String authCode = request.getParameter("auth_code");
	log.info("authCode ==> "+authCode);
	if(StringUtils.isNotEmpty(authCode)){
		try{
			// 这些参数均被抽取出来,参数说明见博客
			AlipayClient alipayClient = new DefaultAlipayClient(ZFB_SERVER_URL, ZFB_APP_ID, ZFB_PRIVATE_KEY, "json", "UTF-8", ZFB_PUBLIC_KEY, "RSA2");
			
			// 通过authCode获取accessToken
			AlipaySystemOauthTokenRequest oauthTokenRequest = new AlipaySystemOauthTokenRequest();
			oauthTokenRequest.setCode(authCode);
			oauthTokenRequest.setGrantType("authorization_code");
			AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(oauthTokenRequest);
			String accessToken = oauthTokenResponse.getAccessToken();
			log.info("accessToken ==> "+accessToken);
			
			if(StringUtils.isNotEmpty(accessToken)){
				// 根据accessToken获取用户信息
				AlipayUserInfoShareResponse userInfoResponse = alipayClient.execute(new AlipayUserInfoShareRequest(), accessToken);
				if (userInfoResponse.isSuccess()){
					log.info("zfbUser ==> "+JSONObject.toJSONString(userInfoResponse));
					// userInfoResponse 中有哪些用户信息参考支付宝官方接口文档,这里演示如下几个
					Map userInfo = new HashMap(6);
					userInfo.put("nickname", userInfoResponse.getNickName());
					userInfo.put("imgUrl", userInfoResponse.getAvatar());
					userInfo.put("uuid", userInfoResponse.getUserId());
					// 接下来你可以通过免密登录或者获取密码自动登录等方式,做登录操作获取进入首页即可
					return "index";
				}else{
					log.warn("无法获取用户信息");
				}
			}else{
				log.error("接入支付宝登录认证出现错误,无法获取到accessToken.");
			}
		}catch (Exception e){
			log.error("获取支付宝用户信息失败");
			e.printStackTrace();
		}
	}else{
		log.error("接入支付宝登录回调方法错误,无法获取到Token.");
	}
	return "login";
}

至此,功能基本完成。当你扫码点击确定之后,支付宝会触发回调接口做登录操作,你需要将项目部署到服务器上。

你可能感兴趣的:(Java,后端)