- 背景:web站点pc端使用第三方登录,qq和微信没问题,微博一直登录失败.
项目使用Java 的SDK -
错误日志:
- 分析:明显看到json解析报错,而且跟weibo的sdk有关
- 依赖关系:
<!--微博sdk依赖-->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>weibo4j-oauth2</artifactId>
<version>2.1.1-beta2-3</version>
</dependency>
在这里必须吐槽下微博,中央仓库的jar包最近更新是2013年,github的上的源码最近更新是2014年,怀疑微博可能已经弃用Java的sdk不再维护了,当然在服务端实现第三方接口调用本身就不是一个明智的决定
-
bug复现
没有抛异常,看下getString()方法
很正常,用了toString处理,百思不得其解服务器上为什么报错
直到我意识到导入的JSONObject的全限定名是org.json.JSONObject,而不是我们熟悉的com.alibaba.fastjson.JSONObject
微博的sdk依赖了一个org.json的包,这个包的版本是20080701,但是工程中引入了一个org.json的包,版本是20180813
<!--<dependency>-->
<!--<groupId>org.json</groupId>-->
<!--<artifactId>json</artifactId>-->
<!--<version>20080701</version>-->
<!--</dependency>-->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180813</version>
</dependency>
敲黑板,划重点了
两个版本的getString()方法的实现不同,20180813版中加了一个类型判断,根据key获取值,判断是否为String类型,如果不是直接抛出异常
然而微博返回的数据是这样的
String s = "{\"access_token\":\"2.00Pl2QMCUQ43qBc0de9dcbad2JuHDC\"," +
"\"uid\":\"2013478597\",\"isRealName\":\"true\",\"expires_in\":2652228,\"remind_in\":\"2652228\"}";
expires_in是number类型,导致接口调用后解析数据时永远报错
- 总结原因:jar包版本冲突
- 解决方案:
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>weibo4j-oauth2</artifactId>
<version>2.1.1-beta2-3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.json/json -->
<!--<dependency>-->
<!--<groupId>org.json</groupId>-->
<!--<artifactId>json</artifactId>-->
<!--<version>20180813</version>-->
<!--</dependency>-->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20080701</version>
</dependency>
实际上下面20080701的不用显式依赖,sdk底层已经依赖了
微博登录失败的问题是解决了,但是第三方登录放在前端使用js来实现才是正解