概要
分享最新Java实现支付宝登录。(注:支付宝登入用个人账号登录(不非得用企业账号)即可测试,如果用沙箱环境进行测试可能会有Bug,建议用个人用户进行测试❤)如果用沙箱环境的话需要
把底下的路径改为它https://openauth-sandbox.dl.alipaydev.com/oauth2/publicAppAuthorize.htm?
流程
登录支付宝开放平台 链接如下:
https://open.alipay.com/https://open.alipay.com/
打开控制台,创建一个自己需要的应用(这边用的网页/移动应用进行演示)然后填写资料,商家账号写自己的个人账号即可
创建完需要申请上线 如下图所示:
然后进行开发设置
密钥工具下载地址
小程序文档 - 支付宝文档中心支付宝文档中心https://opendocs.alipay.com/isv/02kipk
绑定产品 如下:
代码
以上的准备工作就结束了,以下将用最简洁的代码实先登录功能,首先创建一个spring项目
导入依赖:
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.34.0.ALL</version>
</dependency>
实体类:
package com.liu.zfb.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AlipayUser {
private String Address;
private String CertNo;
private String City;
private String CollegeName;
private String Degree;
private String Mobile;
private String Phone;
private String Province;
private String UserName;
private String NickName;
}
业务逻辑类:
package com.liu.zfb.service.impl;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
import com.alipay.api.request.AlipayUserInfoShareRequest;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
import com.alipay.api.response.AlipayUserInfoShareResponse;
import com.liu.zfb.pojo.AlipayUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;
@Service
public class AlipayLoginService implements InitializingBean {
private static final Logger LOGGER = LoggerFactory.getLogger(AlipayLoginService.class);
/**Alipay客户端*/
private AlipayClient alipayClient;
/**支付宝网关*/
/**沙箱的*/
private static final String ALIPAY_BORDER_DEV = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
/**个人用户的*/
private static final String ALIPAY_BORDER_PROD = "https://openapi.alipay.com/gateway.do";
/**appID**/
private static final String APP_ID_PROD = "2021003196653501";
/**私钥*/
private static final String APP_PRIVATE_KEY ="";
/**支付宝公钥*/
private static final String ALIPAY_PUBLIC_KEY ="";
@Override
public void afterPropertiesSet() throws Exception {
alipayClient = new DefaultAlipayClient(ALIPAY_BORDER_PROD, APP_ID_PROD, APP_PRIVATE_KEY, "json", "UTF-8", ALIPAY_PUBLIC_KEY, "RSA2");
}
/**
* 根据auth_code获取用户的user_id和access_token
* @param authCode
* @return
*/
public String getAccessToken(String authCode) {
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setCode(authCode);
request.setGrantType("authorization_code");
System.out.println("11111111111111111111111111111111111111111111111111111");
try {
AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
return oauthTokenResponse.getAccessToken();
} catch (Exception e) {
LOGGER.error("使用authCode获取信息失败!", e);
return null;
}
}
/**
* 根据access_token获取用户信息
* @param token
* @return
*/
public AlipayUser getUserInfoByToken(String token) {
AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest ();
try {
AlipayUserInfoShareResponse response = alipayClient.execute(request, token);
if (response.isSuccess()) {
//打印响应信息
// System.out.println(ReflectionToStringBuilder.toString(response));
//封装支付宝对象信息
AlipayUser alipayUser = new AlipayUser();
alipayUser.setAddress(response.getUserId());
alipayUser.setCertNo(response.getCertNo());
alipayUser.setCity(response.getPhone());
alipayUser.setCollegeName(response.getCollegeName());
alipayUser.setDegree(response.getDegree());
alipayUser.setMobile(response.getMobile());
alipayUser.setPhone(response.getPhone());
alipayUser.setProvince(response.getProvince());
alipayUser.setUserName(response.getUserName());
alipayUser.setNickName(response.getNickName());
return alipayUser;
}
LOGGER.error("根据 access_token获取用户信息失败!");
return null;
} catch (Exception e) {
LOGGER.error("根据 access_token获取用户信息抛出异常!", e);
return null;
}
}
}
实现接口类:
package com.liu.zfb.controller;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.liu.zfb.pojo.AlipayUser;
import com.liu.zfb.service.impl.AlipayLoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 支付宝第三方登录服务
*
* @author minghui.y
* @create 2018-05-22 14:05
**/
@RestController
public class AlipayController {
@Autowired
private AlipayLoginService alipayLoginService;
@RequestMapping("/alipay/getAuthInfo")
public String getAuthCode(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("支付宝返回信息....................................................");
//从request中获取授权信息
String authCode = request.getParameter("auth_code");
System.out.println(authCode);
String appID = request.getParameter("app_id");
String scope = request.getParameter("scope");
System.out.println(scope);
System.out.println("aaaaaaaaa"+appID);
if (StringUtils.isNotEmpty(authCode)) {
//获取access_token
String accessToken = alipayLoginService.getAccessToken(authCode);
//获取用户信息
if (StringUtils.isNotEmpty(accessToken)) {
//获取用户信息
AlipayUser alipayUser = alipayLoginService.getUserInfoByToken(accessToken);
System.out.println("name"+alipayUser.getNickName());
System.out.println("aaaaaaaaaaaaaa信息"+alipayUser);
//存储到cookie中
Cookie cookieName = new Cookie("account", alipayUser.getNickName());
Cookie cookieRole = new Cookie("roleName", "支付宝账户");
cookieName.setMaxAge(3600);
cookieRole.setMaxAge(3600);
cookieName.setPath("/");
cookieRole.setPath("/");
response.addCookie(cookieName);
response.addCookie(cookieRole);
//跳转至主界面
response.sendRedirect("http://localhost:8051/aa");
}
}
return "hello alipay!";
}
@RequestMapping("/aa")
public String aa(){
return "首页";
}
@RequestMapping("/login")
public void login(HttpServletResponse resp) throws IOException {
String id="你的appid";
String url="你的回调路径";
resp.sendRedirect("https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id="+id+"&scope=auth_user&redirect_uri="+url);
}
}
将以上代码复制到你的项目里改好自己信息即可
效果:
小结
以上就是具体步骤,我们也可以根据官方文档来写 网址如下:
小程序文档 - 支付宝文档中心支付宝文档中心https://opendocs.alipay.com/open/01emu5提供一个内网穿透的工具❤
NATAPP -https://natapp.cn/login
下载好工具后 在官网上操作:
创建authtoken启动项。
然后打开下载的Natapp软件文件夹,创建文本把下面代码加上先前复制的authtoken号,然后把文件后缀改成bat。
natapp.exe -authtoken=