You are here

class Webhook in PayPal for Payment 2.0.x

Same name and namespace in other branches
  1. 8 src/Controller/Webhook.php \Drupal\paypal_payment\Controller\Webhook

Handles the "webhook" route.

Hierarchy

Expanded class hierarchy of Webhook

File

src/Controller/Webhook.php, line 20

Namespace

Drupal\paypal_payment\Controller
View source
class Webhook extends ControllerBase {

  /**
   * @var \Symfony\Component\HttpFoundation\Request
   */
  protected $request;

  /**
   * Redirect constructor.
   *
   * @param \Symfony\Component\HttpFoundation\Request $request
   */
  public function __construct(Request $request) {
    $this->request = $request;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {

    /** @noinspection NullPointerExceptionInspection */
    return new static($container
      ->get('request_stack')
      ->getCurrentRequest());
  }

  /**
   * @param $payment_method_id
   *
   * @return \Drupal\Core\Access\AccessResult
   */
  public function access($payment_method_id) : AccessResult {
    return AccessResult::allowedIf($this
      ->verify($payment_method_id));
  }

  /**
   * @param string $payment_method_id
   *
   * @return bool
   */
  private function verify(string $payment_method_id) : bool {
    try {

      /** @var PayPalBasic $payment_method */
      $payment_method = Payment::methodManager()
        ->createInstance('paypal_payment_express:' . $payment_method_id);
      if (!$payment_method instanceof PayPalBasic) {
        throw new RuntimeException('Unsupported web hook');
      }
      $body = $this->request
        ->getContent();
      $resource = new VerifyWebhookSignature();
      $resource
        ->setAuthAlgo($this->request->headers
        ->get('paypal-auth-algo'));
      $resource
        ->setCertUrl($this->request->headers
        ->get('paypal-cert-url'));
      $resource
        ->setTransmissionId($this->request->headers
        ->get('paypal-transmission-id'));
      $resource
        ->setTransmissionSig($this->request->headers
        ->get('paypal-transmission-sig'));
      $resource
        ->setTransmissionTime($this->request->headers
        ->get('paypal-transmission-time'));
      $resource
        ->setRequestBody($body);
      $resource
        ->setWebhookId($payment_method
        ->getWebhookId());
      $response = $resource
        ->post($payment_method
        ->getApiContext($payment_method::PAYPAL_CONTEXT_TYPE_WEBHOOK));
      if ($response
        ->getVerificationStatus() === 'SUCCESS') {
        return TRUE;
      }
    } catch (Exception $ex) {

      // TODO: Error handling
    }
    return FALSE;
  }

  /**
   * PayPal calls this after the payment status has been changed.
   *
   * @param string $payment_method_id
   *
   * @return \Symfony\Component\HttpFoundation\Response
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  public function execute(string $payment_method_id) : Response {
    $webhook = new WebhookEvent($this->request
      ->getContent());
    $event_type_status_map = [
      'PAYMENT.AUTHORIZATION.CREATED' => 'payment_authorized',
      'PAYMENT.AUTHORIZATION.VOIDED' => 'payment_authorization_failed',
      'PAYMENT.CAPTURE.COMPLETED' => 'payment_success',
      'PAYMENT.CAPTURE.REFUNDED' => 'payment_refunded',
      'PAYMENT.SALE.COMPLETED' => 'payment_success',
      'PAYMENT.SALE.REFUNDED' => 'payment_refunded',
    ];
    $resource = $webhook
      ->getResource();
    $payment_id = $resource->invoice_number;
    $payment = $this
      ->entityTypeManager()
      ->getStorage('payment')
      ->load($payment_id);
    if ($payment && $payment
      ->getPaymentMethod()
      ->getPaymentId() === $resource->parent_payment) {
      $payment_status = Payment::statusManager()
        ->createInstance($event_type_status_map[$webhook
        ->getEventType()]);
      $payment
        ->setPaymentStatus($payment_status)
        ->save();
    }
    return new Response();
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ControllerBase::$configFactory protected property The configuration factory.
ControllerBase::$currentUser protected property The current user service. 1
ControllerBase::$entityFormBuilder protected property The entity form builder.
ControllerBase::$entityTypeManager protected property The entity type manager.
ControllerBase::$formBuilder protected property The form builder. 2
ControllerBase::$keyValue protected property The key-value storage. 1
ControllerBase::$languageManager protected property The language manager. 1
ControllerBase::$moduleHandler protected property The module handler. 2
ControllerBase::$stateService protected property The state service.
ControllerBase::cache protected function Returns the requested cache bin.
ControllerBase::config protected function Retrieves a configuration object.
ControllerBase::container private function Returns the service container.
ControllerBase::currentUser protected function Returns the current user. 1
ControllerBase::entityFormBuilder protected function Retrieves the entity form builder.
ControllerBase::entityTypeManager protected function Retrieves the entity type manager.
ControllerBase::formBuilder protected function Returns the form builder service. 2
ControllerBase::keyValue protected function Returns a key/value storage collection. 1
ControllerBase::languageManager protected function Returns the language manager service. 1
ControllerBase::moduleHandler protected function Returns the module handler. 2
ControllerBase::redirect protected function Returns a redirect response object for the specified route.
ControllerBase::state protected function Returns the state storage service.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MessengerTrait::$messenger protected property The messenger. 27
MessengerTrait::messenger public function Gets the messenger. 27
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
StringTranslationTrait::$stringTranslation protected property The string translation service. 4
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
Webhook::$request protected property
Webhook::access public function
Webhook::create public static function Instantiates a new instance of this class. Overrides ControllerBase::create
Webhook::execute public function PayPal calls this after the payment status has been changed.
Webhook::verify private function
Webhook::__construct public function Redirect constructor.