/** * Вызвать запрос к сервису на возврат средств. * * @param int $id * * @return bool * * @throws BillPaybackException */ public function doPayback($id) { $paybackData = $this->db()->row("\n SELECT *\n FROM {$this->TABLE}\n WHERE id = ?i\n ", $id); //Если запроса не существует if (!$paybackData) { throw new BillPaybackException(BillPaybackException::PAYBACK_NOTFOUND); } $is_timeout = $this->isTimeout($paybackData['cnt'], $paybackData['last']); //Таймаут еще не вышел нужно поставить в очередь if (!$is_timeout) { return false; } //Превышен лимит прерываем цикл для этого запроса if ($is_timeout === -1) { throw new BillPaybackException(BillPaybackException::REQUEST_LIMIT); } $data['cnt'] = $paybackData['cnt'] + 1; $data['last'] = 'NOW()'; try { //Готовим запрос $returnPaymentRequest = new ReturnPaymentRequest(); $returnPaymentRequest->setShopId(yandex_kassa::SHOPID_DEPOSIT); $returnPaymentRequest->setClientOrderId($paybackData['id']); $returnPaymentRequest->setInvoiceId($paybackData['invoice_id']); $returnPaymentRequest->setCurrency($this->getCurrency()); $returnPaymentRequest->setCause(self::PAYBACK_CAUSE); $returnPaymentRequest->setAmount(number_format($paybackData['price'], 2, '.', '')); //Делаем запрос к API сервиса $result = $this->getApiFacade()->returnPayment($returnPaymentRequest); //Выставляем статус и код ошибки $data['status'] = $result->getStatus(); $data['error'] = !$result->isSuccess() ? $result->getError() : 0; } catch (Exception $e) { //В случае аварии при транспорте API //пишем в лог и просим поставить задачу в очередь $data['status'] = self::STATUS_FAIL; $data['error'] = 10000 + intval($e->getCode()); $this->db()->update($this->TABLE, $data, 'id = ?i', $paybackData['id']); throw new BillPaybackException($e->getMessage(), true); } $this->db()->update($this->TABLE, $data, 'id = ?i', $result->getClientOrderId()); //Ошибки при которых ставить в очередь нет смысла if (!$result->isSuccess() && in_array($result->getError(), array(403, 404, 405, 412, 413, 414, 417))) { throw new BillPaybackException(BillPaybackException::API_CRITICAL_FAIL, $result->getError()); } //Если статус еще не оплачен то нужно //повторить и поставить задачу в очередь return $data['error'] == 0; }
/** * Вызвать запрос к сервису на возврат средств. * * @param int $reserve_id * * @return bool * * @throws ReservesPaybackException */ public function doPayback($reserve_id) { $paybackData = $this->db()->row("\n SELECT *\n FROM {$this->TABLE}\n WHERE reserve_id = ?i\n ", $reserve_id); //Если запроса не существует if (!$paybackData) { throw new ReservesPaybackException(ReservesPaybackException::PAYBACK_NOTFOUND); } //Если запрос уже успешно обработан //(урал так как если вдруг неполучится сменить статус резерва возврата а возврат пройдет то можно повторить) //if($paybackData['status'] == self::STATUS_SUCCESS) // throw new ReservesPaybackException(ReservesPaybackException::ALREADY_PAYBACK_MSG); $is_timeout = $this->isTimeout($paybackData['cnt'], $paybackData['last']); //Таймаут еще не вышел нужно поставить в очередь if (!$is_timeout) { return false; } //Превышен лимит прерываем цикл для этого запроса if ($is_timeout === -1) { throw new ReservesPaybackException(ReservesPaybackException::REQUEST_LIMIT); } //Если не существует самого резерва $reserveInstance = ReservesModelFactory::getInstanceById($paybackData['reserve_id']); if (!$reserveInstance) { throw new ReservesPaybackException(ReservesPaybackException::PAYBACK_NOTFOUND); } $data['cnt'] = $paybackData['cnt'] + 1; $data['last'] = 'NOW()'; try { //Готовим запрос $returnPaymentRequest = new ReturnPaymentRequest(); $returnPaymentRequest->setShopId(yandex_kassa::SHOPID_SBR); $returnPaymentRequest->setClientOrderId($paybackData['id']); $returnPaymentRequest->setInvoiceId($paybackData['invoice_id']); $returnPaymentRequest->setCurrency($this->getCurrency()); $returnPaymentRequest->setCause(sprintf(self::PAYBACK_CAUSE, $reserveInstance->getNUM())); $returnPaymentRequest->setAmount(number_format($paybackData['price'], 2, '.', '')); //Делаем запрос к API сервиса $result = $this->getApiFacade()->returnPayment($returnPaymentRequest); //Выставляем статус и код ошибки $data['status'] = $result->getStatus(); $data['error'] = !$result->isSuccess() ? $result->getError() : 0; } catch (Exception $e) { //В случае аварии при транспорте API //пишем в лог и просим поставить задачу в очередь $data['status'] = self::STATUS_FAIL; $data['error'] = 10000 + intval($e->getCode()); $this->db()->update($this->TABLE, $data, 'id = ?i', $paybackData['id']); throw new ReservesPaybackException($e->getMessage(), true); } $this->db()->update($this->TABLE, $data, 'id = ?i', $paybackData['id']); $new_status = $this->getSubStatus($result->getStatus()); //Нет смысла менять статус так как система уже в таком же статусе //например долгий процесс ожидания if ($reserveInstance->getStatusBack() != $new_status) { //Не удалост сменить статус if (!$reserveInstance->changeBackStatus($new_status)) { throw new ReservesPaybackException(ReservesPaybackException::CANT_CHANGE_SUBSTATUS, true); } } //Ошибки при которых ставить в очередь нет смысла if (!$result->isSuccess() && in_array($result->getError(), array(403, 404, 405, 412, 413, 414, 417))) { throw new ReservesPaybackException(ReservesPaybackException::API_CRITICAL_FAIL, $result->getError()); } //Если статус еще не оплачен то нужно //повторить и поставить задачу в очередь return $reserveInstance->isStatusBackPayed(); }
//require_once($_SERVER['DOCUMENT_ROOT'] . '/classes/YandexMoney3/ReturnPaymentRequest.php'); //------------------------------------------------------------------------------ $results = array(); //------------------------------------------------------------------------------ //use YandexMoney3\Request\DepositionRequest; //use YandexMoney3\Request\BalanceRequest; use YandexMoney3\Request\ReturnPaymentRequest; use YandexMoney3\YandexMoney3; $apiMwsFacade = YandexMoney3::getMwsApiFacade(array('crypt' => array('encrypt_cert_path' => ABS_PATH . '/classes/reserves/data_mws/certnew_vaan.cer', 'private_key_path' => ABS_PATH . '/classes/reserves/data_mws/private_mws.key', 'passphrase' => 'swirls53.quarks'), 'uri_test' => 'https://penelope-demo.yamoney.ru:8083', 'uri_main' => 'https://penelope.yamoney.ru', 'is_test' => true)); $returnPaymentRequest = new ReturnPaymentRequest(); $returnPaymentRequest->setShopId(17233); $returnPaymentRequest->setClientOrderId(777); $returnPaymentRequest->setInvoiceId(888); $returnPaymentRequest->setCurrency(10643); //643 $returnPaymentRequest->setCause('Возврат средств Заказчику БС#00001 по решению арбитража.'); $returnPaymentRequest->setAmount('1.0'); //print_r($returnPaymentRequest->getDefinedParams()); try { $result = $apiMwsFacade->returnPayment($returnPaymentRequest); } catch (\Exception $e) { $results['test Error Message'] = $e->getMessage(); } if ($result) { $results['test isSuccess'] = $result->isSuccess(); $results['test getDefinedParams'] = print_r($result->getDefinedParams(), true); } /* $reservePayBack = new ReservesPayBack(); */ //------------------------------------------------------------------------------