調用QQ/微信/新浪微博 實現登錄

調用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章