Files
react-native-wechat-1/android/src/main/java/com/rnlib/wechat/RNWechatModule.java
2018-07-12 20:38:45 +08:00

401 lines
13 KiB
Java

package com.rnlib.wechat;
import android.content.Intent;
import android.graphics.Bitmap;
import android.util.Log;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.rnlib.wechat.helper.ActivityHelper;
import com.rnlib.wechat.helper.FormatConversion;
import com.rnlib.wechat.helper.SendMessageToWXHelper;
import com.rnlib.wechat.helper.WXMediaMessageHelper;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.modelmsg.SendMessageToWX;
import com.tencent.mm.opensdk.modelmsg.WXImageObject;
import com.tencent.mm.opensdk.modelmsg.WXMediaMessage;
import com.tencent.mm.opensdk.modelmsg.WXMiniProgramObject;
import com.tencent.mm.opensdk.modelmsg.WXMusicObject;
import com.tencent.mm.opensdk.modelmsg.WXTextObject;
import com.tencent.mm.opensdk.modelmsg.WXVideoObject;
import com.tencent.mm.opensdk.modelmsg.WXWebpageObject;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.modelpay.PayResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.tencent.mm.opensdk.utils.ILog;
public class RNWechatModule extends ReactContextBaseJavaModule {
private static ReactApplicationContext mReactContext;
private static final String TAG = "RNWechat";
private static final String RNWechatEventName = "RNWechatEvent";
private static IWXAPI api;
private boolean isWXApiRegisteSuccess = false;
public RNWechatModule(ReactApplicationContext reactContext) {
super(reactContext);
mReactContext = reactContext;
}
@Override
public String getName() {
return "RNWechat";
}
/**
* 注册 api
*/
@ReactMethod
public void registerApp(String appId, Boolean isDebug, Promise promise) {
if (!appId.isEmpty()) {
api = WXAPIFactory.createWXAPI(mReactContext, appId, true);
if (isDebug) {
api.setLogImpl(new ILog() {
@Override
public void v(String s, String s1) {
Log.d(TAG, s1);
}
@Override
public void d(String s, String s1) {
Log.d(TAG, s1);
}
@Override
public void i(String s, String s1) {
Log.i(TAG, s1);
}
@Override
public void w(String s, String s1) {
Log.w(TAG, s1, null);
}
@Override
public void e(String s, String s1) {
Log.e(TAG, s1, null);
}
});
}
isWXApiRegisteSuccess = api.registerApp(appId);
if (isWXApiRegisteSuccess) {
Log.d(TAG, "WXApi register success. appId: " + appId);
} else {
Log.d(TAG, "WXApi register failed. appId: " + appId);
}
} else {
Log.d(TAG, "There is no appId for WXApi.");
}
promise.resolve(isWXApiRegisteSuccess);
}
/**
* api 注册是否成功
*/
@ReactMethod
public void isWXApiRegisteSuccess(Promise promise) {
promise.resolve(isWXApiRegisteSuccess);
}
/**
* 微信是否安装
*/
@ReactMethod
public void isWXAppInstalled(Promise promise) {
promise.resolve(api.isWXAppInstalled());
}
/**
* 安装版本微信是否支持 api
*/
@ReactMethod
public void isWXAppSupportApi(Promise promise) {
promise.resolve(api.isWXAppSupportAPI());
}
/**
* 打开微信
*/
@ReactMethod
public void openWXApp(Promise promise) {
promise.resolve(api.openWXApp());
}
/**
* 打开小程序
*/
@ReactMethod
public void launchMiniProgram(
String userName,
String path,
Integer miniprogramType,
Promise promise) {
final WXLaunchMiniProgram.Req req = new WXLaunchMiniProgram.Req();
req.userName = userName;
req.path = path;
req.miniprogramType = miniprogramType;
promise.resolve(api.sendReq(req));
}
/**
* OAuth2
*/
@ReactMethod
public void sendAuthRequest(
String scope,
String state,
Promise promise) {
final SendAuth.Req req = new SendAuth.Req();
req.scope = scope;
req.state = state;
promise.resolve(api.sendReq(req));
}
/**
* 发送文字
*/
@ReactMethod
public void sendText(
String text,
Integer sceneType,
Promise promise) {
WXTextObject textObject = new WXTextObject(text);
WXMediaMessage mediaMessage = WXMediaMessageHelper.getInstance(null, null, null, textObject);
SendMessageToWX.Req req = SendMessageToWXHelper.getInstance(mediaMessage, sceneType);
promise.resolve(api.sendReq(req));
}
/**
* 发送图片
*/
@ReactMethod
public void sendImage(
String imageString,
Integer sceneType,
Promise promise) {
WXImageObject imageObject = new WXImageObject(FormatConversion.stringToBitmap(imageString));
WXMediaMessage mediaMessage = WXMediaMessageHelper.getInstance(null, null, null, imageObject);
SendMessageToWX.Req req = SendMessageToWXHelper.getInstance(mediaMessage, sceneType);
promise.resolve(api.sendReq(req));
}
/**
* 发送音乐
*/
@ReactMethod
public void sendMusic(
String musicUrl,
String musicDataUrl,
String title,
String description,
String thumbString,
Integer sceneType,
Promise promise) {
WXMusicObject musicObject = new WXMusicObject();
musicObject.musicUrl = musicUrl;
musicObject.musicDataUrl = musicDataUrl;
Bitmap thumb = FormatConversion.stringToBitmapWithScale(thumbString, 100, 100);
WXMediaMessage mediaMessage = WXMediaMessageHelper.getInstance(
title, description, FormatConversion.bitmapToByteArray(thumb), musicObject);
SendMessageToWX.Req req = SendMessageToWXHelper.getInstance(mediaMessage, sceneType);
promise.resolve(api.sendReq(req));
}
/**
* 发送视频
*/
@ReactMethod
public void sendVideo(
String videoUrl,
String title,
String description,
String thumbString,
Integer sceneType,
Promise promise) {
WXVideoObject videoObject = new WXVideoObject();
videoObject.videoUrl = videoUrl;
Bitmap thumb = FormatConversion.stringToBitmapWithScale(thumbString, 100, 100);
WXMediaMessage mediaMessage = WXMediaMessageHelper.getInstance(
title, description, FormatConversion.bitmapToByteArray(thumb), videoObject);
SendMessageToWX.Req req = SendMessageToWXHelper.getInstance(mediaMessage, sceneType);
promise.resolve(api.sendReq(req));
}
/**
* 发送链接
*/
@ReactMethod
public void sendLink(
String linkString,
String title,
String description,
String thumbString,
Integer sceneType,
Promise promise) {
WXWebpageObject webpageObj = new WXWebpageObject(linkString);
Bitmap thumb = FormatConversion.stringToBitmapWithScale(thumbString, 100, 100);
WXMediaMessage mediaMessage = WXMediaMessageHelper.getInstance(
title, description, FormatConversion.bitmapToByteArray(thumb), webpageObj);
SendMessageToWX.Req req = SendMessageToWXHelper.getInstance(mediaMessage, sceneType);
promise.resolve(api.sendReq(req));
}
/**
* 发送小程序
*/
@ReactMethod
public void sendMiniProgram(
String userName,
Integer miniprogramType,
String path,
String hdThumbString,
String title,
String description,
String webpageUrl,
String thumbString,
Promise promise) {
WXMiniProgramObject miniprogramObject = new WXMiniProgramObject();
miniprogramObject.userName = userName;
miniprogramObject.miniprogramType = miniprogramType;
miniprogramObject.path = path;
miniprogramObject.webpageUrl = webpageUrl;
miniprogramObject.withShareTicket = true;
String realThumbString = hdThumbString.isEmpty() ? thumbString : hdThumbString;
Bitmap realThumb = FormatConversion.stringToBitmapWithScale(realThumbString, 500, 400);
WXMediaMessage mediaMessage = WXMediaMessageHelper.getInstance(
title, description, FormatConversion.bitmapToByteArray(realThumb), miniprogramObject);
SendMessageToWX.Req req = SendMessageToWXHelper.getInstance(mediaMessage, SendMessageToWX.Req.WXSceneSession);
promise.resolve(api.sendReq(req));
}
/**
* 支付
*/
@ReactMethod
public void pay(
String appId,
String partnerId,
String prepayId,
String nonceStr,
Integer timeStamp,
String packageValue,
String sign,
Promise promise) {
PayReq req = new PayReq();
req.appId = appId;
req.partnerId = partnerId;
req.prepayId = prepayId;
req.nonceStr = nonceStr;
req.timeStamp = timeStamp.toString();
req.packageValue = packageValue;
req.sign = sign;
promise.resolve(api.sendReq(req));
}
public static void handleIntent(Intent intent) {
api.handleIntent(intent, new IWXAPIEventHandler() {
@Override
public void onReq(BaseReq baseReq) {
// TODO: 2018/5/2 微信小程序唤醒 App 参数传递
// if (baseReq instanceof ShowMessageFromWX.Req) {
// ShowMessageFromWX.Req req = (ShowMessageFromWX.Req) baseReq;
// WritableMap reqBody = Arguments.createMap();
// reqBody.putString("messageExt", req.message.messageExt);
// }
try {
ActivityHelper.moveTop(mReactContext);
} catch (NullPointerException ignored) {
}
}
@Override
public void onResp(BaseResp baseResp) {
WritableMap body = Arguments.createMap();
body.putInt("errCode", baseResp.errCode);
body.putString("errStr", FormatConversion.getNonNullString(baseResp.errStr));
if (baseResp instanceof SendMessageToWX.Resp) {
// 分享
body.putString("eventType", "SendMessageToWXResp");
} else if (baseResp instanceof WXLaunchMiniProgram.Resp) {
// 打开小程序
WXLaunchMiniProgram.Resp resp = (WXLaunchMiniProgram.Resp) baseResp;
body.putString("eventType", "WXLaunchMiniProgramResp");
body.putString("extMsg", resp.extMsg);
} else if (baseResp instanceof SendAuth.Resp) {
// OAuth2
SendAuth.Resp resp = (SendAuth.Resp) baseResp;
body.putString("eventType", "SendAuthResp");
body.putString("code", FormatConversion.getNonNullString(resp.code));
body.putString("state", FormatConversion.getNonNullString(resp.state));
body.putString("url", FormatConversion.getNonNullString(resp.url));
body.putString("lang", FormatConversion.getNonNullString(resp.lang));
body.putString("country", FormatConversion.getNonNullString(resp.country));
} else if (baseResp instanceof PayResp) {
// 支付
PayResp resp = (PayResp) baseResp;
body.putString("eventType", "PayResp");
body.putString("prepayId", FormatConversion.getNonNullString(resp.prepayId));
body.putString("returnKey", FormatConversion.getNonNullString(resp.returnKey));
}
RNWechatModule.sendEvent(body);
}
});
}
private static void sendEvent(WritableMap mBody) {
mReactContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(RNWechatEventName, mBody);
}
}