ย้ายข้อมูลธุรกรรมสินค้าที่เป็นวัตถุไปยัง v3 (Dialogflow)

ตั้งแต่วันที่ 7 สิงหาคม 2019 เราได้เลิกใช้งาน Orders v2 API และแทนที่ด้วยคำสั่งซื้อแล้ว เวอร์ชัน 3 หากคุณสร้างการดำเนินการที่จัดการธุรกรรมทางกายภาพก่อน วันที่ดังกล่าว ให้ทำตามคำแนะนำนี้เพื่ออัปเดตการดำเนินการของคุณไปใช้คำสั่งซื้อ v3

การเปลี่ยนแปลง API

Orders API เวอร์ชัน 3 มีการเปลี่ยนแปลงที่สำคัญต่อไปนี้จากเวอร์ชัน 2

  • โครงสร้างคำขอ - โครงสร้างคำสั่งซื้อเวอร์ชัน 3 ประกอบด้วย รายละเอียดคำสั่งซื้อ แทนที่จะเป็นแค่เพียงสินค้าในรถเข็นเท่านั้น
  • การอัปเดตคำสั่งซื้อ - Orders API เวอร์ชัน 3 จะจัดการการอัปเดตคำสั่งซื้อใน ในการจัดการกับตำแหน่ง ของคำสั่งซื้อ ดังนั้นปลายทางของคุณจึงไม่ต้อง ใช้ Actions API เพื่อส่งข้อมูลอัปเดตเกี่ยวกับคำสั่งซื้อให้แก่ผู้ใช้ คุณยังส่ง จะอัปเดตเป็นคำขอ Patch ไปยัง Orders API ที่อัปเดต URL ที่มีอยู่ order แทนคำขอ POST เพื่อส่งการอัปเดตสถานะ
  • การอำนวยความสะดวกด้านการชำระเงิน - การดำเนินการที่ใช้ Google Pay เวอร์ชัน 3 Orders API จะรวมรายละเอียดเกตเวย์การชำระเงินไว้ในโครงสร้าง JSON ใหม่ ทำให้สามารถขยายขีดความสามารถและเป็นไปตามกฎหมายของสหภาพยุโรป

ย้ายข้อมูล Node.JS ไปยัง v3

ทำตามขั้นตอนต่อไปนี้เพื่อย้ายข้อมูลการดำเนินการที่ใช้ไลบรารีของไคลเอ็นต์ Node.JS

1. เพิ่มแฟล็กคำสั่งซื้อ v3

ฟังก์ชันไลบรารีของไคลเอ็นต์ที่คุณใช้จัดการธุรกรรมได้รับการอัปเดตแล้ว สำหรับคำสั่งซื้อเวอร์ชัน 3 คุณเพียงต้องเพิ่มแฟล็กในรหัสการดำเนินการตามคำสั่งซื้อ ที่อัปเดตฟังก์ชันเพื่อส่ง JSON เวอร์ชัน 3

เพิ่มโค้ดต่อไปนี้ลงในการดำเนินการตามคำสั่งซื้อ

Node.js
const {dialogflow} = require('actions-on-google');
const app = dialogflow({ordersv3: true});

2. อัปเดตการประกอบรถเข็น

ProposedOrder ได้แทนที่ด้วย Order ที่มีรายละเอียดมากขึ้น ออบเจ็กต์ ดูการอ้างอิง JSON เพื่อแปลงรถเข็น ProposedOrder เป็น รถเข็น Order

3. อัปเดตพารามิเตอร์การชำระเงิน

โครงสร้างของข้อมูลการชำระเงินในขั้นตอนข้อเสนอคำสั่งซื้อ แตกต่างกันใน API แต่ละเวอร์ชัน

ในคำขอ Intent actions.intent.TRANSACTION_DECISION ให้แทนที่อันเดิม paymentOptions ที่มีออบเจ็กต์ paymentParameters ใหม่ ส่วนใหญ่ของ ฟิลด์ที่มีอยู่เหมือนกัน โปรดบันทึกการเปลี่ยนแปลงบางอย่างกับออบเจ็กต์ JSON ใหม่

ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่าง actions.intent.TRANSACTION_DECISION คำขอ Intent สำหรับ Google Pay ที่ใช้เวอร์ชัน 3 และคำขอเวอร์ชันเก่า 2 สำหรับ เปรียบเทียบ

Node.JS ใหม่ (v3)
วันที่
conv.ask(new TransactionDecision({
  orderOptions: {
    requestDeliveryAddress: false,
    userInfoOptions: {
      userInfoProperties: [
        'EMAIL',
      ],
    },
  },
  paymentParameters: {
    googlePaymentOption: {
      // facilitationSpec is expected to be a serialized JSON string
      facilitationSpec: JSON.stringify({
        apiVersion: 2,
        apiVersionMinor: 0,
        merchantInfo: {
          merchantName: 'Example Merchant',
        },
        allowedPaymentMethods: [
          {
            type: 'CARD',
            parameters: {
              allowedAuthMethods: ['PAN_ONLY', 'CRYPTOGRAM_3DS'],
              allowedCardNetworks: [
                'AMEX', 'DISCOVER', 'JCB', 'MASTERCARD', 'VISA'],
            },
            tokenizationSpecification: {
              type: 'PAYMENT_GATEWAY',
              parameters: {
                gateway: 'example',
                gatewayMerchantId: 'exampleGatewayMerchantId',
              },
            },
          },
        ],
        transactionInfo: {
          totalPriceStatus: 'FINAL',
          totalPrice: '10.00',
          currencyCode: 'USD',
        },
      }),
    },
  },
  presentationOptions: {
    actionDisplayName: 'PLACE_ORDER',
  },
  order: order,
}));
Node.JS แบบเก่า (v2)
วันที่
conv.ask(new TransactionDecision({
  orderOptions: {
    requestDeliveryAddress: false,
  },
  paymentOptions: {
    googleProvidedOptions: {
      prepaidCardDisallowed: false,
      supportedCardNetworks: ['VISA', 'AMEX', 'DISCOVER', 'MASTERCARD'],
      tokenizationParameters: {
        tokenizationType: 'PAYMENT_GATEWAY',
        // These will be provided by payment processor,
        // like Stripe, Braintree, Vantiv, Ayden, etc.
        parameters: {
          'gateway': 'stripe',
          'stripe:publishableKey': (conv.sandbox ? 'pk_test_key' : 'pk_live_key'),
          'stripe:version': '2018-11-08'
        },
      },
    },
  },
  proposedOrder: order,
}));
JSON ใหม่ (v3)

โปรดทราบว่า JSON ของ Dialogflow ด้านล่างจะอธิบายการตอบสนองของเว็บฮุค

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "systemIntent": {
        "intent": "actions.intent.TRANSACTION_DECISION",
        "data": {
          "@type": "type.googleapis.com/google.actions.transactions.v3.TransactionDecisionValueSpec",
          "orderOptions": {
            "requestDeliveryAddress": "false"
          },
          "paymentParameters": {
            "googlePaymentOption": {
              "facilitationSpec": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"Example Merchant\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\",\"CRYPTOGRAM_3DS\"],\"allowedCardNetworks\":[\"AMEX\",\"DISCOVER\",\"JCB\",\"MASTERCARD\",\"VISA\"]},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gateway\":\"example\",\"gatewayMerchantId\":\"exampleGatewayMerchantId\"}}}],\"transactionInfo\":{\"totalPriceStatus\":\"FINAL\",\"totalPrice\":\"10.00\",\"currencyCode\":\"USD\"}}"
            }
          },
          "presentationOptions": {
            "actionDisplayName": "PLACE_ORDER"
          },
          "order": {
            "createTime": "2019-08-01T17:12:13.765Z",
            "lastUpdateTime": "2019-08-01T17:12:13.765Z",
            "merchantOrderId": "UNIQUE_ORDER_ID",
            "userVisibleOrderId": "USER_VISIBLE_ORDER_ID",
            "transactionMerchant": {
              "id": "http://www.example.com",
              "name": "Example Merchant"
            },
            "contents": {
              "lineItems": [
                {
                  "id": "LINE_ITEM_ID",
                  "name": "Pizza",
                  "description": "A four cheese pizza.",
                  "priceAttributes": [
                    {
                      "type": "REGULAR",
                      "name": "Line Item Price",
                      "state": "ACTUAL",
                      "amount": {
                        "currencyCode": "USD",
                        "amountInMicros": 8990000
                      },
                      "taxIncluded": true
                    }
                  ],
                  "notes": [
                    "Extra cheese."
                  ],
                  "purchase": {
                    "quantity": 1,
                    "unitMeasure": {
                      "measure": 1,
                      "unit": "POUND"
                    },
                    "itemOptions": [
                      {
                        "id": "ITEM_OPTION_ID",
                        "name": "Pepperoni",
                        "prices": [
                          {
                            "type": "REGULAR",
                            "state": "ACTUAL",
                            "name": "Item Price",
                            "amount": {
                              "currencyCode": "USD",
                              "amountInMicros": 1000000
                            },
                            "taxIncluded": true
                          }
                        ],
                        "note": "Extra pepperoni",
                        "quantity": 1,
                        "subOptions": []
                      }
                    ]
                  }
                }
              ]
            },
            "buyerInfo": {
              "email": "janedoe@gmail.com",
              "firstName": "Jane",
              "lastName": "Doe",
              "displayName": "Jane Doe"
            },
            "priceAttributes": [
              {
                "type": "TOTAL",
                "name": "Total Price",
                "state": "ESTIMATE",
                "amount": {
                  "currencyCode": "USD",
                  "amountInMicros": 15770000
                },
                "taxIncluded": true
              },
              {
                "type": "TAX",
                "name": "Tax",
                "state": "ESTIMATE",
                "amount": {
                  "currencyCode": "USD",
                  "amountInMicros": 3780000
                },
                "taxIncluded": true
              },
              {
                "type": "SUBTOTAL",
                "name": "Subtotal",
                "state": "ESTIMATE",
                "amount": {
                  "currencyCode": "USD",
                  "amountInMicros": 9990000
                },
                "taxIncluded": true
              },
              {
                "type": "DELIVERY",
                "name": "Delivery",
                "state": "ACTUAL",
                "amount": {
                  "currencyCode": "USD",
                  "amountInMicros": 2000000
                },
                "taxIncluded": true
              }
            ],
            "followUpActions": [
              {
                "type": "VIEW_DETAILS",
                "title": "View details",
                "openUrlAction": {
                  "url": "http://example.com"
                }
              },
              {
                "type": "CALL",
                "title": "Call us",
                "openUrlAction": {
                  "url": "tel:+16501112222"
                }
              },
              {
                "type": "EMAIL",
                "title": "Email us",
                "openUrlAction": {
                  "url": "mailto:person@example.com"
                }
              }
            ],
            "termsOfServiceUrl": "www.example.com",
            "note": "Sale event",
            "promotions": [
              {
                "coupon": "COUPON_CODE"
              }
            ],
            "purchase": {
              "status": "CREATED",
              "userVisibleStatusLabel": "CREATED",
              "type": "FOOD",
              "returnsInfo": {
                "isReturnable": false,
                "daysToReturn": 1,
                "policyUrl": "http://www.example.com"
              },
              "fulfillmentInfo": {
                "id": "FULFILLMENT_SERVICE_ID",
                "fulfillmentType": "DELIVERY",
                "expectedFulfillmentTime": {
                  "timeIso8601": "2017-01-16T01:30:15.01Z"
                },
                "location": {
                  "zipCode": "94086",
                  "city": "Sunnyvale",
                  "postalAddress": {
                    "regionCode": "US",
                    "postalCode": "94086",
                    "administrativeArea": "CA",
                    "locality": "Sunnyvale",
                    "addressLines": [
                      "222, Some other Street"
                    ]
                  }
                },
                "price": {
                  "type": "REGULAR",
                  "name": "Delivery Price",
                  "state": "ACTUAL",
                  "amount": {
                    "currencyCode": "USD",
                    "amountInMicros": 2000000
                  },
                  "taxIncluded": true
                },
                "fulfillmentContact": {
                  "email": "johnjohnson@gmail.com",
                  "firstName": "John",
                  "lastName": "Johnson",
                  "displayName": "John Johnson"
                }
              },
              "purchaseLocationType": "ONLINE_PURCHASE"
            }
          }
        }
      }
    }
  }
}
JSON เก่า (v2)

โปรดทราบว่า JSON ของ Dialogflow ด้านล่างจะอธิบายการตอบสนองของเว็บฮุค

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "systemIntent": {
        "intent": "actions.intent.TRANSACTION_DECISION",
        "data": {
          "@type": "type.googleapis.com/google.actions.v2.TransactionDecisionValueSpec",
          "orderOptions": {
            "requestDeliveryAddress": false
          },
          "paymentOptions": {
            "googleProvidedOptions": {
              "prepaidCardDisallowed": false,
              "supportedCardNetworks": [
                "VISA",
                "AMEX",
                "DISCOVER",
                "MASTERCARD"
              ],
              "tokenizationParameters": {
                "tokenizationType": "PAYMENT_GATEWAY",
                "parameters": {
                  "gateway": "stripe",
                  "stripe:publishableKey": "pk_test_key",
                  "stripe:version": "2018-11-08"
                }
              }
            }
          },
          "proposedOrder": {
            "id": "UNIQUE_ORDER_ID222",
            "cart": {
              "merchant": {
                "id": "book_store_id",
                "name": "A Book Store"
              },
              "lineItems": [
                {
                  "name": "My Memoirs",
                  "id": "mymemoirs_id",
                  "price": {
                    "amount": {
                      "currencyCode": "USD",
                      "nanos": 990000000,
                      "units": 8
                    },
                    "type": "ACTUAL"
                  },
                  "quantity": 1,
                  "subLines": [
                    {
                      "note": "By Bestselling Novelist"
                    }
                  ],
                  "type": "REGULAR"
                },
                {
                  "name": "Biography",
                  "id": "biography_id",
                  "price": {
                    "amount": {
                      "currencyCode": "USD",
                      "nanos": 990000000,
                      "units": 10
                    },
                    "type": "ACTUAL"
                  },
                  "quantity": 1,
                  "subLines": [
                    {
                      "note": "Signed copy"
                    }
                  ],
                  "type": "REGULAR"
                }
              ],
              "notes": "Sale event",
              "otherItems": []
            },
            "otherItems": [
              {
                "name": "Subtotal",
                "id": "subtotal",
                "price": {
                  "amount": {
                    "currencyCode": "USD",
                    "nanos": 980000000,
                    "units": 19
                  },
                  "type": "ESTIMATE"
                },
                "type": "SUBTOTAL"
              },
              {
                "name": "Tax",
                "id": "tax",
                "price": {
                  "amount": {
                    "currencyCode": "USD",
                    "nanos": 780000000,
                    "units": 2
                  },
                  "type": "ESTIMATE"
                },
                "type": "TAX"
              }
            ],
            "totalPrice": {
              "amount": {
                "currencyCode": "USD",
                "nanos": 760000000,
                "units": 22
              },
              "type": "ESTIMATE"
            }
          }
        }
      }
    }
  }
}

4. ส่งการอัปเดตด้วย Orders API

Orders API เวอร์ชัน 3 จะจัดการการอัปเดตคำสั่งซื้อ คุณจึงไม่ต้อง ส่งคำขอ POST ไปยัง Actions API แต่คุณส่งคำขอ Patch แทนได้ เป็น Orders API ที่อัปเดตเนื้อหาของออบเจ็กต์ Order

ดึงข้อมูลโทเค็นสำหรับผู้ถือใหม่

คุณสามารถใช้คีย์บัญชีบริการ JSON เดียวกันกับที่ใช้เรียกข้อมูล โทเค็นสำหรับผู้ถือสำหรับ Actions API คุณจะต้องขอโทเค็นสำหรับผู้ถือใหม่สำหรับ Orders API แลกเปลี่ยนคีย์บริการกับโทเค็นสำหรับผู้ถือ ที่ใช้ไลบรารีไคลเอ็นต์ Google APIs และ "https://www.googleapis.com/auth/actions.order.developer"

คุณดูขั้นตอนการติดตั้งและตัวอย่างได้ที่หน้า GitHub ในไลบรารีของไคลเอ็นต์ API นอกจากนี้ คุณสามารถอ้างอิง order-update.js ที่อัปเดตแล้วในตัวอย่าง Node.js ของเราสำหรับตัวอย่างการแลกเปลี่ยนคีย์ Orders API

ส่งการอัปเดต

ขั้นตอนการส่งการอัปเดตคำสั่งซื้อด้วย Orders API จะคล้ายกับการส่ง การอัปเดตด้วย Actions API แม้ว่าคุณจะส่งคำขอแพตช์ แทนคำขอ POST คำขอ Patch ควรใช้เนื้อหา JSON ของ รูปแบบต่อไปนี้:

{ "orderUpdate": OrderUpdate" }

รูปแบบ OrderUpdate แตกต่างจากเวอร์ชัน 3 ด้วย โปรดดูข้อมูลอ้างอิงคำขอแพตช์ และอัปเดตช่อง OrderUpdate ให้สอดคล้องกัน ข้อมูลโค้ดต่อไปนี้ แสดงตัวอย่างคำขอ Patch ที่อัปเดตสถานะของคำสั่งซื้อเป็น "DELIVERED":

Node.js
// Import the 'googleapis' module for authorizing the request.
const {google} = require('googleapis');
// Import the 'request' module for sending an HTTP POST request.
const request = require('request');
// Import the OrderUpdate class from the Actions on Google client library.
const {OrderUpdate} = require('actions-on-google');
// Import the service account key used to authorize the request. Replace the string path with a path to your service account key.
const key = require('./service-account.json');
// Create a new JWT client for the Actions API using credentials from the service account key.
let jwtClient = new google.auth.JWT(
    key.client_email,
    null,
    key.private_key,
    ['https://www.googleapis.com/auth/actions.order.developer'],
    null
);
// Authorize the client asynchronously, passing in a callback to run upon authorization.
jwtClient.authorize((err, tokens) => {
    if (err) {
        console.log(err);
        return;
    }
    // Declare the ID of the order to update.
    const orderId = '<UNIQUE_MERCHANT_ORDER_ID>';

    const orderUpdate = new OrderUpdate({
        updateMask: [
          'lastUpdateTime',
          'purchase.status',
          'purchase.userVisibleStatusLabel',
        ].join(','),
        order: {
          merchantOrderId: orderId,
          lastUpdateTime: new Date().toISOString(),
          purchase: {
            status: 'DELIVERED',
            userVisibleStatusLabel: 'Order delivered',
          },
        },
        reason: 'Order status updated to delivered.',
    });

    // Set up the PATCH request header and body, including the authorized token
    // and order update.
    const bearer = 'Bearer ' + tokens.access_token;
    const options = {
        method: 'PATCH',
        url: `https://actions.googleapis.com/v3/orders/${orderId}`,
        headers: {
          'Authorization': bearer,
        },
        body: {
          header: {
            'isInSandbox': true,
          },
          orderUpdate,
        },
        json: true,
      };
    // Send the PATCH request to the Orders API.
    request.patch(options, (err, httpResponse, body) => {
        if (err) {
            console.log('There was an error...');
            console.log(err);
            return;
        }
    });
});

จัดการสถานะการสั่งซื้อเพิ่มเติม

Orders API เวอร์ชัน 3 รองรับค่าสถานะคำสั่งซื้อเพิ่มเติม ที่ไม่มีในเวอร์ชัน 2 คุณควรส่ง อัปเดตคำสั่งซื้อสำหรับทุกสถานะที่เกี่ยวข้องกับธุรกรรมแต่ละรายการ

ค่าสถานะต่อไปนี้เป็นเวอร์ชันใหม่สำหรับเวอร์ชัน 3

  • IN_PREPARATION - อยู่ระหว่างการจัดเตรียมคำสั่งซื้อเพื่อการจัดส่ง/การจัดส่ง เช่น อาหาร กำลังปรุงอาหาร หรือรายการที่กำลังบรรจุหีบห่อ
  • READY_FOR_PICKUP - ผู้รับจะรับสินค้าที่สั่งซื้อได้
  • DELIVERED - จัดส่งสินค้าที่สั่งซื้อถึงผู้รับแล้ว
  • OUT_OF_STOCK - สินค้าหมดอย่างน้อย 1 รายการในคำสั่งซื้อ
  • CHANGE_REQUESTED - ผู้ใช้ได้ขอให้แก้ไขคำสั่งซื้อ โดยการเปลี่ยนแปลงเป็น กำลังประมวลผล

สถานะ FULFILLED เลิกใช้งานแล้วและแทนที่ด้วย DELIVERED

ย้ายข้อมูล Java ไปยัง v3

ทำตามขั้นตอนต่อไปนี้เพื่อย้ายข้อมูลการดำเนินการที่ใช้ไลบรารีไคลเอ็นต์ Java

1. อัปเดตการประกอบรถเข็น

ProposedOrder ได้แทนที่ด้วย Order ที่มีรายละเอียดมากขึ้น ออบเจ็กต์ ดูการอ้างอิง JSON เพื่อแปลงรถเข็น ProposedOrder เป็น รถเข็น Order

2. อัปเดตพารามิเตอร์การชำระเงิน

โครงสร้างของข้อมูลการชำระเงินในขั้นตอนข้อเสนอคำสั่งซื้อ แตกต่างกันใน API แต่ละเวอร์ชัน

ในคำขอ Intent actions.intent.TRANSACTION_DECISION ให้แทนที่อันเดิม paymentOptions ที่มีออบเจ็กต์ paymentParameters ใหม่ ส่วนใหญ่ของ ฟิลด์ที่มีอยู่เหมือนกัน โปรดบันทึกการเปลี่ยนแปลงบางอย่างกับออบเจ็กต์ JSON ใหม่

ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่าง actions.intent.TRANSACTION_DECISION คำขอ Intent สำหรับ Google Pay ที่ใช้เวอร์ชัน 3 และคำขอเวอร์ชันเก่า 2 สำหรับ เปรียบเทียบ

Java (v3)
วันที่
// Create order options
OrderOptionsV3 orderOptions = new OrderOptionsV3()
    .setRequestDeliveryAddress(false)
    .setUserInfoOptions(new UserInfoOptions()
        .setUserInfoProperties(Collections.singletonList("EMAIL")));

// Create presentation options
PresentationOptionsV3 presentationOptions = new PresentationOptionsV3()
    .setActionDisplayName("PLACE_ORDER");

// Create payment parameters
JSONObject merchantInfo = new JSONObject();
merchantInfo.put("merchantName", "Example Merchant");

JSONObject facilitationSpec = new JSONObject();
facilitationSpec.put("apiVersion", 2);
facilitationSpec.put("apiVersionMinor", 0);
facilitationSpec.put("merchantInfo", merchantInfo);

JSONObject allowedPaymentMethod = new JSONObject();
allowedPaymentMethod.put("type", "CARD");

JSONArray allowedAuthMethods = new JSONArray();
allowedAuthMethods.addAll(Arrays.asList("PAN_ONLY", "CRYPTOGRAM_3DS"));
JSONArray allowedCardNetworks = new JSONArray();
allowedCardNetworks.addAll(Arrays.asList("AMEX", "DISCOVER", "JCB", "MASTERCARD", "VISA"));

JSONObject allowedPaymentMethodParameters = new JSONObject();
allowedPaymentMethodParameters.put("allowedAuthMethods", allowedAuthMethods);
allowedPaymentMethodParameters.put("allowedCardNetworks", allowedCardNetworks);

allowedPaymentMethod.put("parameters", allowedPaymentMethodParameters);

JSONObject tokenizationSpecificationParameters = new JSONObject();
tokenizationSpecificationParameters.put("gateway", "example");
tokenizationSpecificationParameters.put("gatewayMerchantId", "exampleGatewayMerchantId");

JSONObject tokenizationSpecification = new JSONObject();
tokenizationSpecification.put("type", "PAYMENT_GATEWAY");
tokenizationSpecification.put("parameters", tokenizationSpecificationParameters);
allowedPaymentMethod.put("tokenizationSpecification", tokenizationSpecification);

JSONArray allowedPaymentMethods = new JSONArray();
allowedPaymentMethods.add(allowedPaymentMethod);

facilitationSpec.put("allowedPaymentMethods", allowedPaymentMethods);

JSONObject transactionInfo = new JSONObject();
transactionInfo.put("totalPriceStatus", "FINAL");
transactionInfo.put("totalPrice", "10.00");
transactionInfo.put("currencyCode", "USD");

facilitationSpec.put("transactionInfo", transactionInfo);

GooglePaymentOption googlePaymentOption = new GooglePaymentOption()
    .setFacilitationSpec(facilitationSpec.toJSONString());

PaymentParameters paymentParameters = new PaymentParameters()
    .setGooglePaymentOption(googlePaymentOption);

// Ask for transaction decision
return getResponseBuilder(request)
    .add("Placeholder for transaction decision text")
    .add(new TransactionDecision()
        .setOrder(order)
        .setOrderOptions(orderOptions)
        .setPresentationOptions(presentationOptions)
        .setPaymentParameters(paymentParameters)
    )
    .build();
Java Old (v2)
วันที่
OrderOptions orderOptions;
PaymentOptions paymentOptions;

// Setup Google provided payment options
Map<String, String> parameters = new HashMap<>();
parameters.put("gateway", "stripe");
parameters.put("stripe:publishableKey", request.isInSandbox() ? "pk_test_key" : "pk_live_key");
parameters.put("stripe:version", "2017-04-06");
PaymentMethodTokenizationParameters tokenizationParameters =
    new PaymentMethodTokenizationParameters()
        .setTokenizationType("PAYMENT_GATEWAY")
        .setParameters(parameters);
orderOptions = new OrderOptions().setRequestDeliveryAddress(false);
GoogleProvidedPaymentOptions googleProvidedPaymentOptions =
    new GoogleProvidedPaymentOptions()
        .setPrepaidCardDisallowed(false)
        .setSupportedCardNetworks(Arrays.asList("VISA", "AMEX"))
        .setTokenizationParameters(tokenizationParameters);
paymentOptions = new PaymentOptions().setGoogleProvidedOptions(googleProvidedPaymentOptions);

return getResponseBuilder(request)
    .add("Placeholder for transaction decision text")
    .add(
        new TransactionDecision()
            .setOrderOptions(orderOptions)
            .setPaymentOptions(paymentOptions)
            .setProposedOrder(proposedOrder))
    .build();
JSON ใหม่ (v3)

โปรดทราบว่า JSON ของ Dialogflow ด้านล่างจะอธิบายการตอบสนองของเว็บฮุค

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "systemIntent": {
        "intent": "actions.intent.TRANSACTION_DECISION",
        "data": {
          "@type": "type.googleapis.com/google.actions.transactions.v3.TransactionDecisionValueSpec",
          "orderOptions": {
            "requestDeliveryAddress": "false"
          },
          "paymentParameters": {
            "googlePaymentOption": {
              "facilitationSpec": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"Example Merchant\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\",\"CRYPTOGRAM_3DS\"],\"allowedCardNetworks\":[\"AMEX\",\"DISCOVER\",\"JCB\",\"MASTERCARD\",\"VISA\"]},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gateway\":\"example\",\"gatewayMerchantId\":\"exampleGatewayMerchantId\"}}}],\"transactionInfo\":{\"totalPriceStatus\":\"FINAL\",\"totalPrice\":\"10.00\",\"currencyCode\":\"USD\"}}"
            }
          },
          "presentationOptions": {
            "actionDisplayName": "PLACE_ORDER"
          },
          "order": {
            "createTime": "2019-08-01T17:12:13.765Z",
            "lastUpdateTime": "2019-08-01T17:12:13.765Z",
            "merchantOrderId": "UNIQUE_ORDER_ID",
            "userVisibleOrderId": "USER_VISIBLE_ORDER_ID",
            "transactionMerchant": {
              "id": "http://www.example.com",
              "name": "Example Merchant"
            },
            "contents": {
              "lineItems": [
                {
                  "id": "LINE_ITEM_ID",
                  "name": "Pizza",
                  "description": "A four cheese pizza.",
                  "priceAttributes": [
                    {
                      "type": "REGULAR",
                      "name": "Line Item Price",
                      "state": "ACTUAL",
                      "amount": {
                        "currencyCode": "USD",
                        "amountInMicros": 8990000
                      },
                      "taxIncluded": true
                    }
                  ],
                  "notes": [
                    "Extra cheese."
                  ],
                  "purchase": {
                    "quantity": 1,
                    "unitMeasure": {
                      "measure": 1,
                      "unit": "POUND"
                    },
                    "itemOptions": [
                      {
                        "id": "ITEM_OPTION_ID",
                        "name": "Pepperoni",
                        "prices": [
                          {
                            "type": "REGULAR",
                            "state": "ACTUAL",
                            "name": "Item Price",
                            "amount": {
                              "currencyCode": "USD",
                              "amountInMicros": 1000000
                            },
                            "taxIncluded": true
                          }
                        ],
                        "note": "Extra pepperoni",
                        "quantity": 1,
                        "subOptions": []
                      }
                    ]
                  }
                }
              ]
            },
            "buyerInfo": {
              "email": "janedoe@gmail.com",
              "firstName": "Jane",
              "lastName": "Doe",
              "displayName": "Jane Doe"
            },
            "priceAttributes": [
              {
                "type": "TOTAL",
                "name": "Total Price",
                "state": "ESTIMATE",
                "amount": {
                  "currencyCode": "USD",
                  "amountInMicros": 15770000
                },
                "taxIncluded": true
              },
              {
                "type": "TAX",
                "name": "Tax",
                "state": "ESTIMATE",
                "amount": {
                  "currencyCode": "USD",
                  "amountInMicros": 3780000
                },
                "taxIncluded": true
              },
              {
                "type": "SUBTOTAL",
                "name": "Subtotal",
                "state": "ESTIMATE",
                "amount": {
                  "currencyCode": "USD",
                  "amountInMicros": 9990000
                },
                "taxIncluded": true
              },
              {
                "type": "DELIVERY",
                "name": "Delivery",
                "state": "ACTUAL",
                "amount": {
                  "currencyCode": "USD",
                  "amountInMicros": 2000000
                },
                "taxIncluded": true
              }
            ],
            "followUpActions": [
              {
                "type": "VIEW_DETAILS",
                "title": "View details",
                "openUrlAction": {
                  "url": "http://example.com"
                }
              },
              {
                "type": "CALL",
                "title": "Call us",
                "openUrlAction": {
                  "url": "tel:+16501112222"
                }
              },
              {
                "type": "EMAIL",
                "title": "Email us",
                "openUrlAction": {
                  "url": "mailto:person@example.com"
                }
              }
            ],
            "termsOfServiceUrl": "www.example.com",
            "note": "Sale event",
            "promotions": [
              {
                "coupon": "COUPON_CODE"
              }
            ],
            "purchase": {
              "status": "CREATED",
              "userVisibleStatusLabel": "CREATED",
              "type": "FOOD",
              "returnsInfo": {
                "isReturnable": false,
                "daysToReturn": 1,
                "policyUrl": "http://www.example.com"
              },
              "fulfillmentInfo": {
                "id": "FULFILLMENT_SERVICE_ID",
                "fulfillmentType": "DELIVERY",
                "expectedFulfillmentTime": {
                  "timeIso8601": "2017-01-16T01:30:15.01Z"
                },
                "location": {
                  "zipCode": "94086",
                  "city": "Sunnyvale",
                  "postalAddress": {
                    "regionCode": "US",
                    "postalCode": "94086",
                    "administrativeArea": "CA",
                    "locality": "Sunnyvale",
                    "addressLines": [
                      "222, Some other Street"
                    ]
                  }
                },
                "price": {
                  "type": "REGULAR",
                  "name": "Delivery Price",
                  "state": "ACTUAL",
                  "amount": {
                    "currencyCode": "USD",
                    "amountInMicros": 2000000
                  },
                  "taxIncluded": true
                },
                "fulfillmentContact": {
                  "email": "johnjohnson@gmail.com",
                  "firstName": "John",
                  "lastName": "Johnson",
                  "displayName": "John Johnson"
                }
              },
              "purchaseLocationType": "ONLINE_PURCHASE"
            }
          }
        }
      }
    }
  }
}
JSON เก่า (v2)

โปรดทราบว่า JSON ของ Dialogflow ด้านล่างจะอธิบายการตอบสนองของเว็บฮุค

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "systemIntent": {
        "intent": "actions.intent.TRANSACTION_DECISION",
        "data": {
          "@type": "type.googleapis.com/google.actions.v2.TransactionDecisionValueSpec",
          "orderOptions": {
            "requestDeliveryAddress": false
          },
          "paymentOptions": {
            "googleProvidedOptions": {
              "prepaidCardDisallowed": false,
              "supportedCardNetworks": [
                "VISA",
                "AMEX",
                "DISCOVER",
                "MASTERCARD"
              ],
              "tokenizationParameters": {
                "tokenizationType": "PAYMENT_GATEWAY",
                "parameters": {
                  "gateway": "stripe",
                  "stripe:publishableKey": "pk_test_key",
                  "stripe:version": "2018-11-08"
                }
              }
            }
          },
          "proposedOrder": {
            "id": "UNIQUE_ORDER_ID222",
            "cart": {
              "merchant": {
                "id": "book_store_id",
                "name": "A Book Store"
              },
              "lineItems": [
                {
                  "name": "My Memoirs",
                  "id": "mymemoirs_id",
                  "price": {
                    "amount": {
                      "currencyCode": "USD",
                      "nanos": 990000000,
                      "units": 8
                    },
                    "type": "ACTUAL"
                  },
                  "quantity": 1,
                  "subLines": [
                    {
                      "note": "By Bestselling Novelist"
                    }
                  ],
                  "type": "REGULAR"
                },
                {
                  "name": "Biography",
                  "id": "biography_id",
                  "price": {
                    "amount": {
                      "currencyCode": "USD",
                      "nanos": 990000000,
                      "units": 10
                    },
                    "type": "ACTUAL"
                  },
                  "quantity": 1,
                  "subLines": [
                    {
                      "note": "Signed copy"
                    }
                  ],
                  "type": "REGULAR"
                }
              ],
              "notes": "Sale event",
              "otherItems": []
            },
            "otherItems": [
              {
                "name": "Subtotal",
                "id": "subtotal",
                "price": {
                  "amount": {
                    "currencyCode": "USD",
                    "nanos": 980000000,
                    "units": 19
                  },
                  "type": "ESTIMATE"
                },
                "type": "SUBTOTAL"
              },
              {
                "name": "Tax",
                "id": "tax",
                "price": {
                  "amount": {
                    "currencyCode": "USD",
                    "nanos": 780000000,
                    "units": 2
                  },
                  "type": "ESTIMATE"
                },
                "type": "TAX"
              }
            ],
            "totalPrice": {
              "amount": {
                "currencyCode": "USD",
                "nanos": 760000000,
                "units": 22
              },
              "type": "ESTIMATE"
            }
          }
        }
      }
    }
  }
}

3. ส่งการอัปเดตด้วย Orders API

Orders API เวอร์ชัน 3 จะจัดการการอัปเดตคำสั่งซื้อ คุณจึงไม่ต้อง ส่งคำขอ POST ไปยัง Actions API แต่คุณส่งคำขอ Patch แทนได้ เป็น Orders API ที่อัปเดตเนื้อหาของออบเจ็กต์ Order

ดึงข้อมูลโทเค็นสำหรับผู้ถือใหม่

คุณสามารถใช้คีย์บัญชีบริการ JSON เดียวกันกับที่ใช้เรียกข้อมูล โทเค็นสำหรับผู้ถือสำหรับ Actions API คุณจะต้องขอโทเค็นสำหรับผู้ถือใหม่สำหรับ Orders API แลกเปลี่ยนคีย์บริการกับโทเค็นสำหรับผู้ถือ ที่ใช้ไลบรารีไคลเอ็นต์ Google APIs และ &quot;https://www.googleapis.com/auth/actions.order.developer&quot;

คุณดูขั้นตอนการติดตั้งและตัวอย่างได้ที่หน้า GitHub ในไลบรารีของไคลเอ็นต์ API นอกจากนี้ คุณยังสามารถอ้างอิง order-update.js ที่อัปเดตแล้วในตัวอย่าง Java ของเราสำหรับตัวอย่างการแลกเปลี่ยนคีย์ Orders API

ส่งการอัปเดต

ขั้นตอนการส่งการอัปเดตคำสั่งซื้อด้วย Orders API จะคล้ายกับการส่ง การอัปเดตด้วย Actions API แม้ว่าคุณจะส่งคำขอแพตช์ แทนคำขอ POST คำขอ Patch ควรใช้เนื้อหา JSON ของ รูปแบบต่อไปนี้:

{ "orderUpdate": OrderUpdate" }

รูปแบบ OrderUpdate แตกต่างจากเวอร์ชัน 3 ด้วย โปรดดูข้อมูลอ้างอิงคำขอแพตช์ และอัปเดตช่อง OrderUpdate ให้สอดคล้องกัน ข้อมูลโค้ดต่อไปนี้ แสดงตัวอย่างคำขอ Patch ที่อัปเดตสถานะของคำสั่งซื้อเป็น "DELIVERED":

Java
// Create order update
FieldMask fieldMask = FieldMask.newBuilder().addAllPaths(Arrays.asList(
    "last_update_time",
    "purchase.status",
    "purchase.userVisibleStatusLabel"))
    .build();

OrderUpdateV3 orderUpdate = new OrderUpdateV3()
    .setOrder(new OrderV3()
        .setMerchantOrderId(orderId)
        .setLastUpdateTime(Instant.now().toString())
        .setPurchase(new PurchaseOrderExtension()
            .setStatus("DELIVERED")
            .setUserVisibleStatusLabel("Order delivered.")))
    .setUpdateMask(FieldMaskUtil.toString(fieldMask))
    .setReason("Order status was updated to delivered.");

// Setup JSON body containing order update
JsonParser parser = new JsonParser();
JsonObject orderUpdateJson =
    parser.parse(new Gson().toJson(orderUpdate)).getAsJsonObject();
JsonObject body = new JsonObject();
body.add("orderUpdate", orderUpdateJson);
JsonObject header = new JsonObject();
header.addProperty("isInSandbox", true);
body.add("header", header);
StringEntity entity = new StringEntity(body.toString());
entity.setContentType(ContentType.APPLICATION_JSON.getMimeType());
request.setEntity(entity);

// Make request
HttpClient httpClient = HttpClientBuilder.create().build();
HttpResponse response = httpClient.execute(request);

จัดการสถานะการสั่งซื้อเพิ่มเติม

Orders API เวอร์ชัน 3 รองรับค่าสถานะคำสั่งซื้อเพิ่มเติม ที่ไม่มีในเวอร์ชัน 2 คุณควรส่ง อัปเดตคำสั่งซื้อสำหรับทุกสถานะที่เกี่ยวข้องกับธุรกรรมแต่ละรายการ

ค่าสถานะต่อไปนี้เป็นเวอร์ชันใหม่สำหรับเวอร์ชัน 3

  • IN_PREPARATION - อยู่ระหว่างการจัดเตรียมคำสั่งซื้อเพื่อการจัดส่ง/การจัดส่ง เช่น อาหาร กำลังปรุงอาหาร หรือรายการที่กำลังบรรจุหีบห่อ
  • READY_FOR_PICKUP - ผู้รับจะรับสินค้าที่สั่งซื้อได้
  • DELIVERED - จัดส่งสินค้าที่สั่งซื้อถึงผู้รับแล้ว
  • OUT_OF_STOCK - สินค้าหมดอย่างน้อย 1 รายการในคำสั่งซื้อ
  • CHANGE_REQUESTED - ผู้ใช้ได้ขอให้แก้ไขคำสั่งซื้อ โดยการเปลี่ยนแปลงเป็น กำลังประมวลผล

สถานะ FULFILLED เลิกใช้งานแล้วและแทนที่ด้วย DELIVERED