12 sujets de 1 à 12 (sur un total de 12)
  • Auteur
    Messages
  • #49342
    c3do
    Participant
    Points: 51 pts
    Membre 2 étoiles

    Bonjour,

    J’ai un petit soucis avec l’API REST pour créer un remboursement. Le remboursement est effectué, le total est bon, mais l’argument “line_items” du remboursement ne se transmet pas. On ne sait donc pas quelle ligne de la commande a été remboursée.

    Voilà ce que j’envoie:

    {“amount”:”4.89″,”reason”:”test”,”refunded_by”:1,”line_items”:[{“id”:2052,”name”:”nom du produit”,”product_id”:51765,”variation_id”:51766,”quantity”:1,”tax_class”:0,”subtotal”:”4.89″,”total”:”4.89″,”meta_data”:[{“id”:16294,”key”:”pa_taille”,”value”:”52″}]}]}

    et la réponse de woocommerce:

     [“id”]=> int(103883) [“date_created”]=> string(19) “2018-01-18T13:22:02” [“date_created_gmt”]=> string(19) “2018-01-18T12:22:02” [“amount”]=> string(4) “4.89” [“reason”]=> string(4) “test” [“refunded_by”]=> int(1) [“meta_data”]=> array(0) { } [“line_items”]=> array(0) { } [“_links”]=> object(stdClass)#175 (3) { [“self”]=> array(1) { [0]=> object(stdClass)#178 (1) { [“href”]=> string(74) “https://sandbox.XXX.com/wp-json/wc/v2/orders/103864/refunds/103883” } } [“collection”]=> array(1) { [0]=> object(stdClass)#176 (1) { [“href”]=> string(67) “https://sandbox.XXX.com/wp-json/wc/v2/orders/103864/refunds” } } [“up”]=> array(1) { [0]=> object(stdClass)#174 (1) { [“href”]=> string(59) “https://sandbox.XXX.com/wp-json/wc/v2/orders/103864” } } } }

    Si, par hasard, quelqu’un a une idée du pourquoi ce “line_items” ne se transmet pas…

    Merci de votre aide!

    depanagewp
    #49370
    Mathieu
    Participant
    Points: 1,315 pts
    Membre 2 étoiles

    Vous indiquez déjà les données de remboursement dans la requête, que voulez-vous faire avec ces mêmes données dans la réponse ?

    s’il s’agit de vérifier que tout c’est bien passé, je pense que vous devrez lire le résultat de “orders/103864/refunds/103883” pour votre exemple.

    Développeur PHP et WordPress En Alsace dans l'annuaire des prestataires WordPress et WooCommerce
    Création d'extensions pour WordPress et WooCommerce - Personnalisation d'extensions existantes
    🔶 Si vous appréciez mon aide, vous pouvez me faire un don de n'importe quel montant en cliquant ici.

    depanagewp
    #49371
    c3do
    Participant
    Points: 51 pts
    Membre 2 étoiles

    Je vois le résultat en direct, sur la commande woocommerce et ce n’est pas le résultat voulu. Je vais essayer d’être plus clair.

    Lorsque je fais un remboursement sur woocommerce, j’incrémente la quantité des produits à rembourser, et je valide. L’intérêt est double. Le client sait de quoi il a été remboursé sur l’avoir qui est généré automatiquement, et on sait exactement ce qui a été remboursé sur la commande en un coup d’oeil.

    En passant par l’API pour créer le remboursement, j’indique la ligne à rembourser à woocommerce dans line_items (id,quantity,amount) et les attributs généraux (reason, amount,refunded_by). Mais malheureusement, seul le total du remboursement est pris en compte, un avoir sans produit est généré.

    J’ai beau tourner le code dans tous les sens, avec plus ou moins d’attributs, en mettant l’id produit en clé de tableau, je sèche…

    depanagewp
    #49384
    Mathieu
    Participant
    Points: 1,315 pts
    Membre 2 étoiles

    J’avais mal compris, ce que vous avez indiqué après “et la réponse de woocommerce:” c’est la réponse de la lecture de “orders/103864/refunds/103883” ?

    En créant un remboursement à partir de l’espace d’administration, les valeurs “quantity” et les 4 totaux sont négatifs donc essayez peut-être d’indiquer “quantity : -1” à la création du remboursement.

    Développeur PHP et WordPress En Alsace dans l'annuaire des prestataires WordPress et WooCommerce
    Création d'extensions pour WordPress et WooCommerce - Personnalisation d'extensions existantes
    🔶 Si vous appréciez mon aide, vous pouvez me faire un don de n'importe quel montant en cliquant ici.

    depanagewp
    #49390
    c3do
    Participant
    Points: 51 pts
    Membre 2 étoiles

    A chaque requête, l’API retourne une réponse, avec ou sans erreur. Dans cette réponse, je devrais logiquement avoir sensiblement le même line_items que ce que je lui ai envoyé. Mais il est vide. J’ai posté la réponse pour que vous puissiez le constater.

    C’est vrai. J’ai testé les 2 dans line_items (montant et quantité), sans résultat. Le montant global ne passe pas en négatif.

    object(stdClass)#180 (3) {
    ["code"]=>
    string(37) "woocommerce_rest_invalid_order_refund"
    ["message"]=>
    string(60) "Le montant du remboursement doit être supérieure à zéro."
    ["data"]=>
    int(400)
    }
    depanagewp
    #49423
    Mathieu
    Participant
    Points: 1,315 pts
    Membre 2 étoiles

    j’ai mis ma lampe frontale pour me plonger dans le code est ce que j’ai trouvé pour “line_items” n’a pas grand chose à voir avec la documentation ou avec ce qui s’affiche avec une requête “OPTIONS”.
    les arguments à envoyer sont les suivants :
    https://pastebin.com/r9XzXCqA

    là on se dit “super on a trouvé” mais ça ne fonctionne pas encore à cause d’un bug qui remplace le “idLigne” par 0. en mettant le code suivant sur le serveur, ça évite ce remplacement en bloquant la mise en forme du tableau “line_items” lors de la requête.
    https://pastebin.com/rt2EWQRk

    Développeur PHP et WordPress En Alsace dans l'annuaire des prestataires WordPress et WooCommerce
    Création d'extensions pour WordPress et WooCommerce - Personnalisation d'extensions existantes
    🔶 Si vous appréciez mon aide, vous pouvez me faire un don de n'importe quel montant en cliquant ici.

    depanagewp
    #49425
    c3do
    Participant
    Points: 51 pts
    Membre 2 étoiles

    Merci beaucoup d’y avoir consacré de ton temps.

    J’essaierai ce petit patch temporaire un peu plus tard (santé fragile en ce moment). Comment es-tu arrivé à trouver ce bug? J’avais essayé de remonter le code à partir de la classe “class-wc-rest-order-refunds-controller.php” sans succès.

    Est-ce que ce bug a été signalé pour une future correction?

    depanagewp
    #49434
    Mathieu
    Participant
    Points: 1,315 pts
    Membre 2 étoiles

    C’est dans cette classe qu’il y a la même fonction qui est utilisée pour créé un remboursement que dans l’espace d’administration. Et donc j’ai comparé ce que reçoit cette fonction dans les 2 cas pour voir que le tableau “ligne_items” était différent.

    Pour le signalement, je n’utilise plus trop Github en ce moment donc je n’ai rien marqué.

    Développeur PHP et WordPress En Alsace dans l'annuaire des prestataires WordPress et WooCommerce
    Création d'extensions pour WordPress et WooCommerce - Personnalisation d'extensions existantes
    🔶 Si vous appréciez mon aide, vous pouvez me faire un don de n'importe quel montant en cliquant ici.

    depanagewp
    #49470
    c3do
    Participant
    Points: 51 pts
    Membre 2 étoiles

    Je vois bien que le problème viendrait de la variable $request[‘line_items’]. $request correspondrait à la requête que j’envoie. Par contre, je n’arrive pas à savoir à quel endroit est traitée cette variable pour mettre idligne à zéro avant d’arriver dans la fonction wc_create_refund. (ça fait au moins 2 heures que j’essaie de comprendre ^^)

    depanagewp
    #49481
    Mathieu
    Participant
    Points: 1,315 pts
    Membre 2 étoiles

    la clé est enlevée dans le fichier “wp-includes/rest-api.php” ligne 1 236
    la trace d’appel de cette ligne est là :
    https://pastebin.com/cAhtzq33

    Pour faire des recherches dans le code et pour développer en PHP, je vous conseille Eclipse for PHP.
    Cet éditeur fait beaucoup de choses pratiques comme par exemple aller à la définition d’une fonction et inversement retrouver les appels d’une fonction.

    Développeur PHP et WordPress En Alsace dans l'annuaire des prestataires WordPress et WooCommerce
    Création d'extensions pour WordPress et WooCommerce - Personnalisation d'extensions existantes
    🔶 Si vous appréciez mon aide, vous pouvez me faire un don de n'importe quel montant en cliquant ici.

    depanagewp
    #49813
    c3do
    Participant
    Points: 51 pts
    Membre 2 étoiles

    Finalement, ça ne fonctionnait toujours pas. J’ai donc tenté un report de bug sur github, et vu que j’ai un anglais approximatif, j’ai juste écrit que line_items bug.

    Mais ça n’a pas eu l’effet escompté. Ils ont décidé que line_items est read-only, et ils ont “amélioré” le code en conséquence.

    Ce qui veut dire qu’en passant par l’API, tu génères des avoirs vides, normal…

    depanagewp
    #49814
    c3do
    Participant
    Points: 51 pts
    Membre 2 étoiles

    Par contre, c’est prévu pour la v3 de l’api! ouf!

    depanagewp
12 sujets de 1 à 12 (sur un total de 12)
  • Vous devez être connecté pour répondre à ce sujet.