Bitcoind returns 错误 "JSON value is not an array as expected",使用 easybitcoin.php 调用 sendmany()
Bitcoind returns error "JSON value is not an array as expected", using easybitcoin.php to call sendmany()
我正在创建一个 php 脚本来使用对 bitcoind 的 sendmany() 调用。在进行了一些涉及访问三个表以获得权限、检查用户权限并确保发送金额正确并且服务器上有足够比特币的数据库操练之后,我最终得到了以下数组来将比特币发送到:
Array
(
[0] => Array
(
[coinadd] => mteCLqiEK7v5d3YbDQtxj8oKcdhtHRtXcw
[amount] => 0.21445033
)
[1] => Array
(
[coinadd] => 2N5aa9FBxGf5xmeLiDz1yJVNYdsfK9GUWWe
[amount] => 0.02588679
)
[2] => Array
(
[coinadd] => 2Muf4WEzFqNviURTdvkGSswHyrgMzR8optK
[amount] => 0.02601681
)
)
编辑:我将下面的 foreach 更改为更简单的版本。我会做一个删除线以显示它已更改,但找不到删除线的方法。
$max = count($paynow);
$b=1;
$amount = 0;
$emit = '{"';
foreach($paynow as $key => $val){
foreach($val as $k => $v){
$emit .= "$v";
if($b <= $max){
if($k == 'coinadd'){
$emit .= '":';
} elseif($k == 'amount') {
$amnt = $amount += $v;
if($b !== $max){
$emit .= ', "';
}
}
}
}
$b++;
}
$emit .= "}";
上面的 foreach 获取 $paytoo 数组并生成以下 json 字符串:
{
"mteCLqiEK7v5d3YbDQtxj8oKcdhtHRtXcw":0.21445033, "2N5aa9FBxGf5xmeLiDz1yJVNYdsfK9GUWWe":0.02588679, "2Muf4WEzFqNviURTdvkGSswHyrgMzR8optK":0.02601681
}
此字符串在 jsonlint.com
上通过了 JSON lint 测试
然后我解码字符串以创建一个数组。
$send = json_decode($emit,true);
编辑;现在新的foreach直接生成下面的数组,没有json字符串,直接就可以了。看起来比以前干净多了。
foreach($paydata as $pay){
$mrules = getmerchrules($pay['merchant_id']);
$coinadd = get_merch_address_to_send_to($pay['merchant_id']);
if($mrules['autopay'] == 'yes'){
if($pay['balance'] > $mrules['minpay']){
if($coinadd !== ''){
$paynow[$coinadd['coinadd']] = $pay['balance'];
}
}
}
}
Array
(
[mteCLqiEK7v5d3YbDQtxj8oKcdhtHRtXcw] => 0.21445033
[2N5aa9FBxGf5xmeLiDz1yJVNYdsfK9GUWWe] => 0.02588679
[2Muf4WEzFqNviURTdvkGSswHyrgMzR8optK] => 0.02601681
)
到目前为止一切顺利。
现在开始 RPC 调用
$sent = $bitcoin->sendmany( "", $send, 1, "", "", 1, 1, "CONSERVATIVE" );
$err = $bitcoin->error;
编辑:一些花哨的回声让我得到这个字符串,它实际上是通过 curl 发送到 bitcoind 服务器的。该字符串也通过了 jsonlint.com 测试。
Array
(
[19913] => 1
[52] => 1
[68] => 10
[10023] => Array
(
[0] => Content-type: application/json
)
[47] => 1
[10015] => {"method":"sendmany","params":["","{\"mteCLqiEK7v5d3YbDQtxj8oKcdhtHRtXcw\":\"0.24020698\",\"2N5aa9FBxGf5xmeLiDz1yJVNYdsfK9GUWWe\":\"0.02588679\",\"2Muf4WEzFqNviURTdvkGSswHyrgMzR8optK\":\"0.02601681\"}",1],"id":4}
)
编辑:仍然没有变化
Array
(
[result] =>
[error] => Array
(
[code] => -1
[message] => JSON value is not an object as expected
)
[id] => 4
)
Aaa 和 Kablooie!
我从 Bitcoind 收到以下错误:
"JSON value is not an array as expected"
如果我将 JSON 字符串转换为对象,则错误会切换为
"JSON value is not an object as expected".
这段代码来自 easybitcoin.php
中库的 __call 方法
// If no parameters are passed, this will be an empty array
$params = array_values($params);
...
// Build the request, it's ok that params might have any empty array
$request = json_encode(array(
'method' => $method,
'params' => $params,
'id' => $this->id
));
除了割腕献血编程大神,我能想到的都做了。谁能发现我在这里做错了什么?
对于任何想知道的人,这个命令在 ./bitcoin-cli 上有效
./bitcoin-cli sendmany "" "{\"mteCLqiEK7v5d3YbDQtxj8oKcdhtHRtXcw\":0.21445033, \"2N5aa9FBxGf5xmeLiDz1yJVNYdsfK9GUWWe\":0.02588679, \"2Muf4WEzFqNviURTdvkGSswHyrgMzR8optK\":0.02601681}" 1
Bitcoind 响应是一个 txid 号码
f4c443881a40054efbd5c3064268a91253f4cb2f7ba8caca96878d0dec46d774
抱歉多次编辑,没有意识到 Enter 键提交。
我发现了问题。
如果其他人遇到此问题,我会将其作为答案放在这里。
foreach($paydata as $pay){
$mrules = getmerchrules($pay['merchant_id']);
$coinadd = get_merch_address_to_send_to($pay['merchant_id']);
if($mrules['autopay'] == 'yes'){
if($pay['balance'] > $mrules['minpay']){
if($coinadd !== ''){
$paynow[$coinadd['coinadd']] = $pay['balance'];
}
}
}
}
Array
(
[mteCLqiEK7v5d3YbDQtxj8oKcdhtHRtXcw] => 0.21445033
[2N5aa9FBxGf5xmeLiDz1yJVNYdsfK9GUWWe] => 0.02588679
[2Muf4WEzFqNviURTdvkGSswHyrgMzR8optK] => 0.02601681
)
在上面创建数组的代码中,不需要做任何其他事情。问题是我将此数组转换为 json 对象以发送到 easybitcoin.php.
easybitcoin.php 期望的是一个数组。因此,将数组本身提供给它就可以了。尽管这不能归咎于除我之外的任何人,但那里的文档非常粗略。所以一劳永逸,我将把它留在这里,希望它能在将来节省一些时间。
$sent = $bitcoin->sendmany( "", $send, 1, "", "", 1, 1, "CONSERVATIVE" );
其中 $send 是一个简单的数组,如上所示。不需要其他格式。没有双引号,什么都没有,只是传递数组。是的,愚蠢,我知道。但我们到了。感谢所有看过的人。
我正在创建一个 php 脚本来使用对 bitcoind 的 sendmany() 调用。在进行了一些涉及访问三个表以获得权限、检查用户权限并确保发送金额正确并且服务器上有足够比特币的数据库操练之后,我最终得到了以下数组来将比特币发送到:
Array
(
[0] => Array
(
[coinadd] => mteCLqiEK7v5d3YbDQtxj8oKcdhtHRtXcw
[amount] => 0.21445033
)
[1] => Array
(
[coinadd] => 2N5aa9FBxGf5xmeLiDz1yJVNYdsfK9GUWWe
[amount] => 0.02588679
)
[2] => Array
(
[coinadd] => 2Muf4WEzFqNviURTdvkGSswHyrgMzR8optK
[amount] => 0.02601681
)
)
编辑:我将下面的 foreach 更改为更简单的版本。我会做一个删除线以显示它已更改,但找不到删除线的方法。
$max = count($paynow);
$b=1;
$amount = 0;
$emit = '{"';
foreach($paynow as $key => $val){
foreach($val as $k => $v){
$emit .= "$v";
if($b <= $max){
if($k == 'coinadd'){
$emit .= '":';
} elseif($k == 'amount') {
$amnt = $amount += $v;
if($b !== $max){
$emit .= ', "';
}
}
}
}
$b++;
}
$emit .= "}";
上面的 foreach 获取 $paytoo 数组并生成以下 json 字符串:
{
"mteCLqiEK7v5d3YbDQtxj8oKcdhtHRtXcw":0.21445033, "2N5aa9FBxGf5xmeLiDz1yJVNYdsfK9GUWWe":0.02588679, "2Muf4WEzFqNviURTdvkGSswHyrgMzR8optK":0.02601681
}
此字符串在 jsonlint.com
上通过了 JSON lint 测试然后我解码字符串以创建一个数组。
$send = json_decode($emit,true);
编辑;现在新的foreach直接生成下面的数组,没有json字符串,直接就可以了。看起来比以前干净多了。
foreach($paydata as $pay){
$mrules = getmerchrules($pay['merchant_id']);
$coinadd = get_merch_address_to_send_to($pay['merchant_id']);
if($mrules['autopay'] == 'yes'){
if($pay['balance'] > $mrules['minpay']){
if($coinadd !== ''){
$paynow[$coinadd['coinadd']] = $pay['balance'];
}
}
}
}
Array
(
[mteCLqiEK7v5d3YbDQtxj8oKcdhtHRtXcw] => 0.21445033
[2N5aa9FBxGf5xmeLiDz1yJVNYdsfK9GUWWe] => 0.02588679
[2Muf4WEzFqNviURTdvkGSswHyrgMzR8optK] => 0.02601681
)
到目前为止一切顺利。
现在开始 RPC 调用
$sent = $bitcoin->sendmany( "", $send, 1, "", "", 1, 1, "CONSERVATIVE" );
$err = $bitcoin->error;
编辑:一些花哨的回声让我得到这个字符串,它实际上是通过 curl 发送到 bitcoind 服务器的。该字符串也通过了 jsonlint.com 测试。
Array
(
[19913] => 1
[52] => 1
[68] => 10
[10023] => Array
(
[0] => Content-type: application/json
)
[47] => 1
[10015] => {"method":"sendmany","params":["","{\"mteCLqiEK7v5d3YbDQtxj8oKcdhtHRtXcw\":\"0.24020698\",\"2N5aa9FBxGf5xmeLiDz1yJVNYdsfK9GUWWe\":\"0.02588679\",\"2Muf4WEzFqNviURTdvkGSswHyrgMzR8optK\":\"0.02601681\"}",1],"id":4}
)
编辑:仍然没有变化
Array
(
[result] =>
[error] => Array
(
[code] => -1
[message] => JSON value is not an object as expected
)
[id] => 4
)
Aaa 和 Kablooie! 我从 Bitcoind 收到以下错误:
"JSON value is not an array as expected"
如果我将 JSON 字符串转换为对象,则错误会切换为
"JSON value is not an object as expected".
这段代码来自 easybitcoin.php
中库的 __call 方法// If no parameters are passed, this will be an empty array
$params = array_values($params);
...
// Build the request, it's ok that params might have any empty array
$request = json_encode(array(
'method' => $method,
'params' => $params,
'id' => $this->id
));
除了割腕献血编程大神,我能想到的都做了。谁能发现我在这里做错了什么?
对于任何想知道的人,这个命令在 ./bitcoin-cli 上有效
./bitcoin-cli sendmany "" "{\"mteCLqiEK7v5d3YbDQtxj8oKcdhtHRtXcw\":0.21445033, \"2N5aa9FBxGf5xmeLiDz1yJVNYdsfK9GUWWe\":0.02588679, \"2Muf4WEzFqNviURTdvkGSswHyrgMzR8optK\":0.02601681}" 1
Bitcoind 响应是一个 txid 号码
f4c443881a40054efbd5c3064268a91253f4cb2f7ba8caca96878d0dec46d774
抱歉多次编辑,没有意识到 Enter 键提交。
我发现了问题。
如果其他人遇到此问题,我会将其作为答案放在这里。
foreach($paydata as $pay){
$mrules = getmerchrules($pay['merchant_id']);
$coinadd = get_merch_address_to_send_to($pay['merchant_id']);
if($mrules['autopay'] == 'yes'){
if($pay['balance'] > $mrules['minpay']){
if($coinadd !== ''){
$paynow[$coinadd['coinadd']] = $pay['balance'];
}
}
}
}
Array
(
[mteCLqiEK7v5d3YbDQtxj8oKcdhtHRtXcw] => 0.21445033
[2N5aa9FBxGf5xmeLiDz1yJVNYdsfK9GUWWe] => 0.02588679
[2Muf4WEzFqNviURTdvkGSswHyrgMzR8optK] => 0.02601681
)
在上面创建数组的代码中,不需要做任何其他事情。问题是我将此数组转换为 json 对象以发送到 easybitcoin.php.
easybitcoin.php 期望的是一个数组。因此,将数组本身提供给它就可以了。尽管这不能归咎于除我之外的任何人,但那里的文档非常粗略。所以一劳永逸,我将把它留在这里,希望它能在将来节省一些时间。
$sent = $bitcoin->sendmany( "", $send, 1, "", "", 1, 1, "CONSERVATIVE" );
其中 $send 是一个简单的数组,如上所示。不需要其他格式。没有双引号,什么都没有,只是传递数组。是的,愚蠢,我知道。但我们到了。感谢所有看过的人。