React Native集成微信支付【Android】

wechat.jpg

本次博客主要讲解主要在RN中集成微信支付以及被我踩平的坑,需要一定的原生集成经验!

一. 导入微信SDK

用Android Studio打开RN项目中的android部分,在app/build.gradle添加如下代码:

dependencies {
    ......
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
    ......
}

重新Sync Now.

二. 编写代码供JS调用

具体流程可以参考官网的示例:个人建议先看一遍这个比较好理解后面的代码。
https://reactnative.cn/docs/0.48/native-modules-android.html#content

1.创建Module

在包名com.xx.xx下创建包名wxapi,注意此处包名一定要为wxapi,否则会出问题。

在wxapi下新建WxpayModule.java继承自ReactContextBaseJavaModule,代码如下:

  • WxpayModule.java
import android.util.Log;
import android.widget.Toast;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.IllegalViewOperationException;
import com.senlan.supermarket.utils.JsonData;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
/**
 * 类文件:
 * 作者:zhuyong on 2018/5/10 14:04
 * 邮箱:99305919@qq.com
 * 希望每天叫醒你的不是闹钟而是梦想
 */
public class WxpayModule extends ReactContextBaseJavaModule {

    private IWXAPI api;
    public static String APP_ID = "";//这里填写你的APPID
    public static Promise promise = null;

    WxpayModule(ReactApplicationContext reactContext) {
        super(reactContext);
        api = WXAPIFactory.createWXAPI(reactContext, APP_ID);
        api.registerApp(APP_ID);    // 将该app注册到微信
    }

    @Override
    public String getName() {
        return "Wxpay";
    }

    @ReactMethod
    public void pay(String text, Promise promise) {
        //此处的text为调用后台的统一下单接口返回的字符串,我放在此处解析的。
        WxpayModule.promise = promise;
        Log.e("WXPayEntryActivity", "支付参数:" + text);
        JsonData jsonData = JsonData.create(text);
        JsonData bizHead = jsonData.optJson("bizHead");
        String code = bizHead.optString("bizRetCode");
        String message = bizHead.optString("bizRetMsg");
        if (code.equals("1000")) {
            JsonData bizInfo = jsonData.optJson("bizInfo");
            String appid = bizInfo.optString("appid");
            String sign = bizInfo.optString("sign");
            String partnerid = bizInfo.optString("partnerid");
            String prepayid = bizInfo.optString("prepayid");
            String mPackage = bizInfo.optString("package");
            String noncestr = bizInfo.optString("noncestr");
            String timestamp = bizInfo.optString("timestamp");

            PayReq request = new PayReq();
            request.appId = appid;
            request.partnerId = partnerid;
            request.prepayId = prepayid;
            request.packageValue = mPackage;
            request.nonceStr = noncestr;
            request.timeStamp = timestamp;
            request.sign = sign;
            api.sendReq(request);
        } else {
            Toast.makeText(getReactApplicationContext(), "支付出现错误 " + message, Toast.LENGTH_SHORT).show();
        }
    }

    @ReactMethod
    public void isSupported(Promise promise) { // 判断是否安装了微信客户端
        boolean isSupported = api.isWXAppInstalled();
        try {
            WritableMap map = Arguments.createMap();
            map.putBoolean("isSupported", isSupported);
            promise.resolve(map);
        } catch (IllegalViewOperationException e) {
            promise.reject(e);
        }
    }
}
2.创建Package

在wxapi下新建WxpayPackage.java实现接口ReactPackage,代码如下:

  • WxpayPackage.java
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;
/**
 * 类文件:
 * 作者:zhuyong on 2018/5/10 14:04
 * 邮箱:99305919@qq.com
 * 希望每天叫醒你的不是闹钟而是梦想
 */
public class WxpayPackage 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 WxpayModule(reactContext));
        return modules;
    }

}
3.新建WXPayEntryActivity

这一步属于微信官方的集成代码,上面两部分属于RN的相关配置,WXPayEntryActivity.java一定要新建在wxapi类目下,代码如下:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.IllegalViewOperationException;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
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;

/**
 * 类文件:
 * 作者:zhuyong on 2018/5/10 14:04
 * 邮箱:99305919@qq.com
 * 希望每天叫醒你的不是闹钟而是梦想
 */
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

    private static final String TAG = "WXPayEntryActivity";
    private IWXAPI api;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, WxpayModule.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 resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            try {
                //把支付结果返回出去。
                WritableMap map = Arguments.createMap();
                map.putInt("errCode", resp.errCode);
                WxpayModule.promise.resolve(map);
                finish();
            } catch (IllegalViewOperationException e) {
                WxpayModule.promise.reject(e);
            }
        }
    }
}

在AndroidManifest.xml中注册Activity,如下:

<activity
    android:name=".wxapi.WXPayEntryActivity"
    android:exported="true"
    android:launchMode="singleTop" />
4.注册模块

参考官方提供的Toast模块,我们还需要注册刚才编写的模块,其他编写的模块都要在此一块注册,在MainApplication中的getPackages方法中添加代码:

@Override
protected List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
            new MainReactPackage(),
            /**
             * 控制微信支付的插件
             */
            new WxpayPackage()
    );
}

三. JS调用原生模块代码

  • 1.创建Wxpay.js,代码如下:
import { NativeModules } from 'react-native';
export default NativeModules.Wxpay;//Wxpay就是WxpayModule中getName方法返回的字符串。
  • 2.开始调用微信,代码如下:
//先导入Wxpay.js
import Wxpay from "../utils/Wxpay";

//调用方法,responseData为下单接口后台返回数据
async startWxPay(responseData) {
    var {isSupported} = await  Wxpay.isSupported();
    if (!isSupported) {
        Alert.alert("找不到微信应用,请安装最新版微信:")
        return;
    }
    var {errCode} = await  Wxpay.pay(responseData);
    if (errCode == 0) {
        ToastAndroid.show("支付成功", ToastAndroid.SHORT)
    } else if (errCode == -1) {
        ToastAndroid.show("支付失败", ToastAndroid.SHORT)
    } else if (errCode == -2) {
        ToastAndroid.show("取消支付", ToastAndroid.SHORT)
    }
}

最后,就是需要使用签名文件打包apk出来,使用签名工具获取签名信息,然后把签名和包名配置到开放平台上,至此,微信支付的集成全部结束,如果你的APPID和签名信息都准确无误就可以调的起微信了。

OK,如有疑问请给我发简信吧,大家一块把坑踩平!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容