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:
- 安装polyfill依赖:
npm install react-native-polyfill-stream buffer
- 修改
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'), }, }, });
- 在项目入口文件(比如
App.tsx)顶部导入polyfill:
import 'react-native-polyfill-stream'; import { Buffer } from 'buffer'; global.Buffer = Buffer;
不过这个方法容易遇到后续的依赖兼容问题,不如方案一简洁可靠。
内容来源于stack exchange
相关产品推荐
相关产品推荐

