public function executeCreate() { $invoice = $this->getRoute()->getObject(); $invoice->setTransactionId(time() + rand(1, 99) . $invoice->getId()); $invoice->setPaymentSystem('qiwi'); $invoice->save(); $qiwi = QIWI::getInstance(); try { $result = $qiwi->createBill(array('phone' => substr($invoice->getUser()->getProfile()->getMobilePhone(), -10, 10), 'amount' => Currency::convertByAbbr($invoice->getAmount(), 'RUR'), 'comment' => $invoice->getDescription(), 'txn-id' => $invoice->getTransactionId())); if ($result) { $this->redirect('payment_qiwi_success'); } else { $this->redirect('payment_qiwi_fail'); } } catch (QIWIMortalCombatException $e) { $this->redirect('payment_qiwi_fail'); } }
protected function execute($arguments = array(), $options = array()) { new sfDatabaseManager($this->configuration); $invoices = Doctrine::getTable('Invoice')->createQuery('a')->where('a.is_paid = 0')->andWhere('a.payment_system = ?', 'qiwi')->execute(); $this->logSection('invoices found', $invoices->count()); $qiwi = QIWI::getInstance(); $bills = array(); foreach ($invoices as $invoice) { $bills[$invoice->getTransactionId()] = $invoice; } if (count($bills)) { $result = $qiwi->billStatus(array_keys($bills)); foreach ($result as $billId => $billStatus) { if ($billStatus['status'] == QIWI::STATUS_PAID) { $bills[$billId]->doPay($billStatus); $this->logSection('success', '#' . $bills[$billId]->getId()); } } } }
function action_status() { //1) Выбираем новые платежи квики $q = QIWI::getInstance($this->qiwiConfig); $invoice_list = DB::select("id")->from('invoice')->where('status', '=', 'N')->where('payment_id', '=', 2)->execute()->as_array(); $i_request = array(); foreach ($invoice_list as $i) { $i_request[] = $i['id']; } $q_result = $q->billStatus($i_request, true); $email = ""; foreach ($q_result as $id => $v) { if ($v['status'] != 60) { continue; } // не оплачен $content = "Order:{$id}\nAmount:{$v['amount']}\nDetails: " . print_r($v, true) . "\n\n"; $status = "success"; try { $invoice = ORM::factory('invoice', $id); if (!$invoice->loaded()) { throw new Exception("Cannot find invoice (" . $id . ")"); } // проверяем фактические параметры if (floatval($invoice->amount) != floatval($v['amount'])) { throw new Exception("Payment Data error ({$v['amount']} != {$invoice->amount})"); } // проверяем статус платежа - чтоб не проплачивать уже проведенные платежи if ($invoice->status != 'N') { throw new Exception("Invoice already processed (" . $invoice->status . ")"); } $user = ORM::factory('user', $invoice->user_id); if (!$user->loaded()) { throw new Exception("Cannot find user (" . $invoice->user_id . ")"); } // если у пользователя просрочен аккаунт - в качестве начальной даты ставим текущую. // в противном случае - дату макс. срока (если захотели докупить)!! $old_value = $user->expires; if (empty($user->expires) || Date::diff($user->expires) <= 0) { $user_date = new DateTime(); } else { $user_date = new DateTime($user->expires); } $user_date->modify("+ " . intval($invoice->days_amount) . " days"); $user->expires = $user_date->format("Y-m-d 23:59:59"); $user->user_type = 'service'; $invoice->status = 'P'; // оплачен $invoice->modify_date = Date::formatted_time('now', "Y-m-d H:i:s"); $invoice->update(); $user->update(); DB::insert('payment_log', array('user_id', 'type', 'old_value', 'new_value', 'cdate'))->values(array($invoice->user_id, "-", $old_value, $user->expires, Date::formatted_time()))->execute(); } catch (Exception $e) { $status = 'error'; $content .= $e->getMessage(); } DB::insert('invoice_log', array('invoice_id', 'status', 'content', 'cdate'))->values(array($id, $status, $content, Date::formatted_time()))->execute(); $email .= "<br>{$content}<br><hr><br>\n"; } if (!empty($email)) { // Email::send('*****@*****.**', array('*****@*****.**', 'Ассоциация автосервисов'), $feedback->title, $email_view, TRUE); Email::send('*****@*****.**', array('*****@*****.**', 'Ассоциация автосервисов'), "Уведопление об платежах QIWI", $email, TRUE); Email::send('*****@*****.**', array('*****@*****.**', 'Ассоциация автосервисов'), "Уведопление об платежах QIWI", $email, TRUE); } exit; }