第三方服务篇——微信登录详细实现

无论是APP还是Web,第三方登录已经成为了标配,有微信、QQ、微博、人人等,对于国内用户来说微信的使用人数和使用频率都是数一数二的,所以第三方登录中微信登录又是必不可少的,下面从开发者的角度与读者分享一下微信登录的实现。

微信登录两种方式:
  1. 直接集成微信SDK (以下称之为A)
  2. 通过第三方SDK(eg 友盟)集成 (以下称之为B)

两种方式各有利弊,A要比B集成复杂一点,B是在原基础上又封装了一层,对于开发者来说更友好,而且B通常将众多第三方服务集成到一起,不用每一个第三服务都去集成,很方便快捷;反过来说B是面向众多第三方服务的,就算只实现一种,那也会有不少冗余代码和无用逻辑,而且A因为没有B集成逻辑的束缚,可定制度更高。

所以怎样选择取决于业务需求和开发者,不同的场景有不同的选择,笔者的一个项目只用到了微信登录,所以就直接集成了微信SDK来实现,下面分享一下具体实现。

1.登录微信开放平台
第三方服务篇——微信登录详细实现_第1张图片
image.png
2. 资质认证
第三方服务篇——微信登录详细实现_第2张图片
image.png

资质认证需要填写企业相关资质并支付300RMB的审核年费,只有通过审核后才会获得微信登录的权限,也就是说要想实现微信登录这300RMB非花不可。

3. 创建应用
第三方服务篇——微信登录详细实现_第3张图片
image.png

创建应用时,Android要求填入应用名、包名以及签名,应用名尽量一次性填好,因为微信规则半年只能修改一次,而且修改完毕还得审核;签名使用的MD5签名,创建签名后开发者可以通过命令的方式获取,但是为了方便,微信专门为开发者提供了一个工具【传送门】来获取MD5签名,安装后主要输入想获取APP的包名即可(此APP必须已安装)。

4. 开发

上述步骤都通过以后,就可以进入开发阶段了

a.添加SDK

1.AS环境下直接依赖

//在build.gradle文件中,添加如下依赖即可:
dependencies {
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

2.Eclipse下载SDK并添加到本地

这年头使用Ecplise的开发者应该几乎没有了吧!?!SDK下载。微信还提供了Demo,开发者可以下载研读【Demo】。

b. 配置权限






c.新建WXEntryActivity并配置
第三方服务篇——微信登录详细实现_第4张图片
image.png

需要注意的是必须在根目录下创建wxapi并将WXEntryActivity放入此文件夹下,此外无论是包名还是Acitivity命名都严格遵守wxapi和WXEntryActivity,因为微信会通过包名和Activity调用WXEntryActivity。

 

android:exported="true"必须设置,外部微信会打开WXEntryActivity;android:launchMode="singleTask"或android:launchMode="singleTop",从微信界面返回本APP时微信会再次重建WXEntryActiivty,为了避免重复创建以及逻辑保持(从头到尾都执行一遍,可能原来逻辑就乱了)启动方式要设置成singleTask或singleTop。

a.WXEntryActivity代码
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
     @Override
    public void onReq(BaseReq baseReq) {
        LogUtils.d("onReq");
    }

    @Override
    public void onResp(BaseResp resp) {
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                SendAuth.Resp authResp = (SendAuth.Resp) resp;
                final String code = authResp.code;
                mPresenter.loadHttpWechatLogin(code);
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL://注意:有些手机设备会有多个微信客户端,调起来的时候会有一个客户端列表,会有一个取消,不是这里的ERR_USER_CANCEL
                showError(R.string.wechat_auth_prompt);
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                showError(R.string.wechat_auth_prompt);
                break;
            case BaseResp.ErrCode.ERR_UNSUPPORT:
                showError(R.string.wechat_login_not_support);
                break;
            default:
                showError(R.string.wechat_login_fail_prompt);
                break;
        }
    }

    /**
     * 调起微信客户端
     */
    private void senReq() {
        SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";//请求体
        req.state = "ar-guide-wechat";
        wechatApi.sendReq(req);
    }

    private void regToWx() {
        //Config.WECHAT_APPID注册应用后可获取appid
        wechatApi = WXAPIFactory.createWXAPI(this, Config.WECHAT_APPID, true);
        wechatApi.handleIntent(getIntent(), this);
    }

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

    public void onClick(){
       if (wechatApi.isWXAppInstalled()) {//是否安装客户端   
            senReq();
       } else {
            showError(R.string.not_install_wechat_prompt);//提示下载或直接转到 下载界面
        }         
    }
}

首选需要注册wechatApi,因为设置为singleTask或singleTop,所以需要在onNewIntent设置;注册完毕后就可以发送命令调起微信客户端了【注意:微信目前只支持客户端登录不支持网页等其他形式登录】,senReq()方法中有一个req.scope = "snsapi_userinfo",这个可以理解为意图就是想干什么(eg 登录等),req.state可以自定义。

在点击事件下调用senReq()就可以调起微信客户端,相关操作返回WXEntryActivity后结果会回调到onResp(BaseResp resp)中,可根据code进行相应的逻辑处理,在BaseResp.ErrCode.ERR_OK下获取 authResp.code通过网络请求传送给后端,后端根据appId、appSecret、authResp.code就可获得微信用户相关信息。

注意:获取authResp.code后接下来获取微信用户信息在前端也可以做,但是不建议这样做,因为会将appSecret、accessToken等敏感信息暴露出来,安全性很低,所以强烈建议接下来的步骤由后端完成【获取微信用户步骤】。有时候后端的开发人员可能不乐意,觉得移动端登录当然由移动端完成关后端什么,后端只要用户数据就行了,如果这样那直接将微信说明摆给ta看。

第三方服务篇——微信登录详细实现_第5张图片
image.png

微信登录一系列流程基本就是这样了,读者有什么不明白之处或不同观点请留言交流!!!

微信分享请阅读:

《微信篇——分享》

你可能感兴趣的:(第三方服务篇——微信登录详细实现)