比特币开发指南 - 支付处理Payment Processing
请求支付
在请求支付之前,程序需要首先生成一个比特币
地址
或者从其他程序,如Bitcoin Core,获得一个
地址
。比特币
地址
的详细信息在
交易
一节中阐述,并且在该节中给出了为何要
避免多次使用同一个比特币地址
的两个重要原因——而第三个原因则是与支付请求有关。
每次收款时使用单独
地址
会使辨别付款顾客身份变得更加繁琐。程序只需要追踪特定的的支付请求以及其中包含的
地址
,然后搜索
区块链
,查询匹配该
地址
的交易,即可确认身份。
下一小节将详细介绍四种相互兼容的方法,用以向支付者提供支付
地址
和金额。出于便利性和兼容性考虑,推荐支持所述全部方法。
1.
钱包
程序允许用户在支付界面中粘贴或者手动输入
地址
和支付金额。当然,这种方法并不方便,但提供了一种有效的退却选择。
2.
几乎所有的桌面钱包都可以关联到
bitcoin:
URIs
,支付者只需要点击链接即可直接进入支付界面,同时支付地址与金额已经预填完整。许多手机移动钱包也支持此项功能,但网页钱包基本不支持,除非通过安装浏览器扩展程序或者配置URI链接句柄。
3.
大多数移动钱包支持扫描包含
bitcoin:
URIs
编码信息的QR码,并且几乎所有的
钱包
程序都支持显示收款二维码。这同时也方便了在线订单,QR码对于当面交易十分有用。
4.
近期的
钱包
更新增加了对一种新型
支付协议
的支持,该协议通过
X.509
证书认证收款者身份,提高了支付的安全性,并且引入了一些重要新特性如
退款
等。
警告:需要特别当心针对收款支付的盗窃行为。尤其要注意的是,
私钥
绝对不能储存在网络服务器上,并且支付请求需要通过HTTPS或其他方法加密传输,防止中间人攻击替换收款
地址
。
纯文本
如果需要只通过复制粘贴手段就能确定支付数量,你需要提供
地址
、数量和
单位
。当然最好也包含一个有效时间,例如:
(注:所有本节范例使用的均是
Testnet
地址。)
Pay: mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN
Amount: 100 BTC
You must pay by: 2014-04-01 at 23:00 UTC
必须指定
单位
。在撰写本文时所有的流行比特币钱包程序默认显示单位均是
bitcoins
(BTC)或
millibits
(mBTC)。大多数都支持选择BTC或mBTC之一作为显示单位,还有一些程序支持以下这些
单位
。
Bitcoins
|
Unit (Abbreviation)
|
1.0
|
bitcoin (BTC)
|
0.01
|
bitcent (cBTC)
|
0.001
|
millibit (mBTC)
|
0.000001
|
microbit (uBTC)
|
0.00000001
|
由于BTC和mBTC都被广泛接受,在以复制粘贴文本定义支付订单时,同时指定两种
单位
下的数额显得更加直观。例如:
Pay: mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN
Amount: 100 BTC (100000 mBTC)
You must pay by: 2014-04-01 at 23:00 UTC
bitcoin: URI
在
BIP21
中定义的
bitcoin:
URI
方案消除了支付者在复制粘贴文本中可能出现的支付
单位
的混淆。同时也能通过支付订单向支付者提供额外的信息。举个例子:
bitcoin:mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN?amount=100
只有
地址
是必要的,如果只定义了地址,钱包会生成一个预填好收款地址的支付请求,需要支付者输入支付数量。
支付数量总是以BTC的小数形式确定,对于整数数量的BTC(如上例),可以省略小数点。小数数量的BTC的数量开头的0可以省略;例如,下面例子中的1mBTC的请求均是有效的:
bitcoin:mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN?amount=.001
bitcoin:mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN?amount=0.001
还有两个被广泛支持的参数
label
和
message
。
label
参数用来标识收款人名字,
message
参数通常被支付者用来描述支付请求。Label和message参数都被存储在支付者钱包程序中并不会被包含在真正的交易中,所以其他的比特币用户无法看到这两个参数信息。这两个参数必须通过
URI编码
。
四个参数集合起来,通过URI编码,转行显示为如下形式。
bitcoin:mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN\
?amount=0.10\
&label=Example+Merchant\
&message=Order+of+flowers+%26+chocolates
上述的URI可以编码成HTML格式,以兼容不支持URI链接的钱包程序,并且可以向支付者提供一个有效时间。
?amount=0.10\
&label=Example+Merchant\
&message=Order+of+flowers+%26+chocolates"
>Order flowers & chocolate using Bitcoin
(Pay 0.10 BTC [100 mBTC] to mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN by 2014-04-01 at 23:00 UTC)
上述代码生成链接如下:
Order flowers & chocolates using Bitcoin
(Pay 0.10 BTC [100 mBTC] to mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN by 2014-04-01 at 23:00 UTC)
一些订单通过用Javascript显示倒计时来表示有效剩余支付时间。
在后文中的
支付协议
一节中可以看到,URI方案可以通过新的可选和必要参数进行扩展。在撰写本文时,唯一被广泛接受的新参数是
支付协议
中的
r
参数。
程序无论支持哪种形式的URIs链接,最终都需要通过提示由用户最终确认支付,除非用户明确地禁用了提示(可以用于小额支付)。
QR码
QR码可以用来交换
bitcoin:
URIs
信息,广泛应用于当面交易、图像或影像中。大多数的移动钱包程序和部分桌面钱包程序都支持扫描QR码,直接进入预填支付界面。
下图中的四张
比特币QR码
显示的是同一个
bitcoin:
URIs
码,分别以四种不同的错误修正级别(显示在在二维码上方)编码生成的。QR码可以包含
label
和
message
参数,以及其他可选参数。在本例中为了压缩QR码的大小和保证较低素质的摄像头可以容易扫描成功,并未包含额外参数。
QR码提供了四种不同错误修正等级:
1.
低:最多可修复7%的图像损失
2.
中:最多可修复15%的图像损失,但QR码面积比低级修复等级图像大近8%。
3.
四分位:最多可修复25%图像损失,但QR码面积比低级修复等级图像大近20%。
4.
高:最多可修复30%图像损失,但QR码面积比低级修复等级图像大近26%。
错误修正配合校检和(checksum)可以确保比特币QR码信息完整且不会被意外修改,因此你的程序需要针对不同的显示面积来选择合适的错误修正等级。显示面积有限时低错误修正等级更加适用,而当具备高分辨率显示能力时四分位修正等级可以帮助实现快速扫码。
支付协议
比特币核心0.9版本支持新的支付协议。针对支付需求,新的支付协议添加了很多重要的功能。
·
支持X.509认证和SSL加密,以便能够对接收者的身份进行认证并阻止中间人的恶意攻击。
· 提供更多支付过程的
专访 Mable Jiang:复盘 Multicoin 投资方法论与 DeFi 洞察
原文标题:《对话 Mable:复盘 Multicoin Capital 的投资方法论与 DeFi 观察 | 链捕手》受访者:Mable Jiang,Multicoin Capital 执行董事撰文:王...
信标链、PoS、分片……接触以太坊 2.0 得先理解这些术语
原文标题:《以太坊 2.0 术语库》整理:ETH 中文网Attestation 证明证明是指验证者所发起的投票,由验证者的签名聚合而成,用以证明区块的有效性,投票通过验证者的余额进行加权。Attest...
手把手教你搭建 IPFS 私有网络
在联盟链的场景下,IPFS 作为去中心化存储的首选方案,本文将介绍如何使用 go-ipfs 搭建一个私有网络并进行简单使用。...