You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native(TypeScript)中如何实现Bolt11闪电网络支付发票的有效性验证?

React Native(TypeScript)中如何实现Bolt11闪电网络支付发票的有效性验证?

我明白你遇到的麻烦了——想用bolt11库验证发票,结果因为React Native不支持Node核心模块直接翻车,找专门的RN库又找不到维护的版本。别着急,这里有两个靠谱的解决方案,帮你搞定这个问题:

方案一:用轻量兼容的库实现基础验证(推荐)

bolt11本质上是基于Bech32编码的字符串,我们可以用不依赖Node核心模块的轻量库来解码验证,完全适配React Native。这里推荐用@scure/base,它是@noble系列的安全库,对RN友好得很。

步骤1:安装依赖

在项目根目录执行:

npm install @scure/base

步骤2:编写TypeScript验证函数

这个函数会先检查格式前缀,再通过Bech32解码验证校验和,确保是有效的Bolt11发票:

import { bech32 } from "@scure/base";

/**
 * 验证字符串是否为有效的Bolt11闪电网络发票
 * @param invoice 待验证的发票字符串
 * @returns 是否有效
 */
const isValidBolt11 = (invoice: string): boolean => {
  try {
    // 第一步:检查是否符合Bolt11的前缀规则(必须以ln开头)
    if (!invoice.startsWith('ln')) {
      return false;
    }

    // 第二步:用Bech32解码,自动校验校验和
    const { prefix, words } = bech32.decode(invoice);

    // 第三步:验证前缀格式(ln + 2位网络标识,比如主网lnbc、测试网lntb等)
    if (!/^ln[a-z0-9]{2}$/.test(prefix)) {
      return false;
    }

    // 所有检查通过,说明是有效发票
    return true;
  } catch (error) {
    // 解码失败(比如校验和错误、格式混乱)直接返回无效
    return false;
  }
};

测试示例

你可以用这些案例测试函数:

// 有效主网发票
console.log(isValidBolt11("lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq8rkx3yf5tcsyz3d73gafnh3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatgddc6k63n7erqz25le42c4u4ecky03ylcqca784w")); // 返回true

// 无效字符串
console.log(isValidBolt11("random-text")); // 返回false

// 测试网发票
console.log(isValidBolt11("lntb1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq8rkx3yf5tcsyz3d73gafnh3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatgddc6k63n7erqz25le42c4u4ecky03ylcqca784w")); // 返回true

如果需要解析发票里的金额、过期时间等具体字段,可以基于解码后的words数组,按照Bolt11的官方编码规范进一步处理——这个基础验证已经能满足大部分场景的有效性检查了。

方案二:修复原bolt11库的兼容问题(不推荐,比较繁琐)

如果你一定要用原来的bolt11库,需要给React Native添加Node核心模块的polyfill:

  1. 安装polyfill依赖:
npm install react-native-polyfill-stream buffer
  1. 修改metro.config.js,添加模块解析规则:
const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');

const config = {};

module.exports = mergeConfig(getDefaultConfig(__dirname), {
  resolver: {
    extraNodeModules: {
      stream: require.resolve('react-native-polyfill-stream'),
      buffer: require.resolve('buffer'),
    },
  },
});
  1. 在项目入口文件(比如App.tsx)顶部导入polyfill:
import 'react-native-polyfill-stream';
import { Buffer } from 'buffer';
global.Buffer = Buffer;

不过这个方法容易遇到后续的依赖兼容问题,不如方案一简洁可靠。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:13:01