超声波支付

2025-05-27

超声波支付

最近,我的同事Mike Bifulco写了一篇博客文章,介绍了如何使用近场通信 (NFC) 技术通过 NFC 标签和 Stripe 支付链接进行支付。出于类似的考虑,我偶然发现了“超声波支付”的概念,这是一种通过听不见的声音传输数据的技术,于是我决定尝试研究如何在 Stripe 中实现这种支付方式。

结果如下。我的 iPad 处于飞行模式,因此没有连接到互联网,并通过超声波将支付链接传输到我的手机。

如果您想尝试一下,请查看现场演示或查看GitHub 上的存储库

免责声明:这是一个实验。最终目标是实现一个类似于使用超声波的点击支付的解决方案。然而,尽管这并非不可能,而且LISNR等公司也已实现,但这并非能够轻易实现原型化的解决方案。因此,我决定通过发送“支付链接”进行探索,这是一种无代码支付解决方案,允许您通过一个简单的链接向客户请求付款。我仍然想分享我的尝试和经验,因为这项技术仍然可以应用于支付以外的各种应用。

声波

在关注支付之前,重要的是要了解设备如何将模拟声音转换为数字数据,因此,我们不会过多地讨论细节,这里只简单解释一下它的工作原理。

声音是由振动产生的,振动会改变分子的流动方向。这些分子相互碰撞,产生一种称为声波的连锁反应。当声波到达麦克风时,空气分子的运动会对麦克风中的薄膜产生压力,从而产生电信号,然后通过模数转换器 (ADC) 将其转换为数字值。

动画展示了声波如何对麦克风的膜片产生压力,从而产生电能。
来源:“麦克风是如何工作的?”

人类通常能听到 20Hz-20kHz 频率范围内的声音。然而,这并不意味着这些频率之外的声音不存在,只是我们听不到。因此,我们可以通过人耳听不到的声音,以人耳无法感知的频率传输数据。这种技术被称为超声波数据传输。

该图表示电磁波谱,其中人类可以听到的频率范围介于次声波和超声波之间
来源:什么是超声波?

那么,我们如何利用它来转账呢?

JavaScript 中的超声波数据传输

该原型将依赖quiet.js,一个使用声音传输数据的 JavaScript 库。

与通常的点击支付系统要求终端和个人设备都支持 NFC 一样,通过声音发送数据需要相关设备配备麦克风和扬声器。

为了本次实验的目的,商家的设备应该配备扬声器,因为它将传输支付链接;而顾客的设备应该配备麦克风,用于接收链接。
此方案允许商家在店内使用 iPad 销售产品,而无需购买终端设备。

传输数据

使用 quiet.js 通过声音传输文本可以通过创建发射器实例、指定一些参数(包括频率、增益和帧长度),最后使用.transmit()有效载荷调用方法来完成。

让我们看一下执行此操作所需的代码。

初始设置

首先,需要导入库。Quiet.js 包含它所依赖的libquiet库以及 JavaScript 绑定,因此在我的原型中,我使用脚本标签导入了quiet.jsquiet-emscripten.js。我还使用几个必需文件的路径启动了 Quiet;profilesPrefix表示quiet-profiles.json文件所在的位置,memoryInitializerPrefix表示可以在哪里quiet-emscripten.js.mem找到。

<script type="text/javascript" src="quiet.js"></script>
<script>
  Quiet.init({
    profilesPrefix: "/",
    memoryInitializerPrefix: "/"
   });
</script>
<script
  async
  type="text/javascript"
  src="quiet-emscripten.js"
></script>
Enter fullscreen mode Exit fullscreen mode

创建发射器

要创建发射器,transmitter()您需要使用一种方法来指示您想要使用的配置文件,以及在传输结束时调用的回调函数。

var transmit = Quiet.transmitter({
  profile: profilename,
  onFinish: onFinish
});
Enter fullscreen mode Exit fullscreen mode

profile是我之前提到的一组参数,包含有关如何传输数据的信息(帧长度、增益等)。

我使用的看起来像这样:

 "ultrasonic": {
   "mod_scheme": "gmsk",
   "checksum_scheme": "crc32",
   "inner_fec_scheme": "v27",
   "outer_fec_scheme": "none",
   "frame_length": 34,
   "modulation": {
     "center_frequency": 19000,
     "gain": 0.15
   },
   "interpolation": {
     "shape": "rrcos",
     "samples_per_symbol": 14,
     "symbol_delay": 4,
     "excess_bandwidth": 0.35
   },
   "encoder_filters": {
     "dc_filter_alpha": 0.01
   },
   "resampler": {
     "delay": 13,
     "bandwidth": 0.45,
     "attenuation": 60,
     "filter_bank_size": 64
   }
 },
Enter fullscreen mode Exit fullscreen mode

现在不需要深入研究所有这些属性的作用,它们主要指示数据应该如何编码。

接下来,可以使用该transmit()方法传输数据字符串,并传递一个转换为数组缓冲区的值。在这个原型中,我发送了一个支付链接。

transmit.transmit(Quiet.str2ab(https://buy.stripe.com/test_00gfZ73t04dxaGI3cc”));
Enter fullscreen mode Exit fullscreen mode

创建接收器

创建接收器与创建发送器类似。首先,您需要使用receiver()方法,传递配置文件和一些回调函数,然后解码接收到的数据。

 Quiet.receiver({
   profile: profilename,
   onReceive: onReceive
 });
Enter fullscreen mode Exit fullscreen mode

onReceive()函数接收有效载荷,将 UTF8 格式的数组缓冲区转换为字符串,创建一个 URL 对象,并检查主机是否为“buy.stripe.com”,以确保发送的链接是支付链接。如果是,则在浏览器窗口中打开该链接。

const onReceive = (recvPayload) => {
 const link = Quiet.ab2str(recvPayload);
 const linkURL = new URL(link);

 if (linkURL.host === "buy.stripe.com") {
   window.location.href = linkURL;
 }
};
Enter fullscreen mode Exit fullscreen mode

需要更多代码来实现错误处理或处理更复杂的数据结构,但就本次实验的目的而言,这就足够了!

学习内容

在开始这个实验之前,我问了自己几个想要回答的问题。

它能在嘈杂的环境中工作吗?

我在后台播放音乐时测试了这一点,接收器仍然能够检测到支付链接,没有任何问题。考虑到音乐的播放频率不同,这很合理。

如果发射器同时播放音乐,它会起作用吗?

是的。我用笔记本电脑作为发射器测试了这一点。在播放视频时,它仍然成功传输了支付链接。

数据可以传输多远?

在这次实验中,它成功地将支付链路传输到了距离发射器 55 厘米(21.65 英寸)的地方(是的,我测量过了)。然而,接收器离发射器越远,失败的尝试就越多。

可以传输多少数据?

我没有在这方面进行太多的实验,但是根据他们的官方演示,可以使用 quiet.js 来传输图像。

为什么要进行这个实验?

随着非接触式支付的普及,我想研究一下NFC技术的替代方案。新冠疫情让人们更加担心接触表面,包括在商店里。尽管NFC是非接触式的,但商家终端与顾客手机或银行卡之间的距离非常小。NFC技术能够实现两台电子设备在4厘米(1.5英寸)或更短距离内的通信。超声波支付解决方案则可以实现更远距离的通信。

此外,这项通过声音传输数据的技术也意味着它不需要设备连接到互联网,这可能会使其更加安全。虽然处理付款最终需要网络连接,但除了支付之外,它在其他领域也可能是一个有效的解决方案。

考虑到该技术仅使用麦克风和扬声器,它可以让更多设备成为支付终端,例如笔记本电脑、电视等。

结论

这项技术并非新鲜事物,其用途远不止支付。多年来,广告公司一直利用这项技术,通过电视广告向附近运行特定应用程序的手机发送无声营销信标,从而实现定向广告(真是的)。谷歌也在其部分产品中实现了这项技术,用于自动检测附近的设备。说到支付,虽然还有更多法规和安全问题需要考虑,但探索这个领域并了解其机遇和局限性仍然很有意思。

你会用这项技术做什么?欢迎克隆代码,并告诉我们你的成果!

📣在 Twitter 上关注@StripeDev我们的团队
📺 订阅我们的YouTube 频道
💬 加入官方Discord 服务器
📧 注册Dev Digest

关于作者

Charlie 的个人资料图片

Charlie Gerard是 Stripe 的开发倡导者、创意技术专家Google 开发者专家。她热爱研究和实验各种技术。不写代码的时候,她喜欢户外活动、品尝新啤酒和阅读。

文章来源:https://dev.to/stripe/ultrasonic- payments-2958
PREV
使 fetch 更好,并使你的 API 请求方法更容易实现
NEXT
为人类设计 API:对象 ID 条纹