Derleme rezervasyonları (Dialogflow)

Bu rehber, Actions projesi geliştirme sürecinde size yol gösterecektir bir iş ortağıdır.

İşlem akışı

Actions projeniz rezervasyonları işlediğinde şu akışı kullanır:

  1. İşlem gereksinimlerini doğrulayın (isteğe bağlı): İşlem şartları yardımcısını kullanın konuşmanın başında, kullanıcının şunları yapabildiğinden emin olmak için yardımcı olur.
  2. Siparişi oluşturun: Kullanıcıyı, nasıl bir sipariş "alışveriş sepeti montajı" rezervasyonun ayrıntılarını oluşturdukları bölüm.
  3. Sipariş önerme - "Alışveriş sepeti" baştan sona rezervasyon yapmayı önerin. - Böylece doğru olduğunu onaylayabilir. Rezervasyon onaylanırsa Rezervasyon ayrıntılarını içeren bir yanıt almak istiyorum.
  4. Siparişi son haline getirin ve makbuz gönderin: Sipariş onaylandıktan sonra bir makbuz göndererek kullanıcıya gösterir.
  5. Sipariş güncellemeleri gönderin: Rezervasyonun kullanım ömrü süresince kullanıcının rezervasyon durumu güncellemelerini Siparişler API'si.

Kısıtlamalar ve inceleme kuralları

İşlemleri ve Orders API'yi kullanan işlemler için ek politikaların geçerli olduğunu unutmayın. Actions with Actions'ı incelememiz altı hafta kadar sürebilir. Bu nedenle, yayın planınızı planlarken bu süreyi hesaba katın. İnceleme sürecini kolaylaştırmak için İşleminizi incelemeye göndermeden önce işlemle ilgili politikalara ve yönergelere uyduğunuzdan emin olun.

Orders API'yi kullanan Actions (İşlemler) özelliğini yalnızca şu ülkelerde dağıtabilirsiniz:

Avustralya
Brezilya
Kanada
Endonezya
Japonya
Meksika
Katar
Rusya
Singapur
İsviçre
Tayland
Türkiye
Birleşik Krallık
Amerika Birleşik Devletleri

Projenizi oluşturma

İşlem görüşmelerinin kapsamlı örnekleri için Node.js ve Java'daki işlem örneklerimizi görüntüleyin.

Proje ayarlama

İşleminizi oluştururken işlem gerçekleştirmek istediğinizi belirtmeniz gerekir Actions Console'da görüntüleyebilirsiniz. Ayrıca Node.JS istemci kitaplığını kullanarak karşılamanızı sürümünü kullandığınızdan emin olun.

Projenizi ve sipariş karşılamayı ayarlamak için şunları yapın:

  1. Yeni proje oluşturun veya mevcut bir projeyi içe aktarın.
  2. Dağıt > Dizin bilgileri.
  3. Ek bilgiler > İşlemler > "İşlemlerinizi Yapın" ifadesinin bulunduğu kutuyu işaretleyin İşlemler API'sini nasıl kullanıyor?

  4. İşleminizin karşılamasını derlemek için Node.JS istemci kitaplığını kullanıyorsanız sipariş karşılama kodunuzu açın ve true öğesine ordersv3 işareti. Aşağıdaki kod snippet'i örnek bir uygulamayı gösterir Siparişler sürüm 3 için beyanı.

Node.js

const {dialogflow} = require('actions-on-google');
let app = dialogflow({
  clientId, // If using account linking
  debug: true,
  ordersv3: true,
});

Node.js

const {actionssdk} = require('actions-on-google');
let app = actionssdk({
  clientId, // If using account linking
  debug: true,
  ordersv3: true,
});

1. İşlem gereksinimlerini doğrulayın (isteğe bağlı)

Kullanıcı deneyimi

Kullanıcı bir rezervasyon ayarlamak istediğini belirtir gelmez rezervasyonun tetiklenmesini actions.intent.TRANSACTION_REQUIREMENTS_CHECK satın alma niyetinde olduğu için rezervasyon isteyebilirsiniz. Örneğin, İşleminiz çağrıldığında şunları isteyebilir: " yer ayırtmak ister misin?" Kullanıcı "evet" ise bu niyeti hemen istemelisiniz. Bu sayede devam etmelerini ve ayarları düzeltmeleri için bir fırsat vermelerini ve işleme devam etmesini engelleyebilir.

İşlemleri isteme amacın aşağıdaki sonuçlardan birini kontrol etmesi gerekir:

  • Koşullar karşılanırsa yerine getirme işleminizde ve kullanıcının siparişini oluşturmaya devam edebilirsiniz.
  • Koşullardan biri veya daha fazlası karşılanmazsa karşılama işleminiz hata koşulu içeren bir niyettir. Bu durumda sohbeti sonlandırın veya değişiklik gösterebilir.

    Kullanıcı hatayı düzeltebilirse otomatik olarak bu sorunları çözmesi istenir cihazlarında test edebilirsiniz. Görüşme yalnızca ses platformunda gerçekleşiyorsa kullanıcının telefonuna devredilir.

Sipariş karşılama

Kullanıcının karşılanmasını talep edip actions.intent.TRANSACTION_REQUIREMENTS_CHECK intent (ör. TransactionRequirementsCheckSpec nesnesi.

Koşulları kontrol etme

Bir kullanıcının, istemci kitaplığıyla ilgili rezervasyon koşullarını karşılayıp karşılamadığını kontrol edin:

Node.js
conv.ask(new TransactionRequirements());
Java
return getResponseBuilder(request)
    .add("Placeholder for transaction requirements text")
    .add(new TransactionRequirements())
    .build();
Dialogflow JSON

Aşağıdaki JSON dosyasının bir webhook yanıtını açıkladığını unutmayın.

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "systemIntent": {
        "intent": "actions.intent.TRANSACTION_REQUIREMENTS_CHECK",
        "data": {
          "@type": "type.googleapis.com/google.actions.transactions.v3.TransactionRequirementsCheckSpec"
        }
      }
    }
  }
}
İşlemler SDK'sı JSON

Aşağıdaki JSON dosyasının bir webhook yanıtını açıkladığını unutmayın.

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TRANSACTION_REQUIREMENTS_CHECK",
          "inputValueData": {
            "@type": "type.googleapis.com/google.actions.transactions.v3.TransactionRequirementsCheckSpec"
          }
        }
      ]
    }
  ]
}
Koşul kontrolünün sonucunu alın

Asistan, amacı yerine getirdikten sonra istek karşılama isteğinizi gönderir Sonuç olarak actions.intent.TRANSACTION_REQUIREMENTS_CHECK niyetiyle bahsettik.

Bu isteği düzgün bir şekilde işlemek için actions_intent_TRANSACTION_REQUIREMENTS_CHECK etkinliği. Tetiklendiğinde bu amacı gerçekleştirmeye çalışın:

Node.js
const arg = conv.arguments.get('TRANSACTION_REQUIREMENTS_CHECK_RESULT');
if (arg && arg.resultType === 'CAN_TRANSACT') {
  // Normally take the user through cart building flow
  conv.ask(`Looks like you're good to go!`);
} else {
  conv.close('Transaction failed.');
}
Java
Argument transactionCheckResult = request
    .getArgument("TRANSACTION_REQUIREMENTS_CHECK_RESULT");
boolean result = false;
if (transactionCheckResult != null) {
  Map<String, Object> map = transactionCheckResult.getExtension();
  if (map != null) {
    String resultType = (String) map.get("resultType");
    result = resultType != null && resultType.equals("CAN_TRANSACT");
  }
}
ResponseBuilder responseBuilder = getResponseBuilder(request);
if (result) {
  responseBuilder.add("Looks like you're good to go! Now say 'confirm transaction'");
} else {
  responseBuilder.add("Transaction failed");
}
return responseBuilder.build();
Dialogflow JSON

Aşağıdaki JSON dosyasının bir webhook isteğini açıkladığını unutmayın.

{
  "responseId": "",
  "queryResult": {
    "queryText": "",
    "action": "",
    "parameters": {},
    "allRequiredParamsPresent": true,
    "fulfillmentText": "",
    "fulfillmentMessages": [],
    "outputContexts": [],
    "intent": {
      "name": "reservation_transaction_check_complete_df",
      "displayName": "reservation_transaction_check_complete_df"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {},
    "languageCode": ""
  },
  "originalDetectIntentRequest": {
    "source": "google",
    "version": "2",
    "payload": {
      "isInSandbox": true,
      "surface": {
        "capabilities": [
          {
            "name": "actions.capability.SCREEN_OUTPUT"
          },
          {
            "name": "actions.capability.AUDIO_OUTPUT"
          },
          {
            "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
          },
          {
            "name": "actions.capability.WEB_BROWSER"
          }
        ]
      },
      "inputs": [
        {
          "rawInputs": [],
          "intent": "",
          "arguments": [
            {
              "extension": {
                "@type": "type.googleapis.com/google.transactions.v3.TransactionRequirementsCheckResult",
                "resultType": "CAN_TRANSACT"
              },
              "name": "TRANSACTION_REQUIREMENTS_CHECK_RESULT"
            }
          ]
        }
      ],
      "user": {},
      "conversation": {},
      "availableSurfaces": [
        {
          "capabilities": [
            {
              "name": "actions.capability.SCREEN_OUTPUT"
            },
            {
              "name": "actions.capability.AUDIO_OUTPUT"
            },
            {
              "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
            },
            {
              "name": "actions.capability.WEB_BROWSER"
            }
          ]
        }
      ]
    }
  },
  "session": ""
}
İşlemler SDK'sı JSON

Aşağıdaki JSON dosyasının bir webhook isteğini açıkladığını unutmayın.

{
  "user": {},
  "device": {},
  "surface": {
    "capabilities": [
      {
        "name": "actions.capability.SCREEN_OUTPUT"
      },
      {
        "name": "actions.capability.AUDIO_OUTPUT"
      },
      {
        "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
      },
      {
        "name": "actions.capability.WEB_BROWSER"
      }
    ]
  },
  "conversation": {},
  "inputs": [
    {
      "rawInputs": [],
      "intent": "reservation_transaction_check_complete_asdk",
      "arguments": [
        {
          "extension": {
            "@type": "type.googleapis.com/google.transactions.v3.TransactionRequirementsCheckResult",
            "resultType": "CAN_TRANSACT"
          },
          "name": "TRANSACTION_REQUIREMENTS_CHECK_RESULT"
        }
      ]
    }
  ],
  "availableSurfaces": [
    {
      "capabilities": [
        {
          "name": "actions.capability.SCREEN_OUTPUT"
        },
        {
          "name": "actions.capability.AUDIO_OUTPUT"
        },
        {
          "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
        },
        {
          "name": "actions.capability.WEB_BROWSER"
        }
      ]
    }
  ]
}

2. Siparişi oluşturma

Kullanıcı deneyimi

İhtiyacınız olan kullanıcı bilgilerini edindikten sonra, "montaj" kullanıcılara rezervasyonlarını yapma konusunda rehberlik eden bir deneyimdir. Hepsini İşlemin, müşterinin ihtiyaçlarına uygun olarak biraz farklı bir alışveriş sepeti montaj akışı olacaktır geliştirmenizi sağlar.

Temel alışveriş sepeti montaj deneyiminde, kullanıcı eklemek için listeden seçenek belirler. ancak bu sayede görüşmeyi basitleştirecek, en iyi uygulamaları paylaşacağız. Örneğin, müşterilerin uzun süre alışveriş yapmasına olanak tanıyan bir alışveriş sepeti kullanıcının basit bir evet veya hayır sorusuyla aylık rezervasyon yapmasını sağlayabilir. Ayrıca kullanıcıya "önerilen" bandında veya liste kartı da sunabilirsiniz sağlayabilir.

Zengin bilgiler kullanmanızı öneririz. kullanıcı seçeneklerini sunmak için yanıtlar görsel olarak, ancak aynı zamanda sohbeti, kullanıcının kendi deneyimini oluşturabileceği şekilde seslerini kullanarak alışveriş sepetinde bulunabilir. Bu eğitimde ele alınan konulardaki alışveriş sepeti montaj deneyimleri için İşlem Tasarım Yönergeleri'ne bakın.

Sipariş karşılama

Görüşmeniz boyunca kullanıcının istediği rezervasyon ayrıntılarını toplayın bir Order nesnesi oluşturur.

Order, aşağıdakilerin en az birini içermelidir:

  • buyerInfo - Rezervasyonu planlayan kullanıcı hakkında bilgi.
  • transactionMerchant - Kolaylık sağlayan satıcıyla ilgili bilgiler karar verebilir.
  • contents - lineItems olarak listelenen rezervasyonun gerçek ayrıntıları.
ziyaret edin.

Order yanıtlarının belgelerine göz atın oluşturmaktır. Farklı alanlar eklemeniz gerekebileceğini unutmayın Bu da rezervasyona göre değişir.

Aşağıdaki örnek kod, isteğe bağlı alanlar da dahil olmak üzere eksiksiz bir rezervasyon siparişini gösterir:

Node.js
app.intent('build_reservation_df', (conv) => {
  const now = new Date().toISOString();
  const order = {
    createTime: now,
    lastUpdateTime: now,
    merchantOrderId: 'UNIQUE_ORDER_ID',
    userVisibleOrderId: 'USER_VISIBLE_ORDER_ID',
    transactionMerchant: {
      id: 'https://www.example.com',
      name: 'Example Merchant',
    },
    contents: {
      lineItems: [
        {
          id: 'LINE_ITEM_ID',
          name: 'Dinner reservation',
          description: 'A world of flavors all in one destination.',
          reservation: {
            status: 'PENDING',
            userVisibleStatusLabel: 'Reservation is pending.',
            type: 'RESTAURANT',
            reservationTime: {
              timeIso8601: '2020-01-16T01:30:15.01Z',
            },
            userAcceptableTimeRange: {
              timeIso8601: '2020-01-15/2020-01-17',
            },
            partySize: 6,
            staffFacilitators: [
              {
                name: 'John Smith',
              },
            ],
            location: {
              zipCode: '94086',
              city: 'Sunnyvale',
              postalAddress: {
                regionCode: 'US',
                postalCode: '94086',
                administrativeArea: 'CA',
                locality: 'Sunnyvale',
                addressLines: [
                  '222, Some other Street',
                ],
              },
            },
          },
        },
      ],
    },
    buyerInfo: {
      email: 'janedoe@gmail.com',
      firstName: 'Jane',
      lastName: 'Doe',
      displayName: 'Jane Doe',
    },
    followUpActions: [
      {
        type: 'VIEW_DETAILS',
        title: 'View details',
        openUrlAction: {
          url: 'https://example.com',
        },
      },
      {
        type: 'CALL',
        title: 'Call us',
        openUrlAction: {
          url: 'tel:+16501112222',
        },
      },
      {
        type: 'EMAIL',
        title: 'Email us',
        openUrlAction: {
          url: 'mailto:person@example.com',
        },
      },
    ],
    termsOfServiceUrl: 'https://www.example.com',
  };
Java
private static OrderV3 createOrder() {
  // Transaction Merchant
  MerchantV3 transactionMerchant = new MerchantV3()
      .setId("http://www.example.com")
      .setName("Example Merchant");

  // Line Item

  // Reservation Item Extension
  ReservationItemExtension reservationItemExtension = new ReservationItemExtension()
      .setStatus("PENDING")
      .setUserVisibleStatusLabel("Reservation pending.")
      .setType("RESTAURANT")
      .setReservationTime(new TimeV3()
          .setTimeIso8601("2020-01-16T01:30:15.01Z"))
      .setUserAcceptableTimeRange(new TimeV3()
          .setTimeIso8601("2020-01-15/2020-01-17"))
      .setPartySize(6)
      .setStaffFacilitators(Collections.singletonList(new StaffFacilitator()
          .setName("John Smith")))
      .setLocation(new Location()
          .setZipCode("94086")
          .setCity("Sunnyvale")
          .setPostalAddress(new PostalAddress()
              .setRegionCode("US")
              .setPostalCode("94086")
              .setAdministrativeArea("CA")
              .setLocality("Sunnyvale")
              .setAddressLines(
                  Collections.singletonList("222, Some other Street"))));

  LineItemV3 lineItem = new LineItemV3()
      .setId("LINE_ITEM_ID")
      .setName("Dinner reservation")
      .setDescription("A world of flavors all in one destination.")
      .setReservation(reservationItemExtension);

  // Order Contents
  OrderContents contents = new OrderContents()
      .setLineItems(Collections.singletonList(lineItem));

  // User Info
  UserInfo buyerInfo = new UserInfo()
      .setEmail("janedoe@gmail.com")
      .setFirstName("Jane")
      .setLastName("Doe")
      .setDisplayName("Jane Doe");

  // Follow up actions
  Action viewDetails = new Action()
      .setType("VIEW_DETAILS")
      .setTitle("View details")
      .setOpenUrlAction(new OpenUrlAction()
          .setUrl("https://example.com"));

  Action call = new Action()
      .setType("CALL")
      .setTitle("Call us")
      .setOpenUrlAction(new OpenUrlAction()
          .setUrl("tel:+16501112222"));

  Action email = new Action()
      .setType("EMAIL")
      .setTitle("Email us")
      .setOpenUrlAction(new OpenUrlAction()
          .setUrl("mailto:person@example.com"));

  // Terms of service and order note
  String termsOfServiceUrl = "https://example.com";

  String now = Instant.now().toString();

  OrderV3 order = new OrderV3()
      .setCreateTime(now)
      .setLastUpdateTime(now)
      .setMerchantOrderId("UNIQUE_ORDER_ID")
      .setUserVisibleOrderId("UNIQUE_USER_VISIBLE_ORDER_ID")
      .setTransactionMerchant(transactionMerchant)
      .setContents(contents)
      .setBuyerInfo(buyerInfo)
      .setFollowUpActions(Arrays.asList(
          viewDetails,
          call,
          email
      ))
      .setTermsOfServiceUrl(termsOfServiceUrl);

  return order;
}
JSON

Aşağıdaki JSON dosyasının bir webhook yanıtını açıkladığını unutmayın.

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "systemIntent": {
        "intent": "actions.intent.TRANSACTION_DECISION",
        "data": {
          "@type": "type.googleapis.com/google.actions.transactions.v3.TransactionDecisionValueSpec",
          "order": {
            "createTime": "2019-07-17T18:25:30.182Z",
            "lastUpdateTime": "2019-07-17T18:25:30.182Z",
            "merchantOrderId": "UNIQUE_ORDER_ID",
            "userVisibleOrderId": "USER_VISIBLE_ORDER_ID",
            "transactionMerchant": {
              "id": "https://www.example.com",
              "name": "Example Merchant"
            },
            "contents": {
              "lineItems": [
                {
                  "id": "LINE_ITEM_ID",
                  "name": "Dinner reservation",
                  "description": "A world of flavors all in one destination.",
                  "reservation": {
                    "status": "PENDING",
                    "userVisibleStatusLabel": "Reservation is pending.",
                    "type": "RESTAURANT",
                    "reservationTime": {
                      "timeIso8601": "2020-01-16T01:30:15.01Z"
                    },
                    "userAcceptableTimeRange": {
                      "timeIso8601": "2020-01-15/2020-01-17"
                    },
                    "partySize": 6,
                    "staffFacilitators": [
                      {
                        "name": "John Smith"
                      }
                    ],
                    "location": {
                      "zipCode": "94086",
                      "city": "Sunnyvale",
                      "postalAddress": {
                        "regionCode": "US",
                        "postalCode": "94086",
                        "administrativeArea": "CA",
                        "locality": "Sunnyvale",
                        "addressLines": [
                          "222, Some other Street"
                        ]
                      }
                    }
                  }
                }
              ]
            },
            "buyerInfo": {
              "email": "janedoe@gmail.com",
              "firstName": "Jane",
              "lastName": "Doe",
              "displayName": "Jane Doe"
            },
            "followUpActions": [
              {
                "type": "VIEW_DETAILS",
                "title": "View details",
                "openUrlAction": {
                  "url": "https://example.com"
                }
              },
              {
                "type": "CALL",
                "title": "Call us",
                "openUrlAction": {
                  "url": "tel:+16501112222"
                }
              },
              {
                "type": "EMAIL",
                "title": "Email us",
                "openUrlAction": {
                  "url": "mailto:person@example.com"
                }
              }
            ],
            "termsOfServiceUrl": "https://www.example.com"
          },
          "orderOptions": {
            "requestDeliveryAddress": false,
            "userInfoOptions": {
              "userInfoProperties": [
                "EMAIL"
              ]
            }
          },
          "presentationOptions": {
            "actionDisplayName": "RESERVE"
          }
        }
      }
    }
  }
}

3. Siparişi teklif et

Onaylaması için rezervasyon siparişinizi kullanıcıya sunun veya reddet. actions.intent.TRANSACTION_DECISION iste ve oluşturduğunuz Order'ı sağlayın.

Kullanıcı Deneyimi

actions.intent.TRANSACTION_DECISION niyetini istediğinizde Asistan yerleşik bir deneyim başlatır. Bu deneyimde Order doğrudan bir "alışveriş sepeti önizleme kartı"na oluşturulur. Kullanıcı "rezervasyon planla" diyebilirsiniz, İşlemi reddetme veya rezervasyon ayrıntılarını değiştirme isteğinde bulunma.

Bu noktada kullanıcı siparişte değişiklik isteğinde de bulunabilir. Böyle durumlarda Karşılamanızın şu tarihten sonra sipariş değişikliği isteklerini işleyebildiğinden emin olun: alışveriş sepeti montaj deneyimini tamamladıktan sonra yapabilirsiniz.

Sipariş karşılama

actions.intent.TRANSACTION_DECISION intent, bir Order değerini içeren TransactionDecision ve orderOptions

Aşağıdaki kodda, bir sipariş için örnek TransactionsDecision gösterilmektedir:

Node.js
conv.ask(new TransactionDecision({
  orderOptions: {
    requestDeliveryAddress: 'false',
  },
  presentationOptions: {
    actionDisplayName: 'RESERVE',
  },
  order: order,
}));
Java
// Create order options
OrderOptionsV3 orderOptions = new OrderOptionsV3()
    .setRequestDeliveryAddress(false)
    .setUserInfoOptions(new UserInfoOptions()
        .setUserInfoProperties(Collections.singletonList("EMAIL")));

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

// Ask for transaction decision
return getResponseBuilder(request)
    .add("Placeholder for transaction decision text")
    .add(new TransactionDecision()
        .setOrder(order)
        .setOrderOptions(orderOptions)
        .setPresentationOptions(presentationOptions)
    )
    .build();
Dialogflow JSON

Aşağıdaki JSON dosyasının bir webhook yanıtını açıkladığını unutmayın.

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "systemIntent": {
        "intent": "actions.intent.TRANSACTION_DECISION",
        "data": {
          "@type": "type.googleapis.com/google.actions.transactions.v3.TransactionDecisionValueSpec",
          "orderOptions": {
            "requestDeliveryAddress": "false"
          },
          "presentationOptions": {
            "actionDisplayName": "RESERVE"
          },
          "order": {
            "createTime": "2019-07-17T18:25:30.184Z",
            "lastUpdateTime": "2019-07-17T18:25:30.184Z",
            "merchantOrderId": "UNIQUE_ORDER_ID",
            "userVisibleOrderId": "USER_VISIBLE_ORDER_ID",
            "transactionMerchant": {
              "id": "https://www.example.com",
              "name": "Example Merchant"
            },
            "contents": {
              "lineItems": [
                {
                  "id": "LINE_ITEM_ID",
                  "name": "Dinner reservation",
                  "description": "A world of flavors all in one destination.",
                  "reservation": {
                    "status": "PENDING",
                    "userVisibleStatusLabel": "Reservation is pending.",
                    "type": "RESTAURANT",
                    "reservationTime": {
                      "timeIso8601": "2020-01-16T01:30:15.01Z"
                    },
                    "userAcceptableTimeRange": {
                      "timeIso8601": "2020-01-15/2020-01-17"
                    },
                    "partySize": 6,
                    "staffFacilitators": [
                      {
                        "name": "John Smith"
                      }
                    ],
                    "location": {
                      "zipCode": "94086",
                      "city": "Sunnyvale",
                      "postalAddress": {
                        "regionCode": "US",
                        "postalCode": "94086",
                        "administrativeArea": "CA",
                        "locality": "Sunnyvale",
                        "addressLines": [
                          "222, Some other Street"
                        ]
                      }
                    }
                  }
                }
              ]
            },
            "buyerInfo": {
              "email": "janedoe@gmail.com",
              "firstName": "Jane",
              "lastName": "Doe",
              "displayName": "Jane Doe"
            },
            "followUpActions": [
              {
                "type": "VIEW_DETAILS",
                "title": "View details",
                "openUrlAction": {
                  "url": "https://example.com"
                }
              },
              {
                "type": "CALL",
                "title": "Call us",
                "openUrlAction": {
                  "url": "tel:+16501112222"
                }
              },
              {
                "type": "EMAIL",
                "title": "Email us",
                "openUrlAction": {
                  "url": "mailto:person@example.com"
                }
              }
            ],
            "termsOfServiceUrl": "https://www.example.com"
          }
        }
      }
    }
  }
}
İşlemler SDK'sı JSON

Aşağıdaki JSON dosyasının bir webhook yanıtını açıkladığını unutmayın.

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TRANSACTION_DECISION",
          "inputValueData": {
            "@type": "type.googleapis.com/google.actions.transactions.v3.TransactionDecisionValueSpec",
            "orderOptions": {
              "requestDeliveryAddress": "false"
            },
            "presentationOptions": {
              "actionDisplayName": "RESERVE"
            },
            "order": {
              "createTime": "2019-07-17T18:25:30.057Z",
              "lastUpdateTime": "2019-07-17T18:25:30.057Z",
              "merchantOrderId": "UNIQUE_ORDER_ID",
              "userVisibleOrderId": "USER_VISIBLE_ORDER_ID",
              "transactionMerchant": {
                "id": "https://www.example.com",
                "name": "Example Merchant"
              },
              "contents": {
                "lineItems": [
                  {
                    "id": "LINE_ITEM_ID",
                    "name": "Dinner reservation",
                    "description": "A world of flavors all in one destination.",
                    "reservation": {
                      "status": "PENDING",
                      "userVisibleStatusLabel": "Reservation is pending.",
                      "type": "RESTAURANT",
                      "reservationTime": {
                        "timeIso8601": "2020-01-16T01:30:15.01Z"
                      },
                      "userAcceptableTimeRange": {
                        "timeIso8601": "2020-01-15/2020-01-17"
                      },
                      "partySize": 6,
                      "staffFacilitators": [
                        {
                          "name": "John Smith"
                        }
                      ],
                      "location": {
                        "zipCode": "94086",
                        "city": "Sunnyvale",
                        "postalAddress": {
                          "regionCode": "US",
                          "postalCode": "94086",
                          "administrativeArea": "CA",
                          "locality": "Sunnyvale",
                          "addressLines": [
                            "222, Some other Street"
                          ]
                        }
                      }
                    }
                  }
                ]
              },
              "buyerInfo": {
                "email": "janedoe@gmail.com",
                "firstName": "Jane",
                "lastName": "Doe",
                "displayName": "Jane Doe"
              },
              "followUpActions": [
                {
                  "type": "VIEW_DETAILS",
                  "title": "View details",
                  "openUrlAction": {
                    "url": "https://example.com"
                  }
                },
                {
                  "type": "CALL",
                  "title": "Call us",
                  "openUrlAction": {
                    "url": "tel:+16501112222"
                  }
                },
                {
                  "type": "EMAIL",
                  "title": "Email us",
                  "openUrlAction": {
                    "url": "mailto:person@example.com"
                  }
                }
              ],
              "termsOfServiceUrl": "https://www.example.com"
            }
          }
        }
      ]
    }
  ]
}
Kullanıcının kararını yerine getirme

Kullanıcı önerilen siparişe yanıt verdikten sonra, sipariş karşılama işleminiz Aşağıdakini içeren bir bağımsız değişkenle birlikte actions_intent_TRANSACTION_DECISION intent: TransactionDecisionValue. Bu değer şunları içerecek:

  • transactionDecision - Kullanıcının teklif edilenle ilgili kararı sipariş. Olası değerler: ORDER_ACCEPTED, ORDER_REJECTED, CART_CHANGE_REQUESTED ve USER_CANNOT_TRANSACT.

Bu isteği işlemek için şunlar tarafından tetiklenen bir Dialogflow niyeti bildirin: actions_intent_TRANSACTION_DECISION etkinliği. Bu amacı gerçekleştir sipariş karşılama süreciniz:

Node.js
const arg = conv.arguments.get('TRANSACTION_DECISION_VALUE');
if (arg && arg.transactionDecision === 'ORDER_ACCEPTED') {
  console.log('order accepted');
  const order = arg.order;
}
Java
Argument transactionDecisionValue = request
    .getArgument("TRANSACTION_DECISION_VALUE");
Map<String, Object> extension = null;
if (transactionDecisionValue != null) {
  extension = transactionDecisionValue.getExtension();
}

String transactionDecision = null;
if (extension != null) {
  transactionDecision = (String) extension.get("transactionDecision");
}
if ((transactionDecision != null && transactionDecision.equals("ORDER_ACCEPTED"))) {
  OrderV3 order = ((OrderV3) extension.get("order"));
}
Dialogflow JSON

Aşağıdaki JSON dosyasının bir webhook isteğini açıkladığını unutmayın.

{
  "responseId": "",
  "queryResult": {
    "queryText": "",
    "action": "",
    "parameters": {},
    "allRequiredParamsPresent": true,
    "fulfillmentText": "",
    "fulfillmentMessages": [],
    "outputContexts": [],
    "intent": {
      "name": "reservation_get_transaction_decision_df",
      "displayName": "reservation_get_transaction_decision_df"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {},
    "languageCode": ""
  },
  "originalDetectIntentRequest": {
    "source": "google",
    "version": "2",
    "payload": {
      "isInSandbox": true,
      "surface": {
        "capabilities": [
          {
            "name": "actions.capability.SCREEN_OUTPUT"
          },
          {
            "name": "actions.capability.AUDIO_OUTPUT"
          },
          {
            "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
          },
          {
            "name": "actions.capability.WEB_BROWSER"
          }
        ]
      },
      "inputs": [
        {
          "rawInputs": [],
          "intent": "",
          "arguments": []
        }
      ],
      "user": {},
      "conversation": {},
      "availableSurfaces": [
        {
          "capabilities": [
            {
              "name": "actions.capability.SCREEN_OUTPUT"
            },
            {
              "name": "actions.capability.AUDIO_OUTPUT"
            },
            {
              "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
            },
            {
              "name": "actions.capability.WEB_BROWSER"
            }
          ]
        }
      ]
    }
  },
  "session": ""
}
İşlemler SDK'sı JSON

Aşağıdaki JSON dosyasının bir webhook isteğini açıkladığını unutmayın.

{
  "user": {},
  "device": {},
  "surface": {
    "capabilities": [
      {
        "name": "actions.capability.SCREEN_OUTPUT"
      },
      {
        "name": "actions.capability.AUDIO_OUTPUT"
      },
      {
        "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
      },
      {
        "name": "actions.capability.WEB_BROWSER"
      }
    ]
  },
  "conversation": {},
  "inputs": [
    {
      "rawInputs": [],
      "intent": "reservation_get_transaction_decision_asdk",
      "arguments": []
    }
  ],
  "availableSurfaces": [
    {
      "capabilities": [
        {
          "name": "actions.capability.SCREEN_OUTPUT"
        },
        {
          "name": "actions.capability.AUDIO_OUTPUT"
        },
        {
          "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
        },
        {
          "name": "actions.capability.WEB_BROWSER"
        }
      ]
    }
  ]
}

4. Rezervasyonu tamamlama ve makbuz gönderme

actions.intent.TRANSACTION_DECISION niyeti bir transactionDecision ORDER_ACCEPTED içinde istediğiniz gibi rezervasyonun planlanması için işlem yapılması gerekir (ör. rezervasyonun .

Basit bir yanıt gönderme iletişimi sürdürebilirsiniz. Kullanıcı "daraltılmış makbuz kartı" alır yanıtınızı gönderin.

Sipariş karşılama

Node.js
// Set lastUpdateTime and update status of reservation
order.lastUpdateTime = new Date().toISOString();
order.reservation.status = 'CONFIRMED';
order.reservation.userVisibleStatusLabel = 'Reservation confirmed';
order.reservation.confirmationCode = '123ABCDEFGXYZ';

// Send synchronous order update
conv.ask(`Transaction completed! You're all set!`);
conv.ask(new OrderUpdate({
  type: 'SNAPSHOT',
  reason: 'Reason string',
  order: order,
}));
Java
ResponseBuilder responseBuilder = getResponseBuilder(request);
order.setLastUpdateTime(Instant.now().toString());

// Set reservation status to confirmed and provide confirmation code
LineItemV3 lineItem = order.getContents().getLineItems().get(0);
ReservationItemExtension reservationItemExtension = lineItem.getReservation();
reservationItemExtension.setStatus("CONFIRMED");
reservationItemExtension.setUserVisibleStatusLabel("Reservation confirmed.");
reservationItemExtension.setConfirmationCode("123ABCDEFGXYZ");
lineItem.setReservation(reservationItemExtension);
order.getContents().getLineItems().set(0, lineItem);

// Order update
OrderUpdateV3 orderUpdate = new OrderUpdateV3()
    .setType("SNAPSHOT")
    .setReason("Reason string")
    .setOrder(order);

responseBuilder
    .add("Transaction completed! You're all set! Would you like to do anything else?")
    .add(new StructuredResponse().setOrderUpdateV3(orderUpdate));
return responseBuilder.build();
Dialogflow JSON

Aşağıdaki JSON dosyasının bir webhook yanıtını açıkladığını unutmayın.

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Transaction completed! You're all set!"
            }
          },
          {
            "structuredResponse": {
              "orderUpdateV3": {
                "type": "SNAPSHOT",
                "reason": "Reason string",
                "order": {
                  "merchantOrderId": "UNIQUE_ORDER_ID",
                  "reservation": {
                    "status": "CONFIRMED",
                    "userVisibleStatusLabel": "Reservation confirmed",
                    "confirmationCode": "123ABCDEFGXYZ"
                  },
                  "lastUpdateTime": "2019-07-17T18:25:30.187Z"
                }
              }
            }
          }
        ]
      }
    }
  }
}
İşlemler SDK'sı JSON

Aşağıdaki JSON dosyasının bir webhook yanıtını açıkladığını unutmayın.

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Transaction completed! You're all set!"
              }
            },
            {
              "structuredResponse": {
                "orderUpdateV3": {
                  "type": "SNAPSHOT",
                  "reason": "Reason string",
                  "order": {
                    "merchantOrderId": "UNIQUE_ORDER_ID",
                    "reservation": {
                      "status": "CONFIRMED",
                      "userVisibleStatusLabel": "Reservation confirmed",
                      "confirmationCode": "123ABCDEFGXYZ"
                    },
                    "lastUpdateTime": "2019-07-17T18:25:30.059Z"
                  }
                }
              }
            }
          ]
        }
      }
    }
  ]
}

5. Sipariş güncellemelerini gönderin

Rezervasyon durumu, ele alacağız. Kullanıcı rezervasyon siparişi güncellemelerini HTTP ile gönder Sipariş durumunu ve ayrıntılarını içeren Siparişler API'sine YAMA istekleri.

Orders API'ye eşzamansız istekler oluşturma

Orders API'ye yapılan sipariş güncelleme istekleri, bir erişim tarafından yetkilendirilir jeton. Orders API'ye sipariş güncellemesi yamalamak için bir JSON dosyası indirin Actions Console projenizle ilişkilendirilmiş hizmet hesabı anahtarını seçin, ardından bir hamiline ait jeton hizmet hesabı anahtarı ile HTTP isteğinin Authorization başlığı.

Hizmet hesabı anahtarınızı almak için aşağıdaki adımları uygulayın:

  1. Google Cloud Console'da Menü lastik düzeneği >'ne gidin API'ler ve Hizmetler > Kimlik Bilgileri > Kimlik bilgileri oluştur > Hizmet hesabı anahtarı.
  2. Service Account (Hizmet Hesabı) altında New Service Account (Yeni Hizmet Hesabı) seçeneğini belirleyin.
  3. Hizmet hesabını service-account olarak ayarlayın.
  4. Rol öğesini Proje > olarak ayarlayın Sahibi.
  5. Anahtar türünü JSON olarak ayarlayın.
  6. Oluştur'u seçin.
  7. Yerel makinenize özel bir JSON hizmet hesabı anahtarı indirilir.

Sipariş güncellemeleri kodunuzda hizmet anahtarınızı hamiline ait jetonla değiştirin kullanarak Google API'leri istemci kitaplığını ve &quot;https://www.googleapis.com/auth/actions.order.developer&quot; kapsamını kullanabilirsiniz. Burada, yükleme adımlarını ve API istemci kitaplığının GitHub sayfasında örnekler.

için Node.js ve Java örneklerimizde order-update.js anahtar takası örneği.

Sipariş güncellemelerini gönderin

Hizmet hesabı anahtarınızı OAuth hamiline ait jetonla değiştirdikten sonra Siparişler API'ye yetkili YAMA istekleri olarak sipariş güncellemeleri.

Siparişler API'si URL'si: PATCH https://actions.googleapis.com/v3/orders/${orderId}

İsteğinizde aşağıdaki başlıkları sağlayın:

  • OAuth taşıyıcı jetonuyla "Authorization: Bearer token" anahtar/değer çiftleriyle değiştirin.
  • "Content-Type: application/json".

YAMA isteği, aşağıdaki biçimde bir JSON gövdesi almalıdır:

{ "orderUpdate": OrderUpdate }

OrderUpdate nesne aşağıdaki üst düzey alanlardan oluşur:

  • updateMask: Güncellediğiniz siparişin alanları. Güncellemek için rezervasyon durumu, değeri reservation.status, reservation.userVisibleStatusLabel olarak ayarlayın.
  • order - Güncellemenin içeriği. değerini, güncellenen Order nesnesine ayarlayın. Rezervasyonun durumunu (örneğin, "PENDING" - "FULFILLED") olduğunda, nesne şu alanları kullanın:

    • merchantOrderId: Order nesnenizde ayarladığınız kimlik.
    • lastUpdateTime - Bu güncellemenin zaman damgası.
    • purchase - Şunları içeren bir nesne:
      • status - ReservationStatus olan siparişin durumu, Örneğin "CONFIRMED" veya "CANCELLED".
      • userVisibleStatusLabel - İlgili ayrıntıları sağlayan, kullanıcıya yönelik bir etiket sipariş durumunu (ör. "Rezervasyonunuz onaylandı") görebilirsiniz.
  • userNotification (isteğe bağlı) - A userNotification nesne (bu güncelleme gönderildiğinde kullanıcının cihazında görüntülenebilecek). Not bu nesneyi eklemenin, cihazınızda bildirimin gösterileceğini garanti etmediği cihazıyla ilgilidir.

Aşağıdaki örnek kod,OrderUpdate FULFILLED adlı iş ortağına ait rezervasyon siparişinin durumu:

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 orderUpdateJson = new OrderUpdate({
        updateMask: [
          'lastUpdateTime',
          'contents.lineItems.reservation.status',
          'contents.lineItems.reservation.userVisibleStatusLabel',
      ].join(','),
        order: {
          merchantOrderId: orderId,
          lastUpdateTime: new Date().toISOString(),
          contents: {
            lineItems: [
              {
                reservation: {
                  status: 'FULFILLED',
                  userVisibleStatusLabel: 'Reservation fulfilled',
                },
              }
            ]
          }
        },
        reason: 'Reservation status was updated to fulfilled.',
    });

    // 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: orderUpdateJson,
        },
        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;
        }
    });
});
Java
// Create order update
FieldMask fieldMask = FieldMask.newBuilder().addAllPaths(Arrays.asList(
    "lastUpdateTime",
    "contents.lineItems.reservation.status",
    "contents.lineItems.reservation.userVisibleStatusLabel"))
    .build();

OrderUpdateV3 orderUpdate = new OrderUpdateV3()
    .setOrder(new OrderV3()
        .setMerchantOrderId(orderId)
        .setLastUpdateTime(Instant.now().toString())
        .setContents(new OrderContents()
        .setLineItems(Collections.singletonList(new LineItemV3()
            .setReservation(new ReservationItemExtension()
                .setStatus("FULFILLED")
                .setUserVisibleStatusLabel("Reservation fulfilled."))))))
    .setUpdateMask(FieldMaskUtil.toString(fieldMask))
    .setReason("Reservation status was updated to fulfilled.");

// 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);
Rezervasyon durumunu ayarlama

Bir sipariş güncellemesinin ReservationStatus siparişin mevcut durumunu açıklamalıdır. Güncellemenizin order.ReservationStatus bölümünde alanında, aşağıdaki değerlerden birini kullanın:

  • PENDING - Rezervasyon "oluşturuldu" İşleminiz tarafından kullanılıyor ancak ek işlemler yapmasını sağlar.
  • CONFIRMED - Rezervasyon, planlama arka ucunuzda onaylanmıştır.
  • CANCELLED: Kullanıcı, rezervasyonunu iptal etti.
  • FULFILLED - Kullanıcının rezervasyonu hizmet tarafından yerine getirildi.
  • CHANGE_REQUESTED: Kullanıcı, rezervasyonda değişiklik isteğinde bulundu ve bu değişiklik bir şablondur.
  • REJECTED - İşlemi gerçekleştiremediyseniz veya başka bir şekilde Rezervasyonu onaylayın.

Ürün veya hizmetinizle alakalı her durum için daha fazla bilgi edineceksiniz. Örneğin, rezervasyonunuzun rezervasyonun manuel olarak işlenmesi gerekiyorsa isteği aldıktan sonra rezervasyonu onayla, tarihine kadar PENDING siparişi güncellemesi gönder gerektiğini unutmayın. Her rezervasyon için her durum değeri gerekmez.

Sorun giderme

Test sırasında herhangi bir sorunla karşılaşırsanız sorun giderme adımlarımızı okuyun anlamına gelir.