1

我正在尝试创建付款账单并通过电报机器人发送给我的客户:我正在使用区块链 API V2- https ://blockchain.info/api/api 接收。我的代码是:

xpub='***'
keyk='02e57f1***'
url='https://api.blockchain.info/v2/receive?xpub='+str(xpub)+'&callback=https%3A%2F%2Fdoors03.ru&key='+keyk
x=requests.get(url)
r=x.json()
r=r['address']

r - 是一个地址。我把它寄给我的客户(顺便说一句,有什么方法可以发送带有确切付款金额的地址)。在我想检查是否收到付款后:

data={ "Content-Type": "text/plain","key":keyk,"addr":r,"callback":"https%3A%2F%2Fdoors03.ru","onNotification":"KEEP", "op":"RECEIVE"}
r = requests.post(url, data=data)

这是响应 - u'{\n "message" : "Internal handlers error"\n}' 我做错了什么?如何检查付款?如何发送精确的 btc 或 ethereum 总和的地址?

4

1 回答 1

1

抱歉,我没有足够的声誉发表评论,所以这是我唯一的选择。@egorkh 你解决了这个问题吗?也许您已经收到了来自 blockchain.info 支持的解释?我已经向他们发送了一个关于此的问题,但他们回答的时间太长了。

更新:最后,我找到了解决方案。

就我而言,“内部处理程序错误”消息的原因是对其 API 的错误解释。

因为他们没有在他们的 java-api 中实现balance_update请求,所以我自己做了,而且我做错了。

我已经把这个参数:

{"key":keyk,"addr":r,"callback":"https%3A%2F%2Fdoors03.ru","onNotification":"KEEP", "op":"RECEIVE"}

作为 post 参数,就像他们在 api 中提供的其他方法一样。在这些方法中,参数是 URLEncoded,就像你对回调链接所做的那样。但...

在此 HTML 请求中,它们必须以 json 格式以纯文本形式发送,无需任何特殊编码,如下所示:

Map<String, String> params = new HashMap<String, String>();
    params.put("addr", address);
    params.put("callback", callbackUrl);
    params.put("key", apiCode);
    params.put("onNotification", keepOnNotification? "KEEP" : "DELETE");
    params.put("confs", Integer.toString(confirmationCount));
    params.put("op", StringUtils.isBlank(operationType) ? "ALL" : operationType);
    
//parse parameters map to json string(that's optional: you can write it  directly as string)
String body = new Gson().toJson(params);

if (requestMethod.equals("POST")) {
    byte[] postBytes = body.getBytes("UTF-8");
    conn.setDoOutput(true);
    conn.setRequestProperty("Content-Type", "text/plain");
    conn.setRequestProperty("Content-Length", String.valueOf(postBytes.length));
    conn.getOutputStream().write(postBytes);
    conn.getOutputStream().close();
}

您的错误的主要原因可能是您将 "Content-Type": "text/plain" 放入数据对象(, 可能还有编码的回调 url)

于 2018-01-04T11:42:35.097 回答