Php 双请求只检查一个

Php 双请求只检查一个,php,shopify,Php,Shopify,我有一个webhook,我在某人商店的Shopify中使用它,但只有它使用信息上传到我的服务器 当店主点击fullfil项目时,订单将进入我的网站,但在某些情况下,订单只需点击一次就出现两次,我使用的是php和curl 这是我的php文件 <?php //start a session session_start(); //Webhook enviado por shopify $webhookContent= ""; $webhook= fop

我有一个webhook,我在某人商店的Shopify中使用它,但只有它使用信息上传到我的服务器

当店主点击fullfil项目时,订单将进入我的网站,但在某些情况下,订单只需点击一次就出现两次,我使用的是php和curl

这是我的php文件

<?php
//start a session
session_start();

//Webhook enviado por shopify
$webhookContent=        "";
$webhook=               fopen('php://input' , 'rb');
while (!feof($webhook)) {
    $webhookContent .=  fread($webhook, 4096);
}
fclose($webhook);
$data=      json_decode($webhookContent,true);

//guardar datos ordenes
$file = 'shipping_innata.txt';
$print = print_r($webhookContent, true);
file_put_contents($file, $print, FILE_APPEND | LOCK_EX);


//obtener desde headers el dominio de shopify
$domain_header= $_SERVER['HTTP_X_SHOPIFY_SHOP_DOMAIN'];
//consulta en base 99min
$db =  mysqli_connect("localhost", "root", "plas711", "minut_api");

//comprobar carrier
$shipping=      $data ['shipping_lines']['0']['code'];
$express=       '99minutos.com en menos de 99 minutos (L-V de 9 a 16 hrs) SOLO DF';
$program=       '99minutos.com Programado mismo día (L-V de 9 a 16 hrs) SOLO DF';

//variables obtenidas desde json
$first_name=    $data['shipping_address']['first_name'];
$last_name=     $data['shipping_address']['last_name'];
$email=         $data['email'];
$phone=         $data['shipping_address']['phone'];
$address1=      $data['shipping_address']['address1'];
$address2=      $data['shipping_address']['address2'];
$province=      $data['shipping_address']['province'];
$zip=           $data['shipping_address']['zip'];
$city=          $data['shipping_address']['city'];
$latitude=      $data['shipping_address']['latitude'];
$longitude=     $data['shipping_address']['longitude'];
$note=          $data['note'];
$name=          'Orden: '.$data['name'];
$pago=          $data['gateway'];

if($pago =="Pago contra entrega (SOLO DF Y AREA METROPOLITANA)"){
    $total_price= $data['total_price'];
}
else{
    $total_price=0;
}
//busqueda del correo del propietario de la tienda en base de datos
$mail_db=       "SELECT * FROM tbl_usersettings WHERE store_name = '$domain_header'";
$mail_result=   mysqli_query($db, $mail_db);
$mail_q=        mysqli_fetch_array($mail_result, MYSQLI_ASSOC);
$mail_str=      $mail_q['email'];

////////////////////////////////////////////////////
//url encode  para producto en bodegas
function request()
{
    global $total_price,$pago,$latitude, $longitude, $address1, $address2, $city, $province, $zip, $email, $phone, $first_name, $last_name, $productos, $name, $db, $shipping, $express, $program;

    // variables
    $api_key=                                   '23894thfpoiq10fapo93fmapo';
    $user_id=                                   '4290583552';
    if ($shipping == $express){
        $delivery_type =    '99minutos';
    }
    else if($shipping == $program){
    $delivery_type = 'Programado';
    }
    $latlng=                                    '19.346857%2C-99.2985648';
    $destination_route=                         urlencode(implode(' ', array($address1,$address2)));
    $destination_locality=                      urlencode($city);
    $destination_administrative_area_level=     urlencode($province);
    $destination_postal_code=                   urlencode($zip);
    $d_latlng=                                  urlencode(implode(',', array($latitude,$longitude)));
    $customer_phone=                            urlencode($phone);
    $nombre =                                   'Cliente: '.implode(' ',array($first_name,$last_name));


    //Variable que pasa al sistema de 99minutos los datos en la seccion de notas
    //$notes=urlencode(implode(', ', array($name,$nombre)));

    //url que sirve para hacer la peticion de envion al sistema de 99minutos
    $request =  "https://das-dot-line-76299minutos.appspot.com/2/delivery/request?";
    $request.=  "api_key=".$api_key."&";
    $request.=  "user_id=".$user_id."&";
    $request.=  "delivery_type=".$delivery_type."&";
    $request.=  "route=ARTEAGA+Y+SALAZAR&";
    $request.=  "street_number=108&";
    $request.=  "neighborhood=Contadero&";
    $request.=  "locality=Mexico&";
    $request.=  "administrative_area_level_1=Distrito+Federal&";
    $request.=  "postal_code=05500&";
    $request.=  "country=Mexico&latlng=".$latlng."&";
    $request.=  "destination-route=".$destination_route."&";
    $request.=  "destination-street_number=&";
    $request.=  "destination-neighborhood=&";
    $request.=  "destination-locality=".$destination_locality."&";
    $request.=  "destination-administrative_area_level=".$destination_administrative_area_level."&";
    $request.=  "destination-postal_code=".$destination_postal_code."&";
    $request.=  "destination-country=Mexico&";
    $request.=  "destination-latlng=".$d_latlng."&";
    $request.=  "customer_email=".$email."&";
    $request.=  "customer_phone=".$customer_phone."&";
    $request.=  "notification_email=&";
    if($pago =="Pago contra entrega (SOLO DF Y AREA METROPOLITANA)"){
            $monto = "Cobro:".$total_price;
            $notes = urlencode((implode(',', array($name,$nombre,$monto))));
            $request.= "notes=".$notes."&";
            $request.= "receivable_order=true&";
            $request.= "amount=".$total_price."&";
        }
        else
        {
            $notes = urlencode((implode(',', array($name,$nombre))));
            $request.= "notes=".$notes."&";
        }
    $request.=  "dispatch=true";
    //funcion curl para enviar la peticion de envio al sistema de 99minutos
    $archivo = 'respaldo_innata.txt';
    $texto = print_r($request, true);
    file_put_contents($archivo, $texto, FILE_APPEND | LOCK_EX);

    error_log("Request");
    error_log(print_r($request, true));

    $ch_request=curl_init();
    $curl =  curl_init();
    curl_setopt($curl, CURLOPT_URL, $request);
    curl_setopt($curl, CURLOPT_SSLVERSION, 3);
    //curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_HEADER, FALSE);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);

    $response = curl_exec($curl);
    curl_close ($curl);

    error_log("Response");
    error_log(print_r($response, TRUE));
    die();
}
///////////////////////////////////////////////////
function mailprogramado()
{
        global $domain_header, $name, $first_name, $last_name, $email, $phone, $address1, $address2, $province, $zip, $latitude, $longitude, $productos, $pago;
        $to = "ens@99minutos.com";
        $subject = "Envio Tienda Malabares";
        $mail_body = '<html>';
        $mail_body .='<body topmargin="25">';
        $mail_body .='<h2> Dirección de Envio</h2>';
        $mail_body .='<table width="500" border="1" cellspacing="10" cellpadding="10">';
        $mail_body .='<tr> <td width="100" align="center"> Tienda: </td> <td align="left"> '. $domain_header .' </td> </tr>';
        $mail_body .='<tr> <td width="100" align="center"> Orden: </td> <td align="left"> '. $name .' </td> </tr>';
        $mail_body .='<tr> <td width="100" align="center"> Nombre: </td> <td align="left"> '. $first_name .' </td> </tr>';
        $mail_body .='<tr> <td width="100" align="center"> Apellidos: </td> <td align="left"> '. $last_name .' </td> </tr>';
        $mail_body .='<tr> <td width="100" align="center"> Correo: </td> <td align="left"> '. $email .' </td> </tr>';
        $mail_body .='<tr> <td width="100" align="center"> Teléfono: </td> <td align="left"> '. $phone .' </td> </tr>';
        $mail_body .='<tr> <td width="100" align="center"> Dirección: </td> <td align="left"> '. $address1 .' </td> </tr>';
        $mail_body .='<tr> <td width="100" align="center"> Dirección: </td> <td align="left"> '. $address2 .' </td> </tr>';
        $mail_body .='<tr> <td width="100" align="center"> Estado: </td> <td align="left"> '. $province .' </td> </tr>';
        $mail_body .='<tr> <td width="100" align="center"> Codigo Postal: </td> <td align="left"> '. $zip .' </td> </tr>';
        $mail_body .='<tr> <td width="100" align="center"> Latitud: </td> <td align="left"> '. $latitude .' </td> </tr>';
        $mail_body .='<tr> <td width="100" align="center"> Longitud: </td> <td align="left"> '. $longitude .' </td> </tr>';
        $mail_body .='<tr> <td width="100" align="center"> Metodo de pago: </td> <td align="left"> '. $pago .' </td> </tr>';
        $mail_body .='</table>';
        $mail_body .='</body>';
        $mail_body .='</html>';
        $headers = "From:ens@99minutos.com\r\n";
        $headers .= "Content-type: text/html\r\n";
        mail($to, $subject, $mail_body, $headers);
    }
// error_log(print_r($data, true));

if($shipping == $express){
//Notificacion envio depar
mailprogramado();
//realizar pedido de envio
request();
//destruir sesion
session_destroy();
exit();
}
else if($shipping == $program){
//Notificacion envio depar
mailprogramado();
//realizar pedido de envio
request();
//destruir sesion
session_destroy();
exit();
}
?>

如果我理解正确,您会想,为什么您会收到来自Shopify的多个请求,而不是一个请求

我最近也遇到了同样的问题,我认为这是Webhooks机制的一个特性,您必须处理它

以这篇文章为例:


底线。你应该预计Shopify会不止一次地攻击你的端点,你必须自己管理它,以避免重复实体和内容。

好吧,我看了这篇文章,如果我明白我需要对代码排队来解决问题,但现在我不明白我能做到这一点,我不知道我需要在代码的哪一部分尝试这一点。