You are here

public function RobokassaPayment::doValidatePost in Commerce robokassa 8.2

Helper to validate robokassa $_POST data.

Parameters

\Symfony\Component\HttpFoundation\Request $data: $_POST to be validated.

bool $is_interaction: Fallback call flag.

Return value

bool|mixed Transaction according to POST data or due.

1 call to RobokassaPayment::doValidatePost()
RobokassaPayment::onNotify in src/Plugin/Commerce/PaymentGateway/RobokassaPayment.php
Processes the notification request.

File

src/Plugin/Commerce/PaymentGateway/RobokassaPayment.php, line 291

Class

RobokassaPayment
Provides the Off-site Robokassa payment gateway.

Namespace

Drupal\commerce_robokassa\Plugin\Commerce\PaymentGateway

Code

public function doValidatePost(Request $request, $is_interaction = TRUE) {
  $data = $request->request
    ->all();

  // Exit now if the $_POST was empty.
  if (empty($data)) {
    $this->logger
      ->warning('Interaction URL accessed with no POST data submitted.');
    return FALSE;
  }

  // Exit now if any required keys are not exists in $_POST.
  $required_keys = array(
    'OutSum',
    'InvId',
  );
  if ($is_interaction) {
    $required_keys[] = 'SignatureValue';
  }
  $unavailable_required_keys = array_diff_key(array_flip($required_keys), $data);
  if (!empty($unavailable_required_keys)) {
    $this->logger
      ->warning('Missing POST keys. POST data: <pre>!data</pre>', array(
      '!data' => print_r($unavailable_required_keys, TRUE),
    ));
    return FALSE;
  }

  // Exit now if missing Checkout ID.
  if (empty($this->configuration['MrchLogin'])) {
    $info = array(
      '!settings' => print_r($this->configuration, 1),
      '!data' => print_r($data, TRUE),
    );
    $this->logger
      ->warning('Missing merchant ID.  POST data: <pre>!data</pre> <pre>!settings</pre>', $info);
    return FALSE;
  }
  if ($is_interaction) {
    if ($this->configuration) {

      // Robokassa Signature.
      $robo_sign = $data['SignatureValue'];

      // Create own Signature.
      $signature_data = array(
        $data['OutSum'],
        $data['InvId'],
        $this->configuration['pass2'],
      );
      if (isset($data['shp_trx_id'])) {
        $signature_data[] = 'shp_trx_id=' . $data['shp_trx_id'];
      }
      $sign = hash($this->configuration['hash_type'], implode(':', $signature_data));

      // Exit now if missing Signature.
      if (Unicode::strtoupper($robo_sign) != Unicode::strtoupper($sign)) {
        $this->logger
          ->warning('Missing Signature. 1 POST data: !data', array(
          '!data' => print_r($data, TRUE),
        ));
        return FALSE;
      }
    }
  }
  try {

    /** @var \Drupal\commerce_payment\Entity\PaymentInterface $payment */
    $payment = $this->entityTypeManager
      ->getStorage('commerce_payment')
      ->load($data['shp_trx_id']);
  } catch (InvalidPluginDefinitionException $e) {
    $this->logger
      ->warning('Missing transaction id.  POST data: !data', array(
      '!data' => print_r($data, TRUE),
    ));
    return FALSE;
  }
  $amount = new Price($data['OutSum'], $payment
    ->getAmount()
    ->getCurrencyCode());
  if (!$payment instanceof PaymentInterface) {
    $this->logger
      ->warning('Missing transaction id.  POST data: !data', array(
      '!data' => print_r($data, TRUE),
    ));
    return FALSE;
  }
  if (!$payment
    ->getAmount()
    ->equals($amount)) {
    $this->logger
      ->warning('Missing transaction id amount.  POST data: !data', array(
      '!data' => print_r($data, TRUE),
    ));
    return FALSE;
  }
  return $payment;
}