如何使用Demandware OCAPI 为下单添加支付交易状态?

How to add the payment transaction status in order placed by using Demandware OCAPI?

我正在为 Demandware 上的电子商务网站的移动应用程序开发 API。我正在使用 OCAPI 18.8 下订单并将付款详细信息发送给第三方付款处理商 Vantiv。我从 Vantiv 获得了交易 ID 和响应代码,并想更新我的订单以将这些支付交易详细信息存储到我的订单中。但是我在 OCAPI 中找不到任何资源,这让我可以添加从 Vantiv 收到的事务 ID 和响应代码。以下是我通过 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 5+",
                    "link": "link",
                    "promotion_id": "xyz",
                    "promotion_name": "Free Shipping With 5 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"
  }
}

}

更新我的订单但没有成功。 如果您有任何建议,请告诉我。谢谢

在商业云内部,下面的方法调用设置了交易 ID:paymentInstrument.paymentTransaction.setTransactionID(anTransactionId) 所以您的假设是正确的。然而,该字段未在商店 API 中公开。从文档中可以清楚地看出,支付授权应该由商务云触发。这是一个安全限制。可以自定义 API 来规避此限制。

平台本身有一些内部工作流程,您必须逐步遵循这些工作流程才能通过 OCAPI Rest Api 完成订单。您应该遵循逐步的工作流程,或者如果您没有找到它,请让您的 DW 架构师指导您。

如果您出于某种原因在商业云之外进行支付授权,您可以在自定义请求文档属性中处理事情。请注意,在 CC 中有一个选项可以通过 skip_authorization 参数跳过 '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 中,您可以通过 B2C API 方法向订单的 PaymentInstrument 添加属性,这些方法可通过回调的 order 参数访问。

您需要检查 beforePOST 挂钩以确保 c_payment_status 参数是一个可接受的值,如果不是 return 一个 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 resource documentation

免责声明 这是在 Whosebug 的回答表单中徒手编写的所有代码。我还没有验证这实际上 运行,但我希望它能提供指导。

截至今天,该平台提供了一种更好的方法来处理此要求。在 DATA API Endpoints 下,您现在有几个整体来更新整个订单状态、付款、装运,甚至送货地址。官方发行说明中的​​更多详细信息:

You can now use Data API endpoints to update orders in server-to-server use cases, such as when an order management system or payment provider initiates a change.

Use new PUT commands to update the different types of order statuses.

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 

Use a new PUT command to update an order’s shipping address.

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

Use new PATCH commands to update order and payment attributes.

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