记一次react-native Android端接入支付宝支付

1.将支付宝alipaysdk-15.8.06.211122170115.aar(支付宝sdk下载地址)文件放入android/app/libs 文件夹下面(没有的话就新建一个)

image

2.查看android/app/build.gradle文件,找到dependencies 在里面加上

implementation fileTree(dir:"libs",include: ["*.jar","*.aar"])
image

3.在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"/>

4.在android/app/src/main/java/com.xxx下面创建alipay文件夹

5.在创建的alipay文件下新建PayModule.javaPayPackage.java(注意修改以下package为自己项目对应的)

PayModule.java代码如下

package com.xxx.alipay;

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();
    }
}

PayPackage.java代码如下

package com.xxx.alipay;

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.在com.xxx下面的MainApplication.java中注册模块

image.png

下面我们需要在react-native中调用Android支付唤起支付宝方法

1.添加工具类Alipay.js

import { NativeModules } from 'react-native';
export default NativeModules.PayModule;

2.在支付页面引入

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 {
            // 支付失败处理
            .......
        }
    });
};

如有不清楚的可以留言、欢迎指正。(客户端Android集成流程)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容