使用retrofit实现微信登录的相关接口

retrofit版本为1.9.0,2.0.0以后版本有不同的写法,但道理是一致的。

先上代码

public class WXRequest {

    private static IWX iWX;

    private static IWX getIWX(Activity activity) {
        if (iWX == null) {
            synchronized (UserRequest.class) {
                if (iWX == null) {
                    RestAdapter adapter = getAdapter();
                    iWX = adapter.create(IWX.class);
                }
            }
        }
        return iWX;
    }

    protected static RestAdapter getAdapter() {
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setLogLevel(RestAdapter.LogLevel.BASIC)
                .setEndpoint("https://api.weixin.qq.com/sns/")
                .setConverter(new BaseConverter())
                .build();
        return restAdapter;
    }

    interface IWX {
        @GET("/oauth2/access_token")
        void accessToken(@Query("appid") String appid,
                         @Query("secret") String secret,
                         @Query("code") String code,
                         @Query("grant_type") String grant_type,
                         Callback<String> callback);

        @GET("/userinfo")
        void userInfo(@Query("access_token") String access_token,
                      @Query("openid") String openid,
                      Callback<String> callback);

    }

    /*** * 发起请求获取Token */
    public static void accessToken(final Activity activity, String code) {
        Callback<String> back = new Callback<String>() {
            @Override

            public void success(String object, Response response) {
                GSBToken gsbToken = Json.getGSBToke(object);
                getApplaction(activity).getBus(activity).post(gsbToken);
            }

            @Override
            public void failure(RetrofitError error) {

            }
        };

        IWX iwx = getIWX(activity);
        iwx.accessToken(WXConstants.APP_ID, WXConstants.SECRET, code, "authorization_code", back);
    }

    /*** * 请求得到用户信息 */
    public static void getUserInfo(final Activity activity, String access_token, String openid) {
        Callback<String> back = new Callback<String>() {
            @Override

            public void success(String object, Response response) {
                getApplaction(activity).getBus(activity).post(object);
            }

            @Override
            public void failure(RetrofitError error) {

            }
        };

        IWX iwx = getIWX(activity);
        iwx.userInfo(access_token, openid, back);
    }

    private static GSBApplication getApplaction(Activity activity) {
        Application application = activity.getApplication();
        return (GSBApplication) application;
    }
}

1、getIWX(Activity activity) 方法是一个单例方法,用来得到接口IWX的实现类

2、getAdapter()方法得到retrofit的RestAdapter类,通过该类可以实现声明的接口,其中BaseConverter类实现了Converter接口声明的两个方法,该类用于定义网络请求的结果类型

3、IWX接口中的两个方法分别用于得到用户的授权access_token值和用户的详细信息,具体的参数含义请参考微信的api文档,方法中注解的具体含义请参考这里

4、accessToken(final Activity activity, String code) 方法是用于外部调用的具体方法,通过配置具体参数调用IWX的accessToken()方法来得到具体的access_token值并执行回调信息。getUserInfo(final Activity activity, String access_token, String openid)同理

5、上面的代码中的Callback回调对微信端返回的Json格式的String值进行了类型转换,将其转换为具体的逻辑对象,并通过otto对接受者发送了该对象,可根据具体逻辑进行修改

你可能感兴趣的:(微信登录,retrofit)