Application类:
// 从官方网站申请到的合法APP_ID
private static final String APP_ID = "";
public static IWXAPI api;
private void regToWx(Context context) {
// 通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(context, APP_ID, true);
// 将应用的appId注册到微信
api.registerApp(APP_ID);
}
onCreate()方法里调用regToWx(this);
包名下新建wxapi包,增加类WXEntryActivity
package com.wzkj.vzone.org.wxapi;
import android.app.Activity;
import android.os.Bundle;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.wzkj.vzone.org.R;
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
//这两个参数在文档中没有找到,可能是瞎了,,,自己在代码里面找了会才找到,这两个常量代表了微信返回的消息类型,是对登录的处理还是对分享的处理,登录会在后面介绍到
private static final int RETURN_MSG_TYPE_LOGIN = 1;
private static final int RETURN_MSG_TYPE_SHARE = 2;
private static final String TAG = "WXEntryActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 自定义的layout
setContentView(R.layout.activity_wxentry);
TMDApplication.api.handleIntent(getIntent(), this);
//如果没回调onResp,八成是这句没有写
}
// 微信发送消息给app,app接受并处理的回调函数
@Override
public void onReq(BaseReq baseReq) {
}
// app发送消息给微信,微信返回的消息回调函数,根据不同的返回码来判断操作是否成功
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_AUTH_DENIED:
case BaseResp.ErrCode.ERR_USER_CANCEL:
//showToast("微信失败");
break;
case BaseResp.ErrCode.ERR_OK:
switch (resp.getType()) {
case RETURN_MSG_TYPE_SHARE: //showToast("微信分享成功");
finish();
break;
case RETURN_MSG_TYPE_LOGIN:
Toast.makeText(this, "微信登录返回", Toast.LENGTH_LONG).show();
// 获取到code
String code = ((SendAuth.Resp) resp).code;
}
break;
}
}
}
清单文件中:
<activity
android:name=".wxapi.WXEntryActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:exported="true"></activity>
发送微信登录请求:
if (!TMDApplication.api.isWXAppInstalled()) {
AppData.showToast("您还未安装微信客户端");
return;
}
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "diandi_wx_login";
TMDApplication.api.sendReq(req);
利用微信返回的code去请求access_token。第二步拿到的code还不算完呢,这个code的声明周期只有五分钟,而且每个code只可以用一次,切记请勿重复使用,否则就会出现{“errcode”:40029,”errmsg”:”invalid code”}这种问题了。也是构造一个请求发送给微信,可以直接接在获取code之后,立马把这个请求发送出去,因为是属于微信登录的中间操作。通过code请求access_token的接口如下:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数说明
参数 必须 说明
appid 是 应用唯一标识,在微信开放平台提交应用审核通过后获得
secret 是 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
code 是 填写第一步获取的code参数
grant_type 是 填authorization_code
问我在那里获取微信返回的code?肯定是在WXEntryActivity里面咯,前面提到了这个activity是专门用来给微信调用的,附上WXEnrtyActivity.java里面的代码:
请求返回回来的参数形式如下:
{ “access_token”:”ACCESS_TOKEN”,
“expires_in”:7200,
“refresh_token”:”REFRESH_TOKEN”,
“openid”:”OPENID”,
“scope”:”SCOPE”,
“unionid”:”o6_bmasdasdsad6_2sgVt7hMZOPfL” }
官方给出的参数列表:
参数 说明
access_token 微信接口调用凭证
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 授权用户唯一标识
scope 用户授权的作用域,使用逗号(,)分隔
unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
微信验证登录到这里就差不多了,验证的主要目的就是拿到微信给的这个access_token,用来调用微信的各种接口,可以获取用户的基本信息等等。
Demo下载:https://github.com/ITAnt/WechatLogin
记得要导出为apk才能正常运行。