Почему не удалось создать prestashop-заказ через веб-сервис? - PullRequest
0 голосов
/ 14 февраля 2020

Я использую веб-сервисы для создания заказа в последней версии Prestashop 1.7.7.0, он впервые работал правильно, но когда я пытаюсь вызвать этот веб-сервис во второй раз, у меня было следующее предложение «Этот вызов PrestaShop Web Службы потерпели неудачу и вернули HTTP-статус 500. Это означает: Внутренняя ошибка сервера. " и когда я проверяю консоль браузера, это показывает, что «DevTools не удалось разобрать SourceMap» и «Unchecked runtime.lastError: Порт сообщения закрыт до получения ответа."

Вот код веб-службы " api. php "

<?php
require_once 'vendor/autoload.php';
try{
$url = 'http://127.0.0.1/prestashop';
$key  = 'The generated key';
$debug = false;

$webService = new PrestaShopWebservice($url, $key, $debug);

$customerId=$_GET['id'];
      $customerEmail = 'testmail3@yopmail.com'; //Email du client ( A dynamiser dans le cadre d'une utilisation complète )
      $carrierName = 'My carrier'; //Nom du transporteur dans prestashop ( utilisé pour récupérer son identifiant )
      $paymentLabel = 'Paiement par chèque'; // Nom du mode de paiement
      $paymentCode = 'ps_checkpayment'; //Module de paiement utilisé

    /**
     * Liste des produits qu'on souhaite ajouter au panier
     */
    $products = [
        [
            'reference' => 'demo_12',
            'qty' => 3,
        ],
        [
            'reference' => 'demo_19',
            'qty' => 1,
        ],
        [
            'reference' => 'demo_6',
            'qty' => 2,
            'combination' => [
                'reference' => 'demo_6'
            ]
        ],
    ];

    //Paramètres du client
    $customerDatas = [
        'firstname' => 'Mickey',
        'lastname' => 'Mouse',
        'email' => 'testemaddil@yopmail.com',
        'passwd' => 'mypassword',
        'note' => 'Customer created with api',
    ];

    //Paramètres de l'adresse
    $addressDatas = [
        'alias' => 'addresse api',
        'id_customer' => $customerId,
        'firstname' => 'herve',
        'lastname' => 'test',
        'address1' => 'rue des tests',
        'address2' => 'encore rue des tests',
        'postcode' => '67000',
        'city' => 'strasbourg',
        'phone' => '063656565',
        'id_country' => 8,
    ];


    //On regarde si le client existe
    $searchCustomerXml = $webService->get([
        'resource' => 'customers',
        'filter' => ['email' => $customerEmail],
    ]);

    //Si il existe on récupère l'identifiant
    if (!empty($searchCustomerXml->children()->children())) {
        $customerId = (int)$searchCustomerXml->children()->children()[0]->attributes()['id'][0];
    } //Si il n'existe pas on le créé
    else {
        //Création d'un client
        $clientXml = $webService->get(['url' => $url . '/api/customers?schema=blank']);
        foreach ($clientXml->customer[0] as $nodeKey => $node) {
            if (array_key_exists($nodeKey, $customerDatas)) {
                $clientXml->children()[0]->$nodeKey = $customerDatas[$nodeKey];
            }
        }
        $opt = array('resource' => 'customers');
        $opt['postXml'] = $clientXml->asXML();
        $resultXml = $webService->add($opt);
        $customerId = (int)$resultXml->children()[0]->id;
    }

    //Récupération des adresses on part du principe qu'on récupère la première adresse du client si elle existe
    //On regarde si le client existe
    $searchAddressXml = $webService->get([
        'resource' => 'addresses',
        'filter' => ['id_customer' => $customerId],
    ]);

    //Si il existe on récupère l'identifiant de la première adresse
    if (!empty($searchAddressXml->children()->children())) {
        $addressId = (int)$searchAddressXml->children()->children()[0]->attributes()['id'][0];
    } //Si il n'existe pas on le créé
    else {

        //Création d'un client
        $addressXml = $webService->get(['url' => $url . '/api/addresses?schema=blank']);
        foreach ($addressXml->address[0] as $nodeKey => $node) {
            if (array_key_exists($nodeKey, $addressDatas)) {
                $addressXml->children()[0]->$nodeKey = $addressDatas[$nodeKey];
            }
        }

        $opt = array('resource' => 'addresses');
        $opt['postXml'] = $addressXml->asXML();
        $resultXml = $webService->add($opt);
        $addressId = (int)$resultXml->children()[0]->id;
    }

    //Création d'un panier
    $cartXml = $webService->get(['url' => $url . '/api/carts?schema=blank']);

    //Définition des paramètres par défaut du panier
    //Tout ces paramètres pourront être récupérés de l'api en une fois et stockés
    $cartXml->cart->id_customer = $customerId;
    $cartXml->cart->id_address_delivery = $addressId;
    $cartXml->cart->id_address_invoice = $addressId;
    $cartXml->cart->id_currency = 1; //@Todo récupérer via api
    $cartXml->cart->id_lang = 1; //@Todo récupérer via api
    $cartXml->cart->id_shop = 1; //@Todo récupérer via api
    $cartXml->cart->id_shop_group = 1;

    //Identifiant du transporteur à récupérer dynamiquement ( peut bouger en étant édité dans le backoffice )
    $carrierXml = $webService->get(['resource' => 'carriers', 'filter' => ['name' => $carrierName]]);

    if (!empty($carrierXml->children()->children()[0]->attributes()['id'][0])) {
        $id_carrier = (int)$carrierXml->children()->children()[0]->attributes()['id'][0];
    } //Si il n'existe pas on le créé
    else {
        exit('Mode de livraison existe pas');
    }

    $cartXml->cart->id_carrier = $id_carrier;

    //Récupération de identifiants des produits
    $productIds = array();
    foreach ($products as $cartProduct) {
        $productSearchXml = $webService->get([
            'resource' => 'products',
            'filter' => ['reference' => $cartProduct['reference']],
        ]);

        if (!empty($productSearchXml->children()->children()[0]->attributes()['id'][0])) {
            $id_product = (int)$productSearchXml->children()->children()[0]->attributes()['id'][0];
        } else {
            //Si pas de produit on ne peut pas continuer
            continue;
        }

        if (isset($cartProduct['combination'])) {
            $combinationSearchXml = $webService->get([
                'resource' => 'combinations',
                'filter' => ['reference' => $cartProduct['reference']],
            ]);
            if (!empty($combinationSearchXml->children()->children()[0]->attributes()['id'][0])) {
                $id_product_attribute = (int)$combinationSearchXml->children()->children()[0]->attributes()['id'][0];
            } else {
                $id_product_attribute = 0;
            }
        } else {
            $id_product_attribute = 0;
        }
        $productIds[] = [
            'id_product' => $id_product,
            'id_product_attribute' => $id_product_attribute,
            'qty' => $cartProduct['qty']
        ];
    }

    //Insertion des lignes de produits
    foreach ($productIds as $productId) {
        $child = $cartXml->cart->associations->cart_rows->addChild('cart_row');
        $child->id_product = $productId['id_product'];
        $child->id_product_attribute = $productId['id_product_attribute'];
        $child->quantity = $productId['qty'];
        $child->id_adddress_delivery = $addressId;
    }

    //Création du panier
    $opt = array('resource' => 'carts');
    $opt['postXml'] = $cartXml->asXML();
    $addCartXml = $webService->add($opt);

    //Création d'une commande ( à faire )
    $orderXml = $webService->get(['url' => $url . '/api/orders?schema=blank']);

    //On défini les éléments de la commande spécifiques
    $orderXml->order->valid = 1;
    $orderXml->order->module = 'ps_checkpayment'; //Module de paiement
    $orderXml->order->payment = 'Paiement par cheque'; //Libéllé du mode de paiment

    //Les éléments communs avec le panier sont récupérés depuis celui-ci
    $orderXml->order->id_address_delivery = $addCartXml->cart->id_address_delivery;
    $orderXml->order->id_address_invoice = $addCartXml->cart->id_address_invoice;
    $orderXml->order->id_cart = $addCartXml->cart->id;
    $orderXml->order->id_customer = $addCartXml->cart->id_customer;
    $orderXml->order->id_carrier = $addCartXml->cart->id_carrier;
    $orderXml->order->id_currency = $addCartXml->cart->id_currency;
    $orderXml->order->id_shop = $addCartXml->cart->id_shop;
    $orderXml->order->id_shop_group = $addCartXml->cart->id_shop_group;
    $orderXml->order->id_lang = $addCartXml->cart->id_lang;

    // les lignes des produits sont aussi récupérées depuis le panier

    $orderTotal = 0; //Variable pour calculer le total de la commande
    unset($orderXml->order->associations->order_rows->children()[0]); //Suppression de ligne order_detail de démo
    foreach ( $addCartXml->cart->associations->cart_rows->cart_row as $cartRow) {

        //On ne traite pas les lignes vides
        if ( $cartRow->id_product == 0 || $cartRow->id_product =="")
            continue;

        //On récupère les informations disponibles depuis le panier
        $orderRow = $orderXml->order->associations->order_rows->addChild('order_row');
        $orderRow->product_id = $cartRow->id_product;
        $orderRow->product_attribute_id = $cartRow->id_product_attribute;
        $orderRow->product_quantity = $cartRow->quantity;

        //Pour le reste on le récupère depuis les produits
        $productXml = $webService->get(['url' => $url . '/api/products/'.$cartRow->id_product]);
        $orderRow->product_name = $productXml->product->name;
        $orderRow->product_reference = $productXml->product->reference;
        $orderRow->product_price = $productXml->product->price;

        //Ajout du montant du produit au total du panier ( Le prix HT * la qté * 1+ Taux de tva )
        $orderTotal += ( (float)$productXml->product->price * (int)$cartRow->quantity ) * 1.20 ;
    }

    //Données spécifiques à la commande
    $orderXml->order->total_paid_real = $orderTotal; //Montant payé réellement
    $orderXml->order->total_paid = $orderTotal; //Montant payé

    $orderXml->order->total_products = 1; //Montant total produit ht ( obligatoire mais indicatif car recalculé automatiquement )
    $orderXml->order->total_products_wt = 1; //Montant total produit ttc ( obligatoire mais indicatif car recalculé automatiquement )
    $orderXml->order->conversion_rate = 1; // Taux de conversion


    //Création de la commande
    $opt = array('resource' => 'orders');
    $opt['postXml'] = $orderXml->asXML();
    $addOrderXml = $webService->add($opt);

    echo 'Création de la commande '.$addOrderXml->order->id;
}catch (PrestaShopWebserviceException $e) {
    echo $e->getMessage();
}

Ошибка вызова веб-службы

...