区块链接收付款API V2是开始接受自动比特币付款的最快,最简单的方法。只需一个简单的HTTP GET请求,我们就可以在几分钟内启动并运行。
接收比特币支付涉及的困难之一是需要为每个新用户或发票生成一个唯一的地址。这些地址需要安全地监视和存储。区块链收款支付API负责地址的生成和监控。每当收到付款时,会使用简单的回调通知我们的服务器。
为了使用Receive Payments API V2,请通过https://api.blockchain.info/v2/apikey/request/
申请API密钥。此API密钥仅适用于我们的Receive Payments API。开发者不能将标准区块链钱包API密钥用于Receive Payments V2,反之亦然。
此API需要拥有BIP 32帐户xPub才能接收付款。开始接收付款的最简单方法是在https://blockchain.info/wallet/#/signup
上打开一个Blockchain Wallet 。开发者应该在钱包内专门为该API促进的交易创建一个新帐户。进行API调用时,请为此帐户使用xPub(位于设置->地址->管理->更多选项->显示xPub中)。
此方法创建一个唯一的地址,该地址应提供给客户。对于发送到该地址的所有付款,系统都会向开发者发送HTTP通知。请注意,每次调用服务器都会增加index参数。这样做是为了避免向两个不同的客户显示相同的地址。但是,所有资金仍将显示在同一帐户中。
https://api.blockchain.info/v2/receive?xpub=KaTeX parse error: Expected 'EOF', got '&' at position 5: xpub&̲callback=callback_url&key=$key
根据BIP 44中的定义,钱包软件不会扫描超过20个未使用的地址。如果此API发出了足够多的请求,没有相应的付款,则您可能会生成超出此范围的地址,这将使花钱支付给这些地址变得非常困难。因此,如果该API检测到会产生20多个未使用地址的空缺,它将返回错误并拒绝生成新地址。如果遇到此错误,您将需要切换到新的xPub(可以在同一个钱包内使用),或者接收到之前创建的20个地址之一的付款
开发者可以选择通过传递“ gap_limit”作为额外的URL参数来控制此行为。请注意,这不会增加我们的服务器将监视的地址数量。在API停止生成新地址之前,传递gap_limit
参数会更改允许的最大间隙。使用此功能将需要您了解间隙限制以及如何处理(仅限于高级用户):
https://api.blockchain.info/v2/receive?xpub=KaTeX parse error: Expected 'EOF', got '&' at position 5: xpub&̲callback=callback_url&key=KaTeX parse error: Expected 'EOF', got '&' at position 4: key&̲gap_limit=gap_limit
使用xPub派生未使用的地址:
“https://api.blockchain.info/v2/receive?xpub=xpub6CWiJoiwxPQni3DFbrQNHWq8kwrL2J1HuBN7zm4xKPCZRmEshc7Dojz4zMah7E4o2GEEbD6HgfG7sQid186Fw9x9akMNKw2mu1PjqacTJB2&callback=https%3A%2F%2Fmystore.com%3Finvoice_id%3D058921123&key=[yourkeyhere]”
让客户将比特币发送到响应中包含的地址:响应: 200 OK,应用程序/ json
{ “ address” :“ 19jJyiC6DnKyKvPg38eBE8R6yCSXLLEjqw” ,“ index” :23 ,“ callback” :“ https://mystore.com?invoice_id=058921123” }
PHP示例:完整源代码(PHP,Python,Ruby)
$ secret = 'ZzsMLGKe162CfA5EcG6j' ;
$ my_xpub = '{您的XPUB地址}' ;
$ my_api_key = '{您的API密钥}' ;
$ my_callback_url = 'https: //mystore.com?invoice_id = 058921123 & secret = ' 。$ secret ;
$ root_url = 'https: //api.blockchain.info/v2/receive ' ;
$ parameters = 'xpub =' 。$ my_xpub 。'&callback =' 。urlencode ($ my_callback_url )。'&key =' 。$ my_api_key ;
$ response = file_get_contents ($ root_url 。'?' 。$ parameters );
$ object = json_decode ($ response );
回显'发送付款至:' 。$ object- > 地址;
此方法监视您选择的收款和/或已用付款地址。进行交易时,将立即向您发送HTTP通知,随后当交易达到请求中指定的确认数时,您将收到HTTP通知。
您需要指定请求的通知行为。将行为设置为“删除”将在第一个相关通知发送到您的回调地址后删除请求。每次将具有指定确认和操作类型的交易发送到请求中的地址或从请求中的地址发送出去时,将行为设置为“ KEEP”将发送其他通知。
操作类型是一个可选参数,指示是否将针对接收的或已花费的交易或同时对两者进行监视。默认情况下,两种操作类型都受到监视。
开发者还可以选择指定在发送通知之前交易达到的确认数。请注意,您将在0确认时收到通知(即立即进行交易时),并在到达请求中指定的确认数量时收到通知(默认为3确认)。
https://api.blockchain.info/v2/receive/balance_update
监视每笔收到的付款的地址,并提供5则确认信息:响应: 200 OK,应用程序/ json
curl - H “内容类型:文本/纯文本” - 数据'{“ key”:“ [此处为您的键]”,“ addr”:“ 183qrMGHzMstARRh2rVoRepAd919sGgMHb”,“回调”:“ https:// mystore。 COM INVOICE_ID = 123" , “onNotification?”: “KEEP”, “运算”: “接收”, “confs”:5}” 的https ://api.blockchain.info/v2/receive/balance_update
{ “ id” :70 ,“ addr” :“ 183qrMGHzMstARRh2rVoRepAd919sGgMHb” ,“ op” :“ RECEIVE” ,“ confs” :5 ,“ callback” :“ https://mystore.com?invoice_id=123” ,“ onNotification” :“保持” }
响应中的ID可用于删除请求:响应: 200 OK,应用程序/ json
curl - X DELETE “ https://api.blockchain.info/v2/receive/balance_update/70?key= [ 此处是您的钥匙]”
{ “ deleted” :true }
当将指定高度和确认编号的新块添加到区块链时,此方法允许您请求回调。
与余额更新请求一样,您需要将请求的通知行为指定为’KEEP’或’DELETE’。
Height是一个可选参数,指示您希望以哪个高度接收块通知-如果未指定,则为下一个要到达的块的高度。
Confs是另一个可选参数,指示发送通知时一个块应具有多少确认。
https://api.blockchain.info/v2/receive/block_notification
当比特币区块链达到500,000个区块时请求一个通知:响应: 200 OK,应用程序/ json
curl - H “ Content-Type:文本/纯文本” - 数据'{“ key”:“ [此处为您的键”],“ height”:500000,“ callback”:“ https://mysite.com/块REQUEST_ID = 1234" , “onNotification?”: “DELETE”}” 的https ://api.blockchain.info/v2/receive/block_notification
{ “ id” :64 ,“ height” :500000 ,“ callback” :“ https://mysite.com/block?request_id=1234” ,“ confs” :1 ,“ onNotification” :“ DELETE” }
响应中的ID可用于删除请求:响应: 200 OK,应用程序/ json
{ “ deleted” :true }
1)接收并平衡更新回调
请注意,回调网址的长度限制为255个字符。
当通过生成的地址或余额更新请求监视的地址接收到付款时,blockchain.info将通知您指定的回调URL。对于余额更新,一旦交易达到指定的确认数量,就会发送回调和其他通知。
2)阻止通知回调
每次将新块添加到区块链时,都会发送一个块通知,并与通知请求中设置的确认高度和数量相匹配。
PHP示例完整源代码(PHP,Python,Ruby)
作为上述PHP示例的结果的示例回调。
$ real_secret = 'ZzsMLGKe162CfA5EcG6j' ;
$ invoice_id = $ _GET [ 'invoice_id' ]; //将发票ID传递回回调URL
$ transaction_hash = $ _GET [ 'transaction_hash' ];
$ value_in_satoshi = $ _GET [ 'value' ];
$ value_in_btc = $ value_in_satoshi / 100000000 ;
//注释以测试,在活动时取消注释if ($ _GET [ 'test' ] == true ){ return ; }
尝试{ //创建或打开数据库
$ database = new SQLiteDatabase ('db.sqlite' ,0666 ,$ error ); } catch (异常$ e ){ die ($ error ); }
//将发票添加到数据库
$ stmt = $ db- > prepare (“替换INTO invoice_payments(invoice_id,transaction_hash,value)values(?,?,?)” );
$ stmt- > bind_param (“ isd” ,$ invoice_id ,$ transaction_hash ,$ value_in_btc );
如果($ stmt- > execute ()){
echo “ * ok *” ; }
3)预期的回叫响应
为了确认成功处理了回调,您的服务器应使用纯文本,无HTML的文本“ * ok *”(无引号)进行响应。如果服务器没有任何其他响应,或者没有任何响应,则将对每个新块(大约每10分钟)重新发送回调,最多1000次(1周)。似乎已死或从不返回“ * ok *”响应的回调域可能已被阻止使用该服务。
使用checkgap端点检查最后支付的地址和使用生成的最后一个地址之间的索引间隔。使用您要检查的xpub和您的API密钥,如下所示:
curl “ https://api.blockchain.info/v2/receive/checkgap?xpub=[yourxpubhere]]&key=[yourkeyhere]”
{ “ gap” :2 }
查看与使用callback_logs端点进行的回调尝试有关的日志。使用确切的回调和您的API密钥,如下所示:
curl “ https://api.blockchain.info/v2/receive/callback_log?callback=https%3A%2F%2Fmystore.com%3Finvoice_id%3D05892112%26secret%3DZzsMLGKe162CfA5EcG6j&key= [您在这里]
[ { “ callback” :“ https://mystore.com?invoice_id=058921123&secret=ZzsMLGKe162CfA5EcG6j&key=[yourkeyhere]” ,“ Called_at” :“ 2015-10-21T22:43:47Z” ,“ raw_response” :“ * bad * “ ,” response_code“ :200 },{ ” callback“ :” http://mystore.com?invoice_id=058921123&secret=ZzsMLGKe162CfA5EcG6j&key=[yourkeyhere]“ ,” call_at“ :” 2015-10-21T22:43:55Z“ ,“ raw_response” :“ *坏*” ,“ response_code” :200 } ]
自定义密码参数应包含在回调URL中。触发回调时,机密将被传递回回调脚本,并应由您的代码检查其有效性。这样可以防止某人试图呼叫您的服务器并将发票错误地标记为“已付款”。
使用汇率API将当地货币的值转换为BTC。下面的演示应用程序包含有关如何执行此操作的示例。
如果您想将以比特币收到的付款转换为法定货币,请快速使用交易所钱包中的比特币地址。
当恶意用户两次花费相同的BTC时,就会发生两次花费。最初看来成功的付款可以在以后撤回。通过等待将交易包含在区块链中并进行大量确认来抵消此情况。6确认通常被认为是安全的高价值交易。
通过检查$ _GET [‘confirmations’]参数来验证回调脚本中的交易确认。建议您在零确认时确认交易,但仅在一次确认后信任交易。例如,如果购买产品,我们将在零确认时显示订单成功(第一次回调,但尚未回显“ * ok *”),而仅在达到4个或更多确认时才发货。
if ($ _GET [ 'confirmations' ] > = 6 ){ //插入已确认的付款中
echo '* ok *' ; } else { //插入待处理的付款//不要打印*确定*,因此该通知会在下次确认时再次发送}
接收地址永不过期,并且将继续受到监视,直到在回调响应中收到“ * ok *”或blockchain.info已通知回调1000次为止。
可以生成的接收地址数量没有限制(只要满足20个地址间隙限制),该服务旨在监视数百万个地址。
似乎已死或从不返回“ * ok *”响应的回调域可能已被阻止使用该服务。