payway-ar / sdk-php-ventaonline

SDK de BackEnd para Gateway de pago Payway
MIT License
20 stars 17 forks source link

Al ejecutar un pago con CyberSource obtengo "Customer_id required" #78

Open juliangorge opened 11 months ago

juliangorge commented 11 months ago

Buenas noches,

Escribía para dejar asentado un problema que tuve en la versión 1.7 de este SDK y que intenté resolver durante un par de horas y que me costó bastante hallar en dónde fallaba.

Al intentar realizar un pago usando el Retail de Cybersource obtenía "customer_id required"


$cs_data = [
    'send_to_cs' => true,
    'channel' => 'Web',
   // 'customer_id' => '...,' Si agrego este valor, me dice que no es requerido
    'bill_to' => [
        'city' => '...,'
        'country' => 'AR',
        'email' => '...,'
        'first_name' => '...,'
        'last_name' => '...,'
        'phone_number' => '...,'
        'postal_code' => '...,'
        'state' => '...,'
        'street1' => '...,'
        'street2' => '...,'
    ],
    'ship_to' => [
        'city' => '...,'
        'country' => 'AR',
        'email' => '...,'
        'first_name' => '...,'
        'last_name' => '...,'
        'phone_number' => '...,'
        'postal_code' => '...,'
        'state' => '...,'
        'street1' => '...,'
        'street2' => '...,'
    ],
    'currency' => 'ARS',
    'amount' => round('...,' 0),
    'days_in_site' => intval(...),
    'is_guest' => false,
    'num_of_transactions' => '...,'
];

$cybersource = new \Decidir\Cybersource\Retail(
    $cs_data,  // Datos de la operación
    $cs_items, // Datos de los productos
);

Incluso utilizando el mismo ejemplo de datos que proporcionan en el README (y que entiendo que su estructura es distinta a la documentada en DecidirV2 ApiDocs) obtenía el mismo error.

Lo curioso es que si agregaba _customerid al arreglo _csdata, el mismo me dice que el dato no es requerido. Así que dicho la información "customer_id required" no es suficiente para saber dónde debe estar ubicada dicha key.

Solución: Agregué _customerid a la raiz del arreglo _csdata y agregué las siguientes modificaciones al paquete:

Clase Decidir\Cybersource\Retail:

public function setCustomerId($index, $value) {
    $this->dataSet[$index] = $value;
}

Clase Decidir\Payment, método ExecutePayment:

if(!empty($this->cybersource) && $this->cybersource['send_to_cs'] == true){
    $data['fraud_detection'] = json_decode(json_encode($this->cybersource),TRUE);
    $data['fraud_detection']['bill_to']['customer_id'] = strval($data['customer']['id']);
}

Espero que le sirva de ayuda a alguien.

santiagochiale commented 5 months ago

Hola, buen día.

A nosotros nos paso lo mismo al actualizar la versión de la 1.5 a la 2.0. En mi caso, al aplicar el fix de @juliangorge (el cual agradezco) ya no arroja error de customer_id requerido, pero para todas las tarjetas que se probaron indica error por fondos insuficientes.