最近项目需要接入微信登录,以前没有做过,因此记录一下。
准备条件
- 注册微信开放平台
- 创建移动应用,获取appid和appsecret
- 开发者资格认证,需要300¥
- 到资源中心的Android资源下载 页面下载所需要的资源,其中签名生成工具是创建移动应用是生成签名时使用的。
开始
微信官方提供了较全的文档资料,可以在资源中心查看详细的接入文档。
1.将开发工具包的libammsdk.jar文件导入项目中,并添加所需要的权限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.发送请求,在需要请求授权的地方调用如下方法:
//注册App到微信
IWXAPI api = WXAPIFactory.createWXAPI(mContext,AppConfig.WX_APP_ID,true);
api.registerApp(AppConfig.WX_APP_ID);
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
//req.state = "wechat_sdk_demo_test";
api.sendReq(req);
3.在包名目录下创建一个wxapi的包,并在其中创建一个WXEntryActivtity.java类,继承自Activity,同时实现IWXAPIEventHandler接口,当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
// IWXAPI 是第三方app和微信通信的openapi接口
private IWXAPI api;
@Override
public void initVariables() {
// 通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(this, AppConfig.WX_APP_ID, false);
api.registerApp(AppConfig.WX_APP_ID);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
// 微信发送请求到第三方应用时,会回调到该方法
@Override
public void onReq(BaseReq req) {
}
// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
@Override
public void onResp(BaseResp resp) {}
}
4.配置WXEntryActivity,设置exported属性为true
<activity android:name=".wxapi.WXEntryActivity"
android:label="@string/app_name"
android:exported="true"/>
5.接下来便可以在onResp()方法中获取用户的信息了。
String code = (SendAuth.Resp) resp).code;//获取code
//通过请求下面的链接获取json,提取出access_token和openid
https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + AppConfig.WX_APP_ID + "&secret=" + AppConfig.WX_APP_SECRET + "&code=" + code + "&grant_type=authorization_code;
//通过请求下面的链接可以获得用户信息的json数据
https://api.weixin.qq.com/sns/userinfo?access_token=" + wxresp.getAccess_token() + "&openid=" + wxresp.getOpenid() + "&lang=zh_CN";
获取到用户数据后,再将其发送到服务端保存即可,之后与普通登录方式相同。