Skip to content
Snippets Groups Projects
Commit bc6f9b5e authored by Sascha Grossenbacher's avatar Sascha Grossenbacher
Browse files

Issue #3128246 by tcrawford, Berdir: Payment state incorrectly set for payment...

Issue #3128246 by tcrawford, Berdir: Payment state incorrectly set for payment with immediate settlement
parent 1496975c
Branches
Tags
No related merge requests found
......@@ -4,3 +4,30 @@ commerce_payment.commerce_payment_gateway.plugin.datatrans:
redirect_method:
type: string
label: 'Redirect method'
merchant_id:
type: string
label: 'Merchant ID'
service_url:
type: string
label: 'Service URL'
req_type:
type: string
label: 'Request type'
use_alias:
type: boolean
label: 'Use Alias'
security_level:
type: integer
label: 'Security level'
sign:
type: string
label: 'Sign'
hmac_key:
type: string
label: 'HMAC key'
use_hmac_2:
type: boolean
label: 'Use HMAC 2 key'
hmac_key_2:
type: string
label: 'HMAC 2 key'
......@@ -5,6 +5,7 @@ namespace Drupal\commerce_datatrans\Plugin\Commerce\PaymentGateway;
use Drupal\commerce_datatrans\DatatransHelper;
use Drupal\commerce_order\Entity\OrderInterface;
use Drupal\commerce_payment\CreditCard;
use Drupal\commerce_payment\Entity\PaymentInterface;
use Drupal\commerce_payment\Entity\PaymentMethod;
use Drupal\commerce_payment\Entity\PaymentMethodInterface;
use Drupal\commerce_payment\Exception\PaymentGatewayException;
......@@ -351,10 +352,11 @@ class Datatrans extends OffsitePaymentGatewayBase {
return FALSE;
}
/** @var \Drupal\commerce_payment\Entity\PaymentInterface $payment */
$payment = $payment_storage->create([
'state' => 'authorization',
'amount' => $order->getTotalPrice(),
'payment_gateway' => $this->entityId,
'payment_gateway' => $this->parentEntity->id(),
'order_id' => $order->id(),
'test' => $this->getMode() == 'test',
'remote_id' => $post_data['uppTransactionId'],
......@@ -363,6 +365,10 @@ class Datatrans extends OffsitePaymentGatewayBase {
]);
$payment->save();
if ($this->shouldCompletePayment($post_data['reqtype'], $payment)) {
$this->completePayment($payment);
}
// Create a payment method if we use alias.
if (isset($post_data['useAlias']) && $post_data['useAlias'] === 'true') {
$payment_method = $this->createPaymentMethod($post_data);
......@@ -416,4 +422,35 @@ class Datatrans extends OffsitePaymentGatewayBase {
// Delete the local entity.
$payment_method->delete();
}
/**
* Checks if payment should be completed.
*
* @param string $reqtype
* The request type.
* @param \Drupal\commerce_payment\Entity\PaymentInterface $payment
* The payment entity.
*
* @return bool
* TRUE if the payment should be marked as completed.
*/
protected function shouldCompletePayment(string $reqtype, PaymentInterface $payment): bool {
if ($reqtype === 'CAA' && $payment->getState()->value === 'authorization') {
return TRUE;
}
return FALSE;
}
/**
* Completes a payment.
*
* @param \Drupal\commerce_payment\Entity\PaymentInterface $payment
* The payment entity.
*/
protected function completePayment(PaymentInterface $payment) {
$payment->setState('completed');
$payment->save();
}
}
<?php
namespace Drupal\Tests\commerce_datatrans\Kernel;
use Drupal\commerce_order\Entity\OrderItemType;
use Drupal\commerce_payment\Entity\PaymentGateway;
use Drupal\Tests\commerce\Kernel\CommerceKernelTestBase;
use Drupal\commerce_datatrans\Plugin\Commerce\PaymentGateway\Datatrans;
use Symfony\Component\HttpFoundation\Request;
/**
* @coversDefaultClass \Drupal\commerce_datatrans\Plugin\Commerce\PaymentGateway\Datatrans
*
* @group commerce_datatrans
*/
class DatatransKernelTest extends CommerceKernelTestBase {
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The order.
*
* @var \Drupal\commerce_order\Entity\OrderInterface
*/
protected $order;
public static $modules = [
'entity_reference_revisions',
'state_machine',
'profile',
'commerce_number_pattern',
'commerce_order',
'commerce_payment',
'commerce_datatrans',
];
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
$this->installEntitySchema('commerce_order');
$this->installEntitySchema('commerce_order_item');
$this->installEntitySchema('commerce_payment');
$this->installConfig(['commerce_order']);
OrderItemType::create([
'id' => 'default',
'label' => 'Default',
'orderType' => 'default',
])->save();
$this->entityTypeManager = $this->container->get('entity_type.manager');
// Create an order.
$this->order = $this->entityTypeManager->getStorage('commerce_order')->create([
'type' => 'default',
'order_number' => '1',
'store_id' => $this->store->id(),
'state' => 'draft',
]);
$this->order->save();
$order_item = $this->entityTypeManager->getStorage('commerce_order_item')->create([
'type' => 'default',
'unit_price' => [
'number' => '999',
'currency_code' => 'USD',
],
]);
$order_item->save();
$this->order->setItems([$order_item]);
$this->order->save();
}
/**
* @covers ::onReturn
* @covers ::validateResponseData
* @covers ::processPayment
*/
public function testOnReturnComplete() {
// Initialize the datatrans gateway.
$payment_gateway = PaymentGateway::create([
'id' => 'datatrans_id',
'plugin' => 'datatrans',
]);
$payment_gateway->save();
$configuration = [
'_entity' => $payment_gateway,
];
$gateway_plugin_manager = $this->container->get('plugin.manager.commerce_payment_gateway');
$datatrans = new Datatrans($configuration, 'datatrans', $gateway_plugin_manager->getDefinition('datatrans'), $this->entityTypeManager, $this->container->get('plugin.manager.commerce_payment_type'), $this->container->get('plugin.manager.commerce_payment_method_type'), $this->container->get('datetime.time'), $this->container->get('logger.factory'));
// Create the request and call onReturn().
$request = Request::create('', 'POST');
$request->request->add([
'refno' => $this->order->id(),
'status' => 'success',
'security_level' => 2,
'uppTransactionId' => 123,
'authorizationCode' => 456,
'amount' => 999,
'currency' => 'USD',
'sign2' => 'f6ecaff66282456e3a949e0ef19daf4453bf70682bda2e981fd1193ea9da7833',
'responseMessage' => 'test',
'reqtype' => 'CAA',
]);
$datatrans->onReturn($this->order, $request);
$payments = $this->entityTypeManager->getStorage('commerce_payment')->loadMultiple(NULL);
$this->assertCount(1, $payments);
/** @var \Drupal\commerce_payment\Entity\PaymentInterface $payment */
$payment = reset($payments);
$this->assertEquals('completed', $payment->getState()->value);
$this->assertEquals(123, $payment->getRemoteId());
$this->assertEquals($this->order->getTotalPrice(), $payment->getAmount());
$this->assertEquals('datatrans_id', $payment->getPaymentGatewayId());
}
/**
* @covers ::onReturn
* @covers ::validateResponseData
* @covers ::processPayment
*/
public function testOnReturnAuthorizeOnly() {
// Initialize the datatrans gateway.
$payment_gateway = PaymentGateway::create([
'id' => 'datatrans_id',
'plugin' => 'datatrans',
]);
$payment_gateway->save();
$configuration = [
'_entity' => $payment_gateway,
];
$gateway_plugin_manager = $this->container->get('plugin.manager.commerce_payment_gateway');
$datatrans = new Datatrans($configuration, 'datatrans', $gateway_plugin_manager->getDefinition('datatrans'), $this->entityTypeManager, $this->container->get('plugin.manager.commerce_payment_type'), $this->container->get('plugin.manager.commerce_payment_method_type'), $this->container->get('datetime.time'), $this->container->get('logger.factory'));
// Create the request and call onReturn().
$request = Request::create('', 'POST');
$request->request->add([
'refno' => $this->order->id(),
'status' => 'success',
'security_level' => 2,
'uppTransactionId' => 123,
'authorizationCode' => 456,
'amount' => 999,
'currency' => 'USD',
'sign2' => 'f6ecaff66282456e3a949e0ef19daf4453bf70682bda2e981fd1193ea9da7833',
'responseMessage' => 'test',
'reqtype' => 'NOA',
]);
$datatrans->onReturn($this->order, $request);
$payments = $this->entityTypeManager->getStorage('commerce_payment')->loadMultiple(NULL);
$this->assertCount(1, $payments);
/** @var \Drupal\commerce_payment\Entity\PaymentInterface $payment */
$payment = reset($payments);
$this->assertEquals('authorization', $payment->getState()->value);
$this->assertEquals(123, $payment->getRemoteId());
$this->assertEquals($this->order->getTotalPrice(), $payment->getAmount());
$this->assertEquals('datatrans_id', $payment->getPaymentGatewayId());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment