现在几乎每个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. access_token有效且未超时;
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云端服务器,由云端中转接口调用请求。