依赖:
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
微信登录:
这个类一定要在wxapi下面不然不好使。。。。
package com.wd.tech.wxapi;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.wd.tech.baselibrary.util.SpUtil;
import com.wd.tech.baselibrary.util.WXUtils;
import tech.wd.com.informationlibrary.wechat.WXShare;
/**
* 微信登录
*/
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
private static final int RETURN_MSG_TYPE_LOGIN = 1;
private static final int RETURN_MSG_TYPE_SHARE = 2;
private static final String TAG = "WXEntryActivity";
public IWXAPI mWxApi;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* mWxApi = WXAPIFactory.createWXAPI(this, "wxb3852e6a6b7d9516");*/
//这次我使用了一个微信分享的工具类获取IWXAPI
WXShare share = new WXShare(this);
mWxApi = share.getApi();
//如果没回调onResp,八成是这句没有写
mWxApi.handleIntent(getIntent(), this);
}
// 微信发送请求到第三方应用时,会回调到该方法
@Override
public void onReq(BaseReq req) {
}
// 第三的方应用发送到微信请求处理后的响应结果,会回调到该方法
//app发送消息给微信,处理返回消息的回调
@Override
public void onResp(BaseResp baseResp) {
Log.d("WXEntryActivity", "错误码 : " + baseResp.errCode + "");
Log.i(TAG, "error_code:---->" + baseResp.errCode);
int type = baseResp.getType(); //类型:分享还是登录
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_AUTH_DENIED:
//用户拒绝授权
/*ToastUtils.showToast(mContext, "拒绝授权微信登录");*/
Toast.makeText(this, "拒绝授权微信 登录", Toast.LENGTH_SHORT).show();
case BaseResp.ErrCode.ERR_USER_CANCEL:
//用户取消
String message = "";
if (type == RETURN_MSG_TYPE_LOGIN) {
message = "取消了微信登录";
} else if (type == RETURN_MSG_TYPE_SHARE) {
message = "取消了微信分享";
}
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
break;
case BaseResp.ErrCode.ERR_OK:
//用户同意,为微信登录
if (type == RETURN_MSG_TYPE_LOGIN) {
//用户换取access_token的code,仅在ErrCode为0时有效
String code = ((SendAuth.Resp) baseResp).code;
Log.i(TAG, "微信code============" + code);
//这里拿到了这个code,去做2次网络请求获取access_token和用户个人信息
//这里我封装了一个工具类去做微信专用的登录的网络工具类
WXUtils.getWXUserInfo(code, this);
finish();
//销毁本页面
} else if (type == RETURN_MSG_TYPE_SHARE) {
/*微信分享成功*/
finish();
}
break;
}
}
}
下面是判断微信是否安装
public static boolean isWeixinAvilible(Context context) {
final PackageManager packageManager = context.getPackageManager();// 获取packagemanager
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息
if (pinfo != null) {
for (int i = 0; i < pinfo.size(); i++) {
String pn = pinfo.get(i).packageName;
if (pn.equals("com.tencent.mm")) {
return true;
}
}
}
return false;
}
清单文件
清单文件一定要注册activity
<uses-permission android:name="android.permission.INTERNET" />
<activity android:name=".wxapi.WXEntryActivity"
android:exported="true"
/>
在appliaction中配置看如下信息
private static App mainApp;
public static IWXAPI mWxApi;
public static App getMainApp() {
mainApp = new App();
return mainApp;
}
在onCcreat中写入
mWxApi = WXAPIFactory.createWXAPI(this, "appid", true);
// 将该app注册到微信
mWxApi.registerApp("appid");
配置齐全后我们进行调用微信进行微信登录
第三方登录
private void wxLogin() {
//先判断是否安装微信APP,按照微信的说法,目前移动应用上微信登录只提供原生的登录方式,需要用户安装微信客户端才能配合使用。
if (!WXUtils.isWeixinAvilible(this)) {
toase("您还未安装微信客户端",0);
return;
}
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "diandi_wx_login";
//像微信发送请求
BaseApp.mWxApi.sendReq(req);
}
这样我们就可以掉起来微信登录后我们的WXEntryActivity 会受到回调拿到code我们进行请求我们的服务器
微信分享
微信分享我上面已经提到了在初始化微信api的时候我是调用的分享工具类,这个是分享的工具类了
package tech.wd.com.informationlibrary.wechat;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Parcel;
import android.os.Parcelable;
//17600656561
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendMessageToWX;
import com.tencent.mm.opensdk.modelmsg.WXMediaMessage;
import com.tencent.mm.opensdk.modelmsg.WXTextObject;
import com.tencent.mm.opensdk.modelmsg.WXWebpageObject;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.wd.tech.baselibrary.util.Logger;
import java.io.ByteArrayOutputStream;
import java.net.URL;
public class WXShare {
public static final String APP_ID = "wx4c96b6b8da494224";
public static final String ACTION_SHARE_RESPONSE = "action_wx_share_response";
public static final String EXTRA_RESULT = "result";
private final Context context;
private final IWXAPI api;
private OnResponseListener listener;
private ResponseReceiver receiver;
public WXShare(Context context) {
api = WXAPIFactory.createWXAPI(context, APP_ID);
this.context = context;
}
public WXShare register() {
// 微信分享
api.registerApp(APP_ID);
receiver = new ResponseReceiver();
IntentFilter filter = new IntentFilter(ACTION_SHARE_RESPONSE);
context.registerReceiver(receiver, filter);
return this;
}
public void unregister() {
try {
api.unregisterApp();
context.unregisterReceiver(receiver);
} catch (Exception e) {
e.printStackTrace();
}
}
public void shared( final boolean friendsCircle, final String title, final String desc, final String link, final String pictrue) {
new Thread(){
@Override
public void run() {
super.run();
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = link;//分享url
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = title;
msg.description = desc;
try {
Bitmap bitmap = BitmapFactory.decodeStream(new URL(pictrue).openStream());
Bitmap thumBitmap = bitmap.createScaledBitmap(bitmap, 10, 10, true);
// 释放资源
bitmap.recycle();
msg.thumbData = bmpToByteArray(thumBitmap, true);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = String.valueOf(System.currentTimeMillis());
req.message = msg;
req.scene = friendsCircle ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;
api.sendReq(req);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
//bitmap转byte数组
public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
int i;
int j;
if (bmp.getHeight() > bmp.getWidth()) {
i = bmp.getWidth();
j = bmp.getWidth();
} else {
i = bmp.getHeight();
j = bmp.getHeight();
}
Bitmap localBitmap = Bitmap.createBitmap(i, j, Bitmap.Config.RGB_565);
Canvas localCanvas = new Canvas(localBitmap);
while (true) {
localCanvas.drawBitmap(bmp, new Rect(0, 0, i, j), new Rect(0, 0, i, j), null);
if (needRecycle)
bmp.recycle();
ByteArrayOutputStream localByteArrayOutputStream = new ByteArrayOutputStream();
localBitmap.compress(Bitmap.CompressFormat.JPEG, 100,
localByteArrayOutputStream);
localBitmap.recycle();
byte[] arrayOfByte = localByteArrayOutputStream.toByteArray();
try {
localByteArrayOutputStream.close();
return arrayOfByte;
} catch (Exception e) {
// F.out(e);
}
i = bmp.getHeight();
j = bmp.getHeight();
}
}
public WXShare share(String text) {
WXTextObject textObj = new WXTextObject();
textObj.text = text;
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObj;
// msg.title = "Will be ignored";
msg.description = text;
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("text");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;
boolean result = api.sendReq(req);
Logger.i("tagger","text shared: " + result);
return this;
}
public IWXAPI getApi() {
return api;
}
public void setListener(OnResponseListener listener) {
this.listener = listener;
}
private String buildTransaction(final String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}
private class ResponseReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Response response = intent.getParcelableExtra(EXTRA_RESULT);
Logger.d("tagger","type: " + response.getType());
Logger.d("tagger","errCode: " + response.errCode);
String result;
if (listener != null) {
if (response.errCode == BaseResp.ErrCode.ERR_OK) {
listener.onSuccess();
} else if (response.errCode == BaseResp.ErrCode.ERR_USER_CANCEL) {
listener.onCancel();
} else {
switch (response.errCode) {
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = "发送被拒绝";
break;
case BaseResp.ErrCode.ERR_UNSUPPORT:
result = "不支持错误";
break;
default:
result = "发送返回";
break;
}
listener.onFail(result);
}
}
}
}
public static class Response extends BaseResp implements Parcelable {
public int errCode;
public String errStr;
public String transaction;
public String openId;
private int type;
private boolean checkResult;
public Response(BaseResp baseResp) {
errCode = baseResp.errCode;
errStr = baseResp.errStr;
transaction = baseResp.transaction;
openId = baseResp.openId;
type = baseResp.getType();
checkResult = baseResp.checkArgs();
}
@Override
public int getType() {
return type;
}
@Override
public boolean checkArgs() {
return checkResult;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.errCode);
dest.writeString(this.errStr);
dest.writeString(this.transaction);
dest.writeString(this.openId);
dest.writeInt(this.type);
dest.writeByte(this.checkResult ? (byte) 1 : (byte) 0);
}
protected Response(Parcel in) {
this.errCode = in.readInt();
this.errStr = in.readString();
this.transaction = in.readString();
this.openId = in.readString();
this.type = in.readInt();
this.checkResult = in.readByte() != 0;
}
public static final Creator<Response> CREATOR = new Creator<Response>() {
@Override
public Response createFromParcel(Parcel source) {
return new Response(source);
}
@Override
public Response[] newArray(int size) {
return new Response[size];
}
};
}
}
public interface OnResponseListener {
void onSuccess();
void onCancel();
void onFail(String message);
}
工具类我们已经准备齐全下面进行分享
1.初始化工具类,注册分享
wxShare = WXShare(this);
wxShare.register()
2.在activity销毁的时候后分享注销注册
override fun onDestroy() {
wxShare.unregister();
}
3.分享调用工具类中的shared方法
第一个参数:
boolean friendsCircle false为好友,true为朋友圈
final String title 分享的标题
final String desc 分享的描述
final String link 分享的连接
final String pictrue 分享的图片
微信支付
第一步:注册
wxShare = WXShare(this);
api = wxShare .getApi();
wxShare.register()
第二部:掉起支付
val fromJson = Gson().fromJson(data, WeixinEntitiy::class.java)
val request = PayReq()
request.appId = fromJson.getAppId()
request.partnerId = fromJson.getPartnerId()
request.prepayId = fromJson.getPrepayId()
request.packageValue = fromJson.getPackageValue()
request.nonceStr = fromJson.getNonceStr()
request.timeStamp = fromJson.getTimeStamp()
request.sign = fromJson.getSign()
api!!.sendReq(request)
第三部:回调,这个里面可有判断支付是否成功
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WXShare share = new WXShare(this);
api = share.getApi();
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq baseReq) {
//...
}
@Override
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if (resp.errCode == 0) {
SpUtil.saveData(this,"isPay",true);
finish();
} else if (resp.errCode == -2) {
Toast.makeText(this, "您已取消付款!", Toast.LENGTH_SHORT).show();
finish();
} else {
Toast.makeText(this, "参数错误", Toast.LENGTH_SHORT).show();
finish();
}
} else {
finish();
}
}
}
好了这就是以上我的小总结,对大家有帮助