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

你可能感兴趣的:(开发小结)