public class WeChatUtil {
private static WeChatUtil instance;
private static final String TAG = WeChatUtil.class.getName();
private String WXAPP_ID = "";
private String WXAPP_SECRET = "";
public static final int IMAGE_SIZE = 32768;//微信分享图片大小限制
private IWXAPI api;
private static Application application;
private WeiXinToken mWeiXinToken;
private WeiXinInfo mWeiXinInfo;
public static WeChatUtil getInstance() {
if (instance == null) {
instance = new WeChatUtil();
application = MyApplication.getmApplication();
}
return instance;
}
public void initWechatLogin() {
api = WXAPIFactory.createWXAPI(application, WXAPP_ID, true);
api.registerApp(WXAPP_ID);
application.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
api.registerApp(WXAPP_ID);
}
}, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
}
/**
* 微信登陆(三个步骤)
* 1.微信授权登陆
* 2.根据授权登陆code 获取该用户token
* 3.根据token获取用户资料
*/
public void login() {
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = String.valueOf(System.currentTimeMillis());
api.sendReq(req);
}
public void getAccessToken(String code) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid=" + WXAPP_ID + "&secret=" + WXAPP_SECRET +
"&code=" + code + "&grant_type=authorization_code";
OkGo.<WeiXinToken>post(url)
.tag("WeiXinToken")
.retryCount(2)
.execute(new JsonCallback<WeiXinToken>() {
@Override
public void onSuccess(Response<WeiXinToken> response) {
WeiXinToken weiXinToken = response.body();
if (weiXinToken.getErrcode() == 0) {
getWeiXinUserInfo(weiXinToken);
setmWeiXinToken(weiXinToken);
} else {
ToastUtil.showToast(weiXinToken.getErrmsg());
}
}
@Override
public void onError(Response<WeiXinToken> response) {
super.onError(response);
ToastUtil.showToast(response.message());
}
});
}
public void getWeiXinUserInfo(WeiXinToken weiXinToken) {
String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" +
weiXinToken.getAccess_token() + "&openid=" + weiXinToken.getOpenid();
OkGo.<WeiXinInfo>post(url)
.tag("WeiXinInfo")
.retryCount(2)
.execute(new JsonCallback<WeiXinInfo>() {
@Override
public void onSuccess(Response<WeiXinInfo> response) {
WeiXinInfo weiXinInfo = response.body();
setmWeiXinInfo(weiXinInfo);
XLog.json(weiXinInfo.toString());
ToastUtil.showToast(weiXinInfo.toString());
}
});
}
/**
* 微信分享
*
* @param friendsCircle 是否分享到朋友圈
*/
public void share(boolean friendsCircle) {
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = "www.yunjichina.com.cn";//分享url
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = "云迹科技";
msg.description = "云迹科技,机器人行业探索者,专注于商用服务机器人研发,产品涉及酒店机器人、迎宾机器人、讲解机器人、送餐机器人、机器人底盘等。";
msg.thumbData = getThumbData();//封面图片byte数组
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);
}
/**
* 获取分享封面byte数组 我们这边取的是软件启动icon
*
* @return
*/
private byte[] getThumbData() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeResource(application.getResources(), R.drawable.ic_launcher, options);
ByteArrayOutputStream output = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, output);
int quality = 100;
while (output.toByteArray().length > IMAGE_SIZE && quality != 10) {
output.reset(); // 清空baos
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, output);// 这里压缩options%,把压缩后的数据存放到baos中
quality -= 10;
}
bitmap.recycle();
byte[] result = output.toByteArray();
try {
output.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 发起支付
*
* @param weiXinPay
*/
public void pay(WeiXinPay weiXinPay) {
PayReq req = new PayReq();
req.appId = WXAPP_ID;//appid
req.nonceStr = weiXinPay.getNoncestr();//随机字符串,不长于32位。推荐随机数生成算法
req.packageValue = weiXinPay.getPackage_value();//暂填写固定值Sign=WXPay
req.sign = weiXinPay.getSign();//签名
req.partnerId = weiXinPay.getPartnerid();//微信支付分配的商户号
req.prepayId = weiXinPay.getPrepayid();//微信返回的支付交易会话ID
req.timeStamp = weiXinPay.getTimestamp();//时间戳
api.registerApp(WXAPP_ID);
api.sendReq(req);
}
public WeiXinToken getmWeiXinToken() {
return mWeiXinToken;
}
public void setmWeiXinToken(WeiXinToken mWeiXinToken) {
this.mWeiXinToken = mWeiXinToken;
}
public WeiXinInfo getmWeiXinInfo() {
return mWeiXinInfo;
}
public void setmWeiXinInfo(WeiXinInfo mWeiXinInfo) {
this.mWeiXinInfo = mWeiXinInfo;
}
public IWXAPI getApi() {
return api;
}
}
public class WXEntryActivity extends BaseMvpLanActivity<WXEntryPresent> implements IWXAPIEventHandler {
private static final String TAG = WXEntryActivity.class.getName();
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
WeChatUtil.getInstance().getApi().handleIntent(getIntent(), this);
XLog.i(TAG, "WXEntryActivity onNewIntent");
}
@Override
public void onReq(BaseReq baseReq) {
XLog.i(TAG, "WXEntryActivity onReq:" + baseReq);
}
@Override
public void onResp(BaseResp resp) {
XLog.i(TAG, "WXEntryActivity onResp:" + resp);
if (resp.getType() == ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX) {//分享
XLog.i(TAG, "微信分享操作.....");
WeiXin weiXin = new WeiXin(2, resp.errCode, "");
EventBus.getDefault().post(weiXin);
} else if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH) {//登陆
XLog.i(TAG, "微信登录操作.....");
SendAuth.Resp authResp = (SendAuth.Resp) resp;
WeiXin weiXin = new WeiXin(1, resp.errCode, authResp.code);
EventBus.getDefault().post(weiXin);
}
finish();
}
@Override
public void initData(Bundle savedInstanceState) {
WeChatUtil.getInstance().getApi().handleIntent(getIntent(), this);
}
@Override
public WXEntryPresent newP() {
return new WXEntryPresent();
}
}
public class WXPayEntryActivity extends BaseMvpLanActivity<WXPayEntryPresent> implements IWXAPIEventHandler {
@Override
public void initData(Bundle savedInstanceState) {
WeChatUtil.getInstance().getApi().handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
WeChatUtil.getInstance().getApi().handleIntent(intent, this);
}
@Override
public WXPayEntryPresent newP() {
return new WXPayEntryPresent();
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp resp) {
XLog.i("whh", "微信支付回调 返回错误码:" + resp.errCode + " 错误名称:" + resp.errStr);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {//微信支付
WeiXin weiXin = new WeiXin(3, resp.errCode, "");
EventBus.getDefault().post(weiXin);
}
finish();
}
}
@Subscribe
public void onEventMainThread(WeiXin weiXin) {
XLog.i("whh", "收到eventbus请求 type:" + weiXin.getType());
if (weiXin.getType() == 1) {//登录
WeChatUtil.getInstance().getAccessToken(weiXin.getCode());
} else if (weiXin.getType() == 2) {//分享
switch (weiXin.getErrCode()) {
case BaseResp.ErrCode.ERR_OK:
XLog.i("whh", "微信分享成功.....");
break;
case BaseResp.ErrCode.ERR_USER_CANCEL://分享取消
XLog.i("whh", "微信分享取消.....");
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED://分享被拒绝
XLog.i("whh", "微信分享被拒绝.....");
break;
}
} else if (weiXin.getType() == 3) {//微信支付
if (weiXin.getErrCode() == BaseResp.ErrCode.ERR_OK) {//成功
XLog.i("whh", "微信支付成功.....");
}
}
}