diff --git a/assets/form/widget.js b/assets/form/widget.js new file mode 100644 index 0000000..969bcae --- /dev/null +++ b/assets/form/widget.js @@ -0,0 +1,34 @@ +(function () { + var container = document.getElementById('paybear'); + if (!container) { + return; + } + window.paybearWidget = new Paybear({ + button: '#paybear-all', + fiatValue: parseFloat(container.getAttribute('data-fiat-value')), + currencies: JSON.parse(htmlDecode(container.getAttribute('data-currencies'))), + statusUrl: container.getAttribute('data-status'), + redirectTo: container.getAttribute('data-redirect'), + fiatCurrency: container.getAttribute('data-fiat-currency'), + fiatSign: container.getAttribute('data-fiat-sign'), + minOverpaymentFiat: container.getAttribute('data-min-overpayment-fiat'), + maxUnderpaymentFiat: container.getAttribute('data-max-underpayment-fiat'), + modal: true, + enablePoweredBy: false, + redirectPendingTo: container.getAttribute('data-redirect') + }); + + function htmlDecode(input){ + var e = document.createElement('div'); + e.innerHTML = input; + // handle case of empty input + return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue; + } + + var autoopen = container.getAttribute('data-autoopen'); + + if (autoopen && autoopen == 'true') { + document.getElementById('paybear-all').click(); + } + +})(); diff --git a/assets/images/icons/bch.svg b/assets/images/icons/bch.svg new file mode 100644 index 0000000..687723d --- /dev/null +++ b/assets/images/icons/bch.svg @@ -0,0 +1,12 @@ + + \ No newline at end of file diff --git a/assets/images/icons/btc.svg b/assets/images/icons/btc.svg new file mode 100644 index 0000000..c26e12b --- /dev/null +++ b/assets/images/icons/btc.svg @@ -0,0 +1,12 @@ + + \ No newline at end of file diff --git a/assets/images/icons/dash.svg b/assets/images/icons/dash.svg new file mode 100644 index 0000000..ffb370b --- /dev/null +++ b/assets/images/icons/dash.svg @@ -0,0 +1,12 @@ + + \ No newline at end of file diff --git a/assets/images/icons/eth.svg b/assets/images/icons/eth.svg new file mode 100644 index 0000000..a10740f --- /dev/null +++ b/assets/images/icons/eth.svg @@ -0,0 +1,56 @@ + + \ No newline at end of file diff --git a/assets/images/icons/ltc.svg b/assets/images/icons/ltc.svg new file mode 100644 index 0000000..fda6317 --- /dev/null +++ b/assets/images/icons/ltc.svg @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/class-wc-gateway-paybear.php b/class-wc-gateway-paybear.php index f152c47..5edd80b 100644 --- a/class-wc-gateway-paybear.php +++ b/class-wc-gateway-paybear.php @@ -5,10 +5,245 @@ * Plugin Name: Crypto Payments for WooCommerce by PayBear.io * Plugin URI: https://www.paybear.io/ * Description: Allows to accept crypto payments such as Bitcoin (BTC) and Ethereum (ETH) - * Version: 1.0 + * Version: 1.1 */ add_action( 'plugins_loaded', 'paybear_gateway_load', 0 ); +add_action( 'init', 'paybear_shortcodes_init' ); +add_action( 'init', 'create_paybear_post_type' ); + +add_filter('template_include', 'paybear_payment_page_template'); + +function paybear_payment_page_template( $page_template ) +{ + if ( get_post_type() && get_post_type() == 'paybear_payment' ) { + $dir = pathinfo($page_template, PATHINFO_DIRNAME); + $page_template = $dir . DIRECTORY_SEPARATOR . 'page.php'; + } + + return $page_template; +} + +function paybear_shortcodes_init() +{ + add_shortcode('paybear_payment_widget', 'paybear_payment_widget_shortcode'); +} +function create_paybear_post_type() { + register_post_type( 'paybear_payment', + array( + 'labels' => array( + 'name' => __( 'Paybear Payment' ), + 'singular_name' => __( 'Paybear Payment' ) + ), + 'public' => true, + 'has_archive' => false, + // 'capability_type' => 'product', + 'publicly_queryable' => true, + 'exclude_from_search' => true, + 'show_in_menu' => false, + 'show_in_nav_menus' => false, + 'show_in_admin_bar' => false, + 'show_in_rest' => false, + 'hierarchical' => false, + 'supports' => array( 'title' ), + // 'rewrite' => array('slug' => 'checkout') + ) + ); + flush_rewrite_rules(); +} + +function paybear_payment_widget_shortcode($atts = [], $content = null, $tag = '') +{ + wp_enqueue_style('paybear-css', plugin_dir_url(__FILE__) . 'assets/form/paybear.css'); + wp_enqueue_script('paybear-js', plugin_dir_url(__FILE__) . 'assets/form/paybear.js', array('jquery')); + wp_enqueue_script('paybear-widget-js', plugin_dir_url(__FILE__) . 'assets/form/widget.js', array('paybear-js')); + + $order_id = null; + $order = null; + if (isset($_GET['order_id'])) { + $order_id = (int) $_GET['order_id']; + $order = wc_get_order($order_id); + } + + if (!$order_id || !$order) { + return ''; + } + + if (!isset($_GET['key']) || $_GET['key'] != $order->get_order_key()) { + return ''; + } + + $gateway = WC_Gateway_Paybear::get_instance(); + $to_pay = 0; + $total_paid = 0; + $total_paid_fiat = 0; + $fiat_currency = strtoupper(get_woocommerce_currency()); + $fiat_sign = get_woocommerce_currency_symbol(); + $min_overpayment_fiat = $gateway->get_option('min_overpayment'); + $max_underpayment_fiat = $gateway->get_option('max_underpayment'); + $max_underpayment = 0; + $min_overpayment = 0; + $overpaid = false; + + $currencies = $gateway->get_currency_json($order_id); + if ($token = get_post_meta($order_id, 'Token Selected', true)) { + $payments_unconfirmed = $gateway->get_unconfirmed_payments( $order_id, $token); + $rate = round($order->get_total() / get_post_meta($order_id, $token . ' total', true), 8); + $orderTimestamp = get_post_meta($order_id, $token . ' order timestamp', true); + //$paymentTimestamp = get_post_meta($order_id, $token . ' payment timestamp', true); + $deadline = $orderTimestamp + $gateway->get_option('rate_lock_time', 15 )*60; + if (time()>$deadline) { + $rate = $gateway->get_exchange_rate($token); + } + + $total_paid = array_sum($payments_unconfirmed); + $total_paid_fiat = $total_paid * $rate; + $to_pay = get_post_meta($order_id, $token . ' total', true); + $max_underpayment = $max_underpayment_fiat / $rate; + $min_overpayment = $min_overpayment_fiat / $rate; + if ($total_paid > 0) { + $currencies = array($gateway->get_currency_json($order_id, $token)); + } + + if ($total_paid - $to_pay > $min_overpayment) { + $overpaid = true; + } + } + + $fiat_value = doubleval($order->get_total()); + $status_url = $gateway->get_status_link($order_id); + + $redirect_url = $gateway->get_return_url( $order ); + + $status = $order->get_status(); + $payment_status = 'pending payment'; + if ($status == 'completed' || $status == 'processing') { + $payment_status = 'paid'; + } + + if ($status == 'on-hold' && ($fiat_value - $total_paid_fiat) < $max_underpayment_fiat) { + $payment_status = 'waiting for confirmations'; + } elseif ($status == 'on-hold' && $total_paid_fiat > 0) { + $payment_status = 'partial payment'; + } + + $content = '
Payment status | +' . ucwords($payment_status) . ' | +
---|---|
Selected token | +' . strtoupper($token) . ' | +
Payment address | +' . $address . ' | +
Total | +' . wc_price($fiat_value) . ' | +
Paid | +' . wc_price($total_paid_fiat) . ' | +
To pay | +' . wc_price($fiat_value - $total_paid_fiat) . ' | +