web-dev-qa-db-fra.com

Recevez JSON POST avec PHP

J'essaie de recevoir un JSON POST sur un site Web d'interface de paiement, mais je ne parviens pas à le décoder.

Quand j'imprime:

echo $_POST;

Je reçois:

Array

Je ne reçois rien quand j'essaye ceci:

if ( $_POST ) {
    foreach ( $_POST as $key => $value ) {
        echo "llave: ".$key."- Valor:".$value."<br />";
    }
}

Je ne reçois rien quand j'essaye ceci:

$string = $_POST['operation'];
$var = json_decode($string);
echo $var;

Je reçois NULL quand j'essaye ceci:

$data = json_decode( file_get_contents('php://input') );
var_dump( $data->operation );

Quand je fais:

$data = json_decode(file_get_contents('php://input'), true);
var_dump($data);

Je reçois:

NULL

Le format JSON est (selon la documentation du site de paiement):

{
   "operacion": {
       "tok": "[generated token]",
       "shop_id": "12313",
       "respuesta": "S",
       "respuesta_details": "respuesta S",
       "extended_respuesta_description": "respuesta extendida",
       "moneda": "PYG",
       "monto": "10100.00",
       "authorization_number": "123456",
       "ticket_number": "123456789123456",
       "response_code": "00",
       "response_description": "Transacción aprobada.",
       "security_information": {
           "customer_ip": "123.123.123.123",
           "card_source": "I",
           "card_country": "Croacia",
           "version": "0.3",
           "risk_index": "0"
       }
    }
}

Le journal du site de paiement indique que tout est OK. Quel est le problème?

241
Pablo Ramirez

Essayer;

$data = json_decode(file_get_contents('php://input'), true);
print_r($data);
echo $data["operacion"];

D'après votre code json et votre code, il semble que vous ayez correctement orthographié le mot opération, mais ce n'est pas dans le code json.

EDIT

Peut-être aussi intéressant d'essayer de faire écho à la chaîne JSON de php: // input.

echo file_get_contents('php://input');
423
Dom

Si vous avez déjà défini vos paramètres comme $ _POST ['eg' '] par exemple et que vous ne souhaitez pas le modifier, procédez comme suit:

$_POST = json_decode(file_get_contents('php://input'), true);

Cela vous évitera d'avoir à remplacer tout $ _POST par autre chose et vous permettra de faire des demandes de publication normales si vous souhaitez supprimer cette ligne.

69
Steve Chan

Utilisez $HTTP_RAW_POST_DATA au lieu de $_POST.

Cela vous donnera POST les données telles quelles.

Vous pourrez le décoder à l'aide de json_decode() ultérieurement.

37
Urisavka

Il est à noter que si vous utilisez json_decode(file_get_contents("php://input")) (comme d'autres l'ont déjà mentionné), cela échouera si la chaîne est un pas un JSON valide .

Cela peut être simplement résolu en vérifiant d'abord si le JSON est valide. c'est à dire.

function isValidJSON($str) {
   json_decode($str);
   return json_last_error() == JSON_ERROR_NONE;
}

$json_params = file_get_contents("php://input");

if (strlen($json_params) > 0 && isValidJSON($json_params))
  $decoded_params = json_decode($json_params);

Modifier: Notez que la suppression de strlen($json_params) ci-dessus peut entraîner des erreurs subtiles, car json_last_error() ne ne change pas lorsque null ou une chaîne vide est passée, comme indiqué ici: http://ideone.com/va3u8

29
XtraSimplicity

Lire la doc:

En général, php: // input devrait être utilisé à la place de $ HTTP_RAW_POST_DATA.

comme dans le php Manual

11
giuseppe
$data = file_get_contents('php://input');
echo $data;

Cela a fonctionné pour moi.

8
hyperCoder