PHP:PHP手册-Manual

bqucvtff  于 2023-03-28  发布在  PHP
关注(0)|答案(1)|浏览(115)

我一直在使用一个API,我曾经运行一个cron作业,每5分钟调用一次API。最近他们推出了一个类似于PayPal IPN的功能,一旦订单得到响应,就会发布变量。
我确实打印了post变量并将其邮寄出去,看看响应会是什么。这是我使用的代码。

$post_var = "Results: " . print_r($_POST, true);
mail('email@mail.com', "Post Variables", $post_var);

我收到了这个

Results: Array
(
    [--------------------------918fc8da7040954f
Content-Disposition:_form-data;_name] => "ID"

1
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="TXN"

1234567890
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="Comment"

This is a test comment
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="ConnectID"

1
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="ConnectName"

Test Connect (nonexisting)
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="Status"

Unavailable
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="CallbackURL"

http://www.example.com/ipn
--------------------------918fc8da7040954f--

)

现在我需要ID的值,例如1,TXN,例如1234567890等等,我从来没有使用过这种数组。我该如何继续?我实际得到的响应是什么?这是cUrl响应还是多部分表单数据响应?
如果可能的话请给我解释一下。

oug3syen

oug3syen1#

假设$response包含多部分内容:

// Match the boundary name by taking the first line with content
preg_match('/^(?<boundary>.+)$/m', $response, $matches);

// Explode the response using the previously match boundary
$parts = explode($matches['boundary'], $response);

// Create empty array to store our parsed values
$form_data = array();

foreach ($parts as $part)
{
    // Now we need to parse the multi-part content. First match the 'name=' parameter,
    // then skip the double new-lines, match the body and ignore the terminating new-line.
    // Using 's' flag enables .'s to match new lines.
    $matched = preg_match('/name="?(?<key>\w+).*?\n\n(?<value>.*?)\n$/s', $part, $matches);

    // Did we get a match? Place it in our form values array
    if ($matched)
    {
        $form_data[$matches['key']] = $matches['value'];
    }
}

// Check the response...
print_r($form_data);

我相信这种方法有很多注意事项,所以你的里程可能会有所不同,但它满足了我的需求(解析BitBucket片段API响应)。

相关问题