4

我正在使用观察者sales_order_save_after来捕获订单信息并将其中的一些信息发送到另一个 Web 服务。

获得订单信息后,我在观察者中使用以下 curl 片段将信息发送到 Web 服务。信息发送正常,服务接收。然而浏览器仍然留在结帐页面,即使订单完成,用户也不会被重定向到成功页面。

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://myapp.com/');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-Type: application/json')); 
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"field": 'data'}');
curl_setopt($ch, CURLOPT_USERPWD, 'blahblah:blahblah');

curl_exec($ch);
curl_close($ch);
4

4 回答 4

2

所以问题是与 Curl 请求一起发送的标头意味着 Magento 无法将重定向的标头发送到成功页面。我无法解决这个问题,但经过大量谷歌搜索后,我找到了一个我更喜欢的解决方法。基本上,我使用 Zend Queue 功能对请求进行排队并获得一个 cron 来批量处理它们。

我喜欢请求异步工作的想法,以便用户在转发到成功页面之前无需等待 Web 服务获得回复。

这就是我想到的地方:

http://www.kingletas.com/2012/08/zend-queue-with-magento.html

于 2013-05-03T03:23:29.687 回答
1

CURLOPT_FOLLOWLOCATION并且CURLINFO_EFFECTIVE_URL可能有用。

像这样的东西:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://myapp.com/');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // for redirects
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-Type: application/json')); 
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"field": 'data'}');
curl_setopt($ch, CURLOPT_USERPWD, 'blahblah:blahblah');

curl_exec($ch);

$last_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); // get last effective URL

curl_close($ch);

header("Location: ".$last_url); // force browser to redirect
于 2013-04-23T18:52:53.647 回答
1

禁用所有输出,然后尝试。可能是 CURL 正在输出少量文本,甚至是空格,这会中断您的重定向。

<?php

error_reporting(E_ERROR); //this should disable all warnings.

也尝试使用 file_get_contents 而不是 CURL。我经历过 CURL 在 file_get_contents 工作正常的情况下对我不起作用。虽然你必须确保它在 php.ini 中允许外部

于 2013-05-06T19:19:54.230 回答
0

必须在混合物中添加以下内容;否则,重定向到成功页面不起作用:

curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);

这是 Observer.php 的一部分的完整工作代码块:

    $APIURL = 'https://example.com/submit.php';
        $UID = 'username';
        $APIKEY = 'password';
$fields = array(
    'uid'                   => $UID,
    'apikey'                => $APIKEY,
    'name'                  => $customerName,
);

//url-ify the data for the POST
$fields_string = http_build_query($fields);

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $APIURL);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

//execute post   
curl_exec($ch);
//close connection
curl_close($ch);
于 2018-01-08T21:49:02.847 回答