使用新浪微博开放平台api同步微博内容至自己网站(网站接入第三方平台登录--QQ篇网站登录平台)

优采云 发布时间: 2021-09-28 19:28

  使用新浪微博开放平台api同步微博内容至自己网站(网站接入第三方平台登录--QQ篇网站登录平台)

  网站获取第三方平台登录--QQ篇

  网站获取第三方平台登录--微信文章

  内容

  准备注册开放平台并创建新应用

  在新创建的应用程序的信息中,以下信息需要正确,否则在后续请求中重定向地址会不正确。

  

  

  调试应该在上面的回调地址上进行

  获取 App Key 和 App Secret

  如上图

  业务分析指导用户授权。获得授权码后,前往微博兑换token。如果需要其他操作,token会调用对应的接口。我的业务逻辑

  注意:官方不推荐使用uid来判断登录。我这里求简单,就是账号是否绑定

  

  实际开发环境

  前端:VUE

  后端:SpringBoot

  代码

  官方开发文档,参考Web网站部分,这个是没用的JS SDK,因为VUE中无法解析SDK的按钮组件

  放置登录按钮

  在适当的地方放置引导用户登录的元素,按钮等没有具体要求

  

...

// 微博图标点击按钮

weiboClick() {

window.location.href = "https://api.weibo.com/oauth2/authorize?client_id=你的a*敏*感*词*ey&redirect_uri=你的回调地址";

}

  用户点击链接后,会打开微博授权界面

  

  登录后会自动重定向到回调地址,在url中拼接授权成功的代码

  

  因为vue的路由默认是带hash的,所以无法获取url中的参数。这里请直接通过字符串获取参数。

   // 截取url参数

getSearchString(key, search) {

let str = search;

str = str.substring(1, str.length);

let arr = str.split('&');

let obj = {};

for (let i = 0; i < arr.length; i++) {

let tmp_arr = arr[i].split("=");

obj[decodeURIComponent(tmp_arr[0])] = decodeURIComponent(tmp_arr[1]);

}

return obj[key];

}

  带代码到后台兑换微博token登录

  从创建的hook中获取code,并使用code去后端确定登录(后端收到code后去微博界面换取token、uid等信息,并在库判断是否是系统的用户,如果是则通过,不返回绑定提示)

  created() {

let code = this.getSearchString("code",window.location.search)

if (code) {

// 获取微博token

user.getWeiBoToken({code: code}).then(res => {

this.afterLogin(res);

})

}

}

// 登录请求后的逻辑处理

afterLogin(res) {

if (res.code === 200) {

let {data} =res

this.set_token(data.token)

this.set_userInfo(data)

this.$message.success(res.msg);

this.$router.push(&#39;/dashboard&#39;);

} else if (res.code === 201) {

// 将uid赋值到登录的参数对象中用以登录绑定

this.param.weiboId = res.data;

this.$message.error("你的微博尚未绑定账户,请进行密码登录进行绑定!");

} else {

this.$message.error(res.msg);

}

}

  后端接口

  代币文件的官方交换

  /**

* 微博token接口返回对象

* @ClassName WeiBo

* @Author snow

* @Date 2021/1/21 17:58

*/

@Getter

@Setter

public class WeiBoToken {

private String access_token;

private String remind_in;

private String expires_in;

private String uid;

private String isRealName;

}

  /**

* 微博登录

* @param code 微博回调获取的code

* @return 登录成功、失败、需要绑定账号

*/

@GetMapping("/getWeiBoToken")

public JSONObject getWeiBoToken(String code) {

if (DataOperateUtil.isNull(code)) {

return fail("缺少code");

}

RestTemplate restTemplate = new RestTemplate();

MultiValueMap header = new LinkedMultiValueMap();

header.put(HttpHeaders.CONTENT_TYPE, Collections.singletonList(MediaType.APPLICATION_JSON_VALUE));

header.put(HttpHeaders.ACCEPT, Collections.singletonList(MediaType.APPLICATION_JSON_VALUE));

HttpEntity request = new HttpEntity(new JSONObject(), header);

String url = "https://api.weibo.com/oauth2/access_token?client_id=1224469031&client_secret=fa36b19aa07f3362623adf702bf70837&grant_type=authorization_code&redirect_uri=http://sybm.jxsycm.com&code=" + code;

try {

// 请求微博换取token、uid等信息

ResponseEntity exchangeResult = restTemplate.exchange(url, HttpMethod.POST, request, String.class);

System.out.println(exchangeResult);

WeiBoToken weiBoToken = JSON.toJavaObject(JSONObject.parseObject(exchangeResult.getBody()), WeiBoToken.class);

// 判断该微博id是否在库中关联了用户

QueryWrapper queryWrapper = new QueryWrapper();

queryWrapper.eq("weibo_id", weiBoToken.getUid());

queryWrapper.ne("`status`", 0);

SysUser sysUser = sysUserService.getOne(queryWrapper);

if (sysUser == null) {

// 没有绑定账号

return success(201, weiBoToken.getUid());

} else {

// 已获取到用户信息,进行登录(token处理、日志记录等操作)

return loginService(sysUser);

}

} catch (HttpClientErrorException e) {

e.printStackTrace();

}

return fail("请求微博token异常");

}

  如果没有绑定账号,在前端用账号和密码登录,在login方法中判断uid是否有值,如果有则进行登录绑定操作。

  submitForm() {

this.$refs.login.validate(valid => {

if (valid) {

if (this.param.weiboId) {

// 进行登录绑定

user.weiboBindAccount(this.param).then(res=>{

this.afterLogin(res)

})

} else {

user.login(this.param).then(res=>{

this.afterLogin(res)

})

}

} else {

this.$message.error(&#39;请输入账号和密码&#39;);

console.log(&#39;error submit!!&#39;);

return false;

}

});

}

  登录绑定接口

  /**

* 微博绑定账号

* @param param username、password、微博id

* @return 绑定后进行登录

*/

@PostMapping("/weiboBindAccount")

public JSONObject weiboBindAccount(@RequestBody SysUser param) {

Subject subject = SecurityUtils.getSubject();

UsernamePasswordToken token = new UsernamePasswordToken(param.getUsername(), param.getPassword());

try {

...

SysUser sysUser = ...

...

// 登录成功

// 绑定weiboId到账户

sysUser.setWeiboId(param.getWeiboId());

sysUserService.updateById(sysUser);

return loginService(sysUser);

} catch (AuthenticationException e) {

LogUtil.addLogToFile(param.toString(), "登录异常", "", LogUtil.LogLevel.error, e.getMessage());

return fail("账号或密码错误");

}

}

  以上,微博登录完成!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线