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.
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.
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) .
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 :
Be the first to comment.