什么是在PHP中解析Paypal NVP的最佳方法?

11

我需要一个可以正确解析NVP为PHP数组的函数。我一直在使用PayPal提供的代码,但当字符串长度紧挨着名称时,它无法正常工作。

以下是我目前拥有的内容。

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

这个函数大多数情况下都能正常工作。

2个回答

16

最好的方法是使用parse_str函数。它可以将URL编码的字符串解析成PHP数组。

所以你的代码应该像这样:

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

1
这是错误的,因为对于 "note[6]=aaaaa stuff=2" 的 parse_str 处理将导致结果为 array('note'=>array(5=>'aaaaa '),'stuff'=>2) 正确的结果应该是 array('note'=>'aaaaa ', 'stuff'=>2)。 - Mike Starov
4
不是这样的。结果不应该是array('note'=>'aaaaa ', 'stuff'=>2),而应该是"note=aaaaa&stuff=2"。我的回答并没有错误。我使用我发送的代码在PHP中构建了一个PayPal支付网关集成。它每个月可以处理数千个交易,运行良好。 - Josh
2
字符串长度不应该像那样紧挨着字符串指定。这不是 PayPal NVP 的工作方式。请阅读他们的手册。"请求和响应都是 URL 编码的" https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_nvp_NVPAPIOverview - Josh
3
note[6]=aaaaa &stuff=2 的结果应该是 array('note'=>'aaaaa ', 'stuff'=>2)。你使用的方法99%的时间都有效。手册很好,但有时与代码不匹配。我知道PayPal有时会发送指定长度的NVP,通常发生在客户在PayPal页面上输入备注时。 - Mike Starov
2
我已经使用生产中提供的代码多年,从未出现任何问题... - Josh
请注意,从PHP 5.3.9开始,由parse_str解析的变量数量受到max_input_vars配置选项(手册)的限制,默认值为1000。解析大型TransactionSearch结果很可能会失败。 - tillz

0

经过大量的谷歌搜索,我发现了这个:

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

源代码

我不拥有此代码,也没有测试过它,所以请小心使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接