支付宝第三方登录接口调用
这个参考的是支付宝开放平台, 跟着文档一步步做, 可以做出来, 但是有个问题, 就是对新手来说文档不太容易读懂。我是调用过一次支付宝的支付接口,所以上手比较快。这里再做个记录,也给暂时不会的人铺个路。
首先调用支付宝第三方接口, 你得在支付宝开发平台上注册一个账号, 这个地方略过。然后,你还得创建一个应用,来获得一个APP_ID, 这个APP_ID啊, 以后写代码时候需要的一个参数而已。
弄到这里差不多等几个小时就通过了, app_id要审核通过才能用, 也就是只有当审核通过时,第三方接口才能正常调用, 如果你等不及, 可以使用沙箱环境进行开发测试。登录的接口我没有用过沙箱, 不保证说的正确,我这里就不作介绍了。
审核通过后,根据文档开发,我们从第二步开始。
要选择一个功能, 登录嘛, 当然是获取会员信息咯
然后
这些地方要填, 接口加密的话, 点进去会叫你下载一个支付宝开发平台助手的软件
点击生成密钥, 然后把两个公钥粘贴到网页上对应的空格里, 这里接口非对称加密哦, 以后代码里也会用到这些密钥。支付宝网关一定是那个以及回调地址一定要填, 回调地址需要是一个公网ip”的地址, 我推荐用小花生, 或者你自己用什么办法, 能达到目的就行。
对了,查看接口加密方式时候, 一定要把支付宝公钥记下来, 代码里用到。
准备完这些, 可以开始快乐编码了, 首先你需要一个javaweb项目, 然后把第三方登录功能引入,
自己创建或者已经有的, 都可以, 现在先导入sdk
<dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.9.28.ALL</version> </dependency>
贴代码图片(最后会有代码贴出)
这张太多了。。 代码直接贴出
··
@Controller
@Slf4j
public class ThreeLoginController {
private static final String MODEL = "/cms/aliLogin";
@Value("${ali.URL}")
private String URL;
@Value("${ali.APP_ID}")
private String APP_ID;
@Value("${ali.APP_PRIVATE_KEY}")
private String APP_PRIVATE_KEY;
@Value("${ali.FORMAT}")
private String FORMAT;
@Value("${ali.CHARSET}")
private String CHARSET;
@Value("${ali.ALIPAY_PUBLIC_KEY}")
private String ALIPAY_PUBLIC_KEY;
@Value("${ali.SIGN_TYPE}")
private String SIGN_TYPE;
@Autowired
private CoreUserService userService;
@Autowired
private CorePlatformService platformService;
@Autowired
private AlipayClient alipayClient;
@GetMapping(MODEL + "/login.do")
public ModelAndView aliLogin() {
ModelAndView view = new ModelAndView("/threeLogin.html") ;
// https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=商户的APPID&scope=auth_user&redirect_uri=ENCODED_URL
String aliStr="https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id="+APP_ID+"&scope=auth_user&redirect_uri="+"http%3a%2f%2fb2944625b9.zicp.vip%2fcms%2faliLogin%2freturnAddress.do";
view.addObject("aliStr",aliStr);
return view;
}
@GetMapping(MODEL + "/returnAddress.do")
public String returnAddress(@RequestParam(name = "auth_code")String authCode, @RequestParam(name = "app_id")String appId, @RequestParam(name = "scope")String scope) {
log.info("回调成功!");
// 模拟admin登录
UserLoginInfo info = userService.login("admin", "123456");
if (info == null) {
throw new PlatformException("用户名密码错");
}
CoreUser user = info.getUser();
CoreOrg currentOrg = info.getOrgs().get(0);
for (CoreOrg org : info.getOrgs()) {
if (org.getId() == user.getOrgId()) {
currentOrg = org;
break;
}
}
info.setCurrentOrg(currentOrg);
// 记录登录信息到session
this.platformService.setLoginUser(info.getUser(), info.getCurrentOrg(), info.getOrgs());
// 测试 auth_code获取用户的user_id和access_token
String accessToken = getAccessToken(authCode);
if(accessToken != null) {
AlipayUser aUser = getUserInfoByToken(accessToken);
log.info("AlipayUser message: {}", aUser);
}
return "redirect:/index.do";
}
/**
* 根据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");
try {
AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);
return oauthTokenResponse.getAccessToken();
} catch (Exception e) {
log.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.getAddress());
alipayUser.setCertNo(response.getCertNo());
alipayUser.setCity(response.getCity());
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;
}
log.error(“根据 access_token获取用户信息失败!”);
return null;
} catch (Exception e) {
log.error("根据 access_token获取用户信息抛出异常!", e);
return null;
}
}
}
··
这里我要说明一下,扫码登录的页面, 是自己点击或者其他事件进行跳转到的
https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=SCOPE&redirect_uri=ENCODED_URL
把参数填上去就行了,就能到达这个页面
扫码后, 支付宝那边的服务器会返回回调地址, 就是redirect_uri这个,要是外网的环境,
@GetMapping(MODEL + “/returnAddress.do”)就能找到这个, 里面这三个参数是返回的
auth_code, app_id,scope ,之后要用到,抓个包看一下
还有些看文档, 比如参数的解释, 上面说的比较详细
用auth_code可以换access_token, 这个access_token相当于令牌, 想怎么玩就怎么玩,
怎么换取代码已经贴出来了。
之后该干啥干啥
如果遇到支付宝页面的报错, 可以按快捷键ctrl + a, 页面会显示问题所在, 现在把剩下的代码贴出来
``
@Configuration
@Slf4j
@ConfigurationProperties(prefix = “ali”)
@Data
public class AliLoginConf {
private String URL;
private String APP_ID;
private String APP_PRIVATE_KEY;
private String FORMAT;
private String CHARSET;
private String ALIPAY_PUBLIC_KEY;
private String SIGN_TYPE;
@Bean
public AlipayClient getAlipayClient() throws Exception {
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
log.info("注入支付宝客户端成功");
return alipayClient;
}
}
ali.URL=https://openapi.alipay.com/gateway.do
ali.APP_ID=你自己的
ali.APP_PRIVATE_KEY=你自己的
ali.FORMAT=json
ali.CHARSET=UTF-8
ali.ALIPAY_PUBLIC_KEY=你自己的
ali.SIGN_TYPE=RSA2
@Data
public class AlipayUser {
private String userId;
private String code;
private String msg;
/**
* 用户头像
*/
private String avatar;
private String province;
private String city;
private String nickName;
private String gender;
private String address;
private String certNo;
private String collegeName;
private String degree;
private String mobile;
private String phone;
private String userName;
}
``
不知道为啥排版变成这样了。。 丑点能用就行…