diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000000..bcc77ad7b2d Binary files /dev/null and b/.DS_Store differ diff --git a/classes/.DS_Store b/classes/.DS_Store new file mode 100644 index 00000000000..f10f73700d5 Binary files /dev/null and b/classes/.DS_Store differ diff --git a/classes/gateways/.DS_Store b/classes/gateways/.DS_Store new file mode 100644 index 00000000000..0758fe596a4 Binary files /dev/null and b/classes/gateways/.DS_Store differ diff --git a/classes/gateways/gateway-payfast.php b/classes/gateways/gateway-payfast.php new file mode 100644 index 00000000000..4f24680cde9 --- /dev/null +++ b/classes/gateways/gateway-payfast.php @@ -0,0 +1,598 @@ + 'yes', + 'title' => 'PayFast', + 'description' => '', + 'testmode' => 'yes', + 'merchant_id' => '', + 'merchant_key' => '' + ); + + var $form_fields = array(); + var $errors = array(); + var $sanitized_fields = array(); + + public function __construct() { + + $this->id = 'payfast'; + $this->icon = woocommerce::plugin_url() . '/assets/images/icons/payfast.png'; + $this->has_fields = true; + + // Load the settings. + $this->init_settings(); + + // Load the form fields. + $this->init_form_fields(); + + // Setup default merchant data. + $this->merchant_id = $this->settings['merchant_id']; + $this->merchant_key = $this->settings['merchant_key']; + $this->url = 'https://www.payfast.co.za/eng/process'; + + // Setup the test data, if in test mode. + if ( $this->settings['testmode'] == 'yes' ) { + $this->merchant_id = '10000100'; + $this->merchant_key = '46f0cd694581a'; + $this->url = 'https://sandbox.payfast.co.za/eng/process'; + } + + // add_action( 'init', array( &$this, 'check_ipn_response' ) ); + // add_action( 'valid-paypal-standard-ipn-request', array( &$this, 'successful_request' ) ); + + add_action( 'woocommerce_update_options', array( &$this, 'process_admin_options' ) ); + + // add_action( 'receipt_payfast', array( &$this, 'receipt_page' ) ); + } + + /** + * Initialise Gateway Settings Form Fields + * + * Generate form fields HTML. + * + * @since 1.0.0 + * @uses get_option() + */ + + private function init_form_fields () { + + $this->form_fields = array( + 'title' => array( + 'title' => __( 'Title', 'woothemes' ), + 'type' => 'text', + 'description' => __( 'This controls the title which the user sees during checkout.', 'woothemes' ) + ), + 'enabled' => array( + 'title' => __( 'Enable/Disable', 'woothemes' ), + 'type' => 'checkbox', + 'description' => __( 'This controls the title which the user sees during checkout.', 'woothemes' ) + ), + 'description' => array( + 'title' => __( 'Description', 'woothemes' ), + 'type' => 'text', + 'description' => __( 'This controls the description which the user sees during checkout.', 'woothemes' ) + ), + 'testmode' => array( + 'title' => __( 'PayFast Sandbox', 'woothemes' ), + 'type' => 'checkbox', + 'description' => __( 'Place the payment gateway in development mode.', 'woothemes' ) + ), + 'merchant_id' => array( + 'title' => __( 'Merchant ID', 'woothemes' ), + 'type' => 'text', + 'description' => __( 'This is the merchant ID, received from PayFast.', 'woothemes' ) + ), + 'merchant_key' => array( + 'title' => __( 'Merchant Key', 'woothemes' ), + 'type' => 'text', + 'description' => __( 'This is the merchant key, received from PayFast.', 'woothemes' ) + ) + ); + + } // End init_form_fields() + + /** + * Initialise Gateway Settings + * + * Store all settings in a single database entry + * and make sure the $settings array is either the default + * or the settings stored in the database. + * + * @since 1.0.0 + * @uses get_option(), add_option() + */ + + private function init_settings () { + if ( ! is_array( $this->settings ) ) { return; } + + $settings = array(); + $existing_settings = get_option( $this->plugin_id . $this->id . '_settings' ); + + if ( ! $existing_settings ) { + add_option( $this->plugin_id . $this->id . '_settings' ); + } else { + // Prevent "undefined index" errors. + foreach ( $this->settings as $k => $v ) { + if ( ! isset( $existing_settings[$k] ) ) { + $existing_settings[$k] = $v; + } + } + + $this->settings = $existing_settings; + } + + if ( isset( $this->settings['enabled'] ) && ( $this->settings['enabled'] == 'yes' ) ) { $this->enabled = 'yes'; } + } // End init_settings() + + /** + * Generate Settings HTML. + * + * Generate the HTML for the fields on the "settings" screen. + * + * @since 1.0.0 + * @uses method_exists() + */ + + private function generate_settings_html () { + $html = ''; + foreach ( $this->form_fields as $k => $v ) { + if ( ! isset( $v['type'] ) || ( $v['type'] == '' ) ) { $v['type'] == 'text'; } // Default to "text" field type. + + if ( method_exists( $this, 'generate_' . $v['type'] . '_html' ) ) { + $html .= $this->{'generate_' . $v['type'] . '_html'}( $k, $v ); + } + } + + echo $html; + } // End generate_settings_html() + + /** + * Generate Text Input HTML. + * + * @since 1.0.0 + * @return $html string + */ + + private function generate_text_html ( $key, $data ) { + $html = ''; + + if ( isset( $data['title'] ) && $data['title'] != '' ) { $title = $data['title']; } + + $html .= '
', '' ); ?>
+'.__('Thank you for your order, please click the button below to pay with PayPal.', 'woothemes').'
'; + + echo $this->generate_paypal_form( $order ); + */ + } + + /** + * Check PayPal IPN validity + **/ + function check_ipn_request_is_valid() { + /* + // Add cmd to the post array + $_POST['cmd'] = '_notify-validate'; + + // Send back post vars to paypal + $params = array( 'body' => $_POST ); + + // Get url + if ( $this->testmode == 'yes' ): + $paypal_adr = $this->testurl; + else : + $paypal_adr = $this->liveurl; + endif; + + // Post back to get a response + $response = wp_remote_post( $paypal_adr, $params ); + + // Clean + unset($_POST['cmd']); + + // check to see if the request was valid + if ( !is_wp_error($response) && $response['response']['code'] >= 200 && $response['response']['code'] < 300 && (strcmp( $response['body'], "VERIFIED") == 0)) { + return true; + } + + return false; + */ + } + + /** + * Check for PayPal IPN Response + **/ + function check_ipn_response() { + /* + if (isset($_GET['paypalListener']) && $_GET['paypalListener'] == 'paypal_standard_IPN'): + + $_POST = stripslashes_deep($_POST); + + if (self::check_ipn_request_is_valid()) : + + do_action("valid-paypal-standard-ipn-request", $_POST); + + endif; + + endif; + */ + } + + /** + * Successful Payment! + **/ + function successful_request( $posted ) { + /* + // Custom holds post ID + if ( !empty($posted['txn_type']) && !empty($posted['invoice']) ) { + + $accepted_types = array('cart', 'instant', 'express_checkout', 'web_accept', 'masspay', 'send_money'); + + if (!in_array(strtolower($posted['txn_type']), $accepted_types)) exit; + + $order = new woocommerce_order( (int) $posted['custom'] ); + + if ($order->order_key!==$posted['invoice']) exit; + + // Sandbox fix + if ($posted['test_ipn']==1 && $posted['payment_status']=='Pending') $posted['payment_status'] = 'completed'; + + + if ($order->status !== 'completed') : + // We are here so lets check status and do actions + switch (strtolower($posted['payment_status'])) : + case 'completed' : + // Payment completed + $order->add_order_note( __('IPN payment completed', 'woothemes') ); + $order->payment_complete(); + break; + case 'denied' : + case 'expired' : + case 'failed' : + case 'voided' : + // Hold order + $order->update_status('on-hold', sprintf(__('Payment %s via IPN.', 'woothemes'), strtolower(sanitize($posted['payment_status'])) ) ); + break; + default: + // No action + break; + endswitch; + endif; + + exit; + + } + */ + } + +} + +/** + * Add the gateway to WooCommerce + **/ +function add_payfast_gateway( $methods ) { + $methods[] = 'woocommerce_payfast'; return $methods; +} + +add_filter( 'woocommerce_payment_gateways', 'add_payfast_gateway' );