dp0518 2013-06-10 09:38
浏览 35

在将订单放入数据库后执行Observer sales_order_place_after

I'm creating a Magento plugin in which I made a Observer script which I get the order info and product info in order to do a request to a API outside of magento. The thing is, when the script gets executed, the data hasn't been put into the database yet by Magento. Simply sleeping the script for x seconds does not help (ofcourse) because the whole system gets halted.

Here's my code:

<?php
//require_once("DelayedDatabaseAccess.php");

class Plesents_Plugin_Model_Observer {
    public function plesentsRedirect(Varien_Event_Observer $obs) {
        //require_once("DelayedDatabaseAccess.php");
        ob_start();


        $data = $obs->getEvent()->getOrder()->getData();
        $ent_id = $data['entity_id'];
        mail("jeffhuys@gmail.com", "Yeah!", $data['increment_id'] . " || " .     $data['entity_id'] . ".. Waiting 10 seconds..");

        //$data = $obs->getEvent()->getOrder()->getData();
        //$result = ob_get_clean();


        //$ent_id = $data['entity_id'];
        //$ent_id = $_POST['entity_id'];


        //DB Connectie voor DB Magento
        $con =  mysql_connect("xxxx", "xxxx", "xxxx");
                mysql_select_db("xxxx");

        // Query voor dataopvraag
        // TODO pas hier enorm op! Volgens mij is dit SQL-injectie-gevoelig!!!!
        // Stel dat iemand als email "jeffhuys@gmail.com' DROP TABLE x" doet, bam.
        echo($ent_id);
        $sql = "SELECT o.base_subtotal, o.increment_id, o.customer_email,     o.customer_firstname, o.customer_lastname, o.shipping_amount FROM mag1_sales_flat_order o,     mag1_sales_flat_order_item i, mag1_catalog_product_flat_1 f WHERE o.entity_id=i.order_id     AND o.entity_id='107' AND i.name=f.name ORDER BY o.increment_id LIMIT 1";

        $sql2 = "SELECT i.name, f.short_description, f.small_image FROM     mag1_sales_flat_order o, mag1_sales_flat_order_item i, mag1_catalog_product_flat_1 f WHERE     o.entity_id=i.order_id AND i.name=f.name AND o.entity_id='107' ORDER BY o.increment_id";

        echo($sql . "

");
        echo($sql2 . "

");

        $result  = mysql_query($sql);
        echo("  ERROR1?: " . mysql_error());
        $result2 = mysql_query($sql2);
        echo("  ERROR2?: " . mysql_error());

        echo("   ROWS:  " . mysql_num_rows($result));



        var_dump($result);

        // Static variabeles table: plesents_authentication
            $app_id = 3;
        $authentication_token = "xxxx";


        // Opbouw basis URL voor Plesents
        $plesentsurl ="http:/xxxxx/api/orders.json";

            //Resultaten uit Query in Array
        $row = mysql_fetch_array($result);
        echo("

DATA:");
        var_dump($row);
        //var_dump($data);

        $row['base_subtotal']   = $row['base_subtotal'] * 100;
        $row['shipping_amount'] = $row['shipping_amount'] * 100;


        $sha1=sha1($app_id.$authentication_token.$row['base_subtotal'].$row['increment_id']."https://oege.ie.hva.nl/~hilgern001/magento/notify.php".$row['customer_firstname']." ".$row['customer_lastname'].$row['customer_email']);
    echo("Sha1 calc: " . $sha1);


        $httpacc = array(
          "authentication_token" => $authentication_token,
      "order" => array(
        "price_in_cents"     => $row['base_subtotal'],
        "notify_url"         => "https://xxxxx/magento/notify.php",
        "user_name"          => $row['customer_firstname']." ".$row['customer_lastname'],
        "user_email"         => $row['customer_email'],
        "order_id"           => $row['increment_id'],
        "test"               => true,
        "sha1"               => $sha1
        )
    );
    $product_lines = array();
        while($row2 = mysql_fetch_array($result2)) {
        $product_lines[] = array(
          "name"             => $row2['name'],
          "description"      => $row2['short_description'],
          "remote_image_url" => "https://xxxx/magento/media/catalog/product/cache/1/small_image/170x/9df78eab33525d08d6e5fb8d27136e95".$row2['small_image']
        );
    }  
    $httpacc['order']['details_attributes'] = $product_lines;

    $pathdirectory = json_encode($httpacc);

    //URL opbouwen en escapen (voor debugging)  
    //echo $pathdirectory;

    $ch = curl_init($plesentsurl);  

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
    curl_setopt($ch, CURLOPT_POSTFIELDS, $pathdirectory);                                                                  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
        'Content-Type: application/json',                                                                                
        'Content-Length: ' . strlen($pathdirectory))                                                                       
    );                                                                                                                   

    $result = curl_exec($ch);
    $redirect_result = json_decode($result, true);
    $redirect_result_staging = explode('.', $redirect_result['redirect_url']);
    $redirect_url_staging = "https://staging." . $redirect_result_staging[1] . "." . $redirect_result_staging[2];
    $sha_id = $redirect_result['id'];
    $sha1_validate = sha1($app_id.$authentication_token.$sha_id.$row['base_subtotal'].$row['increment_id']."https://xxxx/magento/notify.php".$row['customer_firstname']." ".$row['customer_lastname'].$row['customer_email']);

    echo("

sha1_validate: " . $sha1_validate);
    echo("

redirect_result: " . $redirect_result['sha1']);

    var_dump($result);

    if($redirect_result['sha1']==$sha1_validate) {
        //echo '<meta http-equiv="refresh" content="0;URL='.$redirect_url_staging.'" />';
        $ch = curl_init($redirect_url_staging);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $result = curl_exec($ch); 
    } 
    else {
        echo "sha1 could not be validated correctly!";
    }

    $pagerender = ob_get_clean();
    mail('jeffhuys@gmail.com', 'pagerender', $pagerender);

    //$res = ob_get_clean();
    //mail("jeffhuys@gmail.com", "Yeah!", "Magento moves forward.
 " . $res);
}
}

?>

I know I can use mage to get the info of the order from, but I can't use that to get product info (which I absolutely need).

Is there any way to let this code be executed AFTER Magento inserts his info into the database?

Thanks so much.

EDIT: Sorry, forgot to add. In the SQL-querys, entity_id='107' works, but when I make this dynamic (entity_id=$_POST['entity_id'] or something like that), it will NOT work because this requests data not yet available.

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 制裁名单20240508芯片厂商
    • ¥20 易康econgnition精度验证
    • ¥15 msix packaging tool打包问题
    • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
    • ¥15 python的qt5界面
    • ¥15 无线电能传输系统MATLAB仿真问题
    • ¥50 如何用脚本实现输入法的热键设置
    • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
    • ¥30 深度学习,前后端连接
    • ¥15 孟德尔随机化结果不一致