一、授权登录流程
抖音小程序的授权登录与微信授权登录比较类似,都是通过授权码去获取用户的openId等信息
二、前端代码实现
uni.login({
provider: 'toutiao',
success: function (loginRes) {
console.log("loginRes", loginRes);
console.log("授权码",loginRes.code)
uni.request({
url: common.api_base_url + '/dyMiniLogin?code=' + loginRes.code,
method: 'GET',
success: async res => {
var _data = res.data.data;
if (res.data.code == 200) {
that.$u.vuex('vuex_user', _data)
uni.setStorageSync('token', _data.token)
console.log("登录成功")
} else {
}
that.loginShow = false
},
fail(err){
that.getUserAuth();
console.log("getUserInfo fail = ", err)
}
});
}
});
三、后端代码实现
controller层
/**
* 抖音小程序登录
* @param code
* @param request
* @return
*/
@GetMapping("/dyMiniLogin")
public AjaxResult dyMiniLogin(@RequestParam("code") String code, HttpServletRequest request) {
String ipAddr = IpUtils.getIpAddr(request);
LoginUser loginUser = loginService.dyMiniLogin(code, ipAddr);
log.info("抖音用户登录成功,用户ID为:{},用户名称:{}",loginUser.getUserId(),loginUser.getUsername());
return AjaxResult.success(loginUser);
}
service层,直接通过OKHttpClient的方式去调用获取信息
/**
* 抖音小程序登录
* @param code
* @param ipAddr
* @return
*/
public LoginUser dyMiniLogin(String code, String ipAddr) {
if (StringUtils.isEmpty(code)) {
System.out.println(code);
throw new BaseException("code 不能为空");
}
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(100, TimeUnit.SECONDS) // 设置连接超时时间为 100 秒
.readTimeout(200, TimeUnit.SECONDS) // 设置读取超时时间为 200 秒
.build();
// 构建请求体,包含 appid 和 code 参数
MediaType mediaType = MediaType.parse("application/json");
DouYinLoginRequestParam douYinLoginRequestParam = new DouYinLoginRequestParam();
douYinLoginRequestParam.setAppid("");//抖音小程序appId
douYinLoginRequestParam.setSecret("");//抖音小程序appSecret
douYinLoginRequestParam.setCode(code);
douYinLoginRequestParam.setAnonymous_code("");
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(douYinLoginRequestParam));
Request request = new Request.Builder()
.url("https://developer.toutiao.com/api/apps/v2/jscode2session")
.post(body)
.addHeader("Content-Type", "application/json")
.build();
DouYinLoginResponse douYinLoginResponse = new DouYinLoginResponse();
try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
// 请求成功,处理响应
String responseData = response.body().string();
System.out.println("抖音授权登录返回信息: " + responseData);
JSONObject jsonObject = JSON.parseObject(responseData);
douYinLoginResponse = JSON.parseObject(jsonObject.getString("data"), DouYinLoginResponse.class);
} else {
// 请求失败,处理失败信息
System.out.println("抖音授权登录失败" + response);
}
} catch (IOException e) {
log.error("抖音授权登录失败[{}]",e.getMessage());
throw new BaseException("登录失败,请联系管理员");
}
//这里拿到openId之后做后续处理。数据库存在则登录,不存在则注册
LoginUser loginUser = miniUserRegister(douYinLoginResponse.getOpenid(), 33, ipAddr);
return loginUser;
}
流程总结:抖音小程序授权登录与微信小程序授权登录类似,都是通过授权码code去获取用户的openId等信息。
项目体验(抖音扫码):