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