如何使用Demandware OCAPI按订单添加付款交易状态?

问题描述 投票:0回答:3

我正在为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 $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"
  }
}

}

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

api e-commerce payment-processing demandware
3个回答
0
投票

如果由于某种原因在商业云之外发生了支付身份验证,您可以处理自定义请求文档属性中的内容。请注意,可以通过skip_authorization参数跳过CC中的“授权”选项。例如:

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方法向Order的PaymentInstrument添加属性,这些方法可以通过回调的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 resource documentation

免责声明这是StackOverflow的答案形式中所有代码。我没有证实这实际上会运行,但我希望它提供方向。


0
投票

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


0
投票

平台本身有一些内部工作流程,您必须按照步骤通过OCAPI Rest Api完成订单。您应该按照分步工作流程进行操作,或者如果您没有找到它,请让DW架构师指导您。

© www.soinside.com 2019 - 2024. All rights reserved.