在PHP中解析PayPal NVP的最佳方式是什么?

问题描述:

我需要一个将NVP正确解析为PHP数组的函数。我一直在使用贝宝提供的代码,但是它在名称旁边指定字符串长度时不起作用。在PHP中解析PayPal NVP的最佳方式是什么?

这是我到目前为止。

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

该功能在大多数情况下都有效。

最好的方法是parse_str函数。它会将一个URL编码的字符串解析为一个PHP数组。

所以,你的代码看起来像:

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

这是不正确,因为上parse_str “音符[6] = AAAAA东西= 2” 将导致 阵列( '注'=>数组(5 => 'AAAAA '),' 东西'=> 2) 结果应该是数组('note'=>'aaaaa','stuff'=> 2) – 2010-03-31 17:29:16

+4

否。结果不应该是'array('note'=>'aaaaa','stuff'=> 2)' 。因为你有“note = aaaaa&stuff = 2”。我的回答没有错。我使用我发送的代码在PHP中建立了一个paypal支付网关集成。它每月处理数千笔交易就好了。 – Josh 2010-03-31 19:19:27

+2

字符串长度不应该在字符串旁边指定。这不是PayPal NVP的工作原理。阅读他们的手册。 “请求和响应是URL编码的”https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_nvp_NVPAPIOverview – Josh 2010-03-31 19:22:05

谷歌搜索了很多,我发现这一点:

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

我不拥有这个代码,我没有测试它,所以小心使用它。