2010-03-25 5 views
10

Necesito una función que analice correctamente NVP en matriz de PHP. He estado usando el código provisto por PayPal, pero no funcionó cuando se especificó la longitud de la cadena al lado del nombre.¿Cuál es la mejor manera de analizar Paypal NVP en PHP?

Esto es lo que tengo hasta ahora.

private function parseNVP($nvpstr) 
{ 
    $intial=0; 
    $nvpArray = array(); 

    while(strlen($nvpstr)) 
    { 
     //postion of Key 
     $keypos= strpos($nvpstr,'='); 
     //position of value 
     $valuepos = strpos($nvpstr,'&') ? strpos($nvpstr,'&'): strlen($nvpstr); 

     /*getting the Key and Value values and storing in a Associative Array*/ 
     $keyval=substr($nvpstr,$intial,$keypos); 
     $vallength=$valuepos-$keypos-1; 
     // check if the length is explicitly specified 
     if($braketpos = strpos($keyval,'[')) 
     { 
      // override value length 
      $vallength = substr($keyval,$braketpos+1,strlen($keyval)-$braketpos-2); 
      // get rid of brackets from key name 
      $keyval = substr($keyval,0,$braketpos); 
     } 
     $valval=substr($nvpstr,$keypos+1,$vallength); 
     //decoding the respose 
     if (isValidXMLString("<".urldecode($keyval).">".urldecode($valval)."</".urldecode($keyval).">")) 
      $nvpArray[urldecode($keyval)] =urldecode($valval); 
     $nvpstr=substr($nvpstr,$keypos+$vallength+2,strlen($nvpstr)); 
    } 
    return $nvpArray; 
} 

Esta función funciona la mayor parte del tiempo.

Respuesta

15

La mejor manera es la función parse_str. Analizará una cadena URLencoded en una matriz de PHP.

lo que el código se vería así:

private function parseNVP($nvpstr) 
{ 
    $paypalResponse = array(); 
    parse_str($nvpstr,$paypalResponse); 
    return $paypalResponse; 
} 
+0

Esto es incorrecto desde parse_str en "nota [6] = aaaaa cosas = 2" se traducirá en array ('nota' => array (5 => 'aaaaa '),' cosas' => 2) el resultado debe ser array ('note' => 'aaaaa', 'cosas' => 2) –

+4

No. El resultado no debe ser 'array ('note' => 'aaaaa', 'cosas' => 2)' . para eso tendrías "note = aaaaa & stuff = 2". Mi respuesta no es incorrecta Construí una integración de puerta de enlace de pago de PayPal en PHP usando el código que envié. Procesa miles de transacciones al mes sin problemas. – Josh

+2

La longitud de la cadena no se debe especificar al lado de la cadena así. No es así como funciona PayPal NVP. Lee su manual. "La solicitud y la respuesta tienen codificación URL" https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_nvp_NVPAPIOverview – Josh

0

googlear mucho que he encontrado esto:

function deformatNVP($nvpstr) { 

    $intial=0; 
    $nvpArray = array(); 


    while(strlen($nvpstr)){ 
     //postion of Key 
     $keypos= strpos($nvpstr,'='); 
     //position of value 
     $valuepos = strpos($nvpstr,'&') ? strpos($nvpstr,'&'): strlen($nvpstr); 

     /*getting the Key and Value values and storing in a Associative Array*/ 
     $keyval=substr($nvpstr,$intial,$keypos); 
     $valval=substr($nvpstr,$keypos+1,$valuepos-$keypos-1); 
     //decoding the respose 
     $nvpArray[urldecode($keyval)] =urldecode($valval); 
     $nvpstr=substr($nvpstr,$valuepos+1,strlen($nvpstr)); 
    } 
    return $nvpArray; 
} 

Source.

NO poseo este código y no lo he probado, así que úselo con cuidado.

Cuestiones relacionadas