【问题标题】:PHP Regex for Paypal Payflow response用于 Paypal Payflow 响应的 PHP 正则表达式
【发布时间】:2019-11-27 16:42:39
【问题描述】:

我正在使用 Paypal Payflow 进行付款,现在我无法提取 Paypal 响应。

Paypal 响应以如下格式发送

RESULT=0&RESPMSG=Approved&SECURETOKEN[25]=Fj+1AFUWft0+I0CUFOKh5WA== &SECURETOKENID=9a9ea8208de1413abc3d60c86cb1f4c5  

方括号[] 内的值是实际值的长度。例如,SECURETOKEN 是一个参数,其值为 'Fj+1AFUWft0+I0CUFOKh5WA=='。长度为 25 个字符。

如何从 PHP 的结果中提取每个参数及其对应的值。我对正则表达式不太擅长,我无法在线找到任何解决方案。

在这种情况下,&= 的拆分不起作用。

【问题讨论】:

  • 你可以使用\[(\d+)\]=[^=]+,你能再发一些例子吗?
  • @CodeManiac 这是 Paypal 在其网站上提供的示例之一RESULT=0&RESPMSG=Approved&SECURETOKEN[25]=Fj+1AFUWft0+I0CUFOKh5WA== &SECURETOKENID=9a9ea8208de1413abc3d60c86cb1f4c5
  • @CodeManiac 字符串中的长度字段并不总是可用的。此外,如何使用此正则表达式获取名称值数组。感谢您的回复。
  • 如果你的值字符串里面有=,前一个将不起作用,因为它匹配到=,让我微调它,想出一个更好的,你能分享一下链接吗从您获得上述响应示例的地方

标签: php regex url paypal


【解决方案1】:

字符串看起来是一个 url,所以简单的方法是使用 [parse_str()][1] 它会将给定的字符串转换为“格式正确”的数组。

重要的是函数的返回将存储在第二个参数中(本例中为$keys)。

Ideone - example

$str = 'RESULT=0&RESPMSG=Approved&SECURETOKEN[25]=Fj+1AFUWft0+I0CUFOKh5WA== &SECURETOKENID=9a9ea8208de1413abc3d60c86cb1f4c5';
parse_str($str, $keys);

print_r($keys);

输出:

Array
(
    [RESULT] => 0
    [RESPMSG] => Approved
    [SECURETOKEN] => Array
        (
            [25] => Fj 1AFUWft0 I0CUFOKh5WA== 
        )

    [SECURETOKENID] => 9a9ea8208de1413abc3d60c86cb1f4c5
)

【讨论】:

  • 如果有本地方式,你应该去,不需要正则表达式+1
  • 我喜欢这种方法,只是我只是丢失了我真正想要的字符串。值 'Fj+1AFUWft0+I0CUFOKh5WA==' 必须按原样传递给 Paypal 服务器进行处理。
  • @KaleshKaladharan PHP 也有一个函数,urlencode() 在发送到 PayPal 之前。
  • @MonkeyZeus “不要对名称-值参数数据进行 URL 编码,因为它可能会导致身份验证和报告出现问题。” Paypal 的这个声明让我很困惑。
  • @KaleshKaladharan 我真的不知道该告诉你什么。如果您比 PHP 更了解 Web 标准,那么请继续自制自己的烂摊子。
【解决方案2】:

使用this answer 将响应解析为数组是正确的开始。这是从数组中访问这些值的方法:

$str = 'RESULT=0&RESPMSG=Approved&SECURETOKEN[25]=Fj+1AFUWft0+I0CUFOKh5WA== &SECURETOKENID=9a9ea8208de1413abc3d60c86cb1f4c5';
parse_str( $str, $values );

现在,获取您想要的值:

$tokens = $values['SECURETOKEN'];
// results in an array: ['25' => 'Fj+1AFUWft0+I0CUFOKh5WA=='];

$token = reset( $tokens ); // results in 'Fj+1AFUWft0+I0CUFOKh5WA=='
$length = key( $tokens ); // results in '25'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多