android 手把手教你接微信登录功能

现在几乎每个app都接入了什么qq登录,微信登录,qq分享,微信分享等,我们也知道有三方的sdk已经帮我们做了这些,比如友盟,但是我项目中是后期产品要去加入微信登录功能的,上午说还想花半个小时写完,没想到,上午打开友盟统计,上周迭代的版本发现了很大的问题,只好排查问题,发现后台cdn缓存,刷新导致的,没办法,只好去做容错机制,下午配合运营和测试,一直在测,刚测试说可以了,其实后台也没测试出友盟那个bug,希望这次不要出问题了,不然就很尴尬了,还是快速的把这博客写完,还要赶最后一班公交车呢?


因为所做的项目主要是tv,微信登录是后期适配手机添加的功能,所以就没有使用友盟,而是直接接微信官网的,

官网地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=&lang=zh_CN


为啥我还要自己写呢?因为我遇到了炕,所以在这记录并分享下

第一步:

导入libammsdk.jar

第二步:

在你所在的包下新建一个子包wxapi,比如你包名为com.niubi那么应该创建一个包为com.niubi.wxapi,然后在这个包下创建一个叫WXEntryActivity,这是类名是微信规定好的呢,如果你不按照它这么做的话,到时候第三步获取code,它不会走这个回调,拿不到请求的code值,这是我当初遇到的问题,就是没按照它的要求来.

第三步:

授权,因为你要使用微信登录功能,必须在微信平台上去申请点东西,哪它怎么知道你是已经在平台已经申请的用户嗯?这就是授权起的作用

api = WXAPIFactory.createWXAPI(WXEntryActivity.this, appId,true);
register(appId);
try {
    api.handleIntent(getIntent(), WXEntryActivity.this);
} catch (NullPointerException e) {
    e.printStackTrace();
}

public void register(String appId){
    api.registerApp(appId);
}
这个需要把你在平台上申请的appId,通过代码注册到平台上进行验证,

/**
 * 申请授权
 */
public void sendAuth() {
    final SendAuth.Req req = new SendAuth.Req();
    req.scope = "snsapi_userinfo";
    req.state = "wechat_sdk_appname";
    api.sendReq(req);
}
这个是真正的点击微信登录按钮去授权的,之前的都是初始化一些值,

回调

@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
    int errCode = baseResp.errCode;
    if(errCode==0){
        String code = ((SendAuth.Resp) baseResp).code; //即为所需的code
        getResult(code);
    }
}
回调方法onResp()中去判断errCode是否返回0如果返回0就代表成功,返回其他code就去平台上查看对应的错误,

然后通过获取到的code去

第四步:

通过第三步获取到的code去获取acess_Token,我截图省点事:

appid 应用唯一标识,在微信开放平台提交应用审核通过后获得
secret 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
code 填写第一步获取的code参数
grant_type 填authorization_code

获取access_token后就可以获取用户信息了

第五步:

获取access_token后,进行接口调用,有以下前提:

  1. 1. access_token有效且未超时;

  2. 2. 微信用户已授权给第三方应用帐号相应接口作用域(scope)。

对于接口作用域(scope),能调用的接口有以下:

授权作用域(scope) 接口 接口说明
snsapi_base /sns/oauth2/access_token 通过code换取access_token、refresh_token和已授权scope
/sns/oauth2/refresh_token 刷新或续期access_token使用
/sns/auth 检查access_token有效性
snsapi_userinfo /sns/userinfo 获取用户个人信息

其中snsapi_base属于基础接口,若应用已拥有其它scope权限,则默认拥有snsapi_base的权限。使用snsapi_base可以让移动端网页授权绕过跳转授权登录页请求用户授权的动作,直接跳转第三方网页带上授权临时票据(code),但会使得用户已授权作用域(scope)仅为snsapi_base,从而导致无法获取到需要用户授权才允许获得的数据和基础功能。

这是来自官网平台的


我在项目中遇到的问题:

在app放在安智市场上发布时,审核没通过,报有病毒,后来发现其实是:申请的appId和appSecert放在了客户端导致的,后来我把这申请的appId和appSecert放在服务端,返回加密了下,就通过了审核!



这是微信平台给我们开发者的提示:

注意:

1、Appsecret 是应用接口使用密钥,泄漏后将可能导致应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取Appsecret);

2、access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取access_token 后导致的用户数据泄漏、用户微信相关接口功能被恶意发起等行为;

3、refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后相当于access_token 泄漏,风险同上。


建议将Appsecret、用户数据(如access_token)放在App云端服务器,由云端中转接口调用请求。

所以不要小看这个提示,我就栽倒一次!,下班,

你可能感兴趣的:(android)