調用QQ/微信/新浪微博的第三方登錄接口(開發者端口)
官方文檔寫的很明確了,不過在這裏總結一下,方便小白瞭解下具體接入流程和情況
總體大致流程:
其中:
1.微信登錄可省去獲取用戶標識ID這一步,獲取ID在獲取token時即可獲取
2.QQ第三步如果未開通unionid權限,是不會返回的,而默認返回的OPENID,無法保證跨應用的唯一!
3.新浪微博登錄在獲取token這一步可以返回用戶UID,可根據不同業務情況考慮是否需要多調一個接口(區別是,token是時效性的,而code只能使用一次)
實現:
代碼不用多說,都是直接調接口,寫一個模擬調用接口的幫助類就好了。
(需要注意,微博獲取access_token的接口,請求類型必須爲post,參數以URL拼接的形式傳遞)
其他事項:
需注意,QQ返回參數格式的問題:
格式1:返回錯誤碼:
callback( {"error":100010,"error_description":"redirect uri is illegal"} )
格式2:正常出參,exp:
access_token=1ACEE***4C8&expires_in=7776000&refresh_token=69C4***701
返回參數如需打包結果集,需自行處理,我的處理方案(歡迎拍磚):
(JsonHelper自行封裝json轉換工具類,fastjson/gson/jackson等等)
private static Map packResult(String jsonStr) {
if ( logger.isDebugEnabled() ) {
logger.debug("got an original param :{}", jsonStr);
}
if ( StringHelper.isEmpty(jsonStr) ) {
logger.warn("got an error msg for null");
return null;
}
//返回錯誤碼,exp:callback( {"error":100010,"error_description":"redirect uri is illegal"} )
else if ( jsonStr.startsWith("callback(") ) {
//9 == "callback(".length()
jsonStr = jsonStr.substring(9, jsonStr.lastIndexOf(")"));
if ( logger.isDebugEnabled() ) {
logger.debug("param after substring :{}", jsonStr);
}
return JsonHelper.getObjectByJSON(jsonStr, Map.class);
}
//正常出參,exp:access_token=1ACEE701****9A4C8&expires_in=7776000&refresh_token=69C45C*****082E0701
else if ( !jsonStr.trim().startsWith("{") ) {
Map dataParam = new HashMap();
//each key & value
String[] items = jsonStr.split("&");
for (String item : items) {
String[] kv = item.split("=");
if ( kv.length > 1 ) {// >=2
dataParam.put(kv[0], kv[1]);
}
else if ( kv.length == 1 ) {
logger.warn("get an error result.set null to the return value");
dataParam.put(kv[0], null);
}
}
return dataParam;
}
else {
return JsonHelper.getObjectByJSON(jsonStr, Map.class);
}
}
其他:
實現接入第三方系統,拿到唯一ID做記錄就可以了,關於獲取用戶信息這一步,是爲了完善/補充註冊用戶的信息,實現智能化操作而已,所以針對QQ登錄,如果涉及到多個子應用,切記openid並不能做唯一約束,而要申請unionid接口。
目前本人只是測試階段,微信和QQ已有實際生產應用,新浪微博並未實際生產應用,用戶標識應該取得是:
QQ:unionid(需申請權限)
Wechat:unionid
Sina:uid