话不多说  直接上菜!

一.因为是微信扫码登录,所有要在微信开放平台  微信开放平台 (qq.com) 进行注册----- 如下

1.资源中心 里面也有详细的官方讲解,里面也有demo  可以下载

2.在 管理中心      创建应用 填写一系列的信息

3. 提交审核,大概需要三到五天的时间审核完成;

4. 审核完成微信开放平台会生成一个appid,和sercet 这两个是唯一的id 需要妥善保管;

5. 按照微信开放平台给的文档,下载相应的sdk以及签名工具,在此强调 必须是用签名打包的正式版的apk才可以调起微信的客户端进行授权登录,必须保证应用的签名(用签名工具可以获取)和开放平台上填写的信息一致。   签名工具获取----》首页-----》资源中心---》资源下载

6.将 自己的app 安装到手机

7.将 签名生成工具 下载安装到 (6.上一步中的)手机,打开并输入 (6.上一步app)的包名,并点击 get 按钮,生成签名,填写到  第2步 中.

二.代码部分

1、依赖:在app  build.gradle 中添加

implementation ‘com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+’

implementation 'com.google.code.gson:gson:2.8.5'

2.我用的是HTTP 请求  当然也可以用OKHTTP 会更简单一些

新建 HttpsUtils 类库,写里面的 submitGetData 方法如下:

/**
* 使用GET方法读取http中的数据
*
* @param strUrlPath url地址
* @return 请求的响应数据
*/
public static String submitGetData(String strUrlPath, @NonNull Map<String, String> requestPropertys) throws Exception {
// 创建URL对象
URL url = new URL(strUrlPath);
// 打开连接 获取连接对象
URLConnection connection = url.openConnection();
connection.setConnectTimeout(6000);

if (requestPropertys != null) {
//设置 安卓端flag
for (Map.Entry<String, String> entry : requestPropertys.entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
}

// 从连接对象中获取网络连接中的输入字节流对象
InputStream inputStream = connection.getInputStream();
// 将输入字节流包装成输入字符流对象,并进行字符编码
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
// 创建一个输入缓冲区对象,将字符流对象传入
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

// 定义一个字符串变量,用来接收输入缓冲区中的每一行字符串数据
String line;
// 创建一个可变字符串对象,用来装载缓冲区对象的数据,使用字符串追加的方式,将响应的所有数据都保存在该对象中
StringBuilder stringBuilder = new StringBuilder();
// 使用循环逐行读取输入缓冲区的数据,每次循环读入一行字符串数据赋值给line字符串变量,直到读取的行为空时标识内容读取结束循环
while ((line = bufferedReader.readLine()) != null) {
// 将从输入缓冲区读取到的数据追加到可变字符对象中
stringBuilder.append(line);
}
// 依次关闭打开的输入流
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
// 将可变字符串转换成String对象返回
return stringBuilder.toString();
}
3.把申请出来的appID,secret 放在新建的Constant类中



4.我们回到 MainActivity中
//定义变量
private ImageView IvWeChat;  //显示 二维码的图片控件
IDiffDevOAuth oauth;
String noncestr;
String timeStamp;
String sha;
Toast mToast;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

oauth = DiffDevOAuthFactory.getDiffDevOAuth(); //添加
IvWeChat = (ImageView) findViewById(R.id.iv_wxm);

ConnectWechat();
}
//回调
   OAuthListener mOAuthListener = new OAuthListener() {
@Override
public void onAuthGotQrcode(String s, byte[] bytes) {
Log.e(TAG, "onAuthGotQrcode: ");
IvWeChat.setImageBitmap(null);
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, new BitmapFactory.Options());
IvWeChat.setImageBitmap(bitmap);
}

@Override
public void onQrcodeScanned() {

}

@Override
public void onAuthFinish(OAuthErrCode oAuthErrCode, String s) {
Log.e(TAG, "onAuthFinish: ");
if (oAuthErrCode == OAuthErrCode.WechatAuth_Err_OK) {
new Thread(new Runnable() {
@Override
public void run() {
try {

String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Constant.WECHAT_APPID + "&secret=" + Constant.WECHAT_SECRET + "&code=" + s + "&grant_type=authorization_code";
Log.e(TAG, "onAuthFinish: url: " + url);
String res = HttpsUtils.submitGetData(url, null);
Log.e(TAG, "服务器返回: " + res);
JSONObject jsonObject = new JSONObject(res);
String openid = jsonObject.getString("openid");
String access_token = jsonObject.getString("access_token");

url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid;
res = HttpsUtils.submitGetData(url, null);
Log.e(TAG, "服务器返回: " + res);
jsonObject = new JSONObject(res);
String unionid = jsonObject.getString("unionid");
openid = jsonObject.getString("openid");
String nickName = jsonObject.getString("nickname");
int sex = jsonObject.getInt("sex");
String headimgurl = jsonObject.getString("headimgurl");
String language = jsonObject.getString("language");
String city = jsonObject.getString("city");
String province = jsonObject.getString("province");
String country = jsonObject.getString("country");
JSONArray privilege = jsonObject.getJSONArray("privilege");
Log.e(TAG, "unionid: " + unionid);
Log.e(TAG, "openid: " + openid);
Log.e(TAG, "nickName: " + nickName);
Log.e(TAG, "sex: " + sex);
Log.e(TAG, "headimgurl: " + headimgurl);
Log.e(TAG, "language: " + language);
Log.e(TAG, "city: " + city);
Log.e(TAG, "province: " + province);
Log.e(TAG, "country: " + country);
Log.e(TAG, "privilege: " + privilege);

runOnUiThread(new Runnable() {
@Override
public void run() {

//扫码成功 然后跳转
startActivity(new Intent(此页面.this, 想要跳转的页面.class));
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

}
});

} catch (Exception e) {
e.printStackTrace();
}

}
}).start();
} else if (oAuthErrCode == OAuthErrCode.WechatAuth_Err_Timeout) {
showTip("二维码已过期,请点击刷新"); //这个是提示 也可以用 吐司
//Toast.makeText()


} else if (oAuthErrCode == OAuthErrCode.WechatAuth_Err_Cancel) {
showTip("没有授权返回在刷新一下二维码");

} else if (oAuthErrCode == OAuthErrCode.WechatAuth_Err_NetworkErr) {
showTip("网络错误");

}
}
};

    /**
* 获取access_token
*
* @param
*/

private void ConnectWechat() {
new Thread(new Runnable() {
@Override
public void run() {
try {
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + Constant.WECHAT_APPID + "&secret=" + Constant.WECHAT_SECRET;
Log.e(TAG, "url_1: " + url);
String res = HttpsUtils.submitGetData(url, null);
Log.e(TAG, "服务器返回: " + res);

//获取access_token
String access_token = new JSONObject(res).getString("access_token");
url = "https:api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=2";
Log.e(TAG, "url_2: " + url);

res = HttpsUtils.submitGetData(url, null);

Log.e(TAG, "服务器返回: " + res);
String ticket = new JSONObject(res).getString("ticket");

StringBuilder str = new StringBuilder();// 定义变长字符串
// 随机生成数字,并添加到字符串
for (int i = 0; i < 8; i++) {
str.append(new Random().nextInt(10));
}
noncestr = str.toString();
timeStamp = Long.toString(System.currentTimeMillis()).substring(0, 10);
String string1 = String.format("appid=%s&noncestr=%s&sdk_ticket=%s&timestamp=%s", Constant.WECHAT_APPID, noncestr, ticket, timeStamp);
sha = EncryptUtils.getSHA(string1);
Log.e(TAG, "二维码验证方式" + sha);
oauth.auth(Constant.WECHAT_APPID, "snsapi_userinfo", noncestr, timeStamp, sha, mOAuthListener);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}

//重写onDestroy
@Override
protected void onDestroy() {
super.onDestroy();
//二维码登录
oauth.removeAllListeners();
oauth.stopAuth();
}

//OK,到这里呢,就结束了!
//兄弟们,加油,干就完了,奥里给!没有什么能阻挡我们前进的步伐。

Android (微信扫码登录) 获取微信二维码+扫码登录的更多相关文章

  1. PHP开发微信公众号(一)二维码的获取

    要开发微信公众号,首先进行需要注册一个,然后认证.这就不用多说了. 当然如果没有,也可以去申请一个测试号来使用,地址:https://mp.weixin.qq.com/debug/cgi-bin/sa ...

  2. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-7.授权登录获取微信用户个人信息实战

    笔记 7.授权登录获取微信用户个人信息实战         简介:讲解使用授权码code获取用户个人信息接口 关键点:看微信文档,字段尽量用拷贝 1.通过code获取access_token      ...

  3. .net Core 调用微信Jsapi接口,H5解析二维码

    项目里需要用到扫描二维码,自己实现,不会. 找到了两种解决方案: 通过reqrcode.js,这是一个前端解析二维码内容的js库.如果二维码比较清晰,用这种效果也不错 调用微信扫一扫功能,这种效果很好 ...

  4. 微信内点击链接或扫描二维码可直接用外部浏览器打开H5链接的解决方案

    很多朋友问我怎么解决微信内点击链接或扫描二维码可以直接跳出微信在外部浏览器打开网页链接,其实这并不难,只要我们使用微信跳转浏览器接口实现跳转功能即可. 简单的处理方案 1. 用浏览器打开我们需要用到的 ...

  5. 微信小程序动态生成保存二维码

    起源:最近小程序需要涉及到一些推广方面的功能,所以要写一个动态生成二维码用户进行下载分享,写完之后受益良多,特此来分享一下: 一.微信小程序动态生成保存二维码 wxml: <view class ...

  6. Android生成二维码--保存和分享二维码图片

    之前写过生成自定义二维码的两篇文章:<Android生成自定义二维码><Android生成二维码–拍照或从相册选取图片>,下面就介绍一下Android应用内如何保存以及分享二维 ...

  7. day111:MoFang:邀请好友流程&生成邀请好友二维码&第三方应用识别二维码&本地编译测试&记录邀请人信息

    目录 1.邀请业务逻辑流程图 2.邀请好友-前端 3.邀请好友-后端接口(生成二维码) 4.前端获取后端生成的二维码 5.前端长按页面,保存图片到相册 6.客户端通过第三方识别微信二维码,服务端提供对 ...

  8. 二维码相关---java生成二维码名片,而且自己主动保存到手机通讯录中...

    版权声明:本文为博主原创文章,未经博主credreamer 同意不得转载 违者追究法律责任. https://blog.csdn.net/lidew521/article/details/244418 ...

  9. QR二维码生成器源码(中间可插入小图片)

    二维码终于火了,现在大街小巷大小商品广告上的二维码标签都随处可见,而且大都不是简单的纯二维码,而是中间有个性图标的二维码. 我之前做了一个使用google开源项目zxing实现二维码.一维码编码解码的 ...

  10. Swift3.0生成二维码、扫描二维码、相册读取二维码,兼容iOS7(结合ZXingObjC)

    二维码生成 //MARK: 传进去字符串,生成二维码图片(>=iOS7) text:要生成的二维码内容 WH:二维码高宽 private func creatQRCodeImage(text: ...

随机推荐

  1. Java学习day37

    动态语言:是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化. 主要动态语言:Objective-C.C#.JavaScript.PH ...

  2. 一款开源的文件搜索神器,终于不用记 find 命令了

    这是 HelloGitHub 推出的<讲解开源项目>系列,用一篇文章带你快速上手有趣的开源项目. 今天给大家推荐一个好用+开源的文件搜索工具--fd 该工具支持大多数主流操作系统,快来更新 ...

  3. python基础练习题(题目 递归求阶乘)

    day18 --------------------------------------------------------------- 实例026:利用递归方法求5! 分析:递归包括递归体和递归条 ...

  4. 记一次 PHP 省市县三级联动 数据库取值

    /** * Notes:省市县三级联动 * Created by depressiom * Date: 2022年4月14日 */ public function getCityData(){ //获 ...

  5. HTML5 Canvas 超逼真烟花绽放动画

    各位前端朋友们,大家好!五一假期即将结束,在开启加班模式之前,我要给大家分享一个超酷超逼真的HTML5 Canvas烟花模拟动画.这次升级版的烟花动画有以下几个特点: 烟花绽放时,将展现不同的色彩,不 ...

  6. 1.9 初学者应选择哪个Linux发行版?

    前面章节中,已经对几个常见的 Linux 发行版做了简单的介绍,那么对于初学者来说,选择哪个发行版的性价比更高呢? 通常情况下,初学者学习 Linux,是为了找一份和 Linux 相关的工作,那么问题 ...

  7. Nginx代理websocket为什么要这样做?

    Nginx反向代理websocket 示例: http { map $http_upgrade $connection_upgrade { default upgrade; '' close; } s ...

  8. RabbitMQ从概念到使用、从Docker安装到RabbitMQ整合Springboot【1.5w字保姆级教学】

    @ 目录 一.前言 二.RabbitMQ作用 1. 异步处理 2. 应用解耦 3. 流量控制 三.RabbitMQ概念 1. RabbitMQ简介 2. 核心概念 四.JMS与AMQP比较 五.Rab ...

  9. Python | 内置函数(BIF)

    Python内置函数 | V3.9.1 | 共计155个 还没学完, 还没记录完, 不知道自己能不能坚持记录下去 1.ArithmeticError 2.AssertionError 3.Attrib ...

  10. Elasticsearch高级之-集群搭建,数据分片

    目录 Elasticsearch高级之-集群搭建,数据分片 一 广播方式 二 单播方式 三 选取主节点 四 什么是脑裂 五 错误识别 Elasticsearch高级之-集群搭建,数据分片 es使用两种 ...