安卓app和微信授权登录及分享完整对接

2024-07-06

准备账号体系注册微信开放平台,创建移动应用,填写一系列的信息,在应用平台填写app签名和包名,审核通过之后,取得AppID和 AppSecret

加载sdk 和 初始化加载微信sdk

代码语言:javascript复制implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'初始化

代码语言:javascript复制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/) 新建 Package wxapi, 在wxapi 新建 Activity 名为:WXEntryActivity,大概长这样:/java/com.xxx.xxx/wxapi/WXEntryActivity.java

代码语言:javascript复制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等一系列信息

```java

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 可以查询用户昵称,头像等信息。

代码语言:javascript复制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);

}

});

}分享部分分享图片:

代码语言:javascript复制/**

*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);

}分享链接

代码语言:javascript复制/**

*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);

}俩辅助函数

代码语言:javascript复制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;

}注意事项这个逼库经常加载失败,时不时的抽风代码语言:javascript复制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目录,手动加载 即可

代码语言:javascript复制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 就完了,这里面得还有一层逻辑判断:

代码语言:javascript复制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;

}

}[完]