Back to Top

How to use payment api in Opencart

Updated 31 July 2023

In our previous blog: http://webkul.com/blog/use-cart-api-opencart/, we learnt how to use cart API in Opencart. Today we will learn, how to use payment API in Opencart.

Opencart uses the payment API in the payment details section while adding or editing the order from the admin end.

After adding the product from the sales->orders when we click the continue button, then it goes to the payment details section.

PaymentTab

After selecting or adding the payment address from the payment details section when we click the continue button. Two methods of payment API will be called: address and methods.

Searching for an experienced
Opencart Company ?
Find out More

The address method is used to set the payment address of the order. The method validates the address values and if all values are following the norms then, it sets the address values into the session . Code of the address method is given below :

/**
 * Webkul Software.
 *
 * @category Webkul
 * @package api
 * @author Webkul
 * @copyright Webkul Software Private Limited (https://webkul.com)
 * @license https://store.webkul.com/license.html
 */
public function address() {
	$this->load->language('api/payment');

	// Delete old payment address, payment methods and method so not to cause any issues if there is an error
	unset($this->session->data['payment_address']);
	unset($this->session->data['payment_methods']);
	unset($this->session->data['payment_method']);

	$json = array();

	//Check if api is logged in or not
	if (!isset($this->session->data['api_id'])) {
		$json['error']['warning'] = $this->language->get('error_permission');
	} else {
		// Add keys for missing post vars
		$keys = array(
			'firstname',
			'lastname',
			'company',
			'address_1',
			'address_2',
			'postcode',
			'city',
			'zone_id',
			'country_id'
		);

		foreach ($keys as $key) {
			if (!isset($this->request->post[$key])) {
				$this->request->post[$key] = '';
			}
		}

		//Payment address field validation
		if ((utf8_strlen(trim($this->request->post['firstname'])) < 1) || (utf8_strlen(trim($this->request->post['firstname'])) > 32)) {
			$json['error']['firstname'] = $this->language->get('error_firstname');
		}

		if ((utf8_strlen(trim($this->request->post['lastname'])) < 1) || (utf8_strlen(trim($this->request->post['lastname'])) > 32)) {
			$json['error']['lastname'] = $this->language->get('error_lastname');
		}

		if ((utf8_strlen(trim($this->request->post['address_1'])) < 3) || (utf8_strlen(trim($this->request->post['address_1'])) > 128)) {
			$json['error']['address_1'] = $this->language->get('error_address_1');
		}

		if ((utf8_strlen($this->request->post['city']) < 2) || (utf8_strlen($this->request->post['city']) > 32)) {
			$json['error']['city'] = $this->language->get('error_city');
		}

		$this->load->model('localisation/country');

		$country_info = $this->model_localisation_country->getCountry($this->request->post['country_id']);

		if ($country_info && $country_info['postcode_required'] && (utf8_strlen(trim($this->request->post['postcode'])) < 2 || utf8_strlen(trim($this->request->post['postcode'])) > 10)) {
			$json['error']['postcode'] = $this->language->get('error_postcode');
		}

		if ($this->request->post['country_id'] == '') {
			$json['error']['country'] = $this->language->get('error_country');
		}

		if (!isset($this->request->post['zone_id']) || $this->request->post['zone_id'] == '') {
			$json['error']['zone'] = $this->language->get('error_zone');
		}

		// Custom field validation
		$this->load->model('account/custom_field');

		$custom_fields = $this->model_account_custom_field->getCustomFields($this->config->get('config_customer_group_id'));

		foreach ($custom_fields as $custom_field) {
			if (($custom_field['location'] == 'address') && $custom_field['required'] && empty($this->request->post['custom_field'][$custom_field['custom_field_id']])) {
				$json['error']['custom_field' . $custom_field['custom_field_id']] = sprintf($this->language->get('error_custom_field'), $custom_field['name']);
			}
		}

		// If there is no error then it will enter into the condition
		if (!$json) {
			$this->load->model('localisation/country');

			$country_info = $this->model_localisation_country->getCountry($this->request->post['country_id']);

			if ($country_info) {
				$country = $country_info['name'];
				$iso_code_2 = $country_info['iso_code_2'];
				$iso_code_3 = $country_info['iso_code_3'];
				$address_format = $country_info['address_format'];
			} else {
				$country = '';
				$iso_code_2 = '';
				$iso_code_3 = '';
				$address_format = '';
			}

			$this->load->model('localisation/zone');

			$zone_info = $this->model_localisation_zone->getZone($this->request->post['zone_id']);

			if ($zone_info) {
				$zone = $zone_info['name'];
				$zone_code = $zone_info['code'];
			} else {
				$zone = '';
				$zone_code = '';
			}

			//Setting the payment address in the session 
			$this->session->data['payment_address'] = array(
				'firstname'      => $this->request->post['firstname'],
				'lastname'       => $this->request->post['lastname'],
				'company'        => $this->request->post['company'],
				'address_1'      => $this->request->post['address_1'],
				'address_2'      => $this->request->post['address_2'],
				'postcode'       => $this->request->post['postcode'],
				'city'           => $this->request->post['city'],
				'zone_id'        => $this->request->post['zone_id'],
				'zone'           => $zone,
				'zone_code'      => $zone_code,
				'country_id'     => $this->request->post['country_id'],
				'country'        => $country,
				'iso_code_2'     => $iso_code_2,
				'iso_code_3'     => $iso_code_3,
				'address_format' => $address_format,
				'custom_field'   => isset($this->request->post['custom_field']) ? $this->request->post['custom_field'] : array()
			);

			$json['success'] = $this->language->get('text_address');

			//Unset the payment method if already saved in the session
			unset($this->session->data['payment_method']);
			unset($this->session->data['payment_methods']);
		}
	}

	//Set the response in json format
	$this->response->addHeader('Content-Type: application/json');
	$this->response->setOutput(json_encode($json));
}

If the address is successfully saved in the session then, it returns the success message as the response.

The second method is “methods”. The method is used to get the list of payment methods that can be applied to a particular order based on the payment address. The code of the method is given below:

/**
 * Webkul Software.
 *
 * @category Webkul
 * @package api
 * @author Webkul
 * @copyright Webkul Software Private Limited (https://webkul.com)
 * @license https://store.webkul.com/license.html
 */
public function methods() {
	$this->load->language('api/payment');

	// Delete past shipping methods and method just in case there is an error
	unset($this->session->data['payment_methods']);
	unset($this->session->data['payment_method']);

	$json = array();
	
	//Check if api is logged in or not
	if (!isset($this->session->data['api_id'])) {
		$json['error'] = $this->language->get('error_permission');
	} else {
		// Payment Address
		if (!isset($this->session->data['payment_address'])) {
			$json['error'] = $this->language->get('error_address');
		}

		if (!$json) {
			// Totals
			$totals = array();
			$taxes = $this->cart->getTaxes();
			$total = 0;

			// Because __call can not keep var references so we put them into an array. 
			$total_data = array(
				'totals' => &$totals,
				'taxes'  => &$taxes,
				'total'  => &$total
			);

			$this->load->model('extension/extension');

			$sort_order = array();

			$results = $this->model_extension_extension->getExtensions('total');

			foreach ($results as $key => $value) {
				$sort_order[$key] = $this->config->get($value['code'] . '_sort_order');
			}

			array_multisort($sort_order, SORT_ASC, $results);

			foreach ($results as $result) {
				if ($this->config->get($result['code'] . '_status')) {
					$this->load->model('total/' . $result['code']);
					
					// We have to put the totals in an array so that they pass by reference.
					$this->{'model_total_' . $result['code']}->getTotal($total_data);
				}
			}

			// Payment Methods
			$json['payment_methods'] = array();

			$this->load->model('extension/extension');

			$results = $this->model_extension_extension->getExtensions('payment');

			// Check for recurring products
			$recurring = $this->cart->hasRecurringProducts();

			foreach ($results as $result) {
				if ($this->config->get($result['code'] . '_status')) {
					$this->load->model('payment/' . $result['code']);

					$method = $this->{'model_payment_' . $result['code']}->getMethod($this->session->data['payment_address'], $total);

					if ($method) {
						if ($recurring) {
							if (property_exists($this->{'model_payment_' . $result['code']}, 'recurringPayments') && $this->{'model_payment_' . $result['code']}->recurringPayments()) {
								$json['payment_methods'][$result['code']] = $method;
							}
						} else {
							$json['payment_methods'][$result['code']] = $method;
						}
					}
				}
			}

			$sort_order = array();

			foreach ($json['payment_methods'] as $key => $value) {
				$sort_order[$key] = $value['sort_order'];
			}

			array_multisort($sort_order, SORT_ASC, $json['payment_methods']);

			//Setting the payment methods in the session(if available) otherwise set the error
			if ($json['payment_methods']) {
				$this->session->data['payment_methods'] = $json['payment_methods'];
			} else {
				$json['error'] = $this->language->get('error_no_payment');
			}
		}
	}

	//Set the response in json format
	$this->response->addHeader('Content-Type: application/json');
	$this->response->setOutput(json_encode($json));
}

If the method successfully fetches the available payment methods then it returns the list of available payment methods.

In the payment API, there is one more method named “method”. The method is used to set the payment method that will be applied to the current order.

Opencart uses this method in the last step of order creation from the admin end as shown below. The method is called when we click the apply button(placed on the right side of the payment method) .

TotalTab

The code of the method is given below :

/**
 * Webkul Software.
 *
 * @category Webkul
 * @package api
 * @author Webkul
 * @copyright Webkul Software Private Limited (https://webkul.com)
 * @license https://store.webkul.com/license.html
 */
public function method() {
	$this->load->language('api/payment');

	// Delete old payment method so not to cause any issues if there is an error
	unset($this->session->data['payment_method']);

	$json = array();

	//Check if api is logged in or not
	if (!isset($this->session->data['api_id'])) {
		$json['error'] = $this->language->get('error_permission');
	} else {
		// Payment Address
		if (!isset($this->session->data['payment_address'])) {
			$json['error'] = $this->language->get('error_address');
		}

		// Payment Method
		if (empty($this->session->data['payment_methods'])) {
			$json['error'] = $this->language->get('error_no_payment');
		} elseif (!isset($this->request->post['payment_method'])) {
			$json['error'] = $this->language->get('error_method');
		} elseif (!isset($this->session->data['payment_methods'][$this->request->post['payment_method']])) {
			$json['error'] = $this->language->get('error_method');
		}

		//If there is no error then set the payment method in the session
		if (!$json) {
			$this->session->data['payment_method'] = $this->session->data['payment_methods'][$this->request->post['payment_method']];

			$json['success'] = $this->language->get('text_method');
		}
	}

	//Set the response in json format
	$this->response->addHeader('Content-Type: application/json');
	$this->response->setOutput(json_encode($json));
}

If the payment method is successfully applied, then it returns the success message as given below :

. . .

Leave a Comment

Your email address will not be published. Required fields are marked*


Be the first to comment.

Back to Top

Message Sent!

If you have more details or questions, you can reply to the received confirmation email.

Back to Home