Merge branch 'master' into master

This commit is contained in:
SerHack 2018-07-05 21:42:01 +02:00 committed by GitHub
commit d97311b2a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 99 additions and 144 deletions

View File

@ -1,25 +1,28 @@
# MoneroWP
A WooCommerce extension for accepting Monero
## Dependancies
This plugin is rather simple but there are a few things that need to be set up before hand.
## Dependencies
This plugin is rather simple but there are a few things that need to be set up beforehand.
* A web server! Ideally with the most recent versions of PHP and mysql
* A Monero wallet. You can find the official wallet [here](https://getmonero.org/downloads/)
* [WordPress](https://wordpress.org)
Wordpress is the backend tool that is needed to use WooCommerce and this Monero plugin
WordPress is the backend tool that is needed to use WooCommerce and this Monero plugin
* [WooCommerce](https://woocommerce.com)
This Monero plugin is an extension of WooCommerce, which works with WordPress
* [BCMath](http://php.net/manual/en/book.bc.php)
A PHP extension used for arbitrary precision maths
## Step 1: Activating the plugin
* Downloading: First of all, you will need to download the plugin. You can download the latest release as a .zip file from https://github.com/monero-integrations/monerowp/releases If you wish, you can also download the latest source code from GitHub. This can be done with the command `git clone https://github.com/monero-integrations/monerowp.git` or can be downloaded as a zip file from the GitHub web page.
* Unzip the file monerowp_release.zip if you downloaded the zip from the releases page [here](https://github.com/monero-integrations/monerowp/releases).
* Put the plugin in the correct directory: You will need to put the folder named `monero` from this repo/unzipped release into the wordpress plugins directory. This can be found at `path/to/wordpress/folder/wp-content/plugins`
* Put the plugin in the correct directory: You will need to put the folder named `monero` from this repo/unzipped release into the WordPress plugins directory. This can be found at `path/to/wordpress/folder/wp-content/plugins`
* Activate the plugin from the WordPress admin panel: Once you login to the admin panel in WordPress, click on "Installed Plugins" under "Plugins". Then simply click "Activate" where it says "Monero - WooCommerce Gateway"
@ -28,20 +31,20 @@ This Monero plugin is an extension of WooCommerce, which works with WordPress
* Get your Monero wallet address starting with '4'
* Get your wallet secret viewkey from your wallet
A note on privacy: When you validate transactions with your private viewkey, your viewkey is sent to (but not stored on) xmrchain.net over HTTPS. This could potentally allow an attacker to see your incoming, but not outgoing, transactions if he were to get his hands on your viewkey. Even if this were to happen, your funds would still be safe and it would be impossible for somebody to steal your money. For maximum privacy use your own monero-wallet-rpc instance.
A note on privacy: When you validate transactions with your private viewkey, your viewkey is sent to (but not stored on) xmrchain.net over HTTPS. This could potentially allow an attacker to see your incoming, but not outgoing, transactions if he were to get his hands on your viewkey. Even if this were to happen, your funds would still be safe and it would be impossible for somebody to steal your money. For maximum privacy use your own monero-wallet-rpc instance.
## Step 2 Option 2: Get a monero daemon to connect to
## Step 2 Option 2: Get a Monero daemon to connect to
### Option 1: Running a full node yourself
To do this: start the monero daemon on your server and leave it running in the background. This can be accomplished by running `./monerod` inside your monero downloads folder. The first time that you start your node, the monero daemon will download and sync the entire monero blockchain. This can take several hours and is best done on a machine with at least 4GB of ram, an SSD hard drive (with at least 40GB of free space), and a high speed internet connection.
To do this: start the Monero daemon on your server and leave it running in the background. This can be accomplished by running `./monerod` inside your Monero downloads folder. The first time that you start your node, the Monero daemon will download and sync the entire Monero blockchain. This can take several hours and is best done on a machine with at least 4GB of ram, an SSD hard drive (with at least 40GB of free space), and a high speed internet connection.
### Option 2: Connecting to a remote node
The easiest way to find a remote node to connect to is to visit [moneroworld.com](https://moneroworld.com/#nodes) and use one of the nodes offered. It is probably easiest to use node.moneroworld.com:18089 which will automatically connect you to a random node.
### Setup your monero wallet-rpc
### Setup your Monero wallet-rpc
* Setup a monero wallet using the monero-wallet-cli tool. If you do not know how to do this you can learn about it at [getmonero.org](https://getmonero.org/resources/user-guides/monero-wallet-cli.html)
* Setup a Monero wallet using the monero-wallet-cli tool. If you do not know how to do this you can learn about it at [getmonero.org](https://getmonero.org/resources/user-guides/monero-wallet-cli.html)
* [Create a view-only wallet from that wallet for security.](https://monero.stackexchange.com/questions/3178/how-to-create-a-view-only-wallet-for-the-gui/4582#4582)
@ -61,17 +64,17 @@ The easiest way to find a remote node to connect to is to visit [moneroworld.com
If You chose to use viewkey:
* Enter your monero wallet address in the box labled "Monero Address". If you do not know your address, you can run the `address` commmand in your monero wallet
* Enter your Monero wallet address in the box labeled "Monero Address". If you do not know your address, you can run the `address` command in your Monero wallet
* Enter your secret viewkey in the box labeled "ViewKey"
If you chose to use monero-wallet-rpc:
* Enter your monero wallet address in the box labled "Monero Address". If you do not know your address, you can run the `address` commmand in your monero wallet
* Enter your Monero wallet address in the box labeled "Monero Address". If you do not know your address, you can run the `address` command in your Monero wallet
* Enter the IP address of your server in the box labeled "Monero wallet rpc Host/IP"
* Enter the IP address of your server in the box labeled "Monero wallet RPC Host/IP"
* Enter the port number of the Wallet RPC in the box labeled "Monero wallet rpc port" (will be `18082` if you used the above example).
* Enter the port number of the Wallet RPC in the box labeled "Monero wallet RPC port" (will be `18082` if you used the above example).
Finally:

View File

@ -48,7 +48,7 @@ class ed25519
public $B;
private $gmp; // Is the GMP extention available?
private $gmp; // Is the GMP extension available?
public function __construct()
{

View File

@ -77,8 +77,8 @@ class Monero_Gateway extends WC_Payment_Gateway
if (is_admin()) {
/* Save Settings */
add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options'));
add_filter('woocommerce_currencies', 'add_my_currency');
add_filter('woocommerce_currency_symbol', 'add_my_currency_symbol', 10, 2);
add_filter('woocommerce_currencies', array($this,'add_my_currency'));
add_filter('woocommerce_currency_symbol', array($this,'add_my_currency_symbol'), 10, 2);
add_action('woocommerce_email_before_order_table', array($this, 'email_instructions'), 10, 2);
}
$this->monero_daemon = new Monero_Library($this->host, $this->port);
@ -136,17 +136,17 @@ class Monero_Gateway extends WC_Payment_Gateway
'title' => __('Use monero-wallet-rpc', 'monero_gateway'),
'label' => __(' Verify transactions with the monero-wallet-rpc ', 'monero_gateway'),
'type' => 'checkbox',
'description' => __('This must be setup seperatly', 'monero_gateway'),
'description' => __('This must be setup seperately', 'monero_gateway'),
'default' => 'no'
),
'daemon_host' => array(
'title' => __('Monero wallet rpc Host/ IP', 'monero_gateway'),
'title' => __('Monero wallet RPC Host/ IP', 'monero_gateway'),
'type' => 'text',
'desc_tip' => __('This is the Daemon Host/IP to authorize the payment with port', 'monero_gateway'),
'default' => 'localhost',
),
'daemon_port' => array(
'title' => __('Monero wallet rpc port', 'monero_gateway'),
'title' => __('Monero wallet RPC port', 'monero_gateway'),
'type' => 'text',
'desc_tip' => __('This is the Daemon Host/IP to authorize the payment with port', 'monero_gateway'),
'default' => '18080',
@ -190,7 +190,7 @@ class Monero_Gateway extends WC_Payment_Gateway
return $currencies;
}
function add_my_currency_symbol($currency_symbol, $currency)
public function add_my_currency_symbol($currency_symbol, $currency)
{
switch ($currency) {
case 'XMR':
@ -222,9 +222,9 @@ class Monero_Gateway extends WC_Payment_Gateway
{
$wallet_amount = $this->monero_daemon->getbalance();
if (!isset($wallet_amount)) {
$this->log->add('Monero_gateway', '[ERROR] Can not connect to monero-wallet-rpc');
echo "</br>Your balance is: Not Avaliable </br>";
echo "Unlocked balance: Not Avaliable";
$this->log->add('Monero_gateway', '[ERROR] Cannot connect to monero-wallet-rpc');
echo "</br>Your balance is: Not Available </br>";
echo "Unlocked balance: Not Available";
}
else
{
@ -343,7 +343,7 @@ class Monero_Gateway extends WC_Payment_Gateway
echo "<noscript><h1>You must enable javascript in order to confirm your order</h1></noscript>";
$order = wc_get_order($order_id);
$amount = floatval(preg_replace('#[^\d.]#', '', $order->get_total()));
$payment_id = $this->set_paymentid_cookie(32);
$payment_id = $this->set_paymentid_cookie(8);
$currency = $order->get_currency();
$amount_xmr2 = $this->changeto($amount, $currency, $payment_id);
$address = $this->address;
@ -356,16 +356,20 @@ class Monero_Gateway extends WC_Payment_Gateway
// If there isn't address (merchant missed that field!), $address will be the Monero address for donating :)
$address = "44AFFq5kSiGBoZ4NMDwYtN18obc8AemS33DBLWs3H7otXft3XjrpDtQGv7SqSsaBYBb98uNbr2VBBEt7f2wfn3RVGQBEP3A";
}
$uri = urlencode("monero:".$address."?tx_amount=".$amount_xmr2."&tx_payment_id=".$payment_id);
if($this->zero_confirm){
$this->verify_zero_conf($payment_id, $amount_xmr2, $order_id);
}
else{
$this->verify_non_rpc($payment_id, $amount_xmr2, $order_id);
}
$decoded_address = $this->cryptonote->decode_address($address);
$pub_spendKey = $decoded_address['spendKey'];
$pub_viewKey = $decoded_address['viewKey'];
$integrated_addr = $this->cryptonote->integrated_addr_from_keys($pub_spendKey, $pub_viewKey, $payment_id);
$uri = urlencode("monero:".$address."?tx_amount=".$amount_xmr2."&tx_payment_id=".$payment_id);
$this->verify_non_rpc($payment_id, $amount_xmr2, $order_id, $this->zero_confirm);
if($this->confirmed == false)
{
echo "<h4><font color=DC143C> We are waiting for your transaction to be confirmed </font></h4>";
echo "<h4><font color=DC143C> We are waiting for your transaction to be confirmed </font></h4>";
}
if($this->confirmed)
{
@ -374,7 +378,6 @@ class Monero_Gateway extends WC_Payment_Gateway
echo "
<head>
<p>*don't forget to include the payment ID in your transaction</p>
<!--Import Google Icon Font-->
<link href='https://fonts.googleapis.com/icon?family=Material+Icons' rel='stylesheet'>
<link href='https://fonts.googleapis.com/css?family=Montserrat:400,800' rel='stylesheet'>
@ -385,7 +388,7 @@ class Monero_Gateway extends WC_Payment_Gateway
<body>
<!-- page container -->
<div class='page-container'>
<!-- monero container payment box -->
<!-- Monero container payment box -->
<div class='container-xmr-payment'>
<!-- header -->
<div class='header-xmr-payment'>
@ -398,12 +401,10 @@ class Monero_Gateway extends WC_Payment_Gateway
<div class='xmr-amount-send'>
<span class='xmr-label'>Send:</span>
<div class='xmr-amount-box'>".$amount_xmr2."</div>
<span class='xmr-label'>Payment ID:</span>
<div class='xmr-integrated-address-box'>".$payment_id."</div>
</div>
<div class='xmr-address'>
<span class='xmr-label'>To this address:</span>
<div class='xmr-address-box'>".$address."</div>
<div class='xmr-address-box'>".$integrated_addr."</div>
</div>
<div class='xmr-qr-code'>
<span class='xmr-label'>Or scan QR:</span>
@ -418,7 +419,7 @@ class Monero_Gateway extends WC_Payment_Gateway
</div>
<!-- end footer xmr payment -->
</div>
<!-- end monero container payment box -->
<!-- end Monero container payment box -->
</div>
<!-- end page container -->
</body>
@ -466,7 +467,7 @@ class Monero_Gateway extends WC_Payment_Gateway
<body>
<!-- page container -->
<div class='page-container'>
<!-- monero container payment box -->
<!-- Monero container payment box -->
<div class='container-xmr-payment'>
<!-- header -->
<div class='header-xmr-payment'>
@ -497,7 +498,7 @@ class Monero_Gateway extends WC_Payment_Gateway
</div>
<!-- end footer xmr payment -->
</div>
<!-- end monero container payment box -->
<!-- end Monero container payment box -->
</div>
<!-- end page container -->
</body>
@ -551,7 +552,7 @@ class Monero_Gateway extends WC_Payment_Gateway
$rounded_amount = round($final_amount, 12);
} else {
$new_amount = $amount / $stored_rate_transformed;
$rounded_amount = round($new_amount, 12); //the moneo wallet can't handle decimals smaller than 0.000000000001
$rounded_amount = round($new_amount, 12); //the Monero wallet can't handle decimals smaller than 0.000000000001
}
} else // If the row has not been created then the live exchange rate will be grabbed and stored
{
@ -582,7 +583,8 @@ class Monero_Gateway extends WC_Payment_Gateway
public function retriveprice($currency)
{
$xmr_price = file_get_contents('https://min-api.cryptocompare.com/data/price?fsym=XMR&tsyms=BTC,USD,EUR,CAD,INR,GBP,COP,SGD&extraParams=monero_woocommerce');
$api_link = 'https://min-api.cryptocompare.com/data/price?fsym=XMR&tsyms=BTC,USD,EUR,CAD,INR,GBP,COP,SGD' . ',' . $currency . '&extraParams=monero_woocommerce';
$xmr_price = file_get_contents($api_link);
$price = json_decode($xmr_price, TRUE);
if (!isset($price)) {
$this->log->add('Monero_Gateway', '[ERROR] Unable to get the price of Monero');
@ -602,6 +604,8 @@ class Monero_Gateway extends WC_Payment_Gateway
return $price['COP'];
case 'SGD':
return $price['SGD'];
case $currency:
return $price[$currency];
case 'XMR':
$price = '1';
return $price;
@ -661,7 +665,7 @@ class Monero_Gateway extends WC_Payment_Gateway
}
return $message;
}
public function last_block_seen($height) // sometimes 2 blocks are mined within a few seconds of eacher. Make sure we don't miss one
public function last_block_seen($height) // sometimes 2 blocks are mined within a few seconds of each other. Make sure we don't miss one
{
if (!isset($_COOKIE['last_seen_block']))
{
@ -675,115 +679,34 @@ class Monero_Gateway extends WC_Payment_Gateway
return $difference;
}
}
public function verify_non_rpc($payment_id, $amount, $order_id)
public function verify_non_rpc($payment_id, $amount, $order_id, $accept_zero_conf = false)
{
$tools = new NodeTools($this->testnet);
$bc_height = $tools->get_last_block_height();
$block_difference = $this->last_block_seen($bc_height);
$amount_atomic_units = $amount * 1000000000000;
$txs_from_block = $tools->get_txs_from_block($bc_height);
$tx_count = count($txs_from_block) - 1; // The tx at index 0 is a coinbase tx so it can be ignored
$outputs = $tools->get_outputs($this->address, $this->viewKey, $accept_zero_conf);
$outs_count = count($outputs);
$output_found;
$block_index;
if($block_difference != 0)
$i = 0;
$tx_hash;
if($outs_count != 0)
{
if($block_difference >= 2){
$this->log->add('[WARNING] Block difference is greater or equal to 2');
}
$txs_from_block_2 = $tools->get_txs_from_block($bc_height - 1);
$tx_count_2 = count($txs_from_block_2) - 1;
$i = 1;
while($i <= $tx_count_2)
while($i < $outs_count )
{
$tx_hash = $txs_from_block_2[$i]['tx_hash'];
if(strlen($txs_from_block_2[$i]['payment_id']) != 0)
if($outputs[$i]['payment_id'] == $payment_id)
{
$result = $tools->check_tx($tx_hash, $this->address, $this->viewKey);
if($result)
if($outputs[$i]['amount'] >= $amount_atomic_units)
{
$output_found = $result;
$block_index = $i;
$i = $tx_count_2; // finish loop
$this->on_verified($payment_id, $amount_atomic_units, $order_id);
return true;
}
}
$i++;
}
}
$i = 1;
while($i <= $tx_count)
{
$tx_hash = $txs_from_block[$i]['tx_hash'];
if(strlen($txs_from_block[$i]['payment_id']) != 0)
{
$result = $tools->check_tx($tx_hash, $this->address, $this->viewKey);
if($result)
{
$output_found = $result;
$block_index = $i;
$i = $tx_count; // finish loop
}
}
$i++;
}
if(isset($output_found))
{
$amount_atomic_units = $amount * 1000000000000;
if($txs_from_block[$block_index]['payment_id'] == $payment_id && $output_found['amount'] >= $amount_atomic_units)
{
$this->on_verified($payment_id, $amount_atomic_units, $order_id);
}
if($txs_from_block_2[$block_index]['payment_id'] == $payment_id && $output_found['amount'] >= $amount_atomic_units)
{
$this->on_verified($payment_id, $amount_atomic_units, $order_id);
}
return true;
}
return false;
}
public function verify_zero_conf($payment_id, $amount, $order_id)
{
$tools = new NodeTools($this->testnet);
$txs_from_mempool = $tools->get_mempool_txs();;
$tx_count = count($txs_from_mempool['data']['txs']);
$i = 0;
$output_found;
while($i <= $tx_count)
{
$tx_hash = $txs_from_mempool['data']['txs'][$i]['tx_hash'];
if(strlen($txs_from_mempool['data']['txs'][$i]['payment_id']) != 0)
{
$result = $tools->check_tx($tx_hash, $this->address, $this->viewKey);
if($result)
{
$output_found = $result;
$tx_i = $i;
$i = $tx_count; // finish loop
}
}
$i++;
}
if(isset($output_found))
{
$amount_atomic_units = $amount * 1000000000000;
if($txs_from_mempool['data']['txs'][$tx_i]['payment_id'] == $payment_id && $output_found['amount'] >= $amount_atomic_units)
{
$this->on_verified($payment_id, $amount_atomic_units, $order_id);
}
return true;
}
else
return false;
return false;
}
public function do_ssl_check()
@ -806,7 +729,7 @@ class Monero_Gateway extends WC_Payment_Gateway
</button></p></div>";
} else {
$this->log->add('Monero_gateway', '[ERROR] Plugin can not reach wallet rpc.');
$this->log->add('Monero_gateway', '[ERROR] Plugin cannot reach wallet RPC.');
echo "<div class=\" notice notice-error\"><p>Error with connection of daemon, see documentation!</p></div>";
}
}

View File

@ -220,7 +220,7 @@ class Monero_Library
}
/*
* The following functions can all be called to interact with the monero rpc wallet
* The following functions can all be called to interact with the Monero RPC wallet
* They will majority of them will return the result as an array
* Example: $daemon->address(); where $daemon is an instance of this class, will return the wallet address as string within an array
*/
@ -266,7 +266,7 @@ class Monero_Library
}
/* A payment id can be passed as a string
A random payment id will be generatd if one is not given */
A random payment id will be generated if one is not given */
public function split_integrated_address($integrated_address)
{
@ -366,6 +366,35 @@ class NodeTools
return $array['data']['txs'];
}
public function get_outputs($address, $viewkey, $zero_conf = false)
{
$curl = curl_init();
if(!$zero_conf)
{
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $this->url . '/api/outputsblocks?address=' . $address . '&viewkey=' . $viewkey . '&limit=5&mempool=0',
));
}
// also look in mempool if accepting zero confirmation transactions
if($zero_conf)
{
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $this->url . '/api/outputsblocks?address=' . $address . '&viewkey=' . $viewkey . '&limit=5&mempool=1',
));
}
$resp = curl_exec($curl);
curl_close($curl);
$array = json_decode($resp, true);
return $array['data']['outputs'];
}
public function check_tx($tx_hash, $address, $viewKey)
{
$curl = curl_init();

View File

@ -21,12 +21,12 @@ An extension to WooCommerce for accepting Monero as payment in your store.
* Add monero payments option to your existing online store with alternative main currency.
* Flexible exchange rate calculations fully managed via administrative settings.
* Zero fees and no commissions for monero payments processing from any third party.
* Automatic conversion to Monero via realtime exchange rate feed and calculations.
* Automatic conversion to Monero via real time exchange rate feed and calculations.
* Ability to set exchange rate calculation multiplier to compensate for any possible losses due to bank conversions and funds transfer fees.
== Installation ==
1. Install "Monero WooCommerce extension" wordpress plugin just like any other Wordpress plugin.
1. Install "Monero WooCommerce extension" WordPress plugin just like any other WordPress plugin.
2. Activate
3. Setup your monero-wallet-rpc with a view-only wallet
4. Add your monero-wallet-rpc host address and Monero address in the settings panel