payway-ar / sdk-php-ventaonline

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

invalid_param: fraud_detection.retail_transaction_data.items[0].total_amount (o unit_price) #56

Open Nanod10 opened 1 year ago

Nanod10 commented 1 year ago

Hola, bueno llevo ya unas horas tratando de resolver este error y pues lo he logrado, al menos en las pruebas que he echo funciono.

[
  {
    "code": "invalid_param",
    "param": "fraud_detection.retail_transaction_data.items.[0].total_amount"
  },
  {
    "code": "invalid_param",
    "param": "fraud_detection.retail_transaction_data.items.[0].unit_price"
  }
]

Al debuguear manualmente me encontré con estos valores en el request

retail_transaction_data.items contenia:

[
  {
    "code": "2774-0",
    "description": "Aislador doble Garra San Miguel ",
    "name": "Aislador doble Garra San Miguel ",
    "sku": "2774-0",
    "total_amount": 8131.999999999999,
    "quantity": 1,
    "unit_price": 8131.999999999999
  },
  {
    "code": "3947-0",
    "description": "Aislador Clavar doble Plyrap",
    "name": "Aislador Clavar doble Plyrap",
    "sku": "3947-0",
    "total_amount": 3435,
    "quantity": 1,
    "unit_price": 3435
  },
  {
    "code": "1178-0",
    "description": "Aislador Plastico Regulable N1 San Miguel",
    "name": "Aislador Plastico Regulable N1 San Miguel",
    "sku": "1178-0",
    "total_amount": 12353,
    "quantity": 1,
    "unit_price": 12353
  },
  {
    "code": "2396-0",
    "description": "Aislador Rienda Super Reforzado San Miguel",
    "name": "Aislador Rienda Super Reforzado San Miguel",
    "sku": "2396-0",
    "total_amount": 16993,
    "quantity": 1,
    "unit_price": 16993
  }
]

Observen que el item 0 tiene varios decimales 9, ese importe deberia haber sido 8132 (entero)

Resulta que a lo largo de la librería se utilizaba un método para formatear los montos:

public function rmDecAmount($amount){
    $formatedAmount = intval($amount*100);  
    return $formatedAmount;
}

Pues he observado que en las Clases de las Verticales de Cybersource este método no se utiliza... y se efectúa la misma conversión pero.... sin castear o convertir a numero entero

Por Ejemplo: Versión: 1.5.6 Archivo: Decidir\lib\Cybersource\Retail.php Linea: 104 $product[$idProd] = ($product[$idProd]*100); y debería tener al menos un casteo: $product[$idProd] = (int) ($product[$idProd]*100);

Les dejo un Pull Request: https://github.com/payway-ar/sdk-php-ventaonline/pull/55

Saludos!