android 微信登录
1 导入微信依赖
在 android/app/build.gradle 文件中添加依赖:
dependencies {
api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
2 添加权限
在android/app/src/main/AndroidManifest.xml 中添加必要的权限支持(其中网络权限如果没有使用扫码登录功能非必要;后三个权限,如果没有使用 mta,也非必要,即使有使用 mta,去掉也不影响功能):
<uses-permission android:name="android.permission.INTERNET" />
<!-- for mta statistics, not necessary-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
3 创建包名
在android/app/src/main/java/com/项目名/下创建包名 wxapi(个人确定),后续创建的java文件都放在这个文件夹下。
4 创建 demoModule.java
此处需要用到的api可以参考react-native-wechat的WeChatModule.java
class WxModule extends ReactContextBaseJavaModule {
private IWXAPI api = null;
static String APP_ID = "";
static Promise promise = null;
private final static String NOT_REGISTERED = "registerApp required.";
WxModule(ReactApplicationContext reactContext) {
super(reactContext);
api = WXAPIFactory.createWXAPI(reactContext, null);
}
@Override
public String getName() {
return "Wxapp"; //此处Wxapp是react-native js中调用名
}
@ReactMethod
public void registerApp(String APP_ID) { // 向微信注册
WxModule.APP_ID = APP_ID;
api.registerApp(APP_ID);
}
@ReactMethod
public void openWXApp(Promise promise) {
if (api == null) {
promise.reject(NOT_REGISTERED);
return;
}
WxModule.promise = promise;
api.openWXApp();//打开微信
}
@ReactMethod
public void sendAuthRequest(String scope, String state, Promise promise) {
if (api == null) {
promise.reject(NOT_REGISTERED);
return;
};
DemoModule.promise= promise;
// send oauth request
SendAuth.Req req = new SendAuth.Req();
req.scope = scope;
req.state = state;
api.sendReq(req); //获取用户信息
}
@ReactMethod
public void isSupported(Promise promise) { // 判断是否支持调用微信SDK
boolean isSupported = api.isWXAppInstalled();
promise.resolve(isSupported);
}
}
5创建WXEntryActivity.java
注意点:必须是这个名字。不然微信的回调执行会没有响应。
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = "WXEntryActivity";
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, WxModule.APP_ID);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp baseResp) {
Log.d("baseResp",baseResp.toString());
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 SendAuth.Resp) {
SendAuth.Resp resp = (SendAuth.Resp) (baseResp);
map.putString("type", "SendAuth.Resp");
map.putString("code", resp.code);
map.putString("state", resp.state);
map.putString("url", resp.url);
map.putString("lang", resp.lang);
map.putString("country", resp.country);
} else if (baseResp instanceof SendMessageToWX.Resp) {
SendMessageToWX.Resp resp = (SendMessageToWX.Resp) (baseResp);
map.putString("type", "SendMessageToWX.Resp");
} else if (baseResp instanceof PayResp) {
PayResp resp = (PayResp) (baseResp);
map.putString("type", "PayReq.Resp");
map.putString("returnKey", resp.returnKey);
}
demoModule.promise.resolve(map);
}
}
6创建DemoPackage.java
public class DemoPackage 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 DemoModule(reactContext));
return modules;
}
}
7注册模块
在android/app/src/main/java/com/项目名/MainApplication.java 中注册DemoPackage()
@Override
protected List<ReactPackage> getPackages() {
@SuppressWarnings("UnnecessaryLocalVariable")
List<ReactPackage> packages = new PackageList(this).getPackages();
packages.add(new WxPackage());
return packages;
}
8调用activity
创建WXEntryActivity文件后需要AndroidManifest.xml文件添加exported、taskAffinity及launchMode属性,其中exported设置为true,taskAffinity设置为你的包名,launchMode设置为singleTask
<activity
android:name="你的包名.wxapi.WXEntryActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="true"
android:taskAffinity="填写你的包名"
android:launchMode="singleTask">
</activity>
8 react-native 中调用模块
import {NativeModules} from 'react-native'
NativeModules.Wxapp.registerApp('appid')
NativeModules.Wxapp.isSupported().then((result) => {
console.log(result,'是否安装微信')
}).catch((err) => {
console.log(err,'检测是否安装微信错误')
});