Как добавить статус платежной транзакции в заказ, размещенный с помощью Demandware OCAPI?

Я разрабатываю API для мобильного приложения на сайте электронной коммерции, которое находится на Demandware. Я использую OCAPI 18.8, чтобы разместить заказ и отправить платежные реквизиты стороннему платежному процессору, который является Vantiv. Я получаю идентификатор транзакции и код ответа от Vantiv и хочу обновить свой заказ, чтобы сохранить эти детали платежной транзакции в моем заказе. Но я не смог найти ни одного ресурса в OCAPI, который позволил бы мне добавить идентификатор транзакции и код ответа, полученный от Vantiv. Ниже приведен заказ, который я разместил через 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

}

Я попробовал этот ресурс

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"
  }
}

}

обновить мой заказ, но безуспешно. Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения. Благодарю.

4 ответа

Сама платформа имеет некоторые внутренние рабочие процессы, которые вы должны выполнять шаг за шагом, чтобы выполнить заказ через OCAPI Rest Api. Вы должны следовать пошаговому рабочему процессу или, если вы его не нашли, попросить вашего архитектора DW направить вас.

На сегодняшний день платформа предоставляет лучший способ справиться с этим требованием. В конечных точках DATA API теперь есть несколько входов для обновления общего статуса заказа, оплаты, отгрузки или даже адреса доставки. Более подробная информация в официальных примечаниях к выпуску:

Теперь вы можете использовать конечные точки API данных для обновления заказов в сценариях межсерверного использования, например, когда система управления заказами или поставщик платежей инициируют изменение.

Используйте новые команды PUT для обновления различных типов статусов заказов.

      PUT /sites/{site_id}/orders/{order_no}/confirmation_status 
PUT /sites/{site_id}/orders/{order_no}/export_status 
PUT /sites/{site_id}/orders/{order_no}/external_status 
PUT /sites/{site_id}/orders/{order_no}/payment_status 
PUT /sites/{site_id}/orders/{order_no}/shipping_status 
PUT /sites/{site_id}/orders/{order_no}/status 

Используйте новую команду PUT, чтобы обновить адрес доставки заказа.

      PUT /sites/{site_id}/orders/{order_no}/shipments/{shipment_id}/shipping_address

Используйте новые команды PATCH для обновления атрибутов заказа и оплаты.

      PATCH /sites/{site_id}/orders/{order_no} 
PATCH /sites/{site_id}/orders/{order_no}/payment_instruments/{payment_instrument_id}
PATCH /sites/{site_id}/orders/{order_no}/payment_instruments/{payment_instrument_id}/transaction

источник: https://help.salesforce.com/articleView?id=sf.b2c_20_2_W6833203_ocapi_order_update_endpoints_as.htm&type=5

Если по какой-либо причине у вас есть платежный аутентификатор, выходящий за пределы коммерческого облака, вы можете обрабатывать вещи в атрибутах документа пользовательского запроса. Обратите внимание, что есть возможность пропустить "авторизацию" в CC по skip_authorization параметр. например:

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"
}

Тогда внутри вашего dw.ocapi.shop.order.payment_instrument.afterPOST Вы можете добавить атрибуты к Ордену PaymentInstrument через методы API B2C, которые доступны через обратный вызов order параметр.

Вы хотите проверить в beforePOST крюк, чтобы убедиться, что c_payment_status Параметр является приемлемым значением, и если не вернуть Status.ERROR тип объекта статуса. Затем вы можете сохранить свойства в afterPOST зацепите, где объекты, которые вам нужны, уже созданы.

Например:

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);
}

Для получения дополнительной информации о настройке потока платежей см. Документацию ресурса Orders.

Отказ от ответственности - это весь код, написанный от руки в форме ответа Stackru. Я не утверждал, что это действительно будет работать, но я надеюсь, что это дает направление.

Внутренне в коммерческом облаке вызов метода ниже устанавливает идентификатор транзакции: paymentInstrument.paymentTransaction.setTransactionID(anTransactionId), поэтому ваше предположение верно. Однако это поле не отображается в API магазина. Из документации ясно, что авторизация платежа должна инициироваться коммерческим облаком. это ограничение безопасности. Можно настроить API, чтобы обойти это ограничение.

Другие вопросы по тегам