支付宝第三方登录接口调用
这个参考的是支付宝开放平台, 跟着文档一步步做, 可以做出来, 但是有个问题, 就是对新手来说文档不太容易读懂。我是调用过一次支付宝的支付接口,所以上手比较快。这里再做个记录,也给暂时不会的人铺个路。
首先调用支付宝第三方接口, 你得在支付宝开发平台上注册一个账号, 这个地方略过。然后,你还得创建一个应用,来获得一个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;@Autowiredprivate CoreUserService userService;@Autowiredprivate CorePlatformService platformService;@Autowiredprivate AlipayClient alipayClient;@GetMapping(MODEL + "/login.do")public ModelAndView aliLogin() {ModelAndView view = new ModelAndView("/threeLogin.html") ;// /oauth2/publicAppAuthorize.htm?app_id=商户的APPID&scope=auth_user&redirect_uri=ENCODED_URLString aliStr="/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);// 记录登录信息到sessionthis.platformService.setLoginUser(info.getUser(), info.getCurrentOrg(), info.getOrgs());// 测试 auth_code获取用户的user_id和access_tokenString 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;}}
}
··
这里我要说明一下,扫码登录的页面, 是自己点击或者其他事件进行跳转到的
/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;@Beanpublic 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=/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;
}
``
不知道为啥排版变成这样了。。 丑点能用就行…