API-3.0-PHP icon indicating copy to clipboard operation
API-3.0-PHP copied to clipboard

SANDBOX :: capture sale - return Request error, code 400

Open ozzpy opened this issue 4 years ago • 3 comments

Tenho a implementacao da API 3.0 ja desenvolvida a meses, tudo estava normal ate alguns dias, o paymentId é gerado normalmente porem ao tentar capturar retorna RequestError code 400,consultei a documentacao e segue a mesma.

` public function paymentWithToken(CreditCardPaymentWithToken $creditCardPaymentWithToken): array {

    $environment = $this->getEnvironment();
    $merchant    = $this->getMerchant();

    $sale     = new Sale($creditCardPaymentWithToken->orderId);
    $customer = $sale->customer($creditCardPaymentWithToken->customerName);

    $payment  = $sale->payment($creditCardPaymentWithToken->orderAmount);
    $payment->setType(Payment::PAYMENTTYPE_CREDITCARD)

            ->creditCard($creditCardPaymentWithToken->cardCVV, $creditCardPaymentWithToken->cardBrand)
            ->setCardToken($creditCardPaymentWithToken->cardToken);

    try {
        $sale      = (new CieloEcommerce($merchant, $environment))->createSale($sale);
        $paymentId = $sale->getPayment()->getPaymentId();


        $captureSale = (new CieloEcommerce($merchant, $environment))
                    ->captureSale($paymentId, $creditCardPaymentWithToken->orderAmount, 0);

        $captured = [
            'authorizationCode' => $captureSale->getAuthorizationCode(),
            'returnCode'        => $captureSale->getReturnCode(),
            'returnMessage'     => $captureSale->getReturnMessage(),
            'status'            => $captureSale->getStatus(),
            'tid'               => $captureSale->getTid(),
        ];

        switch ($captureSale->getReturnCode()) {
            case "4":
            case "6":
                $status = "success";
                $message = "Operação realizada com sucesso";
                break;
            case "05":
                $status = "error";
                $message = "Não Autorizada";
                break;
            case "57":
                $status = "error";
                $message = "Cartão Expirado";
                break;
            case "78":
                $status = "error";
                $message = "Cartão Bloqueado";
                break;
            case "99":
                $status = "error";
                $message = "Tempo Excedido";
                break;
            case "77":
                $status = "error";
                $message = "Cartão Cancelado";
                break;
            case "70":
            default:
                $status = "error";
                $message = "Problemas com o Cartão de Crédito";
                break;
        }

        return [
            'status'=>$status,
            'private_message'=>$message,
            'paymentId'=>$paymentId,
            'captureSale'=>$captured
        ];


    } catch (CieloRequestException $e) {
        return [
            'status'=>'error',
            //'private_message'=>$e->getCode().'::'.$e->getMessage().'::'.$e->getTraceAsString(),
            'private_message'=>$e->getCode().'::'.$e->getMessage(),
            'paymentId'=>null,
            'captureSale'=>null
        ];
    }
}`

ozzpy avatar Dec 27 '20 20:12 ozzpy

tambem tentei fazer a requisicao manualmente e tive outro tipo de retorno `
public function capturePaymentInternal($paymentId,$amount) {

    //{{apiUrl}}/1/sales/{{paymentId}}/capture
    $headers = new Headers();
    $headers->addHeaderLine("MerchantId", $this->cielo_merchant_id);
    $headers->addHeaderLine("MerchantKey", $this->cielo_merchant_key);
    $headers->addHeaderLine("Content-Type", 'text/json');
    $headers->addHeaderLine("Content-Length", 0);

    $url = $this->cielo_url_request."/1/sales/".$paymentId."/capture?amount=".$amount;
    $client = new Client();
    $client->setUri($url);
    $client->setHeaders($headers);
    $client->setMethod('PUT');

    $response = $client->send();
    return [$response->getBody(),$paymentId];
}`

retorno "[\r\n {\r\n "Code": 308,\r\n "Message": "Transaction not available to capture"\r\n }\r\n]", "08807f32-b864-400d-9f72-bc985c6e070f"

ozzpy avatar Dec 28 '20 12:12 ozzpy

Apos dias de analise e tentar alguma solucao usado o SDK, implementei minha propria API conforme documentacao da Cielo. Porem achei uma segunda alternativa que seria, ja passar o parametro de captura no momento da requisicao, apos isso apenas pego a informacao da transacao via paymentID, tentando capturar apos gerar o paymentID, continua retornando erro.

`environment = $this->getEnvironment(); $merchant = $this->getMerchant();

    $sale     = new Sale($creditCardPaymentWithToken->orderId);
    $customer = $sale->customer($creditCardPaymentWithToken->customerName);

    $payment  = $sale->payment($creditCardPaymentWithToken->orderAmount);
    // passar parametros de captura
    $payment->setCapture(true);
    $payment->setCapturedAmount($creditCardPaymentWithToken->orderAmount);

    $payment->setType(Payment::PAYMENTTYPE_CREDITCARD)
            ->creditCard($creditCardPaymentWithToken->cardCVV, $creditCardPaymentWithToken->cardBrand)
            ->setCardToken($creditCardPaymentWithToken->cardToken);

    try {

        
        $createSale = (new CieloEcommerce($merchant, $environment))->createSale($sale);
        $paymentId  = $createSale->getPayment()->getPaymentId();

        //metodo interno onde faco uma simples consulta via paymentID
        $paymentInfo = $this->getPaymentInfo($paymentId);
        $payment     = $paymentInfo['payment']['payment'];

        $captured = [
            'authorizationCode' => $payment->getAuthorizationCode(),
            'returnCode'        => $payment->getReturnCode(),
            'returnMessage'     => $payment->getReturnMessage(),
            'status'            => $payment->getStatus(),
            'tid'               => $payment->getTid(),
        ];

        switch ($captureSale->getReturnCode()) {
            case "4":
            case "6":
                $status = "success";
                $message = "Operação realizada com sucesso";
                break;
            case "05":
                $status = "error";
                $message = "Não Autorizada";
                break;
            case "57":
                $status = "error";
                $message = "Cartão Expirado";
                break;
            case "78":
                $status = "error";
                $message = "Cartão Bloqueado";
                break;
            case "99":
                $status = "error";
                $message = "Tempo Excedido";
                break;
            case "77":
                $status = "error";
                $message = "Cartão Cancelado";
                break;
            case "70":
            default:
                $status = "error";
                $message = "Problemas com o Cartão de Crédito";
                break;
        }

        return [
            'status'=>$status,
            'private_message'=>$message,
            'paymentId'=>$paymentId,
            'captureSale'=>$captured
        ];
    } catch (CieloRequestException $e) {
        return [
            'status'=>'error',
            //'private_message'=>$e->getCode().'::'.$e->getMessage().'::'.$e->getTraceAsString(),
            'private_message'=>$e->getCode().'::'.$e->getMessage(),
            'paymentId'=>null,
            'captureSale'=>null
        ];
    }`

ozzpy avatar Jan 07 '21 22:01 ozzpy

@ozzpy vc conseguiu integrar? To recebendo o mesmo erro 308 em algumas transações, e não faço ideia de onde mexer kkk

dimaspante avatar Jan 31 '22 11:01 dimaspante