Platební brány Benefity.cz, Benefit Plus a Sodexo pro WooCommerce

Pro eshop gsklub.cz jsem vytvořil pluginy, které do WooCommerce přidávají platební brány Benefity.cz, Benefit Plus a Sodexo.

Vytvoření platební brány pro WooCommerce je poměrně jednoduché a dobře popsané v oficiální dokumentaci WooCommerce. Každá brána má ale samozřejmě svá specifika, u každé probíhá jinak založení platby i validace toho, jestli platba opravdu proběhla.

Pro veškeré Ajaxové požadavky už nějakou dobu používám REST API WordPressu, které umožňuje jednoduše přidávat do WordPressu REST endpointy. Je to výrazně elegantnější řešení než starší způsob, tedy posílání požadavků na admin-ajax.php.

Jako příklad uvedu založení platby pro platební bránu Benefity.cz:


<?php
namespace WooBenefityCZ;
define('WooBenefityCZ_REST_NAMESPACE','woo-benefity-cz/v1');

/**
 * Class Rest
 * @package WooBenefitPlus
 */
class Rest extends \WP_REST_Controller{

	function __construct(){
		add_action('rest_api_init',array($this,'register_routes'));
	}

	/**
	 * Register the routes for the objects of the controller.
	 */
	public function register_routes(){

		register_rest_route(WooBenefityCZ_REST_NAMESPACE,'payment',array(
			array(
				'methods' => \WP_REST_Server::CREATABLE,
				'callback' => array($this,'process_payment'),
				'args' => [
					'order-key' => [
						'required' => true
					],
					'account' => [
						'required' => true
					],
					'pin' => [
						'required' => true
					]
				]
			),
		));
	}

	/**
	 * Process the Payment
	 *
	 * @param \WP_REST_Request $request Full data about the request.
	 * @return \WP_Error|\WP_REST_Request|\WP_REST_Response | bool
	 */
	function process_payment($request){
		$order_id = wc_get_order_id_by_order_key($request->get_param('order-key'));
		$order = wc_get_order($order_id);


		if (!$order || is_wp_error($order))
			return new \WP_Error('order-not-found',__("The order was not found", WOOBENEFITYCZ_SLUG),array('status' => 500));


		$gateways = $payment_gateways = WC()->payment_gateways()->payment_gateways();
		$benefity_cz = $gateways['benefity_cz'];

		// Prepare the request
		$args = [
			'headers' => [
				'Authorization' => 'Basic ' . base64_encode( $benefity_cz->username . ':' . $benefity_cz->password)
			],
			'body' => [
				'MERCHANT_NUMBER' => $benefity_cz->shop_id,
				'ORDER_NUMBER' => $order->get_id(),
				'ACCOUNT' => $request->get_param('account'),
				'PIN' => $request->get_param('pin'),
				'BENEFIT_GROUP' => $benefity_cz->benefit_group,
				'AMOUNT' => $order->get_total()
			]
		];


		$request = wp_remote_post($benefity_cz->request_url,$args);
		$response = wp_remote_retrieve_body($request);

		// Return error if something went wrong
		if (!$response || is_wp_error($response))
			return new \WP_Error('request-error',__("Error when contacting the payment gateway", WOOBENEFITYCZ_SLUG),array('status' => 500));


		$result = [];
		parse_str($response,$result);

		// Return generic error when something went wrong
		if (!isset($result['ERR']))
			return new \WP_Error('request-error',__("Error when contacting the payment gateway", WOOBENEFITYCZ_SLUG),array('status' => 500));

		// Build the errors array
		$errors = [
			1 => 'Chybné číslo obchodník(a MERCHANT_NUMBER).',
			2 => 'Obchodník nemůže prodávat tuto skupinu (BENEFIT_GROUP) benefitů',
			3 => 'Číslo objednavky (ORDER_NUMBER) již bylo použito.',
			4 => 'Chybný účet (ACCOUNT) nebo pin (PIN).',
			5 => 'Obchodník nesmí platit přes platební bránu.',
			6 => 'Není vyplněn obchodník (MERCHANT_NIUMBER).',
			7 => 'Není vyplněna skupina benefitu (BENEFIT_GROUP).',
			8 => 'Není vyplněno číslo účtu (ACCOUNT).',
			9 => 'Není vyplněn pin (PIN).',
			10 => 'Není vyplněna cena (AMOUNT).',
			11 => 'Cena (AMOUNT) je menší než nula.',
			12 => 'Není vyplněno číslo objednávky (ORDER_NUMBER).',
			13 => 'Účet (ACCOUNT) nemůže platit přes platební bránu.',
			14 => 'Na účtě není dostatek prostředků.'
		];

		// Check the response code
		$code =  intval($result['ERR']);
		if($code != 0) {
			$message = isset( $errors[ $code ] ) ? $errors[ $code ] : __( 'Payment error', WOOBENEFITYCZ_SLUG );
			$order->add_order_note(sprintf(__('Benefity CZ Error: %s',WOOBENEFITYCZ_SLUG),$message));
			return new \WP_Error( 'payment-error', $message, array( 'status' => 500 ) );
		}

		// Update order status and redirect to thankyou page
		$order->add_order_note(__('Benefity CZ: Successful payment.',WOOBENEFITYCZ_SLUG));
		$order->update_status($benefity_cz->status_successful_payment);
		return new \WP_REST_Response(array('status' => 'success', 'redirect' => $order->get_checkout_order_received_url()), 201);
	}
}

new Rest();


Budete-li mít zájem o některou z platebních bran, nebo pokud potřebujete vytvořit nějakou jinou funkcionalitu pro WordPress, neváhejte se na mě obrátit.

Share

Přidat komentář