Je développe une API pour l'application mobile du site Web de commerce électronique qui est sur Demandware. J'utilise l'OCAPI 18.8 pour passer une commande et envoyer les détails de paiement au processeur de paiement tiers qui est Vantiv. Je reçois l'ID de transaction et le code de réponse de Vantiv et je souhaite mettre à jour ma commande pour stocker ces détails de transaction de paiement dans ma commande. Mais je n'ai trouvé aucune ressource dans OCAPI qui m'a permis d'ajouter l'identifiant de transaction et le code de réponse reçus de Vantiv. Voici la commande que j'ai passée via OCAPI:

{
"_v": "18.8",
"_type": "order",
"_resource_state": "xyz",
"adjusted_merchandize_total_tax": 0,
"adjusted_shipping_total_tax": 0,
"billing_address": {
    "_type": "order_address",
    "city": "Boston",
    "country_code": "US",
    "first_name": "John",
    "full_name": "John Martin",
    "id": "xyz",
    "last_name": "Martin"
},
"channel_type": "storefront",
"confirmation_status": "not_confirmed",
"created_by": "Customer",
"creation_date": "2018-11-20T10:37:58.055Z",
"currency": "USD",
"customer_info": {
    "_type": "customer_info",
    "customer_id": "xyz",
    "customer_name": "Ammar Shahbaz",
    "customer_no": "xyz"
},
"customer_name": "Ammar Shahbaz",
"export_status": "not_exported",
"last_modified": "2018-11-20T10:37:58.376Z",
"merchandize_total_tax": 0,
"notes": {
    "_type": "simple_link",
    "link": "link"
},
"order_no": "123",
"order_token": "xyz",
"order_total": 299.8,
"payment_instruments": [
    {
        "_type": "order_payment_instrument",
        "amount": 299.8,
        "payment_card": {
            "_type": "payment_card",
            "card_type": "Visa",
            "credit_card_expired": false,
            "expiration_month": 1,
            "expiration_year": 2021,
            "holder": "John Doe",
            "masked_number": "************4240",
            "number_last_digits": "4240"
        },
        "payment_instrument_id": "xyz",
        "payment_method_id": "CREDIT_CARD"
    }
],
"payment_status": "not_paid",
"product_items": [
    {
        "_type": "product_item",
        "adjusted_tax": 0,
        "base_price": 149.9,
        "bonus_product_line_item": false,
        "gift": false,
        "item_id": "xyz",
        "item_text": "Long Sleeve Sequin Shift Dress",
        "price": 299.8,
        "price_after_item_discount": 299.8,
        "price_after_order_discount": 299.8,
        "product_id": "xyz",
        "product_name": "Dress",
        "quantity": 2,
        "shipment_id": "xyz",
        "tax": 0,
        "tax_basis": 299.8,
        "tax_class_id": "xyz",
        "tax_rate": 0,
        "c_cost": 25.17,
        "c_finalSale": false,
        "c_outlet": false,
        "c_taxClassID": "xyz"
    }
],
"product_sub_total": 299.8,
"product_total": 299.8,
"shipments": [
    {
        "_type": "shipment",
        "adjusted_merchandize_total_tax": 0,
        "adjusted_shipping_total_tax": 0,
        "gift": false,
        "merchandize_total_tax": 0,
        "product_sub_total": 299.8,
        "product_total": 299.8,
        "shipment_id": "xyz",
        "shipment_total": 299.8,
        "shipping_address": {
            "_type": "order_address",
            "city": "Boston",
            "country_code": "US",
            "first_name": "John",
            "full_name": "John Martin",
            "id": "xyz",
            "last_name": "Martin"
        },
        "shipping_method": {
            "_type": "shipping_method",
            "description": "Order received within 5-8 business days",
            "id": "xyz",
            "name": "Standard",
            "price": 0,
            "shipping_promotions": [
                {
                    "_type": "shipping_promotion",
                    "callout_msg": "Free shipping on U.S. orders of $125+",
                    "link": "link",
                    "promotion_id": "xyz",
                    "promotion_name": "Free Shipping With $125 Purchase"
                }
            ],
            "c_BxFlatrateFlag": false,
            "c_IsBorderlinxMethod": false
        },
        "shipping_status": "not_shipped",
        "shipping_total": 0,
        "shipping_total_tax": 0,
        "tax_total": 0
    }
],
"shipping_items": [
    {
        "_type": "shipping_item",
        "adjusted_tax": 0,
        "base_price": 0,
        "item_id": "xyz",
        "item_text": "Shipping",
        "price": 0,
        "price_after_item_discount": 0,
        "shipment_id": "xyz",
        "tax": 0,
        "tax_basis": 0,
        "tax_class_id": "xyz",
        "tax_rate": 0
    }
],
"shipping_status": "not_shipped",
"shipping_total": 0,
"shipping_total_tax": 0,
"site_id": "site name",
"status": "created",
"taxation": "net",
"tax_total": 0

}

J'ai essayé cette ressource

Patch /orders/{order_no}/payment_instruments/{payment_instrument_id} 
{
 "amount" : 299.8,
 "payment_card" : {
                 "number":"424459xxxxxx4240",
                 "security_code":"121",
                 "holder":"John Martin",
                 "card_type":"Visa",
                 "expiration_month":1,
                 "expiration_year":2021
                },
"payment_method_id" : "CREDIT_CARD",
"c_PaymentProcessor": "VANTIV_CREDIT",
"c_paymentTransaction": {
  "custom": { 
    "litleAFTresponse": "Approved",
    "litleAFTTxnId": "8283868xxx8288282"
  }
}

}

Pour mettre à jour ma commande mais sans succès. Veuillez me faire savoir si vous avez des suggestions. Merci.

0
Awais 20 nov. 2018 à 16:32

3 réponses

Meilleure réponse

Si vous avez une authentification de paiement en dehors du cloud commercial pour une raison quelconque, vous pourrez peut-être gérer les choses dans les attributs de document de demande personnalisés. Notez qu'il existe une option pour ignorer «autorisation» dans CC par le paramètre skip_authorization. par exemple:

POST /shop/v19_3/orders/00000027/payment_instruments?skip_authorization=true HTTP/1.1
Host: example.com
Authorization:Bearer eyJfdiI6IjXXXXXX.eyJfdiI6IjEiLCJleHAXXXXXXX.-d5wQW4c4O4wt-Zkl7_fiEiALW1XXXX 
Content-Type: application/json
{
  "amount": 49.99,
  "payment_method_id": "MY_PAYMENT_METHOD",
  "c_payment_token": "tokenvaluehere==",
  "c_payment_status": "payment_status"
}

Ensuite, dans votre dw.ocapi.shop.order.payment_instrument.afterPOST, vous pouvez ajouter des attributs aux PaymentInstrument de la commande via les méthodes de l'API B2C qui sont accessibles via le paramètre order du callback.

Vous voudrez vérifier dans le hook beforePOST pour vous assurer que le paramètre c_payment_status est une valeur acceptable et si ce n'est pas retourner un objet d'état de type Status.ERROR. Ensuite, vous pouvez enregistrer les propriétés dans le hook afterPOST où les objets dont vous aurez besoin sont déjà créés.

Par exemple:

exports.paymentInstrumentAfterPOST = function(order, paymentInstrumentRequest) {
  const PaymentTransaction = require('dw/order/PaymentTransaction');
  const Status = require('dw/system/Status');
  const Transaction = require('dw/system/Transaction');
  let methodId = paymentInstrumentRequest.payment_method_id;
  let instruments = order.getPaymentInstruments(methodId);
  let instrument = instruments[0]; // FIXME you should actually iterate over this instead; just for demo
  let paymentTransaction =  instrument.getPaymentTransaction();

  Transaction.begin();
  paymentTransaction.setTransactionID(paymentInstrumentRequest.c_payment_token);
  paymentTransaction.setType(PaymentTransaction.TYPE_AUTH);

  Transaction.commit();

  return new Status(Status.OK);
}

Pour plus d'informations sur la personnalisation du flux de paiement, consultez le Documentation sur les ressources des commandes

Clause de non-responsabilité , c'est tout du code écrit à la main dans le formulaire de réponse de StackOverflow. Je n'ai pas confirmé que cela fonctionnera réellement, mais j'espère que cela fournira une direction.

0
sholsinger 11 avril 2019 à 16:28

La plate-forme elle-même a des flux de travail internes que vous devez suivre étape par étape pour terminer une commande via OCAPI Rest Api. Vous devez suivre le flux de travail étape par étape ou si vous ne le trouvez pas, demandez à votre architecte DW de vous guider.

0
Alex MAN 2 mars 2019 à 16:42

En interne dans le cloud de commerce, l'appel de méthode ci-dessous définit l'ID de transaction: paymentInstrument.paymentTransaction.setTransactionID (anTransactionId) afin que votre hypothèse soit correcte. Ce champ n'est cependant pas exposé dans l'API de la boutique. D'après la documentation, il est clair que l'autorisation du paiement doit être déclenchée par le cloud de commerce. c'est une contrainte de sécurité. Il est possible de personnaliser l'API pour contourner cette limitation.

0
Jesper 28 févr. 2019 à 13:35