基于react native的android原生微信客服,微信支付以及判断是否安装微信
微信openSDK
引入SDK(Android Studio 环境下)
请按照android接入指南
创建wxapi/WXPayEntryActivity.java(用于接收微信响应返回信息)
package com.xxxx.wxapi;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
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.modelpay.PayResp;
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String APP_ID="wxxxxxxxx";
public ReactApplicationContext reactContext;
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this,APP_ID);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
public void setReactContext(ReactApplicationContext reactContext) {
this.reactContext = reactContext;
}
// 处理微信请求
@Override
public void onReq(BaseReq req) {
}
// 处理微信回调
@Override
public void onResp(BaseResp baseResp) {
WritableMap map = Arguments.createMap();
map.putInt("errCode", baseResp.errCode);
map.putString("errStr", baseResp.errStr);
map.putString("openId", baseResp.openId);
map.putString("transaction", baseResp.transaction);
if (baseResp instanceof PayResp) {
//支付返回值
PayResp resp = (PayResp) (baseResp);
map.putString("type", "PayReq.Resp");
map.putString("returnKey", resp.returnKey);
}
finish();
}
}
CustomerServiceModule.java
package com.xxxx;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReadableMap;
import com.tencent.mm.opensdk.modelbiz.WXOpenCustomerServiceChat;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.windoent.bandaimatch.wxapi.WXEntryActivity;
public class CustomerServiceModule extends ReactContextBaseJavaModule{
private final static String NOT_REGISTERED = "registerApp required.";
private static final String APP_ID="wxxxxxxxx";
private static ReactApplicationContext reactContext;
private IWXAPI api;
public CustomerServiceModule(ReactApplicationContext context){
super(context);
WXEntryActivity.reactContext=context;
reactContext=context;
api=WXAPIFactory.createWXAPI(context,APP_ID,true);
}
@Override
public String getName() {
return "CustomerServiceChat";
}
// 判断是否安装微信
@ReactMethod
public void isWeChatInstalled(Promise promise) {
if (api == null) {
promise.resolve(NOT_REGISTERED);
return;
}
String result="no";
boolean isInstalled = api.isWXAppInstalled();
if(isInstalled){
result="ok";
}else{
result="no";
}
promise.resolve(result);
}
//微信客服
@ReactMethod
public void open(String corpId, String kfUrl, Promise promise) {
try{
if (api == null) {
promise.resolve(NOT_REGISTERED);
return;
}
// 将应用的appId注册到微信
api.registerApp(APP_ID);
// open customer service logic
WXOpenCustomerServiceChat.Req req = new WXOpenCustomerServiceChat.Req();
req.corpId = corpId;
req.url = kfUrl;
api.sendReq(req);
}catch(Exception e){
promise.resolve("Error");
}
}
// 微信支付
@ReactMethod
public void pay(ReadableMap data, Promise promise) {
// 将应用的appId注册到微信
api.registerApp(APP_ID);
PayReq payReq = new PayReq();
if (data.hasKey("partnerId")) {
payReq.partnerId = data.getString("partnerId");
}
if (data.hasKey("prepayId")) {
payReq.prepayId = data.getString("prepayId");
}
if (data.hasKey("nonceStr")) {
payReq.nonceStr = data.getString("nonceStr");
}
if (data.hasKey("timeStamp")) {
payReq.timeStamp = data.getString("timeStamp");
}
if (data.hasKey("sign")) {
payReq.sign = data.getString("sign");
}
if (data.hasKey("package")) {
payReq.packageValue = data.getString("package");
}
payReq.appId = APP_ID;
api.sendReq(payReq);
}
}
CustomerServicePackage.java
package com.xxxx;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CustomerServicePackage implements ReactPackage {
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new CustomerServiceModule(reactContext));
return modules;
}
}
MainApplication.java(引入CustomerServicePackage包)
package com.xxxx;
import android.app.Application;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.facebook.react.defaults.DefaultReactNativeHost;
import com.facebook.soloader.SoLoader;
import java.util.List;
import com.windoent.bandaimatch.CustomerServicePackage;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost =
new DefaultReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected List<ReactPackage> getPackages() {
@SuppressWarnings("UnnecessaryLocalVariable")
List<ReactPackage> packages = new PackageList(this).getPackages();
// Packages that cannot be autolinked yet can be added manually here, for example:
// packages.add(new MyReactNativePackage());
packages.add(new CustomerServicePackage());
return packages;
}
@Override
protected String getJSMainModuleName() {
return "index";
}
@Override
protected boolean isNewArchEnabled() {
return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
}
@Override
protected Boolean isHermesEnabled() {
return BuildConfig.IS_HERMES_ENABLED;
}
};
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
@Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
DefaultNewArchitectureEntryPoint.load();
}
//ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
}
}
wxCustomer.js
import {NativeModules} from 'react-native';
export default NativeModules.CustomerServiceChat;
使用案例
import wxCustomer from '../../common/js/wxCustomer';
是否安装微信app
wxCustomer.isWeChatInstalled()
//微信客服
wxCustomer.open(
'ww8259a7xxxx',
'https://work.weixin.qq.com/kfid/xxxxx',
);
//微信支付
wxCustomer.pay({
partnerId: payInfo?.partnerid,
prepayId: payInfo?.prepayid,
nonceStr: payInfo?.noncestr,
timeStamp: payInfo?.timestamp,
package: payInfo?.package,
sign: payInfo?.sign,
});