安卓app和微信授权登录和完整对接代码
安卓app和微信授权登录、分享完整对接
准备
账号体系
注册微信开放平台,创建移动应用,填写一系列的信息,在应用平台填写app
签名和包名,审核通过之后,取得AppID
和AppSecret
加载sdk和初始化
加载微信sdk
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta: '
初始化
public class App extends Application {
public static IWXAPI iwxapi;
public void onCreate() {
super.onCreate();
// 通过WXAPIFactory工厂,获取IWXAPI的实例
iwxapi = WXAPIFactory.createWXAPI(this, BuildConfig.WXAPP_ID, true);
// 将应用的appId注册到微信
iwxapi.registerApp(BuildConfig.WXAPP_ID);
//建议动态监听微信启动广播进行注册到微信
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 将该app注册到微信
iwxapi.registerApp(BuildConfig.APPLICATION_ID);
}
}, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
}
}
WXAPP_ID
为开放平台提供的AppID
APPLICATION_ID
为app
包名
授权登录部分
在app
根目录(/java/com.xxx.xxx/
) 新建Packagewxapi
, 在wxapi
新建Activity
名为:WXEntryActivity
,大概长这样:/java/com.xxx.xxx/wxapi/WXEntryActivity.java
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 隐藏状态栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//接收到分享以及登录的intent传递handleIntent方法,处理结果
App.iwxapi.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK: //微信回调成功
String code = ((SendAuth.Resp) baseResp).code;
//取得微信的code ,就可以干很多事情
finish();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED://用户拒绝授权
finish();
break;
case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消
finish();
break;
default:
finish();
break;
}
}
}
通过code
取得open
信息,比如openid
,access_token
等一系列信息。
private void getOpenInfo(String code) {
OkHttpUtils.get().url("https://api.weixin.qq.com/sns/oauth2/access_token")
.addParams("appid", BuildConfig.WXAPP_ID)
.addParams("secret", BuildConfig.WXAPP_Secret)
.addParams("code", code)
.addParams("grant_type", "authorization_code")
.build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
Toast.makeText(WXEntryActivity.this, "微信授权失败", Toast.LENGTH_LONG).show();
finish();
}
@Override
public void onResponse(String response, int id) {
JSONObject jsonObject = JSONObject.parseObject(response);
String openId = jsonObject.getString("openid");
String access_token = jsonObject.getString("access_token");
Log.v("openId", openId "---" access_token);
// 取得openid 又可以干很多事情
// 在这里可以 对接 自己的 系统的用户信息等
finish();
}
});
}
通过openid
可以查询用户昵称,头像等信息。
private void getUserInfo(String access_token, String openid) {
OkHttpUtils.get().url("https://api.weixin.qq.com/sns/userinfo")
.addParams("access_token", access_token)
.addParams("openid", openid)
.build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
finish();
Toast.makeText(WXEntryActivity.this, "微信授权失败", Toast.LENGTH_LONG).show();
}
@Override
public void onResponse(String response, int id) {
//JSONObject jsonObject = JSONObject.parseObject(response);
Log.v("response", response);
}
});
}
分享部分
分享图片:
/**
*bmp 分享图片
*width 缩略图宽
*height 缩略图高
*sence 分享场景 0:分享到对话,1:朋友圈 ,2:分享到收藏
*/
public static void Image(Bitmap bmp, int width, int height, int sence) {
//初始化 WXImageObject 和 WXMediaMessage 对象
WXImageObject imgObj = new WXImageObject(bmp);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
//设置缩略图
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, width, height, true);
//bmp.recycle();
msg.thumbData = bmpToByteArray(thumbBmp);
//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("img");
req.message = msg;
req.scene = sence;
req.userOpenId = App.userInfo.getOpenId();
//调用api接口,发送数据到微信
App.iwxapi.sendReq(req);
}
分享链接
/**
*url: 分享链接
*title: 分享标题
*desc: 分享描述
*thumbBmp: 分享缩略图
*sence: 分享场景 0:分享到对话,1:朋友圈 ,2:分享到收藏
*/
public static void Url(String url, String title, String desc, Bitmap thumbBmp, int sence) {
//初始化一个WXWebpageObject,填写url
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = url;
//用 WXWebpageObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = title;
msg.description = desc;
msg.thumbData = bmpToByteArray(thumbBmp);
//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message = msg;
req.scene = sence;
req.userOpenId = App.userInfo.getOpenId();
//调用api接口,发送数据到微信
App.iwxapi.sendReq(req);
}
俩辅助函数
private static String buildTransaction(String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis()) : type System.currentTimeMillis();
}
private static byte[] bmpToByteArray(Bitmap bmp) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, output);
byte[] result = output.toByteArray();
try {
output.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
注意事项
这个逼库经常加载失败,时不时的抽风
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta: '
解决办法:把包给down 下来,手动加载 ,在这里:https://bintray.com/wechat-sdk-team/maven
下载对应版本库如: wechat-sdk-android-without-mta-6.6.5.aar,放到libs目录,手动加载即可
android {
compileSdkVersion 28
repositories { //本地aar方式
flatDir {
dirs 'libs' //this way we can find the .aar file in libs folder
}
}
}
implementation(name: 'wechat-sdk-android-without-mta-6.6.5', ext: 'aar')
分享之后关闭不掉的问题,也就是finish失效
事实上在回调之后,不是BaseResp.ErrCode.ERR_OK
就完了,这里面得还有一层逻辑判断:
public void onResp(BaseResp baseResp) {
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
// 在此处应该还需要判断 回调成功类型。是登录还是分享,然后做相对应的操作
switch (baseResp.getType()) {
case ConstantsAPI.COMMAND_SENDAUTH: //登录成功的回调
String code = ((SendAuth.Resp) baseResp).code;
// 登录 todo
break;
case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX: //分享成功
// 分享 todo
Toast.makeText(getApplicationContext(), "分享成功!", Toast.LENGTH_LONG).show();
finish();
break;
default:
finish();
break;
}
case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消
finish();
break;
default:
finish();
break;
}
}
【完】
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tangbibjc
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01