前面的什么下载SDK解压放入项目的libs文件夹就不说了,只要是第三方集成就必须经历这一步
<下载地址:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=624ac8b68addc1d2630676a28cbbb681f83044f2&lang=zh_CN>
微信官方api在这里
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=624ac8b68addc1d2630676a28cbbb681f83044f2&lang=zh_CN
首先说一下拿到用户信息都需要那些个东西
AppID和AppSecret都不可少
还有一点比较坑的是,微信测试第三方登录的时候要打正式包才能测试,不要授权页面都呼不起来
这个图就是拿到用户信息的步骤了
下面来说说具体的步骤
1,发起第一次请求,拿到code
2,通过code,加上appid,加上secret拼接网址请求网络拿到access_token和openid
3,通过access_token和openid拼接网址请求网络拿到返回码验证access_token是否有效
4,如果有效的话继续拼接网址拿到用户的信息
接下来就是详细的步骤,按照上面说的走
1,通过得到的appid注册微信api
//api注册微信
api = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID, true);
api.registerApp(WEIXIN_APP_ID);
发起请求
SendAuth.Req req = new SendAuth.Req();
req.scope = “snsapi_userinfo”;
req.state = “wechat_sdk_demo”;
//请求授权成功后就会回调wxapi包下的WXEntryActivity这个类
api.sendReq(req);
接下来就是写在WXEntryActivity里面了,微信规定就是你发起请求后,回调一定要写在这个类里面,
并且这个类一定要在项目包名下建立的一个wxapi的文件夹,如下
然后重写他的一个方法就可以拿到code了
//发送到微信请求的响应结果
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK: //发送成功
code = ((SendAuth.Resp) resp).code; //即为所需的code
Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();
//拿到code,加上appid和secret拼接网址,请求数据得到包含token和openid来继续请求拿到用户数据
break;
case BaseResp.ErrCode.ERR_USER_CANCEL: //发送取消
Toast.makeText(this, "取消登录", Toast.LENGTH_SHORT).show();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED: //发送被拒绝
Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
break;
default://发送返回
break;
}
finish();
}
2,拿到code就到第二步了:
//拿到code,加上appid和secret拼接网址,请求数据得到包含token和openid来继续请求拿到用户数据
//https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
String urlstr = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID + "&secret=" + APP_SECRET + "&" +
"code=" + code + "&grant_type=authorization_code";
OkHttpUtils.get().url(urlstr).build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
}
@Override
public void onResponse(String response, int id) {
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(response);
//TODO 拿到token了
final String accessToken = jsonObject.getString("access_token");
final String openid = jsonObject.getString("openid");
break;
3,这样就拿到 accessToken和openid后就到第三步:验证token是否有效
@Override public void onResponse(String response, int id) {
try {
JSONObject object = new JSONObject(response);
int errcode = object.getInt("errcode");
if (errcode == 0) {//说明access_token是有效的,
String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN";
OkHttpUtils.get().url(url).build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
}
@Override
public void onResponse(String response, int id) {
try {
//4,第四步,拿到用户的信息,都在response
JSONObject object = new JSONObject(response);
// TODO: 拿到昵称和头像
String nickname = object.getString("nickname");//昵称
String headimgurl = object.getString("headimgurl");//头像
// TODO: 这边跳转到验证手机号页面
} catch (JSONException e) {
}
}
});
}
} catch (JSONException e) {
}
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
});
break;
最后不要忘了,在minifast里面加上acticity的配置
<!-- 微信的 -->
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@android:style/Theme.NoDisplay">
</activity>
大概就是这几步,测试的时候要用正式版测试
最后把整个WXEnterActivity贴出来
package com.tongdao.tongdaobocai.wxapi;
import android.os.Bundle;
import android.widget.Toast;
import com.google.android.gms.common.api.GoogleApiClient;
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;
import com.tongdao.tongdaobocai.base.BaseActivity;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;
import org.json.JSONException;
import org.json.JSONObject;
import okhttp3.Call;
/**
* WXEntryActivity 是微信固定的Activiy、 不要改名字、并且放到你对应的项目报名下面、
* 例如: ....(包名).wxapi.WXEntryActivity
* 不然无法回调、切记...
* Wx 回调接口 IWXAPIEventHandler
* 关于WXEntryActivity layout。 我们没给页面、而是把Activity 主题 android:theme="@android:style/Theme.Translucent" 透明、
*/
public class WXEntryActivity extends BaseActivity implements IWXAPIEventHandler {
private final String TAG = this.getClass().getSimpleName();
//appid
public static final String APP_ID = "****************;
public static final String APP_SECRET = "***************";//微信的secret,用于获取用户信息用的
private IWXAPI mApi;
public static String code;//要通过code拿到token和openId
private String token; //要通过token和openId拿到用户信息
private String openId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mApi = WXAPIFactory.createWXAPI(this, APP_ID, true);
mApi.handleIntent(this.getIntent(), this);
}
//微信发送的请求将回调到onReq方法
@Override
public void onReq(BaseReq baseReq) {
// Toast.makeText(this, "回调了onreq吗11111", Toast.LENGTH_SHORT).show();
}
//发送到微信请求的响应结果
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK: //发送成功
code = ((SendAuth.Resp) resp).code; //即为所需的code
Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();
//拿到code,加上appid和secret拼接网址,请求数据得到包含token和openid来继续请求拿到用户数据
//https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
String urlstr = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID + "&secret=" + APP_SECRET + "&" +
"code=" + code + "&grant_type=authorization_code";
OkHttpUtils.get().url(urlstr).build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
}
@Override
public void onResponse(String response, int id) {
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(response);
//TODO 拿到token了
final String accessToken = jsonObject.getString("access_token");
final String openid = jsonObject.getString("openid");
// 获取access_token,openid后,就可以用来获取更多用户信息,比如微信昵称,头像,性别等。接口为:
/*
这个是验证access_token 是否是有效的 https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
正确的Json返回结果:
{
"errcode":0,"errmsg":"ok"
}
*/
String url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openid;
OkHttpUtils.get().url(url).build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
}
@Override
public void onResponse(String response, int id) {
try {
JSONObject object = new JSONObject(response);
int errcode = object.getInt("errcode");
if (errcode == 0) {//说明access_token是有效的,
String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN";
OkHttpUtils.get().url(url).build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
}
@Override
public void onResponse(String response, int id) {
try {
JSONObject object = new JSONObject(response);
// TODO: 拿到昵称和头像
String nickname = object.getString("nickname");//昵称
String headimgurl = object.getString("headimgurl");//头像
// TODO: 这边跳转到验证手机号页面
} catch (JSONException e) {
}
}
});
}
} catch (JSONException e) {
}
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
});
break;
case BaseResp.ErrCode.ERR_USER_CANCEL: //发送取消
Toast.makeText(this, "取消登录", Toast.LENGTH_SHORT).show();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED: //发送被拒绝
Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
break;
default://发送返回
break;
}
finish();
}
}