请求支付在请求支付之前,程序需要首先生成一个比特币地址或者从其他程序,如BitcoinCore,获得一个地址。比特币地址的详细信息在交易一节中阐述,并且在该节中给出了为何要避免多次使用同一个比特币地址的两个重要原因——而第三个原因则是与支付请求有关。每次收款时使用单独地址会使辨别付款顾客身份变得更加繁琐。程序只需要追踪特定的的支付请求以及其中包含的地址,然后搜索区块链,查询匹配该地址的交易,即可确认身份。下一小节将详细介绍四种相互兼容的方法,用以向支付者提供支付地址和金额。出于便利性和兼容性考虑,推荐支持所述全部方法。1.钱包程序允许用户在支付界面中粘贴或者手动输入地址和支付金额。当然,这种方法并不方便,但提供了一种有效的退却选择。2.几乎所有的桌面钱包都可以关联到bitcoin:URIs,支付者只需要点击链接即可直接进入支付界面,同时支付地址与金额已经预填完整。许多手机移动钱包也支持此项功能,但网页钱包基本不支持,除非通过安装浏览器扩展程序或者配置URI链接句柄。3.大多数移动钱包支持扫描包含bitcoin:URIs编码信息的QR码,并且几乎所有的钱包程序都支持显示收款二维码。这同时也方便了在线订单,QR码对于当面交易十分有用。4.近期的钱包更新增加了对一种新型支付协议的支持,该协议通过X.509证书认证收款者身份,提高了支付的安全性,并且引入了一些重要新特性如退款等。警告:需要特别当心针对收款支付的盗窃行为。尤其要注意的是,私钥绝对不能储存在网络服务器上,并且支付请求需要通过HTTPS或其他方法加密传输,防止中间人攻击替换收款地址。纯文本如果需要只通过复制粘贴手段就能确定支付数量,你需要提供地址、数量和单位。当然最好也包含一个有效时间,例如:(注:所有本节范例使用的均是Testnet地址。)Pay:mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QNAmount:100BTCYoumustpayby:2014-04-01at23:00UTC必须指定单位。在撰写本文时所有的流行比特币钱包程序默认显示单位均是bitcoins(BTC)或millibits(mBTC)。大多数都支持选择BTC或mBTC之一作为显示单位,还有一些程序支持以下这些单位。BitcoinsUnit(Abbreviation)1.0bitcoin(BTC)0.01bitcent(cBTC)BitcoinsUnit(Abbreviation)0.001millibit(mBTC)0.000001microbit(uBTC)0.00000001satoshi由于BTC和mBTC都被广泛接受,在以复制粘贴文本定义支付订单时,同时指定两种单位下的数额显得更加直观。例如:Pay:mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QNAmount:100BTC(100000mBTC)Youmustpayby:2014-04-01at23:00UTCbitcoin:URI在BIP21中定义的bitcoin:URI方案消除了支付者在复制粘贴文本中可能出现的支付单位的混淆。同时也能通过支付订单向支付者提供额外的信息。举个例子:bitcoin:mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN?amount=100只有地址是必要的,如果只定义了地址,钱包会生成一个预填好收款地址的支付请求,需要支付者输入支付数量。支付数量总是以BTC的小数形式确定,对于整数数量的BTC(如上例),可以省略小数点。小数数量的BTC的数量开头的0可以省略;例如,下面例子中的1mBTC的请求均是有效的:bitcoin:mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN?amount=.001bitcoin: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链接的钱包程序,并且可以向支付者提供一个有效时间。ahref=bitcoin:mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN\?amount=0.10\&label=Example+Merchant\&message=Order+of+flowers+%26+chocolatesOrderflowers&chocolateusingBitcoin/a(Pay0.10BTC[100mBTC]tomjSk1Ny9spzU2fouzYgLqGUD8U41iR35QNby2014-04-01at23:00UTC)上述代码生成链接如下:Orderflowers&chocolatesusingBitcoin(Pay0.10BTC[100mBTC]tomjSk1Ny9spzU2fouzYgLqGUD8U41iR35QNby2014-04-01at23:00UTC)一些订单通过用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加密,以便能够对接收者的身份进行认证并阻止中间人的恶意攻击。提供更多支付过程的细节无需点对点网络,支付方可以直接付款给接收方。这将加快支付过程并为一些计划中的功能的实现做了铺垫,例如“子母交易(接受者可以使用尚未得到确认的款项发起另外的交易)”、离线近场交易、蓝牙交易。在这个版本(x.509)中,支付者还可以付款给例如这样的通用名地址【CommonName(CN)】,而不是付款给一串毫无意义的字符,如:“mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN”为了支付过程使用这个支付协议,你使用一个拓展但能够回溯兼容的URL地址,例如:bitcoin:mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN\?amount=0.10\&label=Example+Merchant\&message=Order+of+flowers+%26+chocolates\&r=以上命令行当中,除了R命令行之外,均不是本支付协议所必须的。但在你的应用程序中可能包含了它们,以便使那些不支持本协议的钱包实现回溯兼容的功能。R命令会使支持本支付协议的钱包自动忽略其他的参数,只需要从URL地址取回支付命令就可以了。如果有特殊的需要(在此只做推荐而不做为强制要求)也可以从HTTP服务器上取回支付命令-----从HTTP上取回命令会更好一些。浏览器、二维码扫描设备或者其他处理URL的程序可以打开支付方在URL上的比特币钱包程序。如果钱包程序识别本支付协议,它将会进入R命令所指定的URL地址,R命令中提供一系列MIME格式的收付请求。资源:加文.安德森的“支付请求发生器(PaymentRequestGenerator)”生成了在测试网络上运行的客户URL和支付请求。支付请求和支付细节“支付请求”由谷歌的ProtocolBuffers语言的数据结构所创建。BIP70通过非序列性方式(在支付请求的ProtocolBuffer代码中被定义)来表达数据结构,但下列文本文件中,它们会通过使用简单的或者说是更实用的pythonCGI程序以更多线性命令来呈现。(为了更加简洁清晰,许多正常的CGI最佳实践没有在该程序中使用)整个过程将被举例说明:起初,一个用户点击一个BITCOIN的URL地址或者扫描二维码。为了在脚本中使用protocolbuffer,你需要一个ProtocolBuffer编译器(protoc),,你可以直接从GOOGLE下载或者在大多数Linux软件包中找到它。谷歌之外的protocolbuffer编译器也是可以用的,要看编程语言的类型。你也需要从比特币核心代码中获取一个“支付请求”的ProtocolBuffer描述。初始化代码从ProtocolBuffer生成的Python代码开始,我们着手开发简单的CGI程序#!/usr/bin/envpython##Thisisthecodegeneratedbyprotoc--python_out=./paymentrequest.protofrompaymentrequest_pb2import*##LoadsomefunctionsfromtimeimporttimefromsysimportstdoutfromOpenSSL.cryptoimportFILETYPE_PEM,load_privatekey,sign##Copythreeoftheclassescreatedbyprotocintoobjectswecanusedetails=PaymentDetails()request=PaymentRequest()x509=X509Certificates()上面的启动代码是相当简单的,仅需要UNIX系统的初相时间函数、标准输出的文件描述符、来自OpenSSLlibrary的一部分函数和由ProtocolBuffer生成的数据结构和函数。配置代码接下来,我们将设定配置设置,该设置通常只有在接受者想去做点不同的事情时发生改变。这段代码在request(PaymentRequest)和details(PaymentDetails)项目中植入一部分装置。当将其串行化时,PaymentDetails将包含在PaymentRequest.之内。##SSLSignaturemethodrequest.pki_type=x509+sha256##Default:none##MainnetorTestnet?details.network=test##