public function onCaptured($response) { $order = $this->owner->Order(); if ($order->exists()) { OrderProcessor::create($order)->completePayment(); } }
public function testOffsitePaymentWithGatewayCallback() { //set up cart $cart = ShoppingCart::singleton()->setCurrent($this->objFromFixture("Order", "cart"))->current(); //collect checkout details $cart->update(array('FirstName' => 'Foo', 'Surname' => 'Bar', 'Email' => '*****@*****.**')); $cart->write(); //pay for order with external gateway $processor = OrderProcessor::create($cart); $this->setMockHttpResponse('PaymentExpress/Mock/PxPayPurchaseSuccess.txt'); $response = $processor->makePayment("PaymentExpress_PxPay", array()); //gateway responds (in a different session) $oldsession = $this->mainSession; $this->mainSession = new TestSession(); ShoppingCart::singleton()->clear(); $this->setMockHttpResponse('PaymentExpress/Mock/PxPayCompletePurchaseSuccess.txt'); $this->getHttpRequest()->query->replace(array('result' => 'abc123')); $identifier = $response->getPayment()->Identifier; $response = $this->get("paymentendpoint/{$identifier}/complete"); //reload cart as new order $order = Order::get()->byId($cart->ID); $this->assertFalse($order->isCart(), "order is no longer in cart"); $this->assertTrue($order->isPaid(), "order is paid"); //bring back client session $this->mainSession = $oldsession; $response = $this->get("paymentendpoint/{$identifier}/complete"); $this->assertNull(Session::get("shoppingcartid"), "cart session id should be removed"); $this->assertNotEquals(404, $response->getStatusCode(), "We shouldn't get page not found"); $this->markTestIncomplete("Should assert other things"); }
public function testPlacedOrderImmutability() { $order = $this->objFromFixture("Order", "paid"); $processor = OrderProcessor::create($order)->placeOrder(); $this->assertEquals(408, $order->Total(), "check totals"); //make a changes to existing products $this->mp3player->BasePrice = 100; $this->mp3player->write(); $this->socks->BasePrice = 20; $this->socks->write(); //total doesn't change $this->assertEquals(408, $order->Total()); $this->assertFalse($order->isCart()); //item values don't change $items = $order->Items()->innerJoin("Product_OrderItem", '"OrderItem"."ID" = "Product_OrderItem"."ID"'); $this->assertNotNull($items); $this->assertDOSEquals(array(array('ProductID' => $this->mp3player->ID, 'Quantity' => 2, 'CalculatedTotal' => 400), array('ProductID' => $this->socks->ID, 'Quantity' => 1, 'CalculatedTotal' => 8)), $items); $mp3player = $items->find('ProductID', $this->mp3player->ID); //join needed to provide ProductID $this->assertNotNull($mp3player, "MP3 player is in order"); $this->assertEquals(200, $mp3player->UnitPrice(), "Unit price remains the same"); $this->assertEquals(400, $mp3player->Total(), "Total remains the same"); $socks = $items->find('ProductID', $this->socks->ID); $this->assertNotNull($socks, "Socks are in order"); $this->assertEquals(8, $socks->UnitPrice(), "Unit price remains the same"); $this->assertEquals(8, $socks->Total(), "Total remains the same"); }
/** * Make payment for a place order, where payment had previously failed. * * @param array $data * @param Form $form * * @return boolean */ public function dopayment($data, $form) { if (self::config()->allow_paying && $this->order && $this->order->canPay()) { // Save payment data from form and process payment $data = $form->getData(); $gateway = !empty($data['PaymentMethod']) ? $data['PaymentMethod'] : null; if (!GatewayInfo::is_manual($gateway)) { $processor = OrderProcessor::create($this->order); $data['cancelUrl'] = $processor->getReturnUrl(); $response = $processor->makePayment($gateway, $data); if ($response) { if ($response->isRedirect() || $response->isSuccessful()) { return $response->redirect(); } $form->sessionMessage($response->getMessage(), 'bad'); } else { $form->sessionMessage($processor->getError(), 'bad'); } } else { $form->sessionMessage(_t('OrderActionsForm.MANUAL_NOT_ALLOWED', "Manual payment not allowed"), 'bad'); } return $this->controller->redirectBack(); } $form->sessionMessage(_t('OrderForm.COULDNOTPROCESSPAYMENT', 'Payment could not be processed.'), 'bad'); $this->controller->redirectBack(); }
public function onPendingAuthorize($response) { $order = $this->owner->Order(); if ($order->exists()) { OrderProcessor::create($order)->placeOrder(); } }
protected function placeOrder() { // ensure order is being reloaded from DB, to prevent dealing with stale data! /** @var Order $order */ $order = Order::get()->byID($this->owner->OrderID); if ($order && $order->exists()) { OrderProcessor::create($order)->placeOrder(); } }
/** * Make payment for a place order, where payment had previously failed. * * @param array $data * @param Form $form * * @return boolean */ public function dopayment($data, $form) { if (self::config()->allow_paying && $this->order && $this->order->canPay()) { // Save payment data from form and process payment $data = $form->getData(); $gateway = !empty($data['PaymentMethod']) ? $data['PaymentMethod'] : null; if (!GatewayInfo::isManual($gateway)) { /** @var OrderProcessor $processor */ $processor = OrderProcessor::create($this->order); $response = $processor->makePayment($gateway, $data, $processor->getReturnUrl()); if ($response && !$response->isError()) { return $response->redirectOrRespond(); } else { $form->sessionMessage($processor->getError(), 'bad'); } } else { $form->sessionMessage(_t('OrderActionsForm.ManualNotAllowed', "Manual payment not allowed"), 'bad'); } return $this->controller->redirectBack(); } $form->sessionMessage(_t('OrderForm.CouldNotProcessPayment', 'Payment could not be processed.'), 'bad'); $this->controller->redirectBack(); }
/** * Helper function that populates a form with data and submits it. */ protected function placeOrder($firstname, $surname, $email, $address1, $address2 = null, $city = null, $state = null, $postcode = null, $country = null, $password = null, $confirmpassword = null, $member = null) { $data = array('FirstName' => $firstname, 'Surname' => $surname, 'Email' => $email, 'Address' => $address1, 'City' => $city, 'State' => $state); if ($address2) { $data['AddressLine2'] = $address2; } if ($postcode) { $data['PostalCode'] = $postcode; } if ($country) { $data['Country'] = $country; } if ($password) { $data['Password[_Password]'] = $password; } if ($confirmpassword) { $data['Password[_ConfirmPassword]'] = $confirmpassword; } $order = $this->shoppingcart->current(); $order->update($data); $address = new Address(); $address->update($data); $address->write(); $order->ShippingAddressID = $address->ID; $order->BillingAddressID = $address->ID; //same (for now) if ($member) { $order->MemberID = $member->ID; } $order->write(); $this->processor = OrderProcessor::create($order); return $this->processor->placeOrder(); }
public function testOrderPlacedByGuest() { // start a new order $order = $this->objFromFixture("Order", "cart1"); $order->FirstName = "Edmund"; $order->Surname = "Hillary"; $order->Email = "*****@*****.**"; $order->Status = "Unpaid"; $order->write(); $no_log_generated_with_order_status_unpaid = OrderStatusLog::get()->sort('ID')->last(); $this->assertNull($no_log_generated_with_order_status_unpaid, "no log generated with Status of 'Unpaid'"); $processor_guest = OrderProcessor::create($order); $response = $processor_guest->makePayment("Manual", array()); $order->Status = "Paid"; $order->write(); $log_order_status_paid = OrderStatusLog::get()->sort('ID')->last(); $this->assertNull($log_order_status_paid, "no log generated with Status of 'Unpaid'"); $order->Status = "Processing"; $order->write(); $log_order_status_processing = OrderStatusLog::get()->sort('ID')->last(); $this->assertEquals(OrderStatusLog::get()->count(), '1', "One items in the OrderStatusLog"); $this->assertNotNull($log_order_status_processing, "a log when changing to 'Processing' status (and PaymentMethod is 'Manual')"); $this->assertSame($log_order_status_processing->Order()->ID, $order->ID, "Log conatins an Order"); $this->assertContains("Processing", $log_order_status_processing->Note, "Processing note is recorded"); $this->assertContains(' changed to "Processing"', $log_order_status_processing->Title, "Processing title is recorded"); $this->assertEmailSent("*****@*****.**", "*****@*****.**", _t('ShopEmail.StatusChangeSubject') . $log_order_status_processing->Title); }