2010-03-25 5 views
10

Ho bisogno di una funzione che analizzerà correttamente NVP in array PHP. Ho usato il codice fornito da paypal ma non ha funzionato per quando la lunghezza della stringa è stata specificata accanto al nome.Qual è il modo migliore per analizzare Paypal NVP in PHP?

Ecco quello che ho finora.

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; 
} 

Questa funzione funziona la maggior parte del tempo.

risposta

15

Il modo migliore è la funzione parse_str. Analizzerà una stringa con codifica URL in un array PHP.

Quindi il codice sarà simile:

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

Questo non è corretto in quanto parse_str su "nota [6] = aaaaa roba = 2" si tradurrà in array ('note' => array (5 => 'AAAAA '),' roba' => 2) il risultato dovrebbe essere array ('note' => 'aaaaa', 'stuff' => 2) –

+4

No. Il risultato non dovrebbe essere 'array ('note' => 'aaaaa', 'stuff' => 2)' . per questo avresti "note = aaaaa & stuff = 2". La mia risposta non è errata. Ho costruito un'integrazione di gateway di pagamento paypal in PHP utilizzando il codice che ho inviato. Elabora migliaia di transazioni al mese bene. – Josh

+2

La lunghezza della stringa non deve essere specificata accanto alla stringa in questo modo. Non è così che funziona PayPal NVP. Leggi il loro manuale. "La richiesta e la risposta sono codificate tramite URL" https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_nvp_NVPAPIOverview – Josh

0

Googling molto ho trovato questo:

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.

NON possiedo questo codice e non l'ho testato, quindi usarlo con attenzione.