WooCommerce Custom Payment Gateway

2019-05-26 16:45发布

I am trying to make a Custom Gateway Plugin for my Merchant Account but I got stuck and I don't know how to continue.

Now, here is what I done so far:

<?php
 /*
  Plugin Name: Paysecure.ro Payment Gateway
  Plugin URI: http://www.Paysecure.ro
  Description: Allows you to use Paysecure.ro Payment Gateway with the WooCommerce plugin.
  Version: 0.0.1
  Author: Andrei Raileanu
 */

if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

add_action('plugins_loaded', 'woocommerce_Paysecure', 0);

function woocommerce_Paysecure(){
    if (!class_exists('WC_Payment_Gateway'))
        return; // if the WC payment gateway class is not available, do nothing
    if(class_exists('WC_Paysecure'))
        return;

    class WC_Gateway_Paysecure extends WC_Payment_Gateway{
        public function __construct(){

            $plugin_dir = plugin_dir_url(__FILE__);

            global $woocommerce;

            $this->id = 'Paysecure';
            $this->icon = apply_filters('woocommerce_Paysecure_icon', ''.$plugin_dir.'Paysecure.png');
            $this->has_fields = true;

            // Load the settings
            $this->init_form_fields();
            $this->init_settings();

            // Define user set variables
            $this->title = "Credit/Debit Card";
             $this->description = "You will be redirected to paysecure.ro to complete your purchase.";
            $this->cui = "XXXXXXXXX";
            $this->encryption_key = "XXXXXXXXX";
            $this->currency = "USD";

            // Logs
            if ($this->debug == 'yes'){
                $this->log = $woocommerce->logger();
            }

            // Actions
            add_action('woocommerce_receipt_' . $this->id, array($this, 'receipt_page'));

            // Save options
            add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );

            // Payment listener/API hook
            add_action('woocommerce_api_wc_' . $this->id, array($this, 'check_ipn_response'));

        }

        function init_form_fields()
            {
                $this->form_fields = array(
                    'enabled' => array(
                        'title' => __( 'Enable/Disable', 'woocommerce' ),
                        'type' => 'checkbox',
                        'label' => __( 'Enable Paysecure', 'woocommerce' ),
                        'default' => 'yes'
                    )
                );
        }

        public function admin_options() {

            ?>
            <h3><?php _e( 'Paysecure', 'woocommerce' ); ?></h3>
            <p><?php _e( 'Paysecure Payment Gateway', 'woocommerce' ); ?></p>

            <table class="form-table">
                    <?php $this->generate_settings_html(); ?>
              </table>

             <?php
        }

        function payment_fields() {
            $plugin_dir = plugin_dir_url(__FILE__);
            // Description of payment method from settings
            if ($this->description) { ?>
                <p><?php
                echo $this->description; ?>
                </p><?php
            } ?>

<?php
        }

        function process_payment( $order_id ) {
            global $woocommerce;

            $order = new WC_Order($order_id);

            // I WILL NEED THESE FIELDS
            //$this->notify_url;
        //$order->get_total();
            //$order->get_order_number();
            //$order->billing_first_name; 
            //$order->billing_email;

        }

    }

    function add_Paysecure_gateway($methods){
        $methods[] = 'WC_Gateway_Paysecure';
        return $methods;
    }

    add_filter('woocommerce_payment_gateways', 'add_Paysecure_gateway');

}

Here are the PHP instructions from my merchant account provider:

<?php 
 require_once('./functions.php'); 
 $key = 'THIS IS THE ENCRYPTION KEY'; 
 $data = array( 'cui' => 'THIS IS THE CUI CODE',
'AMOUNT' => '200',
'CURRENCY' => 'USD',
'ORDER' =>  '12313',
'DESC' => ps_clean('SHORT DESCRIPTION'),
'PENTRU' => 'EMAIL ADDRESS',
'TRTYPE' => 0,                              
'BACKREF' => 'http://www.site.ro/test.php',
'TIMESTAMP'=>time()   

);

 echo '<form action="https://paysecure.ro/order/cgi-bin/" method="post" >';

  foreach ($data as $l => $v ) echo '<input size="55" readonly type="text" name="'.$l.'" value="'.$v.'" /> : <label for="'.$l.'">'.$l.'</label><br>'; 

  echo '<input size="55" type="text" name="P_SIGN" readonly value="'.calculateSign($data,$key).'" /><br>' ; //se calculeaza P_SIGN - ul , encriptarea datelor

?>
<input type="submit" />
</form>

Can someone help me with the rest of the code?

2条回答
该账号已被封号
2楼-- · 2019-05-26 16:49

How about this?

add_action( 'plugins_loaded', 'init_gateway_cash' );

function init_gateway_cash() {
    class WC_Gateway_Cash extends WC_Payment_Gateway {
        function __construct() {
            $this->id = "Cash Gateway";
            $this->title = "Cash";
            $this->description = "More later";

            $this->init_form_fields();
            $this->init_settings();

            add_action( 'woocommerce_update_options_payment_gateways', array( &$this, 'process_admin_options' ) );

        }
        function init_form_fields(){
            $this->form_fields = array(
                    'enabled' => array(
                            'title' => __( 'Enable/Disable', 'woocommerce' ),
                            'type' => 'checkbox',
                            'label' => __( 'Enable Cheque Payment', 'woocommerce' ),
                            'default' => 'yes'
                    ),
                    'title' => array(
                            'title' => __( 'Title', 'woocommerce' ),
                            'type' => 'text',
                            'description' => __( 'This controls the title which the user sees during checkout.', 'woocommerce' ),
                            'default' => __( 'Cheque Payment', 'woocommerce' ),
                            'desc_tip' => true,
                    ),
                    'description' => array(
                            'title' => __( 'Customer Message', 'woocommerce' ),
                            'type' => 'textarea',
                            'default' => ''
                    )
            );
        }

        function process_payment( $order_id ) {
            global $woocommerce;
            $order = new WC_Order( $order_id );
            $productArray = array();
            $x = 0;
            foreach( $order->get_items() as $item_id => $item ) {
                $productArray[$x] = $order->get_product_from_item( $item );
                $x++;
            }

            // Mark as on-hold (we're awaiting the cheque)
            $order->update_status('on-hold', 
            __( 'Awaiting cheque payment.', 'woocommerce' )
            );


            // Remove cart
            $woocommerce->cart->empty_cart();

            // Return thankyou redirect
            return array(
                'result' => 'success',
                'redirect' => $this->get_return_url( $order )
            );
        }
    }

}
function add_gateway_cash_class ($methods ) {
    $methods[] = 'WC_Gateway_Cash'; 
    return $methods;
}

add_filter( 'woocommerce_payment_gateways', 'add_gateway_cash_class' );
查看更多
Anthone
3楼-- · 2019-05-26 17:14

1st mistake I noticed you made, $this->id MUST be in lowercase. 'Paysecure' is not gonna work here come time for the API hook.

// Payment listener/API hook
add_action('woocommerce_api_wc_' . $this->id, array($this, 'check_ipn_response'));

change to this instead:

// Payment listener/API hook
add_action('woocommerce_api_wc_paysecure', array($this, 'check_ipn_response'));

2nd mistake is that you forgot to create the function check_ipn_response()

   // Handles the callbacks received from the payment backend. give this url to your payment processing comapny as the ipn response URL:
    // USAGE:  http://myurl.com/?wc-api=WC_Gateway_Paysecure
      function check_ipn_response() {

        $http_contents  = file_get_contents("php://input");
        $json = json_decode($http_contents, true);
        $order = new WC_Order($json['custom']);

                if ($callback_json['status'] == 'Transaction approved') 
                {
            $order->payment_complete();  //This will ensure stock reductions are made, and the status is changed to the correct value.
            $order->add_order_note( __( 'KiwiPay Transaction Approved.', 'kiwipay' ) );
                }                   
else
                {
                        $order->update_status('failed');
                        $order->add_order_note('KiwiPay status received - ' . $callback_json['status']);
    }


                //references:
                //http://docs.woothemes.com/document/payment-gateway-api/
                //https://github.com/Paymium/WooCommerce/blob/master/checkout.php
                //https://github.com/tubiz/voguepay-woocommerce-payment-gateway/blob/master/voguepay-woocommerce-payment-gateway.php


                /*
                {
                "id":1863,
                "amount":1750,
                "status":"Transaction approved",
                "created":1434198776,
                "reference":"2626", //this is the order number $order->get_order_number()
                "name":"HamishTest Test",
                "email":"hamish@tst.xom",
                "address":{"street":"my rd","region":"N/A","city":"tauranga","zip":"3175","country":"NZ"},
                "test":true,
                "price":"17.50",
                "custom":"6589"   //this is the wc order_id passed during process_payment to the paymen processor.
                }
                */
查看更多
登录 后发表回答