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:
- İş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.
- 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.
- 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.
- Siparişi son haline getirin ve makbuz gönderin: Sipariş onaylandıktan sonra bir makbuz göndererek kullanıcıya gösterir.
- 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:
- Yeni proje oluşturun veya mevcut bir projeyi içe aktarın.
- Dağıt > Dizin bilgileri.
Ek bilgiler > İşlemler > "İşlemlerinizi Yapın" ifadesinin bulunduğu kutuyu işaretleyin İşlemler API'sini nasıl kullanıyor?
İşleminizin karşılamasını derlemek için Node.JS istemci kitaplığını kullanıyorsanız sipariş karşılama kodunuzu açın ve
true
öğesineordersv3
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:
conv.ask(new TransactionRequirements());
return getResponseBuilder(request) .add("Placeholder for transaction requirements text") .add(new TransactionRequirements()) .build();
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" } } } } }
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:
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.'); }
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();
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": "" }
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ı.
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:
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', };
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; }
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:
conv.ask(new TransactionDecision({ orderOptions: { requestDeliveryAddress: 'false', }, presentationOptions: { actionDisplayName: 'RESERVE', }, order: order, }));
// 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();
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" } } } } } }
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
veUSER_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:
const arg = conv.arguments.get('TRANSACTION_DECISION_VALUE'); if (arg && arg.transactionDecision === 'ORDER_ACCEPTED') { console.log('order accepted'); const order = arg.order; }
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")); }
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": "" }
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
// 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, }));
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();
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" } } } } ] } } } }
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:
- Google Cloud Console'da Menü lastik düzeneği >'ne gidin API'ler ve Hizmetler > Kimlik Bilgileri > Kimlik bilgileri oluştur > Hizmet hesabı anahtarı.
- Service Account (Hizmet Hesabı) altında New Service Account (Yeni Hizmet Hesabı) seçeneğini belirleyin.
- Hizmet hesabını
service-account
olarak ayarlayın. - Rol öğesini Proje > olarak ayarlayın Sahibi.
- Anahtar türünü JSON olarak ayarlayın.
- Oluştur'u seçin.
- 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 "https://www.googleapis.com/auth/actions.order.developer" 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ğerireservation.status, reservation.userVisibleStatusLabel
olarak ayarlayın.order
- Güncellemenin içeriği. değerini, güncellenenOrder
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ı) - AuserNotification
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:
// 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; } }); });
// 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.