本篇文章給大家了解安卓app和微信授權登錄及分享完整對接,有一定的參考價值,有需要的朋友可以參考一下,希望對你們有所助。

安卓app和微信授權登錄、分享完整對接
準備
賬號體系
注冊微信開放平臺,創(chuàng)建移動應用,填寫一系列的信息,在應用平臺填寫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);
//建議動態(tài)監(jiān)聽微信啟動廣播進行注冊到微信
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);
// 隱藏狀態(tài)欄
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 又可以干很多事情
// 在這里可以 對接 自己的 系統(tǒng)的用戶信息等
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接口,發(fā)送數(shù)據(jù)到微信
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接口,發(fā)送數(shù)據(jù)到微信
App.iwxapi.sendReq(req);
}倆輔助函數(shù)
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;
}注意事項
這個逼庫經(jīng)常加載失敗,時不時的抽風
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;
}
}





