如何使用JavaScript中的Etherscan API创建付费专区?

问题描述 投票:2回答:1

我正在尝试制作一个简单的付费专区,它使用Etherscan API从地址(当前设置为我的钱包在rinkby testnetwork上)检索交易并收集所有“来自”地址(所有已汇款的人的地址)以非常基本的方式解决)。

我设法创建了所有发件人的字符串。下一部分我需要根据在网页上输入的地址检查这个地址列表 - 如果输入的地址与发件人地址var x字符串上的地址匹配 - 支付墙被取消。

这就是我被困住的地方。

来自输入框和x变量的输入都是stings,如控制台中所示。但是我无法获得与x匹配的输入值。

我尝试匹配并使用indexOf,如果你手动输入地址作为代码的一部分(在代码中显示),它将起作用,但它不能与输入框中的值一起使用。我和indexOf尝试过类似的问题,同样的问题。

我遇到的另一个问题是,我需要在那里完全匹配完整地址,因为部分匹配仍然可以在x中找到我尝试过的方法。

我基本上需要发件人地址作为密码/密钥来访问付费专区背后的任何内容。

我确信有很多更好的方法可以做到这一点,如果可以,请帮忙。

<?php 
$url = "http://api-rinkeby.etherscan.io/api?module=account&action=txlist&address=0x445b5f277D463122a2Aaeac8B77d8f60865156Dc&startblock=0&endblock=99999999&sort=asc&apikey=YourApiKeyToken";
$fgc = json_decode(file_get_contents($url), true);
$fgc2 = $fgc["result"];

?>
<html>
all senders
<div id="demo"> </div>
matched in all senders list
<div id="demo2"></div>

<input type="text" id="ethadd" onChange="ethConvert()"; onKeyUp="ethConvert()"; value="enter address";  > enter address to check if payment has been sent

<script>
var myObj, i, x = "", lenght, allSenders; 
var amount = document.getElementById("ethadd").value
var amount2 = toString(amount);

myObj = <?php echo json_encode($fgc2);?>;

for (i in myObj) {
    x += myObj[i].from + "<br>" ;
}

//both iput from the iput box and the x variable are stings however I cant get an input value to be matched to x
console.log(typeof x);
console.log(typeof amount);

var n = x.indexOf(amount);

//tried using this to match an address put in the input box to part of the string - it works if you have enter the address
//manually like this but wont work with a value fromt the input box tried a similar thing with indexOf, same problem - wont work with
//anything from the input box 
var string = x;
var expr = /0x445b5f277d463122a2aaeac8b77d8f60865156dc/

document.getElementById("demo2").innerHTML = string.match(expr);

document.getElementById("demo").innerHTML = x;

</script>
</html>
javascript php string blockchain ethereum
1个回答
0
投票

你的一些标记是错误的,这可能会导致一些问题。我没有看到ethConvert定义在任何地方,所以这可能是你没有在更改/ keyup事件上看到所需行为的另一个原因。这是一个精简的未经测试的例子,其逻辑是收集移动到PHP而不是JS的'from'地址。

应该注意,这不安全所以不要依赖它做任何重要的事情。

<?php 
    $apiKey       = '';
    $url          = "http://api-rinkeby.etherscan.io/api?module=account&action=txlist&address=0x445b5f277D463122a2Aaeac8B77d8f60865156Dc&startblock=0&endblock=99999999&sort=asc&apikey={$apiKey}";
    $transactions = json_decode(file_get_contents($url), true);
    $addresses    = [];

    if (isset($transactions['result'])) {
        foreach ($transactions['result'] as $transaction) {
            $addresses[] = $transaction['from'];
        }
        // in php5.5+, this foreach could be replaced with
        // $addresses = array_column($transactions['result'], 'from');
    }
?>
<html>
    enter address to check if payment has been sent

    <input type="text" id="eth_address" onchange="checkAddress()" value="enter address" />
    <!-- you had some markup mistakes on this input, specifically the ; chars -->

    <script>
        var addresses = <?php echo json_encode($addresses); ?>;

        function isValid() {
            return addresses.indexOf(document.getElementById('eth_address').value) > -1;
        }

        function checkAddress() {
            if (isValid()) {
                alert('lift paywall');
            }
        }
    </script>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.