参考:
Android文档
登录成功后获取用户信息:
GET https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
参考
获取用户个人信息UnionID 机制
1.动态引入sdk,
这里我引入的固定版本
//微信登录
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.6.4'
也可以使用最新版本:
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
注意:如果集成了友盟分享,那么这个会和友盟分享引入的微信sdk冲突,去掉此引入即可
2.设置回调页
demo下载地址:https://developers.weixin.qq.com/doc/oplatform/Downloads/Android_Resource.html
注意,需要在你自己的项目包路径下新建一个wxapi
文件夹,然后复制demo中的WXEntryActivity
到这个wxapi
文件夹下面。然后在AndroidManifest.xml
配置对应的回调页
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTask"
android:taskAffinity="com.smallcake.xz"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
异常1:No value for openid
40029 invalid code 不合法或已过期的 code
一直爆此错误,一直比对微信开放平台的appid是否错了,但确定是正确的。
最后发现WXEntryActivity
页面中,此段代码,需要传入app_id
,和app_secret
,之前一直用的demo默认的。导致了此错误,所以一定要在此处设置自己获得的app_id
,和app_secret
。
if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH) {
SendAuth.Resp authResp = (SendAuth.Resp)resp;
final String code = authResp.code;
NetworkUtil.sendWxAPI(handler, String.format("https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid=%s&secret=%s&code=%s&grant_type=authorization_code", Contants.WX_APP_ID,
Contants.WX_APP_SECRET, code), NetworkUtil.GET_TOKEN);
}
3.发起登录
在页面onCreae
t中注册api
private IWXAPI api;
//微信注册
private void regToWx() {
api = WXAPIFactory.createWXAPI(this, Contants.WX_APP_ID, false);
api.registerApp(Contants.WX_APP_ID);
}
然后调用此方法,它就会拉起微信客户端,
/**
* 微信登录
*/
private void wxSendLogin() {
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
api.sendReq(req);
}
4.回调结果
微信客户端点击同意,就会进入回调页WXEntryActivity
的onResp
方法
public void onResp(BaseResp resp)
此方法里面通过判断resp.getType()
的类型,进入此判断
if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH) {
SendAuth.Resp authResp = (SendAuth.Resp)resp;
final String code = authResp.code;
NetworkUtil.sendWxAPI(handler, String.format("https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid=%s&secret=%s&code=%s&grant_type=authorization_code", Contants.WX_APP_ID,
Contants.WX_APP_SECRET, code), NetworkUtil.GET_TOKEN);
}
注意:此处替换为自己的app_id
,和app_secret
,否则会出现步骤2所说异常。
此判断会拿获得的code
参数,NetworkUtil
通过app_id
,app_secret
,code
去获取access_token
,openid
,unionid
等参数,然后通过handler
(MyHandler
)的handleMessage
方法拿到对应的result
,再去解析里面的access_token
,openid
,unionid
等参数,就可以了。至于你拿到这三个参数直接传递给后端,或传递到其他页面后再传递给后端,就看你自己的实际需求了。
@Override
public void handleMessage(Message msg) {
int tag = msg.what;
switch (tag) {
case NetworkUtil.GET_TOKEN: {
Bundle data = msg.getData();
JSONObject json = null;
try {
json = new JSONObject(data.getString("result"));
L.e("json=="+json.toString());
String openId, unionid, access_token;
openId = json.getString("openid");
unionid = json.getString("unionid");
access_token = json.getString("access_token");
//TODO,传递给其他页面或其他操作
Intent intent = new Intent(wxEntryActivityWeakReference.get(),RegisterActivity.class);
intent.putExtra("openid", openId);
intent.putExtra("unionid", unionid);
intent.putExtra("access_token", access_token);
wxEntryActivityWeakReference.get().startActivity(intent);
} catch (JSONException e) {
Log.e(TAG, e.getMessage());
}
}
}
}
网友评论