Bitcoind使用easybitcoin.php调用sendmany()返回错误“ JSON值不是预期的数组”

时间:2018-08-03 05:04:05

标签: php json bitcoind

我正在创建一个php脚本,以使用sendmany()调用来进行bitcoind。在进行了一些数据库健美操之后,涉及击中三个表以获取权限,检查用户特权并确保发送量正确并且服务器上有足够的比特币,接下来我将使用以下数组将比特币发送至:

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值不是预期的数组”

如果将JSON字符串转换为对象,则错误切换为

“ JSON值不是预期的对象”。

此代码段来自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键已提交。

1 个答案:

答案 0 :(得分:0)

我发现了问题。

如果有人遇到此问题,我将在此处作为答案。

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是一个简单的数组,如上所示。无需其他格式。没有双引号,什么也没有,只要传递数组即可。是的,愚蠢,我知道。但是我们到了。感谢所有看过的人。