协议演进 / BIP/比特币改进提案 / BIP-73

BIP-73 对支付请求 URL 用 “Accept” 头协商响应类型

让扫码钱包用一个短的支付请求 URL、靠 HTTP Accept 头协商服务器返回 bitcoin URI 还是一份完整的 PaymentRequest,免得二维码塞满长串而扫不出来。本 BIP 目前处于已部署状态。

一、档案卡

档案卡
编号BIP-73
标题Use "Accept" header for response type negotiation with Payment Request URLs
作者Stephen Pair <[email protected]>
指定日期2013-08-27
层级Applications(应用)
类型Specification(规范类)
状态Deployed(已部署)
阅读版https://bips.dev/73
官方原文https://github.com/bitcoin/bips/blob/master/bip-0073.mediawiki

二、放在哪一族

支付协议(Payment Protocol)族的一块小补丁,紧贴 BIP-70(Payment Protocol)、BIP-71(支付协议 MIME 类型)与 BIP-72(支付协议的 bitcoin: URI 扩展)。

BIP-70 让商户能给出带金额、收款脚本和退款信息的结构化 PaymentRequest;BIP-72 把下载 PaymentRequest 的地址塞进 bitcoin: URI 的参数里。问题是 URI 一长,二维码就密。BIP-73 不改 PaymentRequest 本身,只改“怎么用一个短 URL 把它取回来”:同一个端点,按客户端想要什么返回什么。

它也不要求实现方先完整支持 BIP-70——原文明确说,实现本 BIP 不以完整支持 PaymentRequest 为前提。

三、它要解决什么

3.1 长 URI 把二维码撑密了

支付协议在 bitcoin: URI 之外又加了一个参数,指向存放 PaymentRequest 的 URL。URI 本身已有地址、金额等信息,再叠加一个不短的请求 URL,渲染成二维码后信息密度很高。密度越高越难扫,用户体验越差——尤其在光线、屏幕或摄像头条件一般时。

3.2 通用扫码器扫到之后没用

普通二维码扫描 App 不懂 bitcoin: URI。若二维码里只是一个网页地址,它至少还能打开一个页面;若塞满支付参数,通用扫描器往往无能为力。本 BIP 想让同一个二维码对钱包、对浏览器、对通用扫描器都各有可用的回应。

目标因此很具体:让扫码钱包能用密度更低的二维码——码里只放支付请求 URL,细节留到取回时再协商。

四、规则本身

4.1 把非 bitcoin URI 当作取件端点

支持本 BIP 的扫码钱包,应把从二维码扫到的非 bitcoin URI 视为一个端点:向它发请求,可以取回一份 bitcoin URI,或一份 PaymentRequest,二选一由协商决定。

4.2 用 Accept 头表明想要什么

钱包客户端用 HTTP 的 Accept 头声明自己能接受什么:

服务器据此回应。原文不要求客户端与服务器完整实现 HTTP Accept 的全部语义,只定了一条优先级:

没有 Accept 头时,服务器预期返回适合在浏览器里渲染的 text/html。这样通用扫描器扫到同一个码,也能打开一个带支付链接的网页,用户点链接唤起设备上的钱包继续付款。

4.3 uri-list 只取第一条

当服务器返回 uri-list 时,只用列表里的第一条,并预期它就是 bitcoin URI;其余 URI 一律忽略。这一条避免了多条链接时钱包不知该跟哪一条的歧义。

五、谁必须动

普通持币人:无感。不必改设置;扫码时钱包若支持本 BIP,二维码可以更疏、更好扫。

钱包开发者:扫码逻辑要改——扫到非 bitcoin URI 的 URL 时,不要直接报错,而要带 Accept 头去取内容:能处理 PaymentRequest 就声明 application/bitcoin-paymentrequest,只想要 URI 就声明 text/uri-list;拿到 uri-list 只取第一条。

商户与支付服务器:同一个支付请求 URL 要能按 Accept 头分流:给钱包发 PaymentRequest 或 URI,给浏览器和通用扫描器发 HTML 页。还应提供退路,例如让用户可切换成 bitcoin: URI 的二维码。

全节点与矿工:不涉及。不改共识、不改交易格式、不改网络转发规则。

六、现在算不算数,以及一个常见误读

状态为 Deployed(已部署)。它属于 BIP-70 支付协议时代的一组配套规范,价值在于把“短码 + 按需取件”写成了各家可互操作的约定。是否“算数”,只看仓库标注的 Deployed,不等于今天所有钱包与商户仍在用支付协议——原文没有给出采用统计,本页也不臆测。

常见误读:

“BIP-73 是 BIP-70 的替代,要先完整实现支付协议才能用它。”

不对。原文在摘要里就写明:实现本 BIP 不要求完整支持 PaymentRequest。它泛化的是支付请求 URL 的行为——用 Accept 头协商返回内容——一个只想要 bitcoin URI 的钱包也能从中受益。

七、延伸

本页内容整理自 bitcoin/bips 仓库与 bips.dev,事实已与仓库核对;解读仅供学习参考。