步骤
1、目前 SDK 已发布到 Maven Central,开发者可使用 gradle 编译、更新支付宝支付 SDK。
在 android/app/build.gradle
文件中,需添加如下依赖:
dependencies {
...
api 'com.alipay.sdk:alipaysdk-android:+@aar' //加这个
...
}
2、在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.INTERNET" />
3、在android/app/src/main/java/com.xxxxx
下面创建alipay文件夹(xxxxx是你的包名),并在alipay文件夹下新建PayModule.java
和PayPackage.java
两个文件。
4、PayModule.java
内容:
package com.xxxxx.alipay; //xxxxx是包名
import com.alipay.sdk.app.PayTask;
import com.alipay.sdk.app.EnvUtils;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableMap;
import java.util.Map;
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();
}
}
5、PayPackage.java
内容:
package com.xxxxx.alipay; //xxxxx是包名
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
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 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();
}
}
6、在android/app/src/main/java/com/xxxxx/MainApplication.java
文件里添加:
import com.xxxxx.alipay.PayPackage; //加这个
public class MainApplication extends Application implements ReactApplication {
...
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 PayPackage()); //加这个
return packages;
}
...
7、封装及引用模块
封装Alipay.js
import { NativeModules } from 'react-native';
function alipay(pay_url) {
return new Promise((resolve, reject) => {
NativeModules.PayModule.alipay(pay_url, res => {
// '6001': '支付取消', '6002': '网络连接出错', '4000': '支付失败', '5000': '重复请求'
if (res.resultStatus === '9000') {
resolve(res)
} else {
reject(res)
}
});
})
}
export default alipay;
8 、在业务中使用
// 支付宝支付
import alipay from '@/utils/Alipay';
const apipayFun = async () => {
const timestamp = new Date().getTime();
const times = Number(BigInt(timestamp).toString());
const obj = {
product_id: 10,
pay_type: 1,
order_time: times
}
const res = await createOrder(obj)
//createOrder是服务端接口,提供订单ID和当前时间戳返回支付信息
if (res.code == 0) {
try {
//res.data.pay_url是支付地址
const paymentResult = await alipay(res.data.pay_url);
console.log('支付成功', paymentResult);
} catch (error) {
console.error('支付失败', error);
}
}
}
服务端参考 小程序文档 - 支付宝文档中心
微信登录以及支付参考文档 Native Wechat | Native WeChat