支付处理 Payment Processing
请求支付
在请求支付之前,程序需要首先生成一个比特币地址或者从其他程序,如 Bitcoin Core,获得一个地址。比特币地址的详细信息在交易一节中阐述,并且在该节中给出了为何要避免多次使用同一个比特币地址的两个重要原因——而第三个原因则是与支付请求有关。
每次收款时使用单独地址会使辨别付款顾客身份变得更加繁琐。程序只需要追踪特定的的支付请求以及其中包含的地址,然后搜索区块链,查询匹配该地址的交易,即可确认身份。
下一小节将详细介绍四种相互兼容的方法,用以向支付者提供支付地址和金额。出于便利性和兼容性考虑,推荐支持所述全部方法。
- 钱包程序允许用户在支付界面中粘贴或者手动输入地址和支付金额。当然,这种方法并不方便,但提供了一种有效的退却选择。
- 几乎所有的桌面钱包都可以关联到bitcoin:URIs,支付者只需要点击链接即可直接进入支付界面,同时支付地址与金额已经预填完整。许多手机移动钱包也支持此项功能,但网页钱包基本不支持,除非通过安装浏览器扩展程序或者配置URI链接句柄。
- 大多数移动钱包支持扫描包含bitcoin:URIs编码信息的QR码,并且几乎所有的钱包程序都支持显示收款二维码。这同时也方便了在线订单,QR码对于当面交易十分有用。
- 近期的钱包更新增加了对一种新型支付协议的支持,该协议通过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 | satoshi |
由于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链接的钱包程序,并且可以向支付者提供一个有效时间。
bitcoin:mjsk1ny9spzu2fouzyglqgud8u41ir35qn\ ?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码提供了四种不同错误修正等级:
- 低:最多可修复7%的图像损失
- 中:最多可修复15%的图像损失,但QR码面积比低级修复等级图像大近8%。
- 四分位:最多可修复25%图像损失,但QR码面积比低级修复等级图像大近20%。
- 高:最多可修复30%图像损失,但QR码面积比低级修复等级图像大近26%。
错误修正配合校检和(checksum)可以确保比特币QR码信息完整且不会被意外修改,因此你的程序需要针对不同的显示面积来选择合适的错误修正等级。显示面积有限时低错误修正等级更加适用,而当具备高分辨率显示能力时四分位修正等级可以帮助实现快速扫码。
支付协议
比特币核心0.9版本支持新的支付协议。针对支付需求,新的支付协议添加了很多重要的功能。
- 支持X.509认证和SSL加密,以便能够对接收者的身份进行认证并阻止中间人的恶意攻击。
- 提供更多支付过程的