예제 #1
0
 public function returnPayment(ReturnPaymentRequest $returnPaymentRequest)
 {
     $paramArray = $returnPaymentRequest->getDefinedParams(MWSUri::RETURN_PAYMENT);
     $apiNetworkClient = new ApiNetworkClient($this->options);
     $response = $apiNetworkClient->request($this->getApiUri(MWSUri::RETURN_PAYMENT), $paramArray);
     return new Responses\ReturnPaymentResponse($response->getBodyXmlDecoded());
 }
예제 #2
0
 /**
  * Вызвать запрос к сервису на возврат средств.
  * 
  * @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;
 }
예제 #3
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();
 }
예제 #4
0
if (!isset($_SERVER['DOCUMENT_ROOT']) || !strlen($_SERVER['DOCUMENT_ROOT'])) {
    $_SERVER['DOCUMENT_ROOT'] = rtrim(realpath(pathinfo(__FILE__, PATHINFO_DIRNAME) . '/../../'), '/');
}
require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/stdf.php";
//require_once($_SERVER['DOCUMENT_ROOT'] . '/classes/reserves/ReservesPayBack.php');
require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/YandexMoney3/YandexMoney3.php';
//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();