文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

android微信授权怎么获取用户个人信息

2023-06-22 06:37

关注

本篇内容主要讲解“android微信授权怎么获取用户个人信息”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“android微信授权怎么获取用户个人信息”吧!

微信官方文档API:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html

申请你的 AppID

只有审核通过的应用才能进行开发。

下载 SDK 及 API 文档

Android Studio 环境下:

在 build.gradle 文件中,添加如下依赖即可:
dependencies {
implementation ‘com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'
}

将APP注册到微信

IWXAPI msgApi = WXAPIFactory.createWXAPI(LoginActivity.this, Constant.AppID, true);    if (msgApi.isWXAppInstalled()) {      // 将应用的appId注册到微信      msgApi.registerApp(Constant.AppID);      //建议动态监听微信启动广播进行注册到微信      registerReceiver(new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {          // 将该app注册到微信          msgApi.registerApp(Constant.AppID);        }      }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));      final Req req = new Req();      req.scope = "snsapi_userinfo"; //获取用户个人信息则填写 snsapi_userinfo      req.state =  "mvwl-"; //可根据项目填写      msgApi.sendReq(req);    } else {      Toast.makeText(LoginActivity.this, "请安装微信客户端后进行此操作").show();      return;    }

创建WXEntryActivity,在AndroidMainifest.xml中添加WXEntryActivity

public class WXEntryActivity extends WXCallbackActivity  implements IWXAPIEventHandler {  public static final String WXLOGIN_ACTION = "com.mvw.test.wxlogin";  private IWXAPI iwxapi;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    iwxapi = WXAPIFactory.createWXAPI(this, "自己项目APPID", true);    try {      Intent intent = getIntent();      iwxapi.handleIntent(intent, this);    } catch (Exception e) {      e.printStackTrace();    }  }  @Override  protected void onNewIntent(Intent intent) {    super.onNewIntent(intent);    setIntent(intent);    iwxapi.handleIntent(intent, this);  }  // 微信发送请求到第三方应用时,会回调到该方法  @Override  public void onReq(BaseReq baseReq) {    switch (baseReq.getType()) {      case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:        break;      case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:        break;      default:        break;    }  }  @Override  public void onResp(BaseResp baseResp) {    Intent intent = new Intent(WXLOGIN_ACTION);    //登录回调    Log.i("微信", "onResp: "+ baseResp.errCode);    switch (baseResp.errCode){      case BaseResp.ErrCode.ERR_OK:        String code = ((SendAuth.Resp) baseResp).code;        intent.putExtra("Wx_Login", code);        intent.putExtra("error_code", 0);        break;      //用户拒绝授权      case BaseResp.ErrCode.ERR_AUTH_DENIED:        intent.putExtra("error_code", -4);        break;      //用户取消授权      case BaseResp.ErrCode.ERR_USER_CANCEL:        intent.putExtra("error_code", -2);        break;    }    sendBroadcast(intent);  //使用了广播    finish();  }}
<activity      android:configChanges="keyboardHidden|orientation|screenSize"      android:exported="true"      android:name=".wxapi.WXEntryActivity"      android:theme="@android:style/Theme.Translucent.NoTitleBar" />

接收微信返回参数code,根据code获取access_token,获取用户个人信息
下面是完整的使用列子。

package com.mvw.test.activity;import android.annotation.SuppressLint;import android.app.Activity;import android.app.AlertDialog;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.graphics.drawable.ColorDrawable;import android.net.Uri;import android.os.Bundle;import android.support.annotation.Nullable;import android.text.Html;import android.text.TextUtils;import android.util.Log;import android.view.Gravity;import android.view.View;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.EditText;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import com.google.gson.Gson;testimport com.google.gson.GsonBuilder;import com.mvw.test.R;import com.mvw.test.wxapi.WXEntryActivity;import com.test.netlibrary.OkHttpUtils;import com.test.netlibrary.callback.StringCallback;import com.orhanobut.logger.Logger;import com.tencent.mm.opensdk.constants.ConstantsAPI;import com.tencent.mm.opensdk.modelmsg.SendAuth.Req;import com.tencent.mm.opensdk.openapi.IWXAPI;import com.tencent.mm.opensdk.openapi.WXAPIFactory;import com.umeng.socialize.PlatformConfig;import java.util.HashMap;import java.util.Map;import okhttp3.Call;import okhttp3.MediaType;import org.json.JSONException;import org.json.JSONObject;public class LoginActivity extends Activity implements View.OnClickListener {private String WEIXIN_ACCESS_TOKEN_KEY = "wx_access_token_key"; //微信access_token  private String WEIXIN_OPENID_KEY = "wx_openid_key"; //微信openid  private String WEIXIN_REFRESH_TOKEN_KEY = "wx_refresh_token_key";//微信refresh_token  private String WEIXIN_UNIONID = "wx_unionid_key";//微信unionid  private Activity activity;  private IWXAPI msgApi;  private WXLoginReceiver wxLoginReceiver;  private  boolean flag=false;  @Override  protected void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_login);    activity = this;    initView();  }  private void initView() {    ImageView iv_weChat = (ImageView) findViewById(R.id.iv_weChat);    iv_weChat.setOnClickListener(this);  }    @Override  public void onClick(View v) {    switch (v.getId()) {      case R.id.iv_weChat:           registerWeChat();        break;    }  }//注册广播  @Override  protected void onResume() {    super.onResume();    flag = true;    if (wxLoginReceiver == null) {       IntentFilter wxIntent = new IntentFilter(WXEntryActivity.WXLOGIN_ACTION);      wxLoginReceiver = new WXLoginReceiver();       registerReceiver(wxLoginReceiver, wxIntent);    }  }    class WXLoginReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {      String code = intent.getStringExtra("Wx_Login");      int error_code = intent.getIntExtra("error_code", -1);      if (TextUtils.equals(intent.getAction(), WXEntryActivity.WXLOGIN_ACTION)) {        switch (error_code) {          case 0:            if (!code.isEmpty()) {              String accessToken = ShareUtilService.getString(WEIXIN_ACCESS_TOKEN_KEY, "");              String openid = ShareUtilService.getString(WEIXIN_OPENID_KEY, "");              if (!"".equals(accessToken)) {                // 有access_token,判断是否过期有效                isExpireAccessToken(accessToken, openid);              } else {                // 没有access_token                getAccessToken(code);              }            }            break;          case -4: //用户拒绝授权          case -2:  //用户取消授权            Log.i("微信", "onReceive: " + error_code);            break;        }      }    }  }    private void registerWeChat() {    ShareUtilService.remove(WEIXIN_REFRESH_TOKEN_KEY);    ShareUtilService.remove(WEIXIN_ACCESS_TOKEN_KEY);    ShareUtilService.remove(WEIXIN_OPENID_KEY);    ShareUtilService.remove(WEIXIN_UNIONID);    msgApi = WXAPIFactory.createWXAPI(LoginActivity.this, Constant.AppID, true);    Log.i("微信", "registerWeChat: " + msgApi.isWXAppInstalled());    if (msgApi.isWXAppInstalled()) {      // 将应用的appId注册到微信      msgApi.registerApp(Constant.AppID);      //建议动态监听微信启动广播进行注册到微信      registerReceiver(new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {          // 将该app注册到微信          msgApi.registerApp("自己项目APPID");        }      }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));      final Req req = new Req();      req.scope = "snsapi_userinfo";      req.state =  "mvwl-";//根据自己项目需要定义      msgApi.sendReq(req);    } else {      Toast.makeText(LoginActivity.this, R.string.pay_wx_client_install,          Toast.LENGTH_SHORT).show();      return;    }  }    private void getAccessToken(String code) {    Map<String, String> map = new HashMap<>();    map.put("appid", "自己项目APPID");    map.put("secret", "自己项目APPSecret");    map.put("code", code);    map.put("grant_type", "authorization_code");    OkHttpUtils.get().url("https://api.weixin.qq.com/sns/oauth3/access_token?").params(map).build().execute(        new StringCallback() {          @Override          public void onError(Call call, Exception e, int id) {            Log.i("微信获取Err", e.getMessage());                   }          @Override          public void onResponse(String response, int id) {            String access = null;            String openid = null;            try {                JSONObject jsonObject = new JSONObject(response);                access = jsonObject.getString("access_token");                openid = jsonObject.getString("openid");                String refresh = jsonObject.getString("refresh_token");                ShareUtilService.setString(WEIXIN_ACCESS_TOKEN_KEY, access);                ShareUtilService.setString(WEIXIN_OPENID_KEY, openid);                ShareUtilService.setString(WEIXIN_REFRESH_TOKEN_KEY, refresh);                getWeChatUserInfo(access, openid);            } catch (JSONException e) {              e.printStackTrace();            }          }        });  }    private void getWeChatUserInfo(String accessToken, String openid) {    Map<String, String> map = new HashMap<>();    map.put("access_token", accessToken);    map.put("openid", openid);    OkHttpUtils.get().url("https://api.weixin.qq.com/sns/userinfo?").params(map).build().execute(        new StringCallback() {          @Override          public void onError(Call call, Exception e, int id) {            Log.i("微信用户信息Err", e.getMessage());          }          @Override          public void onResponse(String response, int id) {            try {              JSONObject jsonObject = new JSONObject(response);                ShareUtilService.setString("userInfo", response);                String unionid = jsonObject.getString("unionid");                ShareUtilService.setString(WEIXIN_UNIONID,unionid);            } catch (JSONException e) {              e.printStackTrace();            }          }        });  }    private void isExpireAccessToken(final String accessToken, final String openid) {    Map<String, String> map = new HashMap<>();    map.put("access_token", accessToken);    map.put("openid", openid);    OkHttpUtils.get().url("https://api.weixin.qq.com/sns/auth?").params(map).build().execute(        new StringCallback() {          @Override          public void onError(Call call, Exception e, int id) {            Log.i("微信token过期Err", e.getMessage());                      }          @Override          public void onResponse(String response, int id) {            try {              JSONObject jsonObject = new JSONObject(response);              int errCode = jsonObject.getInt("errcode");              if (errCode == 0) {                getWeChatUserInfo(accessToken, openid);              } else {                // 过期了,使用refresh_token来刷新accesstoken                refreshAccessToken();              }            } catch (JSONException e) {              e.printStackTrace();            }          }        });  }    private void refreshAccessToken() {    // 从本地获取以存储的refresh_token    String refreshToken = ShareUtilService.getString(WEIXIN_REFRESH_TOKEN_KEY, "");    if (TextUtils.isEmpty(refreshToken)) {      return;    }    Map<String, String> map = new HashMap<>();    map.put("appid", "自己项目的APPID“);    map.put("grant_type", "refresh_token");    map.put("refresh_token", refreshToken);    OkHttpUtils.get().url("https://api.weixin.qq.com/sns/oauth3/refresh_token?").params(map).build().execute(        new StringCallback() {          @Override          public void onError(Call call, Exception e, int id) {            Log.i("微信刷新TokenError", e.getMessage());            // 重新请求授权            registerWeChat();          }          @Override          public void onResponse(String response, int id) {            try {               JSONObject jsonObject = new JSONObject(response);                String access = jsonObject.getString("access_token");                String openid = jsonObject.getString("openid");                getWeChatUserInfo(access, openid);                    } catch (JSONException e) {              e.printStackTrace();            }          }        });  }  @Override  protected void onDestroy() {    super.onDestroy();    if(flag){      flag=false;      if (wxLoginReceiver != null) {        unregisterReceiver(wxLoginReceiver);      }    }  }}

到此,相信大家对“android微信授权怎么获取用户个人信息”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯