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

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

首先调用支付宝第三方接口, 你得在支付宝开发平台上注册一个账号, 这个地方略过。然后,你还得创建一个应用,来获得一个APP_ID, 这个APP_ID啊, 以后写代码时候需要的一个参数而已。

android 开发支付宝支付接口文档 调用支付宝接口_支付宝

android 开发支付宝支付接口文档 调用支付宝接口_开发平台_02


android 开发支付宝支付接口文档 调用支付宝接口_开发平台_03


android 开发支付宝支付接口文档 调用支付宝接口_支付宝_04


弄到这里差不多等几个小时就通过了, app_id要审核通过才能用, 也就是只有当审核通过时,第三方接口才能正常调用, 如果你等不及, 可以使用沙箱环境进行开发测试。登录的接口我没有用过沙箱, 不保证说的正确,我这里就不作介绍了。

审核通过后,根据文档开发,我们从第二步开始。

android 开发支付宝支付接口文档 调用支付宝接口_android 开发支付宝支付接口文档_05


android 开发支付宝支付接口文档 调用支付宝接口_支付宝_06


要选择一个功能, 登录嘛, 当然是获取会员信息咯

然后

android 开发支付宝支付接口文档 调用支付宝接口_android 开发支付宝支付接口文档_07


这些地方要填, 接口加密的话, 点进去会叫你下载一个支付宝开发平台助手的软件

android 开发支付宝支付接口文档 调用支付宝接口_支付宝_08


点击生成密钥, 然后把两个公钥粘贴到网页上对应的空格里, 这里接口非对称加密哦, 以后代码里也会用到这些密钥。支付宝网关一定是那个以及回调地址一定要填, 回调地址需要是一个公网ip”的地址, 我推荐用小花生, 或者你自己用什么办法, 能达到目的就行。

对了,查看接口加密方式时候, 一定要把支付宝公钥记下来, 代码里用到。

android 开发支付宝支付接口文档 调用支付宝接口_android 开发支付宝支付接口文档_09


android 开发支付宝支付接口文档 调用支付宝接口_android 开发支付宝支付接口文档_10


准备完这些, 可以开始快乐编码了, 首先你需要一个javaweb项目, 然后把第三方登录功能引入,

自己创建或者已经有的, 都可以, 现在先导入sdk

<dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.9.28.ALL</version> </dependency> 贴代码图片(最后会有代码贴出)

android 开发支付宝支付接口文档 调用支付宝接口_获取用户信息_11


android 开发支付宝支付接口文档 调用支付宝接口_android 开发支付宝支付接口文档_12


android 开发支付宝支付接口文档 调用支付宝接口_android 开发支付宝支付接口文档_13


这张太多了。。 代码直接贴出

··

@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 ,之后要用到,抓个包看一下

android 开发支付宝支付接口文档 调用支付宝接口_支付宝_14


android 开发支付宝支付接口文档 调用支付宝接口_支付宝_15


还有些看文档, 比如参数的解释, 上面说的比较详细

用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;
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;

}
``

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