এই নির্দেশিকাটি আপনাকে একটি অ্যাকশন প্রজেক্ট তৈরি করার প্রক্রিয়ার মধ্য দিয়ে নিয়ে যাবে যা সংরক্ষণ করার জন্য অর্ডার API ব্যবহার করে।
লেনদেন প্রবাহ
যখন আপনার অ্যাকশন প্রজেক্ট রিজার্ভেশন পরিচালনা করে, তখন এটি নিম্নলিখিত প্রবাহ ব্যবহার করে:
- লেনদেনের প্রয়োজনীয়তা যাচাই করুন (ঐচ্ছিক) - ব্যবহারকারী একটি লেনদেন সম্পাদন করতে সক্ষম কিনা তা নিশ্চিত করতে কথোপকথনের শুরুতে লেনদেনের প্রয়োজনীয়তা সহায়ক ব্যবহার করুন।
- অর্ডার তৈরি করুন - ব্যবহারকারীকে একটি "কার্ট সমাবেশ" এর মাধ্যমে নিয়ে যান যেখানে তারা তাদের সংরক্ষণের বিবরণ তৈরি করে।
- অর্ডার প্রস্তাব করুন - একবার "কার্ট" সম্পূর্ণ হলে, ব্যবহারকারীর কাছে সংরক্ষণ "অর্ডার" প্রস্তাব করুন, যাতে তারা নিশ্চিত করতে পারে যে এটি সঠিক। রিজার্ভেশন নিশ্চিত হলে, আপনি রিজার্ভেশনের বিবরণ সহ একটি প্রতিক্রিয়া পাবেন।
- অর্ডারটি চূড়ান্ত করুন এবং একটি রসিদ পাঠান - অর্ডার নিশ্চিত হওয়ার সাথে সাথে আপনার রিজার্ভেশন সিস্টেম আপডেট করুন এবং ব্যবহারকারীকে একটি রসিদ পাঠান।
- অর্ডার আপডেট পাঠান - রিজার্ভেশনের জীবনকাল ধরে, অর্ডার এপিআই-এ প্যাচ রিকোয়েস্ট পাঠিয়ে ব্যবহারকারীকে রিজার্ভেশন স্ট্যাটাস আপডেট দিন।
সীমাবদ্ধতা এবং পর্যালোচনা নির্দেশিকা
মনে রাখবেন যে অতিরিক্ত নীতিগুলি লেনদেন এবং অর্ডার API ব্যবহার করে এমন অ্যাকশনগুলিতে প্রযোজ্য। লেনদেনের সাথে অ্যাকশন পর্যালোচনা করতে আমাদের ছয় সপ্তাহ পর্যন্ত সময় লাগতে পারে, তাই আপনার প্রকাশের সময়সূচী পরিকল্পনা করার সময় সেই সময়টিকে বিবেচনা করুন। পর্যালোচনা প্রক্রিয়া সহজ করতে, পর্যালোচনার জন্য আপনার অ্যাকশন জমা দেওয়ার আগে আপনি লেনদেনের জন্য নীতি এবং নির্দেশিকা মেনে চলছেন তা নিশ্চিত করুন।
আপনি শুধুমাত্র নিম্নলিখিত দেশে অর্ডার API ব্যবহার করে এমন অ্যাকশন স্থাপন করতে পারেন:
অস্ট্রেলিয়া ব্রাজিল কানাডা ইন্দোনেশিয়া | জাপান মেক্সিকো কাতার রাশিয়া | সিঙ্গাপুর সুইজারল্যান্ড থাইল্যান্ড তুরস্ক যুক্তরাজ্য মার্কিন যুক্তরাষ্ট্র |
আপনার প্রকল্প তৈরি করুন
লেনদেন সংক্রান্ত কথোপকথনের বিস্তৃত উদাহরণের জন্য, Node.js এবং Java- তে আমাদের লেনদেনের নমুনাগুলি দেখুন।
প্রকল্প সেটআপ
আপনার অ্যাকশন তৈরি করার সময়, আপনাকে অবশ্যই নির্দিষ্ট করতে হবে যে আপনি অ্যাকশন কনসোলে লেনদেন করতে চান। এছাড়াও, আপনি যদি Node.JS ক্লায়েন্ট লাইব্রেরি ব্যবহার করেন, তাহলে অর্ডার API-এর সর্বশেষ সংস্করণ ব্যবহার করার জন্য আপনার পূর্ণতা সেট আপ করুন।
আপনার প্রকল্প এবং পরিপূর্ণতা সেট আপ করতে, নিম্নলিখিতগুলি করুন:
- একটি নতুন প্রকল্প তৈরি করুন বা একটি বিদ্যমান প্রকল্প আমদানি করুন।
- Deploy > ডিরেক্টরির তথ্যে নেভিগেট করুন।
অতিরিক্ত তথ্যের অধীনে > লেনদেন > বাক্সটি চেক করুন যা বলে যে "আপনার অ্যাকশনগুলি কি ভৌত পণ্যের লেনদেন করতে লেনদেন API ব্যবহার করে?"।
আপনি যদি আপনার অ্যাকশনের পূর্ণতা তৈরি করতে Node.JS ক্লায়েন্ট লাইব্রেরি ব্যবহার করেন, তাহলে আপনার পূর্ণতা কোডটি খুলুন এবং
ordersv3
ফ্ল্যাগটিকেtrue
সেট করতে আপনার অ্যাপ ডেকারেশন আপডেট করুন। নিম্নলিখিত কোড স্নিপেট অর্ডার সংস্করণ 3 এর জন্য একটি উদাহরণ অ্যাপ ঘোষণা দেখায়।
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. লেনদেনের প্রয়োজনীয়তা যাচাই করুন (ঐচ্ছিক)
ব্যবহারকারীর অভিজ্ঞতা
ব্যবহারকারী একটি রিজার্ভেশন সেট আপ করতে ইচ্ছুক হওয়ার সাথে সাথেই, আমরা একটি রিজার্ভেশনের অনুরোধ করতে পারে তা নিশ্চিত করার জন্য actions.intent.TRANSACTION_REQUIREMENTS_CHECK
অভিপ্রায় ট্রিগার করার পরামর্শ দিই। উদাহরণস্বরূপ, যখন আহ্বান করা হয়, তখন আপনার অ্যাকশন জিজ্ঞাসা করতে পারে, "আপনি কি একটি আসন সংরক্ষণ করতে চান?" ব্যবহারকারী যদি "হ্যাঁ" বলে, তাহলে আপনাকে এখনই এই অভিপ্রায়ের অনুরোধ করা উচিত৷ এটি নিশ্চিত করবে যে তারা এগিয়ে যেতে পারে এবং তাদের লেনদেন চালিয়ে যেতে বাধা দেয় এমন কোনো সেটিংস ঠিক করার সুযোগ দেবে।
লেনদেনের প্রয়োজনীয়তাগুলির জন্য অনুরোধ করা নিম্নলিখিত ফলাফলগুলির মধ্যে একটিতে অভিপ্রায়ের ফলাফলগুলি পরীক্ষা করে:
- প্রয়োজনীয়তা পূরণ করা হলে, আপনার পূর্ণতা একটি সাফল্য শর্ত সহ একটি অভিপ্রায় পায় এবং আপনি ব্যবহারকারীর অর্ডার নির্মাণের সাথে এগিয়ে যেতে পারেন।
এক বা একাধিক প্রয়োজনীয়তা না থাকলে, আপনার পূর্ণতা ব্যর্থতার শর্ত সহ অভিপ্রায় গ্রহণ করে। এই ক্ষেত্রে, কথোপকথন শেষ করুন বা রিজার্ভেশন প্রবাহ থেকে দূরে পিভট করুন।
ব্যবহারকারী যদি ত্রুটিটি ঠিক করতে পারে, তাহলে তাদের ডিভাইসে স্বয়ংক্রিয়ভাবে সেই সমস্যাগুলি সমাধান করার জন্য অনুরোধ করা হবে। যদি কথোপকথনটি একটি স্মার্ট স্পিকারের মতো একটি ভয়েস-অনলি পৃষ্ঠে সংঘটিত হয় তবে এটি ব্যবহারকারীর ফোনে হস্তান্তর করা হয়।
পূর্ণতা
একজন ব্যবহারকারী লেনদেনের প্রয়োজনীয়তা পূরণ করেছে তা নিশ্চিত করতে, একটি TransactionRequirementsCheckSpec অবজেক্টের সাথে actions.intent.TRANSACTION_REQUIREMENTS_CHECK
উদ্দেশ্য পূরণের অনুরোধ করুন।
প্রয়োজনীয়তা পরীক্ষা করুন
একজন ব্যবহারকারী ক্লায়েন্ট লাইব্রেরির সাথে রিজার্ভেশন প্রয়োজনীয়তা পূরণ করে কিনা তা দেখতে পরীক্ষা করুন:
conv.ask(new TransactionRequirements());
return getResponseBuilder(request) .add("Placeholder for transaction requirements text") .add(new TransactionRequirements()) .build();
মনে রাখবেন যে নীচের JSON একটি ওয়েবহুক প্রতিক্রিয়া বর্ণনা করে।
{ "payload": { "google": { "expectUserResponse": true, "systemIntent": { "intent": "actions.intent.TRANSACTION_REQUIREMENTS_CHECK", "data": { "@type": "type.googleapis.com/google.actions.transactions.v3.TransactionRequirementsCheckSpec" } } } } }
মনে রাখবেন যে নীচের JSON একটি ওয়েবহুক প্রতিক্রিয়া বর্ণনা করে।
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.TRANSACTION_REQUIREMENTS_CHECK", "inputValueData": { "@type": "type.googleapis.com/google.actions.transactions.v3.TransactionRequirementsCheckSpec" } } ] } ] }
একটি প্রয়োজনীয়তা চেক ফলাফল পান
অ্যাসিস্ট্যান্ট অভিপ্রায় পূরণ করার পরে, এটি চেকের ফলাফল সহ actions.intent.TRANSACTION_REQUIREMENTS_CHECK
উদ্দেশ্য সহ আপনার পূরণের অনুরোধ পাঠায়।
এই অনুরোধটি সঠিকভাবে পরিচালনা করতে, একটি ডায়ালগফ্লো অভিপ্রায় ঘোষণা করুন যা actions_intent_TRANSACTION_REQUIREMENTS_CHECK
ইভেন্ট দ্বারা ট্রিগার হয়েছে৷ যখন ট্রিগার করা হয়, তখন আপনার পূর্ণতায় এই অভিপ্রায়টি পরিচালনা করুন:
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();
মনে রাখবেন যে নীচের JSON একটি ওয়েবহুক অনুরোধ বর্ণনা করে।
{ "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": "" }
মনে রাখবেন যে নীচের JSON একটি ওয়েবহুক অনুরোধ বর্ণনা করে।
{ "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. অর্ডার তৈরি করুন
ব্যবহারকারীর অভিজ্ঞতা
একবার আপনার কাছে আপনার প্রয়োজনীয় ব্যবহারকারীর তথ্য পেয়ে গেলে, একটি "কার্ট সমাবেশ" অভিজ্ঞতা তৈরি করুন যা ব্যবহারকারীকে তাদের রিজার্ভেশন তৈরি করতে গাইড করে। প্রতিটি অ্যাকশন তাদের পরিষেবার জন্য উপযুক্ত হিসাবে একটি সামান্য ভিন্ন কার্ট সমাবেশ প্রবাহ থাকবে।
একটি মৌলিক কার্ট সমাবেশের অভিজ্ঞতায়, একজন ব্যবহারকারী তাদের রিজার্ভেশন যোগ করার জন্য একটি তালিকা থেকে বিকল্পগুলি নির্বাচন করে, যদিও আপনি ব্যবহারকারীর অভিজ্ঞতা সহজ করার জন্য কথোপকথনটি ডিজাইন করতে পারেন। উদাহরণস্বরূপ, একটি কার্ট সমাবেশ অভিজ্ঞতা তৈরি করুন যা ব্যবহারকারীকে একটি সাধারণ হ্যাঁ বা না প্রশ্ন সহ একটি মাসিক রিজার্ভেশন নির্ধারণ করতে সক্ষম করে৷ আপনি ব্যবহারকারীকে "প্রস্তাবিত" সংরক্ষণের একটি ক্যারোজেল বা তালিকা কার্ডও উপস্থাপন করতে পারেন৷
আমরা ব্যবহারকারীর বিকল্পগুলিকে দৃশ্যমানভাবে উপস্থাপন করার জন্য সমৃদ্ধ প্রতিক্রিয়া ব্যবহার করার পরামর্শ দিই, তবে কথোপকথনটিও ডিজাইন করুন যাতে ব্যবহারকারী শুধুমাত্র তাদের ভয়েস ব্যবহার করে তাদের কার্ট তৈরি করতে পারে৷ কিছু সেরা অনুশীলন এবং কার্ট সমাবেশ অভিজ্ঞতার উদাহরণের জন্য, লেনদেন ডিজাইন নির্দেশিকা দেখুন।
পূর্ণতা
আপনার কথোপকথন জুড়ে, রিজার্ভেশন বিশদ সংগ্রহ করুন যা একজন ব্যবহারকারী ক্রয় করতে চায় এবং তারপর একটি Order
অবজেক্ট তৈরি করতে চায়।
আপনার Order
অন্তত নিম্নলিখিতগুলি থাকতে হবে:
-
buyerInfo
- ব্যবহারকারী রিজার্ভেশন সময়সূচী সম্পর্কে তথ্য। -
transactionMerchant
- বণিক সম্পর্কে তথ্য যা রিজার্ভেশন সহজতর করছে। -
contents
-lineItems
হিসাবে তালিকাভুক্ত রিজার্ভেশনের প্রকৃত বিবরণ।
আপনার কার্ট তৈরি করতে Order
প্রতিক্রিয়া ডকুমেন্টেশন পড়ুন। মনে রাখবেন যে আপনাকে রিজার্ভেশনের উপর নির্ভর করে বিভিন্ন ক্ষেত্র অন্তর্ভুক্ত করতে হতে পারে।
নিচের নমুনা কোডটি ঐচ্ছিক ক্ষেত্র সহ একটি সম্পূর্ণ রিজার্ভেশন অর্ডার দেখায়:
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; }
মনে রাখবেন যে নীচের JSON একটি ওয়েবহুক প্রতিক্রিয়া বর্ণনা করে।
{ "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. আদেশ প্রস্তাব
নিশ্চিত বা প্রত্যাখ্যান করার জন্য ব্যবহারকারীর কাছে আপনার রিজার্ভেশন অর্ডার উপস্থাপন করুন। actions.intent.TRANSACTION_DECISION
অভিপ্রায়ের অনুরোধ করুন এবং আপনার তৈরি করা Order
প্রদান করুন।
ব্যবহারকারীর অভিজ্ঞতা
যখন আপনি actions.intent.TRANSACTION_DECISION
অভিপ্রায়ের জন্য অনুরোধ করেন, তখন সহকারী একটি অন্তর্নির্মিত অভিজ্ঞতা শুরু করে যেখানে Order
সরাসরি একটি "কার্ট প্রিভিউ কার্ড"-এ রেন্ডার করা হয়। ব্যবহারকারী "সংরক্ষণের সময়সূচী" বলতে পারেন, লেনদেন প্রত্যাখ্যান করতে পারেন বা রিজার্ভেশনের বিবরণ পরিবর্তন করার অনুরোধ করতে পারেন।
ব্যবহারকারী এই সময়ে অর্ডার পরিবর্তনের অনুরোধ করতে পারেন। এই ক্ষেত্রে, আপনার নিশ্চিত হওয়া উচিত যে আপনার পূরণটি কার্ট সমাবেশের অভিজ্ঞতা শেষ করার পরে অর্ডার পরিবর্তনের অনুরোধগুলি পরিচালনা করতে পারে।
পূর্ণতা
আপনি যখন actions.intent.TRANSACTION_DECISION
অভিপ্রায়ের অনুরোধ করেন, তখন একটি TransactionDecision
তৈরি করুন যাতে Order
এবং orderOptions
রয়েছে
নিম্নলিখিত কোড একটি অর্ডারের জন্য একটি উদাহরণ TransactionsDecision
দেখায়:
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();
মনে রাখবেন যে নীচের JSON একটি ওয়েবহুক প্রতিক্রিয়া বর্ণনা করে।
{ "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" } } } } } }
মনে রাখবেন যে নীচের JSON একটি ওয়েবহুক প্রতিক্রিয়া বর্ণনা করে।
{ "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" } } } ] } ] }
ব্যবহারকারীর সিদ্ধান্ত হ্যান্ডেল
ব্যবহারকারী প্রস্তাবিত অর্ডারে সাড়া দেওয়ার পরে, আপনার পূর্ণতা একটি TransactionDecisionValue
সমন্বিত একটি যুক্তি সহ actions_intent_TRANSACTION_DECISION
অভিপ্রায় গ্রহণ করে। এই মান নিম্নলিখিত ধারণ করবে:
-
transactionDecision
- প্রস্তাবিত আদেশের বিষয়ে ব্যবহারকারীর সিদ্ধান্ত। সম্ভাব্য মানগুলি হলORDER_ACCEPTED
,ORDER_REJECTED
,CART_CHANGE_REQUESTED
, এবংUSER_CANNOT_TRANSACT
৷
এই অনুরোধটি পরিচালনা করতে, একটি ডায়ালগফ্লো অভিপ্রায় ঘোষণা করুন যা actions_intent_TRANSACTION_DECISION
ইভেন্ট দ্বারা ট্রিগার হয়েছে৷ আপনার পূর্ণতা এই অভিপ্রায় পরিচালনা করুন:
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")); }
মনে রাখবেন যে নীচের JSON একটি ওয়েবহুক অনুরোধ বর্ণনা করে।
{ "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": "" }
মনে রাখবেন যে নীচের JSON একটি ওয়েবহুক অনুরোধ বর্ণনা করে।
{ "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. রিজার্ভেশন চূড়ান্ত করুন এবং একটি রসিদ পাঠান
যখন actions.intent.TRANSACTION_DECISION
অভিপ্রায় ORDER_ACCEPTED
এর একটি transactionDecision
সাথে ফিরে আসে, তখন রিজার্ভেশনের সময়সূচী করার জন্য যা কিছু প্রসেসিং প্রয়োজন হয় তা সম্পাদন করুন (যেমন এটি আপনার নিজস্ব ডাটাবেসে ধরে রাখা)।
কথোপকথন চলমান রাখতে একটি সাধারণ প্রতিক্রিয়া পাঠান। ব্যবহারকারী আপনার প্রতিক্রিয়া সহ একটি "সংহত রসিদ কার্ড" পাবেন৷
পূর্ণতা
// 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();
মনে রাখবেন যে নীচের JSON একটি ওয়েবহুক প্রতিক্রিয়া বর্ণনা করে।
{ "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" } } } } ] } } } }
মনে রাখবেন যে নীচের JSON একটি ওয়েবহুক প্রতিক্রিয়া বর্ণনা করে।
{ "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. অর্ডার আপডেট পাঠান
রিজার্ভেশন অবস্থা তার জীবদ্দশায় পরিবর্তিত হয়. অর্ডারের স্থিতি এবং বিশদ বিবরণ সহ HTTP প্যাচ অনুরোধের সাথে ব্যবহারকারী সংরক্ষণ অর্ডার আপডেটগুলি অর্ডার API এ পাঠান৷
অর্ডার API এ অ্যাসিঙ্ক্রোনাস অনুরোধ সেট আপ করুন
অর্ডার এপিআই-তে অর্ডার আপডেট করার অনুরোধগুলি একটি অ্যাক্সেস টোকেন দ্বারা অনুমোদিত। অর্ডার API-এ একটি অর্ডার আপডেট প্যাচ করতে, আপনার অ্যাকশন কনসোল প্রকল্পের সাথে যুক্ত একটি JSON পরিষেবা অ্যাকাউন্ট কী ডাউনলোড করুন, তারপর একটি বাহক টোকেনের জন্য পরিষেবা অ্যাকাউন্ট কীটি বিনিময় করুন যা HTTP অনুরোধের Authorization
শিরোনামে পাস করা যেতে পারে।
আপনার পরিষেবা অ্যাকাউন্ট কী পুনরুদ্ধার করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:
- Google ক্লাউড কনসোলে , মেনুতে যান ☰ > APIs এবং পরিষেবাগুলি > শংসাপত্র > শংসাপত্র তৈরি করুন > পরিষেবা অ্যাকাউন্ট কী।
- পরিষেবা অ্যাকাউন্টের অধীনে, নতুন পরিষেবা অ্যাকাউন্ট নির্বাচন করুন।
- পরিষেবা অ্যাকাউন্ট
service-account
সেট করুন। - প্রকল্প > মালিকের ভূমিকা সেট করুন।
- JSON- এ কী টাইপ সেট করুন।
- তৈরি করুন নির্বাচন করুন।
- একটি ব্যক্তিগত JSON পরিষেবা অ্যাকাউন্ট কী আপনার স্থানীয় মেশিনে ডাউনলোড করা হবে।
আপনার অর্ডার আপডেট কোডে, Google APIs ক্লায়েন্ট লাইব্রেরি এবং "https://www.googleapis.com/auth/actions.order.developer" স্কোপ ব্যবহার করে একটি বাহক টোকেনের জন্য আপনার পরিষেবা কী বিনিময় করুন। আপনি API ক্লায়েন্ট লাইব্রেরি GitHub পৃষ্ঠায় ইনস্টলেশন পদক্ষেপ এবং উদাহরণ খুঁজে পেতে পারেন।
একটি উদাহরণ কী বিনিময়ের জন্য আমাদের Node.js এবং জাভা নমুনায় order-update.js
উল্লেখ করুন।
অর্ডার আপডেট পাঠান
একবার আপনি একটি OAuth বাহক টোকেনের জন্য আপনার পরিষেবা অ্যাকাউন্ট কী বিনিময় করে নিলে, অর্ডার API-এ অনুমোদিত প্যাচ অনুরোধ হিসাবে অর্ডার আপডেটগুলি পাঠান৷
অর্ডার API URL: PATCH https://actions.googleapis.com/v3/orders/${orderId}
আপনার অনুরোধে নিম্নলিখিত শিরোনামগুলি প্রদান করুন:
-
"Authorization: Bearer token"
OAuth বহনকারী টোকেনের সাথে আপনি আপনার পরিষেবা অ্যাকাউন্ট কী বিনিময় করেছেন৷ -
"Content-Type: application/json"
।
প্যাচ অনুরোধে নিম্নলিখিত বিন্যাসের একটি JSON বডি নেওয়া উচিত:
{ "orderUpdate": OrderUpdate }
OrderUpdate
অবজেক্টটি নিম্নলিখিত শীর্ষ-স্তরের ক্ষেত্রগুলি নিয়ে গঠিত:
-
updateMask
- অর্ডারের ক্ষেত্রগুলি যা আপনি আপডেট করছেন। রিজার্ভেশন স্ট্যাটাস আপডেট করতে, মানটিকেreservation.status, reservation.userVisibleStatusLabel
সেট করুন। order
- আপডেটের বিষয়বস্তু। আপনি যদি রিজার্ভেশনের বিষয়বস্তু আপডেট করছেন, তাহলে মানটিকে আপডেট করাOrder
অবজেক্টে সেট করুন। আপনি যদি শুধু রিজার্ভেশনের স্থিতি আপডেট করেন (উদাহরণস্বরূপ,"PENDING"
থেকে"FULFILLED"
) অবজেক্টে নিম্নলিখিত ক্ষেত্রগুলি রয়েছে:-
merchantOrderId
- একই আইডি আপনি আপনারOrder
অবজেক্টে সেট করেছেন। -
lastUpdateTime
- এই আপডেটের টাইমস্ট্যাম্প। -
purchase
- নিম্নলিখিত সমন্বিত একটি বস্তু:-
status
-ReservationStatus
হিসাবে অর্ডারের স্থিতি, যেমন "CONFIRMED
" বা "CANCELLED
"। -
userVisibleStatusLabel
- একটি ব্যবহারকারী-মুখী লেবেল যা অর্ডার স্থিতির বিশদ প্রদান করে, যেমন "আপনার রিজার্ভেশন নিশ্চিত হয়েছে"।
-
-
userNotification
(ঐচ্ছিক) - একটিuserNotification
অবজেক্ট যা ব্যবহারকারীর ডিভাইসে প্রদর্শিত হতে পারে যখন এই আপডেটটি পাঠানো হয়। মনে রাখবেন যে এই বস্তুটি অন্তর্ভুক্ত করা নিশ্চিত করে না যে ব্যবহারকারীর ডিভাইসে একটি বিজ্ঞপ্তি উপস্থিত হবে৷
নিম্নলিখিত নমুনা কোডটি OrderUpdate
একটি উদাহরণ দেখায় যা রিজার্ভেশন অর্ডারের স্থিতিকে FULFILLED
এ আপডেট করে:
// 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);
রিজার্ভেশন স্ট্যাটাস সেট করুন
অর্ডার আপডেটের ReservationStatus
অবশ্যই অর্ডারের বর্তমান অবস্থার বর্ণনামূলক হতে হবে। আপনার আপডেটের order.ReservationStatus
। রিজার্ভেশন স্ট্যাটাস ক্ষেত্রে, নিম্নলিখিত মানগুলির মধ্যে একটি ব্যবহার করুন:
-
PENDING
- রিজার্ভেশন আপনার অ্যাকশন দ্বারা "তৈরি করা হয়েছে" কিন্তু আপনার ব্যাক-এন্ডে অতিরিক্ত প্রক্রিয়াকরণের প্রয়োজন। -
CONFIRMED
- রিজার্ভেশন আপনার শিডিউলিং ব্যাক-এন্ডে নিশ্চিত করা হয়েছে। -
CANCELLED
- ব্যবহারকারী তাদের রিজার্ভেশন বাতিল করেছে। -
FULFILLED
- ব্যবহারকারীর রিজার্ভেশন পরিষেবা দ্বারা পূর্ণ হয়েছে৷ -
CHANGE_REQUESTED
- ব্যবহারকারী রিজার্ভেশনে একটি পরিবর্তনের অনুরোধ করেছেন, এবং পরিবর্তনটি প্রক্রিয়া করা হচ্ছে৷ -
REJECTED
- আপনি যদি রিজার্ভেশন প্রক্রিয়া বা অন্যথায় নিশ্চিত করতে অক্ষম হন।
আপনার রিজার্ভেশনের সাথে প্রাসঙ্গিক প্রতিটি স্ট্যাটাসের জন্য অর্ডার আপডেট পাঠান। উদাহরণস্বরূপ, অনুরোধ করার পরে রিজার্ভেশন নিশ্চিত করার জন্য আপনার রিজার্ভেশনের ম্যানুয়াল প্রক্রিয়াকরণের প্রয়োজন হলে, অতিরিক্ত প্রক্রিয়াকরণ সম্পন্ন না হওয়া পর্যন্ত একটি PENDING
অর্ডার আপডেট পাঠান। প্রতিটি সংরক্ষণের জন্য প্রতিটি স্থিতি মান প্রয়োজন হয় না।
সমস্যা সমাধান
পরীক্ষার সময় আপনি যদি কোনো সমস্যায় পড়েন, লেনদেনের জন্য আমাদের সমস্যা সমাধানের পদক্ষেপগুলি পড়ুন।