/** * /robokassa/init * Инициализация транзакции и возврат json-обекта * * @param sfWebRequest $request */ public function executeInit(sfWebRequest $request) { $userId = $this->getUser()->getUserRecord()->getId(); // В качестве параметра ожидаем ID услуги (POST параметр service) $serviceId = (int) $request->getParameter("service", 0); $term = (int) $request->getParameter("term", 1); // Получаем стоимость услуги $service = Doctrine::getTable('Service')->find($serviceId); $this->forward404Unless($service); $price = $service->getPrice(); // Инициализация транзакции $transaction = new BillingTransaction(); $transaction->setUserId($userId); $transaction->setPaysystem('robokassa'); $transaction->setServiceId($serviceId); $transaction->setPrice($price); $transaction->setTerm($term); $total = round($term * $price, 2); $transaction->setTotal($total); $transaction->save(); $url = Robokassa::getScriptURL($transaction); $b = new sfWebBrowser(); $b->get($url); $text = $b->getResponseText(); $matches = array(); preg_match_all("/^(.*)document.write\\(\\'(.*)\\'\\)/isu", $text, $matches); $return = array("result" => array("script" => html_entity_decode(trim($matches[1][0])), "html" => html_entity_decode(trim($matches[2][0])))); $this->getResponse()->setHttpHeader('Content-Type', 'application/json'); return $this->renderText(json_encode($return)); }
/** * Тест каскадных удалений * */ public function testCascade() { $bt = new BillingTransaction(); // Создаем пользователя, услугу и транзакцию $user = $this->helper->makeUser(); $user->save(); $service = new Service(); $service->save(); $bt->setUserId($user->getId()); $bt->setServiceId($service->getId()); $bt->save(); // При удалении службы транзакция остается $service->delete(); $findBt = Doctrine::getTable('BillingTransaction')->find($bt->getId()); $this->assertType('BillingTransaction', $findBt); $this->assertEquals($findBt->getId(), $bt->getId()); // При удалении пользователя удаляется запись о транзакции $user->delete(); $findBt = Doctrine::getTable('BillingTransaction')->find($bt->getId()); $this->assertEquals($findBt, null); }
/** * Генерирует транзакцию для пользователя и сервиса * @param object $user * @param bool $isNew создавать ли новую транзакцию, если есть старая * @return BillingTransaction */ private function getTestTransaction($user = null, $isNew = false) { if ((is_null($this->_transaction) || $isNew) && !is_null($user)) { $service = $this->getService(); $term = 6; $transaction = new BillingTransaction(); $transaction->fromArray(array('service_id' => $service->getId(), 'price' => $service->getPrice(), 'term' => $term, 'status' => 0, 'total' => $term * $service->getPrice(), 'user_id' => $user->getId())); $transaction->save(); $this->_transaction = $transaction; } return $this->_transaction; }