导语:
现如今每个社交app都会有第三方登录的功能,今天主要简单阐述一下第三方登录微信的步骤。
步骤:
1.前往微信开放平台注册微信第三方登录app(https://open.weixin.qq.com/),获取所需要的APPID,需要准备相关app应用信息。
2.下载相关第三方登录Jar包,libammsdk.jar
3.审核通过后,会给你一个APPID,在你需要第三方登录的界面进行初始化设置:
private IWXAPI api;
//初始化微信登录程序
private void initWXLogin(){
//api注册
api = WXAPIFactory.createWXAPI(this,AppUtils.WXAPPID, true);
api.registerApp(AppUtils.WXAPPID);
SendAuth.Req req = new SendAuth.Req();
//授权读取用户信息
req.scope = "snsapi_userinfo";
//自定义信息
req.state = "wechat_sdk_demo_test";
//向微信发送请求
api.sendReq(req);
// startActivity(new Intent(this, WXEntryActivity.class));
}
4.重点来了,就是新建一个类WXEntryActivity,不可改名,包名也有如下规则。
首先配置manifests文件:
<activity
android:exported="true"
android:launchMode="singleTop"
android:name="包名.wxapi.WXEntryActivity"
android:theme="@android:style/Theme.NoDisplay" />
WXEntryActivity包名规则:
很多文档上人云亦云,说manifests中的package就是本app包名,其实是不正确的,app的包名不一定是package中的包名,我们根据最保险的方法,用代码把包名跑出来。
代码如下:
private String getAppInfo() {
try {
String pkName = this.getPackageName();
String versionName = this.getPackageManager().getPackageInfo(
pkName, 0).versionName;
int versionCode = this.getPackageManager()
.getPackageInfo(pkName, 0).versionCode;
return pkName ;
} catch (Exception e) {
}
return null;
}
我们用此方法拿到包名后,根据拿到的包名后,在manfests中注册WXEntryActivity,创建一个 wxapi的文件夹 在文件夹下创建WXEntryActivity类,将如下代码全部复制。
WXEntryActivity代码:
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.common.api.Api;
import com.samples.utils.AppUtils;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.modelmsg.SendAuth;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
/**
* Created by Administrator on 2016/8/16.
*/
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注册API
api = WXAPIFactory.createWXAPI(this, AppUtils.WXAPPID);
api.handleIntent(getIntent(), this);
Log.i("savedInstanceState"," sacvsa"+api.handleIntent(getIntent(), this));
}
@Override
public void onReq(BaseReq baseReq) {
}
// 发送到微信请求的响应结果
@Override
public void onResp(BaseResp resp) {
if(resp instanceof SendAuth.Resp){
SendAuth.Resp newResp = (SendAuth.Resp) resp;
//获取微信传回的code
String code = newResp.code;
Log.i("newRespnewResp"," code :"+code);
}
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
Log.i("savedInstanceState","发送成功ERR_OKERR_OK");
//发送成功
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
Log.i("savedInstanceState","发送取消ERR_USER_CANCEL");
//发送取消
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
Log.i("savedInstanceState","发送取消ERR_AUTH_DENIEDERR_AUTH_DENIEDERR_AUTH_DENIED");
//发送被拒绝
break;
default:
Log.i("savedInstanceState","发送返回breakbreakbreak");
//发送返回
break;
}
finish();
}
}
5.如何拿到OPENID:
用get方法访问
https://api.weixin.qq.com/sns/oauth2/access_token?appid= APPID&secret=SECRET&code=CODE&grant_type=authorization_code
appid(你的APPID)
code(WXEntryActivity 中onResp方法回调得到的code)
SECRET(你的secret)
grant_type (这个字符串authorization_code)
需要按自己注册的数据用get方法访问这个接口。
得到的数据结构为
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
6.如何拿到用户信息:
访问如下接口拿到用户资料,其中access_token便是上个获得OPENID的接口得到的access_token:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
总结:
不要人云亦云,自己实践才能掌握真理。。