@column-na/card-reveal-react-native

中文文档
0.13.0发布于 2026/10/31SEE LICENSE IN LICENSETypeScriptES Module近 30 天下载 2093

在您的 React Natural app 中显示一个 Colonal 的卡号, CVV, 过期和持卡人名, 而无需使用数据 .

中文使用文档
文档目录14 节
  1. 如何运作
  2. 安装
  3. 使用量
  4. 反应绑定
  5. 按键符号 : prepareReveal()
  6. CardRevealText
  7. 选项
  8. ready , (中文(简体) ), unmount , (中文(简体) ), hide 财务报告和审定财务报表 sh…
  9. 隐藏、显示和复制
  10. 错误
  11. 揭发PIN
  12. 沙盒活下来
  13. 版本
  14. 许可证

@ co栏- na/ card- reveal- react- native

在您的 React Natural 或 Expo app 中显示一列卡的全号, CVV, 过期和持卡人名 。 卡片数据从不触及你的代码或服务器.

它纯粹是JavaScript,没有本土依赖性,因此在"博览会"(Expo Go),"博览会"(Expo)开发建设和"赤裸回放"(Bright React Industrial)中工作. 它需要回放19.1或更后,再回放"原住民"0.81或更后.

如何运作

  1. 应用程序 电话 client.prepareReveal()这使得揭示的一次性钥匙 并给应用它的拇指印, keyThumbprint。用卡片标识发送到您的服务器.
  2. 您的服务器 使用您的 API 密钥创建单一用途的显示符, 有效期为 1 分钟, 绑定在该密钥上 :
    curl -X POST 'https://api.column.com/issuing/cards/<card_id>/reveal-tokens' -u :<YOUR API KEY> \
      -H 'Content-Type: application/json' -d '{"reveal_key_thumbprint": "<keyThumbprint>"}'
    # {"id":"crtk_...","card_id":"card_...","expires_at":"...","reveal_key_thumbprint":"..."}
    
    请检查date=中的日期值 (帮助) 签入的用户先拥有卡. 那就只发信条 id 对应用程序.
  3. 应用程序 制作一个 CardRevealText 每个字段和呼叫 prepared.reveal(...)。请求直接从设备到Colonel的API,卡片细节会回到加密的结尾来结束一次性密钥,它会留在SDK的内存中. 值停留在SDK组件内:没有回调,回调或回调值会暴露出值. 信使只用那把钥匙,所以泄漏的信使对其他人都没用.

安装

npx expo install @column-na/card-reveal-react-native react-native-get-random-values
# or: npm install @column-na/card-reveal-react-native react-native-get-random-values

每一个揭示,活或沙盒,生成一个一次性的密钥,这需要安全的随机来源(Scrypto.getRandomValues) (中文(简体) ). React Industrial的引擎不能提供一台,所以在您的应用程序的条目文件上方导入多填充器一次,先于其它任何设备:

import 'react-native-get-random-values';

没有它, reveal() 掷出 invalid_options。 。 。 .

多填充是被披露者信任边界的一部分:一次性密钥只能像它给SDK的随机字节一样不可预测. 使用 react-native-get-random-values,用于安装 crypto.getRandomValues 由操作系统的安全随机源支持, 也在 Expo apps 中, 不要替换 crypto.getRandomValues 在显示真卡片的建筑里 装有Shim或测试杆 SDK在每个密钥之前检查源( 它拒绝全零输出或重复输出, 输出没有写入它传递的数组, 以及一个已变质的密钥) 并失败 reveal_failed 而不是发送一个可预测的密钥。 检查检查键的非常字节然后由来制成,所以一个多填法不能用一个字节来传递,而用另一个字节来种子这个键,但无法从一个攻击者可以复制的音源中分辨出.

使用量

import { useEffect, useMemo, useRef } from 'react';
import { View } from 'react-native';
import {
  CardRevealError,
  CardRevealText,
  createCardRevealClient,
  type CardRevealTextHandle,
} from '@column-na/card-reveal-react-native';

export function CardDetails({
  cardId,
  createRevealToken, // asks your server for a token bound to the key: (keyThumbprint) => Promise<string>
}: {
  cardId: string;
  createRevealToken: (keyThumbprint: string) => Promise<string>;
}) {
  const client = useMemo(() => createCardRevealClient({ environment: 'live' }), []); // or 'sandbox'
  const pan = useRef<CardRevealTextHandle>(null);
  const cvv2 = useRef<CardRevealTextHandle>(null);
  const month = useRef<CardRevealTextHandle>(null);
  const year = useRef<CardRevealTextHandle>(null);

  useEffect(() => {
    let cancelled = false;
    let unmount = () => {};
    (async () => {
      // One prepared key and one token per reveal: both are single use.
      const prepared = await client.prepareReveal();
      const revealToken = await createRevealToken(prepared.keyThumbprint);
      if (cancelled) return;
      const reveal = prepared.reveal({
        cardId,
        revealToken,
        fields: { pan, cvv2, expiration_month: month, expiration_year: year },
        style: { color: '#fff', fontFamily: 'Menlo' },
        fieldStyles: { pan: { fontSize: 20 } },
        format: { pan: 'spaced', expirationYear: 'YY' },
      });
      unmount = reveal.unmount;
      await reveal.ready;
    })().catch((error) => {
      if (CardRevealError.is(error)) console.warn('Card reveal failed:', error.code);
    });
    return () => {
      cancelled = true;
      unmount();
    };
  }, [client, cardId, createRevealToken]);

  return (
    <View>
      <CardRevealText ref={pan} placeholder="•••• •••• •••• ••••" selectable />
      <CardRevealText ref={cvv2} placeholder="•••" />
      <CardRevealText ref={month} placeholder="MM" />
      <CardRevealText ref={year} placeholder="YY" />
    </View>
  );
}

反应绑定

CardRevealProvider 财务报告和审定财务报表 CardRevealSlot 在几行中也这样做:

import { CardRevealProvider, CardRevealSlot } from '@column-na/card-reveal-react-native';

<CardRevealProvider
  client={client}
  cardId={cardId}
  mintToken={({ cardId, keyThumbprint }) => myServer.createRevealToken(cardId, keyThumbprint)}
>
  <CardRevealSlot field="pan" placeholder="•••• •••• •••• ••••" selectable />
  <CardRevealSlot field="cvv2" placeholder="•••" />
</CardRevealProvider>;
  • mintToken({ cardId, keyThumbprint }) 请求您的服务器提供一个绑定在 启示的密钥上的符号并用它解决 id每一次都叫这个.
  • <CardRevealSlot field="..."> 是一个 CardRevealText 为那个领域取道具.
  • <CardRevealProvider> 还要 style, (中文(简体) ), fieldStyles, (中文(简体) ), format, (中文(简体) ), timeoutMs 财务报告和审定财务报表 enabled (默认) true· ; false 或隐藏显示的牌.
  • 在它内部, useCardRevealState() 返回时 { status, error, retry }。 。 。 . status 实值 'idle', (中文(简体) ), 'preparing', (中文(简体) ), 'minting', (中文(简体) ), 'revealing', (中文(简体) ), 'ready' 或者说 'error'。 。 。 . error 是一个 CardRevealError 还是什么 mintToken 抛出. retry() 以新的键和符号开始 .
  • 改变客户端,卡片,插槽,样式, format 或者说 timeoutMs 以新符号再次显示; 卸载提供者 卸载显示并忘记任何未使用的密钥.
  • useCardReveal({ client, cardId, mintToken, fields }) 跟钩子一样 fields 将每个字段映射到一个 CardRevealText 参考:.

按键符号 : prepareReveal()

client.prepareReveal() 使下一个显示的一次性P-256键对在符号存在之前. 它决心:

  • keyThumbprint键的 RFC 7638 (法语) SHA-256拇指印,基底64url不粘贴(43个字符). 传到你的服务器上 用它来铸造信物 reveal_key_thumbprint这是公用钥匙的散文 不是秘密.
  • reveal(options):用该键显示,具有相同的选项和结果: client.reveal()。它可能被称为一次;第二次呼叫 invalid_options。在使用密钥前丢出无效的选项,所以更正后的调用仍然可以使用.
  • discard():忘却了钥匙而不透露,因为当揭示不会发生时(信使不能被铸造出,或者屏幕移动了). 后来 reveal() 掷出 invalid_options。 。 。 .
const prepared = await client.prepareReveal();
const revealToken = await myServer.createRevealToken(cardId, prepared.keyThumbprint);
const { ready, unmount } = prepared.reveal({ cardId, revealToken, fields: { pan, cvv2 } });

列只为发送密钥的启示回答绑定符. 任何其它密钥都有一个 401 (单位:千美元)reveal_failed)),而代币并未用完. 私钥会留在SDK的记忆中,一旦披露的请求得到解决,或者披露被撕毁,就会被遗忘. prepareReveal() 拒绝方式 invalid_options (没有安全的随机来源,或生活在反应-内在-网络上)或 reveal_failed。 。 。 .

每一个显出的迹象都用一个 reveal_key_thumbprint,所以,每一次披露从 prepareReveal()。 。 。 . client.reveal() 选择相同的选项,但为另一个密钥刻出一个符号,或者没有准备的密钥的显示,得到一个 401。 。 。 .

CardRevealText

Prop说明
placeholder显示在披露之前和之后 unmount。 。 。 .
style文本风格. 揭发 style 财务报告和审定财务报表 fieldStyles 在顶部应用.
selectable用户是否可以选择(并复制)所显示的文本 。 默认 false。 。 。 .
testID测试标识符.

选项

选项说明
cardId该卡的身份证( E)card_...) (中文(简体) ).
revealToken显式代号 ID (crtk_...从您的服务器上。 单用,有效期为一分.
fields地图 pan, (中文(简体) ), cvv2, (中文(简体) ), cardholder_name, (中文(简体) ), expiration_month, (中文(简体) ), expiration_year 财务报告和审定财务报表 pin 改为 CardRevealText 参考: 每个字段使用不同的组件;见 揭发PIN。 。 。 .
style 编号 : fieldStyles对每个字段或一个字段进行回放原生文字样式.
format.pan'spaced' (默认 : 4111 1111 1111 1111 16位数字)或 'plain'。 。 。 .
format.expirationYear'YYYY' (违约)或 'YY'。 。 。 .
timeoutMs多长时间 ready 在拒绝前等待 timeout. 默认为 15000,最高为 120000.
hiddentrue 显示被遮蔽的字段( e)••••直到你打电话 show()默认 false。 。 。 .
autoHideMs卸载此数毫秒之后的显示 ready 决议(1至360000).
onAutoHide打电话一次 autoHideMs 卸载显示.

ready, (中文(简体) ), unmount, (中文(简体) ), hide 财务报告和审定财务报表 show

  • ready 一旦每个字段都显示其价值,就解决.
  • 如果有球场失败,或者超时, ready 拒绝,每一个字段都回到它的占位符.
  • unmount() 做同样的。 若为 ready 仍然悬而未决,它拒绝 unmounted。 。 。 .
  • hide() 财务报告和审定财务报表 show() 面罩并解开每个字段;见 隐藏、显示和复制。 。 。 .
  • 丢弃无效的选项 invalid_options 同步进行.

隐藏、显示和复制

  • reveal.hide() 口罩每个字段(每个字符但空格显示为 •和 reveal.show() 重新显示它,没有新的符号或请求。 一个蒙面 CardRevealText 无法选择。 两人之后什么都不做 unmount() 或者失败. hidden: true 开始伪装.
  • autoHideMs 删除长时间后的值 ready,作为 unmount() 誓以报应 onAutoHide 一次 一次吗 再次显示它们需要一个新的标志.
  • 复制 : React Industrial 没有本地模块的剪贴板 API ()@react-native-clipboard/clipboard 或者说 expo-clipboard)),而这个SDK没有本土代码,因此它没有提供复制按钮. copyable 财务报告和审定财务报表 onCopy 仅是网并投掷 invalid_options 在这里。 设定 selectable 打开 CardRevealText 这样持卡人就可以与系统文本选择一起复制.

错误

每个错误都是 CardRevealError 拥有稳定 code数字 : invalid_options, (中文(简体) ), container_not_found (一名裁判不是挂在挂上) CardRevealText, (中文(简体) ), reveal_failed, (中文(简体) ), timeout 财务报告和审定财务报表 unmounted。 。 。 . field 和 HTTP 软件 status 当人们知道的时候 apiCode 当列的 API 返回出错代码时。 A 类 401 指代号缺失,无效,已经使用,过期,用于不同的卡片或绑入不同的显示密钥. 信件中从不包含令牌或卡数据,SDK也从不登录.

揭发PIN

添加 pin 改为 fields 显示借记卡的PIN。 SDK 只为您列出的字段询问列, 所以 PIN 只在您包含时返回 pin,而只有PIN的显示不能返回卡号或CVV. 您的服务器以同样的方式创建出信号符 。 该卡的程序必须允许 PIN 显示 。 在你透露他们的PIN前 检查持卡人.

启示 pin 而不是卡片号码旁边 如果PIN不能被揭示,整个揭示失败了,所以与其他域一起要求它也会隐藏这些. 当它失败时, reveal_failed 将列的错误代码载入 apiCode数字 :

apiCode含义
pin_not_revealablePIN是在PIN披露之前设定的. 重新设置 PIN 使其可公开 .
feature_not_enabledPIN显示卡程序没有启用.
invalid_field_value该卡没有PIN,或者不是借记卡.

这些失败发生在使用显式符号之前, 所以同样的显式仍然有效 pin。 。 。 .

沙盒活下来

现场直播沙盒
数据真实牌模拟牌
请求直接列 : GET https://api.column.com/issuing/cards/{id}/reveal 与 Live-Mode: Yes,加密端为结束同一请求与 Live-Mode: No,同时加密

都变成这样 CardRevealText 组件。 在沙盒里, sandboxBaseUrl 可以指向本地的模拟。 使用 http://127.0.0.1:<port> iOS 模拟器和 http://10.0.2.2:<port> 在Android模拟器上.

现场直播在React Industrial Web上无法提供,它扔到那里 invalid_options。在网络上,使用 @column-na/card-reveal,将卡片数据保存在孤立的 iframes 中.

版本

这个软件包遵循语义化的版本,并以与Web SDK相同的版本发布. 每个请求都会发出 X-Column-SDK-Version: card-reveal-react-native/<version>。 。 。 .

SDK没有发出分析.

许可证

专有. 使用须遵守列卡显示的 SDK 许可证 LICENSE 并需要与Colle协议.

版本与发布记录

@column-na/card-reveal-react-native 共发布 14 个版本,首次发布于 2026/10/15;过去 12 个月发布了 14 个版本。

版本发布日期距今
0.13.0latest2026/10/3110 天前
0.12.02026/10/3011 天前
0.11.02026/10/3011 天前
0.10.02026/10/3011 天前
0.9.02026/10/2911 天前
0.8.02026/10/2912 天前

关于 @column-na/card-reveal-react-native 的常见问题

@column-na/card-reveal-react-native 是什么?

在您的 React Natural app 中显示一个 Colonal 的卡号, CVV, 过期和持卡人名, 而无需使用数据 .

如何安装 @column-na/card-reveal-react-native?

在项目目录运行 npm install @column-na/card-reveal-react-native,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(>=19.1.0)、react-native(>=0.81.4)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@column-na/card-reveal-react-native 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@column-na/card-reveal-react-native 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@column-na/card-reveal-react-native 可以商用吗?

@column-na/card-reveal-react-native 使用 SEE LICENSE IN LICENSE 许可。许可条款写在包内的独立文件中,请阅读该文件确认可否商用。以上为概括,不构成法律意见,请以许可原文为准。

@column-na/card-reveal-react-native 的下载量有多少?

根据 npm 官方下载统计,@column-na/card-reveal-react-native 在 2026/10/11 – 2026/11/09 这 30 天内被下载 2,093 次,日均约 70 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@column-na/card-reveal-react-native 还在维护吗?

最新版本 0.13.0 发布于 2026/10/31(10 天前);至今共发布 14 个版本,其中过去 12 个月发布了 14 个;首次发布于 2026/10/15。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。