react-native封装自己的支付宝,微信支付并发布到NPM

react-native开发经常会使用到第三方 比如说支付.
因为很多封装好的支付 GitHub 已经不维护了,所以自己封装一下,方便以后使用.

这里强调下,我的开发环境是mac

先下载必须的组件,微信和支付宝的官网SDK
微信支付文档
[支付宝支付文档]

组件名就叫做react-native-lht-pay 下面就开始

首先要先创建模板项目

大家可以自行去GitHub查看,这个没什么好说的,不是重点
使用react-native-create-library

npm install -g react-native-create-library
//名字可以自己定义
react-native-create-library --package-identifier com.lht.pay --platforms android,ios lht-pay

重新命名一下自己的项目
为什么不直接写react-native-lht-pay 因为你上传npm后会自动生成react-native前缀
会变成这个样子 react-native-react-native-lht-pay
所以自己改了下名字

mv lht-pay react-native-lht-pay

先装下 tree 为了看下目录结构,装下这个插件
只是为了看的更清楚目录结构,大家可以忽略这里

brew install tree

创建完成后会看到一个文件夹


image.png

把名字改成组件名字


image.png

再看下目录结构

.
├── README.md
├── android
│   ├── build.gradle
│   └── src
│       └── main
│           ├── AndroidManifest.xml
│           └── java
│               └── com
│                   └── lht
│                       └── pay
│                           ├── RNLhtPayModule.java
│                           └── RNLhtPayPackage.java
├── index.js
├── ios
│   ├── RNLhtPay.h
│   ├── RNLhtPay.m
│   ├── RNLhtPay.podspec
│   ├── RNLhtPay.xcodeproj
│   │   └── project.pbxproj
│   └── RNLhtPay.xcworkspace
│       └── contents.xcworkspacedata
└── package.json


创建好之后我们开始写代码

封装原生需要编写iOS 安卓 双端的代码,有能力的小伙伴可以开工了.

先创建一个 react-native 空项目,放到边,等最后集成测试使用.
iOS这边必须用空项目来导入,不然无法读取包.

先说安卓吧

使用安卓studio 打开刚才创建的模板里的android 文件


image.png

这里只给一些少许代码

package com.lht.pay;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Callback;

public class RNLhtPayModule extends ReactContextBaseJavaModule {

  public static String WX_APPID = "";

  private final ReactApplicationContext reactContext;

  public RNLhtPayModule(ReactApplicationContext reactContext) {
    super(reactContext);
    this.reactContext = reactContext;
  }

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


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

安卓里的代码我就不再赘述了,需要些的很多,可以自己参考我的GitHub
主要是 微信和阿里的SDK 自己编写了一些代码之类的
安卓有个地方需要说明下

项目下的build.gradle 文件里的
repositories {
    flatDir {
        dirs 'libs'   //因为支付宝的SDK 换成了AAR格式 所以导入方式改成这样,这个是给小白指明的
    }
    maven{
        url 'https://maven.google.com'
        name 'Google'
    }
    maven{ url 'https://jitpack.io'}
    jcenter()
    mavenCentral()
    google()
}

还有一个地方 需要提醒一下

项目的build.gradle 文件里的
dependencies {
    ...
    //这里是支付宝新的导入方式
    compile (name:'alipaySdk-15.6.8-20191021122514', ext: 'aar') //这里包名我没有改,能看到包是什么时候更新的,后期为了更好维护
    implementation 'androidx.annotation:annotation:+'  //这里要添加AndroidX 组件,因为RN现在已经支持androidx了 
    ...

}

好了 如果你能build success 那么就配置好了


image.png

下面我们开始封装iOS

还记得刚才创建的react-native 空项目吧....
现在用上了
目前我的 react-native 版本是 0.61.4 后期有更新的话看情况再更新插件
cocoapod 就不用多说了吧,这个必须有
我还没有研究怎么把iOS封装到pod里 使用,等有时间了 好好研究下,完善插件.

现在把整个react-native-lht-pay 放到 paydemo 的node_modules里(是整个插件哈)

image.png

现在是要测试我们的插件能不能使用和修复bug
就模拟下 真正的项目来做一下,iOS这边也需要环境才能跑的起来,所以先粘贴进项目
iOS拖入到Libraries文件夹下

image.png

这里有一个静态文件的知识,其实我不是很精通,但是我可以配置和使用.
iOS 打包成静态库(并且静态库里需要有第三方SDK ) 这个我找了一些资料,
有些人说可以,有些人说不可以,静态库分为2种,一种是.a一种是Frameworks
支付宝的是Frameworks静态库,微信的是.a静态文件,这就尴尬了,

这里也需要大神帮忙下
AlipaySDK 为什么不能在项目内的工程导入 而是必须放到当前项目才能变异成功

然后把 这2个文件导入到自己的插件工程

AlipaySDK.framework  AlipaySDK.bundle 
image.png

切记一点
就是拖入项目的时候 AlipaySDK.framework


image.png

而AlipaySDK.bundle 是需要选中 add to targets的

然后微信的这几个文件也导入进来


image.png

这时候我们的.a 静态库会是 红色的


image.png

我们需要build一下 他就会变成黑色, 正常情况下,xcode 是会自动build的.

然后就是添加支付宝的一些依赖了 这些官网都有

image.png

他会报一个错误


image.png

image.png

只要改成这样的导入方式就没问题了,这个问题 pod里写代码也可以解决掉


image.png

然后主项目里 添加一些依赖项 要导入自己的依赖项
把阿里的那些库都导入进来 你再build项目


image.png

RNLhtPay.h

#if __has_include("RCTBridgeModule.h")
#import "RCTBridgeModule.h"
#else
#import <React/RCTBridgeModule.h>
#endif
#import "WXApi.h"

@interface RNLhtPay : NSObject <RCTBridgeModule,WXApiDelegate>

@end

RNLhtPay.m
这里就简单些一个方法,其他的自己定义

RCT_EXPORT_METHOD(setAlipayScheme:(NSString *)scheme){
    alipayScheme = scheme;
}

最后就是编写js 代码了 找到模板项目的 index.js 文件

大体上完成了,
下面就是上传到npm GitHub了

GitHub我晚点放出,因为要调试,还要写文档,需要商户的ID 和回调地址.
封装好后我会上传 GitHub 给大家看源码

npm registry

npm registry就相当于一个包注册管理中心。它管理着全世界的开发者们发布上来的各种插件,同时开发者们可以通过npm install的方式安装所需要的插件。

npm官方registry为:http://registry.npmjs.org/

国内速度较快的为:https://registry.npm.taobao.org/

查看
你可以查看当前使用的registry:

$ npm config get registry

切换
当然也可以通过命令切换当前使用的npm registry

# 全局切换
$ npm config set registry http://registry.npmjs.org/
有时候你可能只想在执行某些npm命令时临时切换,这个时候,可以使用--registry来指定临时切换的registry,比如在npm发布

$ npm publish --registry http://registry.npmjs.org/
就可以临时指定,当然,在命令执行结束之后,registry仍然会恢复到原来的registry
要发布组件到npm registry,你必须要是npm registry的注册用户,通过:

$ npm adduser

来新增一个用户,或者你已经在[官网](https://www.npmjs.com/)注册了一个用户,可以通过:

$ npm login

来登陆npm registry账户。

利用以下两种方式来确认你是否创建/登陆成功npm registry

1.  命令`$ npm whoami`确认本地是否成功登陆认证成功
2.  在线打开 [https://npmjs.com/~username](https://npmjs.com/~username) 查看是否创建账户成功

如果有.gitignore但是没有.npmignore文件,那么.gitignore可以充当.npmignore的作用

需要注意:
做好以上准备之后,就可以发布了。这里需要注意,首次发布跟后面更新发布是不一样的。

第一次发布的话,直接执行命令:

$ npm publish

就搞定了,可以在线查看确认是否发布成功。访问链接(<package>是你发布的npm package名):
https://www.npmjs.com/package/<package>
看看是否已经有内容了,有内容说明发布成功了。

更新发布

如果不是首次发布,需要执行两个命令

$ npm version <update_type>
$ npm publish

$ npm version命令是用来自动更新版本号,update_type取值有patch minor major。那么在什么场景应该选择什么update_type呢?

image.png

最后提示发布成功 我们就科一去看看了


image.png

好了 写的不是很好,有很多地方忘记截图 或者有纰漏,请大家多谅解.

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

推荐阅读更多精彩内容