id = 'bacs'; $this->icon = apply_filters( 'woocommerce_bacs_icon', '' ); $this->has_fields = false; $this->method_title = __( 'Crypto Payment', 'woocommerce' ); $this->method_description = __( '', 'woocommerce' ); // Load the settings. $this->init_form_fields(); $this->init_settings(); // Define user set variables. $this->title = $this->get_option( 'title' ); $this->description = $this->get_option( 'description' ); $this->instructions = $this->get_option( 'instructions' ); // BACS account fields shown on the thanks page and in emails. $this->account_details = get_option( 'woocommerce_bacs_accounts', array( array( 'account_name' => $this->get_option( 'account_name' ), 'account_number' => $this->get_option( 'account_number' ), 'bank_name' => $this->get_option( 'bank_name' ), ), ) ); // Actions. add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) ); add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'save_account_details' ) ); add_action( 'woocommerce_thankyou_bacs', array( $this, 'thankyou_page' ) ); // Customer Emails. add_action( 'woocommerce_email_before_order_table', array( $this, 'email_instructions' ), 10, 3 ); } /** * Initialise Gateway Settings Form Fields. */ public function init_form_fields() { $this->form_fields = array( 'enabled' => array( 'title' => __( 'Enable/Disable', 'woocommerce' ), 'type' => 'checkbox', 'label' => __( 'Enable Crypto payment', 'woocommerce' ), 'default' => 'no', ), 'title' => array( 'title' => __( 'Title', 'woocommerce' ), 'type' => 'safe_text', 'description' => __( 'This controls the title which the user sees during checkout.', 'woocommerce' ), 'default' => __( 'Crypto payment', 'woocommerce' ), 'desc_tip' => true, ), 'description' => array( 'title' => __( 'Description', 'woocommerce' ), 'type' => 'textarea', 'description' => __( 'Payment method description that the customer will see on your checkout.', 'woocommerce' ), 'default' => __( 'Make your payment directly to the crypto wallet Address . Please use your Order ID as the payment reference. Your order will not be shipped until the funds have cleared in our account.', 'woocommerce' ), 'desc_tip' => true, ), 'instructions' => array( 'title' => __( 'Instructions', 'woocommerce' ), 'type' => 'textarea', 'description' => __( 'Instructions that will be added to the thank you page and emails.', 'woocommerce' ), 'default' => '', 'desc_tip' => true, ), 'account_details' => array( 'type' => 'account_details', ), ); } /** * Generate account details html. * * @return string */ public function generate_account_details_html() { ob_start(); $country = WC()->countries->get_base_country(); $locale = $this->get_country_locale(); // Get sortcode label in the $locale array and use appropriate one. $sortcode = isset( $locale[ $country ]['sortcode']['label'] ) ? $locale[ $country ]['sortcode']['label'] : __( 'Sort code', 'woocommerce' ); ?>
account_details ) { foreach ( $this->account_details as $account ) { $i++; echo ''; } } ?>
 
$name ) { if ( ! isset( $account_names[ $i ] ) ) { continue; } $accounts[] = array( 'account_name' => $account_names[ $i ], 'account_number' => $account_numbers[ $i ], 'bank_name' => $bank_names[ $i ], ); } } // phpcs:enable do_action( 'woocommerce_update_option', array( 'id' => 'woocommerce_bacs_accounts' ) ); update_option( 'woocommerce_bacs_accounts', $accounts ); } /** * Output for the order received page. * * @param int $order_id Order ID. */ public function thankyou_page( $order_id ) { if ( $this->instructions ) { echo wp_kses_post( wpautop( wptexturize( wp_kses_post( $this->instructions ) ) ) ); } $this->bank_details( $order_id ); } /** * Add content to the WC emails. * * @param WC_Order $order Order object. * @param bool $sent_to_admin Sent to admin. * @param bool $plain_text Email format: plain text or HTML. */ public function email_instructions( $order, $sent_to_admin, $plain_text = false ) { /** * Filter the email instructions order status. * * @since 7.4 * @param string $terms The order status. * @param object $order The order object. */ if ( ! $sent_to_admin && 'bacs' === $order->get_payment_method() && $order->has_status( apply_filters( 'woocommerce_bacs_email_instructions_order_status', 'on-hold', $order ) ) ) { if ( $this->instructions ) { echo wp_kses_post( wpautop( wptexturize( $this->instructions ) ) . PHP_EOL ); } $this->bank_details( $order->get_id() ); } } /** * Get bank details and place into a list format. * * @param int $order_id Order ID. */ private function bank_details( $order_id = '' ) { if ( empty( $this->account_details ) ) { return; } // Get order and store in $order. $order = wc_get_order( $order_id ); // Get the order country and country $locale. $country = $order->get_billing_country(); $locale = $this->get_country_locale(); // Get sortcode label in the $locale array and use appropriate one. $sortcode = isset( $locale[ $country ]['sortcode']['label'] ) ? $locale[ $country ]['sortcode']['label'] : __( 'Sort code', 'woocommerce' ); $bacs_accounts = apply_filters( 'woocommerce_bacs_accounts', $this->account_details, $order_id ); if ( ! empty( $bacs_accounts ) ) { $account_html = ''; $has_details = false; foreach ( $bacs_accounts as $bacs_account ) { $bacs_account = (object) $bacs_account; if ( $bacs_account->account_name ) { $account_html .= '

' . wp_kses_post( wp_unslash( $bacs_account->account_name ) ) . ':

' . PHP_EOL; } $account_html .= ''; } if ( $has_details ) { echo '

' . esc_html__( 'Crypto Payment Gateway', 'woocommerce' ) . '

' . wp_kses_post( PHP_EOL . $account_html ) . '
'; } } } /** * Process the payment and return the result. * * @param int $order_id Order ID. * @return array */ public function process_payment( $order_id ) { $order = wc_get_order( $order_id ); if ( $order->get_total() > 0 ) { // Mark as on-hold (we're awaiting the payment). $order->update_status( apply_filters( 'woocommerce_bacs_process_payment_order_status', 'on-hold', $order ), __( 'Awaiting BACS payment', 'woocommerce' ) ); } else { $order->payment_complete(); } // Remove cart. WC()->cart->empty_cart(); // Return thankyou redirect. return array( 'result' => 'success', 'redirect' => $this->get_return_url( $order ), ); } /** * Get country locale if localized. * * @return array */ public function get_country_locale() { if ( empty( $this->locale ) ) { // Locale information to be used - only those that are not 'Sort Code'. $this->locale = apply_filters( 'woocommerce_get_bacs_locale', array( 'AU' => array( 'sortcode' => array( 'label' => __( 'BSB', 'woocommerce' ), ), ), 'CA' => array( 'sortcode' => array( 'label' => __( 'Bank transit number', 'woocommerce' ), ), ), 'IN' => array( 'sortcode' => array( 'label' => __( 'IFSC', 'woocommerce' ), ), ), 'IT' => array( 'sortcode' => array( 'label' => __( 'Branch sort', 'woocommerce' ), ), ), 'NZ' => array( 'sortcode' => array( 'label' => __( 'Bank code', 'woocommerce' ), ), ), 'SE' => array( 'sortcode' => array( 'label' => __( 'Bank code', 'woocommerce' ), ), ), 'US' => array( 'sortcode' => array( 'label' => __( 'Routing number', 'woocommerce' ), ), ), 'ZA' => array( 'sortcode' => array( 'label' => __( 'Branch code', 'woocommerce' ), ), ), ) ); } return $this->locale; } }