在RN应用开发过程中,集成支付宝和微信支付除了直接使用第三方的插件之,比如:react-native-yunpeng-alipay
,我们还可以借助RN提供的NativeModules调用原生模块来实现支付。NativeModules是JS代码调用原生模块的桥梁。所以,我们只需要在原生工程中集成支付宝和微信支付的sdk,然后使用NativeModules调用即可。
Android集成支付宝
首先,我们去支付宝官网下载支付宝SDK,下载对应的Android版本。
然后,将aar文件放入android/app/libs 文件夹下面,没有的话可以新建一个。
然后,参考原生Android依赖aar包的方式,在android/app/build.gradle
文件的dependencies 节点里面添加如下依赖代码。
implementation fileTree(dir:"libs",include: ["*.jar","*.aar"])
上面的代码会自动将libs目录下的jar和aar添加到工程依赖环境中。接着,在android/app/src/main/AndroidMainifest.xml
中添加以下必要权限。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果要让JS能够调用原生的代码,还需要封装JavaModul和ReactPackage。首先,在android/app/src/main/java/com.xxx
下面创建alipay文件包,然后,在alipay文件下新建PayModule.java
和PayPackage.java
。
PayModule.java代码如下:
package com.cgv.alipay;
public class PayModule extends ReactContextBaseJavaModule {
private final ReactApplicationContext reactContext;
public PayModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
}
@Override
public String getName() {
return "PayModule";
}
@ReactMethod
public void setAlipayScheme(String scheme){
}
@ReactMethod
public void setAlipaySandbox(Boolean isSandbox) {
if (isSandbox) {
EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);
} else {
EnvUtils.setEnv(EnvUtils.EnvEnum.ONLINE);
}
}
@ReactMethod
public void alipay(final String orderInfo, final Callback promise) {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(getCurrentActivity());
Map<String, String> result = alipay.payV2(orderInfo, true);
WritableMap map = Arguments.createMap();
map.putString("memo", result.get("memo"));
map.putString("result", result.get("result"));
map.putString("resultStatus", result.get("resultStatus"));
promise.invoke(map);
}
};
// 异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
}
}
PayPackage.java的代码如下:
package com.cgv.alipay;
public class PayPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new PayModule(reactContext));
return modules;
}
/**
* 早期版本的RN如果有报错取消下面注释即可
*/
// @override
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
接下来,在MainApplication.java中的getPackages()方法注册上面的模块即可。
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost =
new ReactNativeHost(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 PayPackage());
return packages;
}
@Override
protected String getJSMainModuleName() {
return "index";
}
};
...//省略其他代码
}
接下来,我们只需要在React Native中使用NativeModules调用Android唤起支付即可。首先,导出PayModule。
import { NativeModules } from 'react-native';
export default NativeModules.PayModule;
然后,在需要支付的地方调用使用ReactMethod
注解的方法即可,如下所示。
import PayModule from './Alipay';
/**
* 唤起支付宝app支付
* @param {*} payStr 为后端接口返回的支付参数
*/
const aliPayAction = async payStr => {
PayModule.alipay(payStr, res => {
const { resultStatus } = res;
const resObj = {
'6001': '支付取消',
'6002': '网络连接出错',
'4000': '支付失败',
'5000': '重复请求'
};
if (resultStatus === '9000') {
// 支付成功处理
....
} else {
// 支付失败处理
.......
}
});
};
iOS集成支付宝
对于iOS来说,集成支付宝支付也可以参考这种方式来实现。首先,启动Xcode,把iOS包中的压缩文件中AlipaySDK.bundle、AlipaySDK.framework文件拷贝到RN项目中IOS文件夹下,如下图。
接着,导入AlipaySDK.bundle、AlipaySDK.framework到项目工程中,如下图。
点击项目,选择Build Phases选项卡,然后选择【Link Binary With Libraries】中增加依赖。
AlipaySDK.framework可以直接从左侧解决方案中拖入即可,其他依赖点击+添加。在项目目录下右键创建Group Alipay,并创建AlipayMoudle模块,如下图所示。
接着,就是编写BridgeModule代码。首先,新建一个AlipayModule类,然后在AlipayModule.h添加如下代码。
#import <React/RCTBridgeModule.h>
#import <React/RCTLog.h>
#import <Foundation/Foundation.h>
@interface AlipayModule : NSObject <RCTBridgeModule>
@end
接着,在AlipayModule.m添加如下代码。
#import <Foundation/Foundation.h>
#import "AlipayModule.h"
#import <AlipaySDK/AlipaySDK.h>
@implementation AlipayModule
RCT_EXPORT_METHOD(pay:(NSString *)orderInfo
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{
//应用注册scheme,在AliSDKDemo-Info.plist定义URL types
NSString *appScheme = @"yourschemenvalue";
[[AlipaySDK defaultService] payOrder:orderInfo fromScheme:appScheme callback:^(NSDictionary *resultDic) {
resolve(resultDic);
}];
}
RCT_EXPORT_MODULE(Alipay);
@end
接下来,点击项目,选择Info选项卡,然后选择URL Types中,设置yourschemevalue,如下图。
然后,在Info.plist添加白名单。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>alipay</string>
<string>weixin</string>
<string>wechat</string>
</array>
最后,使用NativeModules调用iOS的支付方法即可。