Skip to content
Snippets Groups Projects
PxIPN.php 2.73 KiB
<?php
/**
 * PxIPN controller class.
 *
 * PxPay IPN endpoint, replacement for CiviCRM's 'extern/pxIPN.php'.
 *
 * @since 0.1
 */

namespace CiviCRM_WP_REST\Controller;

class PxIPN extends Base {

	/**
	 * The base route.
	 *
	 * @since 0.1
	 * @var string
	 */
	protected $rest_base = 'pxIPN';

	/**
	 * Registers routes.
	 *
	 * @since 0.1
	 */
	public function register_routes() {

		register_rest_route( $this->get_namespace(), $this->get_rest_base(), [
			[
				'methods' => \WP_REST_Server::ALLMETHODS,
				'callback' => [ $this, 'get_item' ]
			]
		] );

	}

	/**
	 * Get items.
	 *
	 * @since 0.1
	 * @param WP_REST_Request $request
	 */
	public function get_item( $request ) {

		/**
		 * Filter payment processor params.
		 *
		 * @since 0.1
		 * @param array $params
		 * @param WP_REST_Request $request
		 */
		$params = apply_filters(
			'civi_wp_rest/controller/pxIPN/params',
			$this->get_payment_processor_args( $request ),
			$request
		);

		// log notification
		\Civi::log()->alert( 'payment_notification processor_name=Payment_Express', $params );

		try {

			$result = \CRM_Core_Payment_PaymentExpressIPN::main( ...$params );

		} catch ( \CRM_Core_Exception $e ) {

			\Civi::log()->error( $e->getMessage() );
			\Civi::log()->error( 'error data ', [ 'data' => $e->getErrorData() ] );
			\Civi::log()->error( 'REQUEST ', [ 'params' => $params ] );

			return $this->civi_rest_error( $e->getMessage() );

		}

		return rest_ensure_response( $result );

	}

	/**
	 * Get payment processor necessary params.
	 *
	 * @since 0.1
	 * @param WP_REST_Resquest $request
	 * @return array $args
	 */
	public function get_payment_processor_args( $request ) {

		// get payment processor types
		$payment_processor_types = civicrm_api3( 'PaymentProcessor', 'getoptions', [
			'field' => 'payment_processor_type_id'
		] );

		// payment processor params
		$params = apply_filters( 'civi_wp_rest/controller/pxIPN/payment_processor_params', [
			'user_name' => $request->get_param( 'userid' ),
			'payment_processor_type_id' => array_search(
				'DPS Payment Express',
				$payment_processor_types['values']
			),
			'is_active' => 1,
			'is_test' => 0
		] );

		// get payment processor
		$payment_processor = civicrm_api3( 'PaymentProcessor', 'get', $params );

		$args = $payment_processor['values'][$payment_processor['id']];

		$method = empty( $args['signature'] ) ? 'pxpay' : 'pxaccess';

		return [
			$method,
			$request->get_param( 'result' ),
			$args['url_site'],
			$args['user_name'],
			$args['password'],
			$args['signature']
		];

	}

	/**
	 * Item schema.
	 *
	 * @since 0.1
	 * @return array $schema
	 */
	public function get_item_schema() {}

	/**
	 * Item arguments.
	 *
	 * @since 0.1
	 * @return array $arguments
	 */
	public function get_item_args() {}

}