支付宝第三方登录接口调用

这个参考的是支付宝开放平台, 跟着文档一步步做, 可以做出来, 但是有个问题, 就是对新手来说文档不太容易读懂。我是调用过一次支付宝的支付接口,所以上手比较快。这里再做个记录,也给暂时不会的人铺个路。

首先调用支付宝第三方接口, 你得在支付宝开发平台上注册一个账号, 这个地方略过。然后,你还得创建一个应用,来获得一个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;

}
``

不知道为啥排版变成这样了。。 丑点能用就行…

Logo

Authing 是一款以开发者为中心的全场景身份云产品,集成了所有主流身份认证协议,为企业和开发者提供完善安全的用户认证和访问管理服务

更多推荐