超声波支付
最近,我的同事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.js
和quiet-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>
创建发射器
要创建发射器,transmitter()
您需要使用一种方法来指示您想要使用的配置文件,以及在传输结束时调用的回调函数。
var transmit = Quiet.transmitter({
profile: profilename,
onFinish: onFinish
});
这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
}
},
现在不需要深入研究所有这些属性的作用,它们主要指示数据应该如何编码。
接下来,可以使用该transmit()
方法传输数据字符串,并传递一个转换为数组缓冲区的值。在这个原型中,我发送了一个支付链接。
transmit.transmit(Quiet.str2ab(“https://buy.stripe.com/test_00gfZ73t04dxaGI3cc”));
创建接收器
创建接收器与创建发送器类似。首先,您需要使用receiver()
方法,传递配置文件和一些回调函数,然后解码接收到的数据。
Quiet.receiver({
profile: profilename,
onReceive: onReceive
});
该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;
}
};
需要更多代码来实现错误处理或处理更复杂的数据结构,但就本次实验的目的而言,这就足够了!
学习内容
在开始这个实验之前,我问了自己几个想要回答的问题。
它能在嘈杂的环境中工作吗?
我在后台播放音乐时测试了这一点,接收器仍然能够检测到支付链接,没有任何问题。考虑到音乐的播放频率不同,这很合理。
如果发射器同时播放音乐,它会起作用吗?
是的。我用笔记本电脑作为发射器测试了这一点。在播放视频时,它仍然成功传输了支付链接。
数据可以传输多远?
在这次实验中,它成功地将支付链路传输到了距离发射器 55 厘米(21.65 英寸)的地方(是的,我测量过了)。然而,接收器离发射器越远,失败的尝试就越多。
可以传输多少数据?
我没有在这方面进行太多的实验,但是根据他们的官方演示,可以使用 quiet.js 来传输图像。
为什么要进行这个实验?
随着非接触式支付的普及,我想研究一下NFC技术的替代方案。新冠疫情让人们更加担心接触表面,包括在商店里。尽管NFC是非接触式的,但商家终端与顾客手机或银行卡之间的距离非常小。NFC技术能够实现两台电子设备在4厘米(1.5英寸)或更短距离内的通信。超声波支付解决方案则可以实现更远距离的通信。
此外,这项通过声音传输数据的技术也意味着它不需要设备连接到互联网,这可能会使其更加安全。虽然处理付款最终需要网络连接,但除了支付之外,它在其他领域也可能是一个有效的解决方案。
考虑到该技术仅使用麦克风和扬声器,它可以让更多设备成为支付终端,例如笔记本电脑、电视等。
结论
这项技术并非新鲜事物,其用途远不止支付。多年来,广告公司一直利用这项技术,通过电视广告向附近运行特定应用程序的手机发送无声营销信标,从而实现定向广告(真是的)。谷歌也在其部分产品中实现了这项技术,用于自动检测附近的设备。说到支付,虽然还有更多法规和安全问题需要考虑,但探索这个领域并了解其机遇和局限性仍然很有意思。
你会用这项技术做什么?欢迎克隆代码库,并告诉我们你的成果!
📣在 Twitter 上关注@StripeDev和我们的团队
📺 订阅我们的YouTube 频道
💬 加入官方Discord 服务器
📧 注册Dev Digest
关于作者
Charlie Gerard是 Stripe 的开发倡导者、创意技术专家和Google 开发者专家。她热爱研究和实验各种技术。不写代码的时候,她喜欢户外活动、品尝新啤酒和阅读。
文章来源:https://dev.to/stripe/ultrasonic- payments-2958