- 背景:web站點(diǎn)pc端使用第三方登錄,qq和微信沒問題,微博一直登錄失敗.
項(xiàng)目使用Java 的SDK -
錯(cuò)誤日志:
error_log.png - 分析:明顯看到j(luò)son解析報(bào)錯(cuò),而且跟weibo的sdk有關(guān)
- 依賴關(guān)系:
<!--微博sdk依賴-->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>weibo4j-oauth2</artifactId>
<version>2.1.1-beta2-3</version>
</dependency>

Snipaste_2018-12-20_14-44-31.png
在這里必須吐槽下微博,中央倉庫的jar包最近更新是2013年,github的上的源碼最近更新是2014年,懷疑微博可能已經(jīng)棄用Java的sdk不再維護(hù)了,當(dāng)然在服務(wù)端實(shí)現(xiàn)第三方接口調(diào)用本身就不是一個(gè)明智的決定
-
bug復(fù)現(xiàn)
Snipaste_2018-12-20_14-53-57.png
沒有拋異常,看下getString()方法
Snipaste_2018-12-20_14-55-17.png
很正常,用了toString處理,百思不得其解服務(wù)器上為什么報(bào)錯(cuò)
直到我意識到導(dǎo)入的JSONObject的全限定名是org.json.JSONObject,而不是我們熟悉的com.alibaba.fastjson.JSONObject
微博的sdk依賴了一個(gè)org.json的包,這個(gè)包的版本是20080701,但是工程中引入了一個(gè)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>
敲黑板,劃重點(diǎn)了

Snipaste_2018-12-20_15-03-45.png
兩個(gè)版本的getString()方法的實(shí)現(xiàn)不同,20180813版中加了一個(gè)類型判斷,根據(jù)key獲取值,判斷是否為String類型,如果不是直接拋出異常
然而微博返回的數(shù)據(jù)是這樣的
String s = "{\"access_token\":\"2.00Pl2QMCUQ43qBc0de9dcbad2JuHDC\"," +
"\"uid\":\"2013478597\",\"isRealName\":\"true\",\"expires_in\":2652228,\"remind_in\":\"2652228\"}";
expires_in是number類型,導(dǎo)致接口調(diào)用后解析數(shù)據(jù)時(shí)永遠(yuǎn)報(bào)錯(cuò)
- 總結(jié)原因: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>
實(shí)際上下面20080701的不用顯式依賴,sdk底層已經(jīng)依賴了
微博登錄失敗的問題是解決了,但是第三方登錄放在前端使用js來實(shí)現(xiàn)才是正解


