接入微信登录—(由于微信的官方文档写的有点散,特此记录一下)

  • Post author:
  • Post category:其他


最近app上Goole市场,三方登录这块原先用的是mob的,但是Goole那边检测到mob会自动收集手机用户的手机号码信息并上传到mob的后台,所以App被下架了,没办法就让直接对接微信登录。下面就是整体的流程了



步骤:

1.接入微信的sdk,可以直接用

Gradle

的方式添加

在 build.gradle 文件中,添加如下依赖即可:

//该文件是根目录下的build.gradle
//目前 Maven Central仅支持部分版本:6.6.4、6.6.5、6.6.23、6.7.0、6.7.9、6.8.0,建议开发者升级
//至最新版本6.8.0。后续所有版本更新都会上传至Maven Central
repositories {
        jcenter() //由于 jCenter 服务关停,需要修改成引用 Maven Central
        mavenCentral()

        google()
        maven {
            url "https://jitpack.io"
        }
}
//该文件是工程目录下的build.gradle 不是根目录下的
dependencies {
//微信sdk
api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

2.添加权限

<!--其中网络权限如果没有使用扫码登录功能非必要;后三个权限,如果没有使用 mta,也非必要,即使有使用 mta,去掉也不影响功能-->
<uses-permission android:name="android.permission.INTERNET" />

<!-- for mta statistics, not necessary-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

3.接入sdk,添加完所需权限后,接入微信登录环境算是搭建好了。下面第一步是初始化(即:向微信注册)



//在项目的Application的onCreate()方法中调用


   @Override
    public void onCreate() {
        super.onCreate();

        wxinit();
    }




/**微信初始化*/
    public static IWXAPI api;
    private void wxinit(){
        api = WXAPIFactory.createWXAPI(this,WX_APP_ID,true);
        api.registerApp(WX_APP_ID);
        //建议动态监听微信启动广播进行注册到微信
        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                // 将该app注册到微信
                api.registerApp(WX_APP_ID);
            }
        }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
    }

4.在项目中微信登录点击事件的方法内调起微信授权


//微信登录点击事件
onclick(v->{
  if (Application.api == null) {
                        Application.api = WXAPIFactory.createWXAPI(this, WX_APP_ID, true);
                    }
                    if(!Application.api.isWXAppInstalled()){
                        toast("未安装微信客户端!");
                    }else{
                        Application.api.registerApp(WX_APP_ID);
                        SendAuth.Req req = new SendAuth.Req();
                        req.scope = "snsapi_userinfo";
                        req.state = "wechat_sdk_demo";
                        Application.api.sendReq(req);
                    }
});

5.在项目的包名下,创建一个名为wxapi的文件夹,然后在该文件夹下创建一个名为

WXEntryActivity的java文件(文件夹和类名都是不能更改的,都是与微信约定好的名字)
/**
 * 微信客户端回调activity示例
 */
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

    private String openid;
    private String accessToken;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_wx);
        boolean handleIntent = XChatApplication.api.handleIntent(getIntent(), this);
        //下面代码是判断微信分享后返回WXEnteryActivity的,如果handleIntent==false,说明没有调用IWXAPIEventHandler,则需要在这里销毁这个透明的Activity;
        if (handleIntent == false) {
            Log.d("微信登录", "onCreate: " + handleIntent);
            finish();
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        XChatApplication.api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq baseReq) {
        Log.d("微信登录", "onReq: 退出");
        finish();
    }

    /**
     * 微信请求回调处理结果
     */
    @Override
    public void onResp(BaseResp baseResp) {
        Log.d("微信登录", "onResp: 回调");
        //登录回调
        if (baseResp != null) {
            switch (baseResp.errCode) {
                case BaseResp.ErrCode.ERR_OK:
                    String code = ((SendAuth.Resp) baseResp).code;
                    Log.d("微信登录 code", "" + code);
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            getAccessToken(code);
                        }
                    }).start();
                    break;
                case BaseResp.ErrCode.ERR_AUTH_DENIED: //用户拒绝授权
                    finish();
                    break;
                case BaseResp.ErrCode.ERR_USER_CANCEL: //用户取消
                    finish();
                    break;
                default:
                    finish();
                    break;

            }
        } else {
            Log.d("微信登录", "onResp: 回调为空");
        }
    }

    private void getAccessToken(String code) {
        //获取授权,参数拼接
        StringBuffer longUrl = new StringBuffer();
        longUrl.append("https://api.weixin.qq.com/sns/oauth2/access_token")
                .append("?appid=" + Constants.WX_APP_ID)
                .append("&secret=" + Constants.WX_APP_SECRET)
                .append("&code=" + code)
                .append("&grant_type=authorization_code");
        Log.d("微信登录请求参数", "" + longUrl);
        OkHttpClient okHttpClient = new OkHttpClient();
        final Request request = new Request.Builder()
                .url(longUrl.toString())
                .get()
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                String responseInfo = response.body().string();
                Log.d("微信登录返回值", "" + responseInfo);
                try {
                    JSONObject jo = new JSONObject(responseInfo);
                    openid = jo.getString("openid");
                    accessToken = jo.getString("access_token");
//一直到这里其实上面拿的都是微信授权的信息,这里是因为后台那边可以用这些参数去微信获取该用户
//的名称头像等数据,再进行注册。返回给我们这边是我们项目的用户数据模型。所以就直接调用的后台接
//口,没有继续查下去
                    //CoreManager.getCore(IAuthCore.class).ThirdLogin(openid, //jo.getString("unionid"), accessToken, 1);
                  
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                finish();
            }

            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                finish();
            }

        });
    }

//如果有需要可以再继续走该方法,获取微信用户的详细信息
    private void getWXUserInfo(String openid,String accessToken,String unionid){
        StringBuffer userUrl = new StringBuffer();
        userUrl.append("https://api.weixin.qq.com/sns/userinfo")
                .append("?access_token=" + accessToken)
                .append("&openid=" + Constants.WX_APP_SECRET);
        Log.d("微信登录请求参数", "" + openid);
        OkHttpClient okHttpClient = new OkHttpClient();
        final Request request = new Request.Builder()
                .url(userUrl.toString())
                .get()
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
               //{
                //  "openid": "OPENID",       普通用户的标识,对当前开发者帐号唯一
                //  "nickname": "NICKNAME",   普通用户昵称
                //  "sex": 1,                 普通用户性别,1 为男性,2 为女性
                //  "province": "PROVINCE",   普通用户个人资料填写的省份
                //  "city": "CITY",           普通用户个人资料填写的城市
                //  "country": "COUNTRY",     国家,如中国为 CN
                //  "headimgurl": "https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",   头像
                //  "privilege": ["PRIVILEGE1", "PRIVILEGE2"],     用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
                //  "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"    用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的 unionid 是唯一的。
                //}

            }
        });
    }

}

上面代码中,微信的appId和secret 是自己项目在微信申请的。

以上 基本上就是接入微信登录的全部过程。



版权声明:本文为qq_34165238原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。