ভৌত দ্রব্যের লেনদেন v3-এ স্থানান্তরিত করুন (Dialogflow)

7 আগস্ট 2019 থেকে, Orders v2 API বাতিল করা হয়েছে এবং Orders সংস্করণ 3 দ্বারা প্রতিস্থাপিত হয়েছে। আপনি যদি এই তারিখের আগে একটি অ্যাকশন তৈরি করে থাকেন যা শারীরিক লেনদেন পরিচালনা করে, তাহলে অর্ডার v3 ব্যবহার করার জন্য আপনার অ্যাকশন আপডেট করতে এই নির্দেশিকা অনুসরণ করুন।

এপিআই পরিবর্তন

অর্ডার API-এর সংস্করণ 3 সংস্করণ 2 থেকে নিম্নলিখিত কী পরিবর্তনগুলি বৈশিষ্ট্যযুক্ত:

  • অনুরোধের কাঠামো - সংস্করণ 3 অর্ডার কাঠামোতে শুধুমাত্র কার্টের বিষয়বস্তু ধারণ করার পরিবর্তে অর্ডারের সমস্ত বিবরণ রয়েছে।
  • অর্ডার আপডেট - সংস্করণ 3 অর্ডার এপিআই অর্ডার প্লেসমেন্ট পরিচালনা করার পাশাপাশি অর্ডার আপডেটগুলি পরিচালনা করে, তাই আপনার এন্ডপয়েন্টকে তাদের অর্ডার সম্পর্কে ব্যবহারকারীদের আপডেট পাঠাতে অ্যাকশন API ব্যবহার করার প্রয়োজন নেই। আপনি অর্ডার এপিআইতে প্যাচ অনুরোধ হিসাবে আপডেটগুলিও পাঠান যা স্থিতি আপডেট পাঠানোর জন্য পোস্ট অনুরোধের পরিবর্তে বিদ্যমান order অবজেক্ট আপডেট করে।
  • অর্থপ্রদানের সুবিধা - 3 সংস্করণের অর্ডার API-এর সাথে Google Pay ব্যবহার করে এমন অ্যাকশনগুলি তাদের পেমেন্ট গেটওয়ের বিবরণ একটি নতুন JSON স্ট্রাকচারে নেস্ট করে যা আরও এক্সটেনসিবিলিটি এবং ইইউ আইন মেনে চলার অনুমতি দেয়।

Node.JS v3 এ মাইগ্রেট করুন

Node.JS ক্লায়েন্ট লাইব্রেরি ব্যবহার করে এমন একটি অ্যাকশন স্থানান্তর করতে এই পদক্ষেপগুলি অনুসরণ করুন।

1. অর্ডার v3 পতাকা যোগ করুন

আপনি যে ক্লায়েন্ট লাইব্রেরি ফাংশনগুলি লেনদেন পরিচালনা করতে ব্যবহার করেছেন সেগুলি অর্ডার সংস্করণ 3-এর জন্য আপডেট করা হয়েছে, আপনাকে কেবলমাত্র আপনার পূর্ণতা কোডে একটি পতাকা যুক্ত করতে হবে যা সংস্করণ 3 JSON পাঠাতে ফাংশনগুলি আপডেট করে৷

আপনার পূর্ণতা নিম্নলিখিত কোড যোগ করুন:

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

2. আপনার কার্ট সমাবেশ আপডেট করুন

ProposedOrder প্রকারটি আরও বিস্তারিত Order অবজেক্ট দিয়ে প্রতিস্থাপিত হয়েছে। আপনার ProposedOrder কার্টকে একটি Order কার্টে রূপান্তর করতে JSON রেফারেন্স দেখুন।

3. পেমেন্ট প্যারামিটার আপডেট করুন

অর্ডার প্রস্তাব ধাপে অর্থপ্রদানের তথ্যের কাঠামো API সংস্করণগুলির মধ্যে আলাদা।

আপনার actions.intent.TRANSACTION_DECISION ইন্টেন্ট অনুরোধে, পুরানো paymentOptions অবজেক্টটিকে নতুন paymentParameters অবজেক্ট দিয়ে প্রতিস্থাপন করুন। বেশিরভাগ অন্তর্ভুক্ত ক্ষেত্র একই, JSON অবজেক্টের কাঠামোতে কিছু পরিবর্তনের জন্য সংরক্ষণ করুন।

নিম্নলিখিত কোড স্নিপেটগুলি একটি উদাহরণ দেখায় actions.intent.TRANSACTION_DECISION সংস্করণ 3 ব্যবহার করে Google Pay-এর জন্য অভিপ্রায়ের অনুরোধ এবং তুলনা করার জন্য একটি পুরানো সংস্করণ 2 অনুরোধ৷

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

উল্লেখ্য যে নিচের ডায়ালগফ্লো JSON একটি ওয়েবহুক প্রতিক্রিয়া বর্ণনা করে।

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

উল্লেখ্য যে নিচের ডায়ালগফ্লো JSON একটি ওয়েবহুক প্রতিক্রিয়া বর্ণনা করে।

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

4. অর্ডার API দিয়ে আপডেট পাঠান

অর্ডার API-এর সংস্করণ 3 অর্ডার আপডেটগুলি পরিচালনা করে, তাই আপনাকে আর অ্যাকশন API-এ POST অনুরোধ পাঠাতে হবে না। পরিবর্তে, আপনি অর্ডার এপিআইতে একটি প্যাচ অনুরোধ পাঠান যা আপনার Order অবজেক্টের বিষয়বস্তু আপডেট করে।

একটি নতুন বাহক টোকেন পুনরুদ্ধার করুন

আপনি একই JSON পরিষেবা অ্যাকাউন্ট কী ব্যবহার করতে পারেন যা আপনি অ্যাকশন API-এর জন্য একটি বাহক টোকেন পুনরুদ্ধার করতে ব্যবহার করেছিলেন, আপনাকে অর্ডার API-এর জন্য একটি নতুন বহনকারী টোকেন অনুরোধ করতে হবে। Google APIs ক্লায়েন্ট লাইব্রেরি এবং "https://www.googleapis.com/auth/actions.order.developer" সুযোগ ব্যবহার করে একটি বাহক টোকেনের জন্য আপনার পরিষেবা কী বিনিময় করুন৷

আপনি API ক্লায়েন্ট লাইব্রেরি GitHub পৃষ্ঠায় ইনস্টলেশন পদক্ষেপ এবং উদাহরণ খুঁজে পেতে পারেন। আপনি অর্ডার API কী এক্সচেঞ্জের উদাহরণের জন্য আমাদের Node.js নমুনায় আপডেট করা order-update.js উল্লেখ করতে পারেন।

আপডেট পাঠান

অর্ডার এপিআই-এর সাথে অর্ডার আপডেট পাঠানোর প্রক্রিয়াটি অ্যাকশন এপিআই-এর সাথে আপডেট পাঠানোর অনুরূপ, যদিও আপনি একটি POST অনুরোধের পরিবর্তে একটি প্যাচ অনুরোধ পাঠান। প্যাচ অনুরোধে নিম্নলিখিত বিন্যাসের একটি JSON বডি নেওয়া উচিত:

{ "orderUpdate": OrderUpdate" }

OrderUpdate ফর্ম্যাটটি সংস্করণ 3-তেও আলাদা । প্যাচ অনুরোধের রেফারেন্স দেখুন এবং সেই অনুযায়ী আপনার OrderUpdate ক্ষেত্রগুলি আপডেট করুন। নিম্নলিখিত কোড স্নিপেটটি প্যাচ অনুরোধের একটি উদাহরণ দেখায় যা একটি অর্ডারের স্থিতিকে " DELIVERED " তে আপডেট করে:

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

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

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

অতিরিক্ত অর্ডার স্ট্যাটাস হ্যান্ডেল

অর্ডার API-এর সংস্করণ 3 অতিরিক্ত অর্ডার স্ট্যাটাস মান সমর্থন করে যা 2 সংস্করণে উপলব্ধ ছিল না। প্রতিটি লেনদেনের সাথে প্রাসঙ্গিক প্রতিটি স্ট্যাটাসের জন্য আপনাকে অর্ডার আপডেট পাঠাতে হবে।

নিম্নলিখিত স্থিতি মান সংস্করণ 3 নতুন:

  • IN_PREPARATION - শিপমেন্ট/ডেলিভারির জন্য অর্ডার প্রস্তুত করা হচ্ছে, যেমন খাবার রান্না করা হচ্ছে বা কোনো আইটেম প্যাকেজ করা হচ্ছে।
  • READY_FOR_PICKUP - অর্ডার প্রাপকের দ্বারা পিক-আপের জন্য উপলব্ধ।
  • DELIVERED - অর্ডার প্রাপকের কাছে পৌঁছে দেওয়া হয়েছে
  • OUT_OF_STOCK - অর্ডারের এক বা একাধিক আইটেম স্টকের বাইরে।
  • CHANGE_REQUESTED - ব্যবহারকারী অর্ডারে একটি পরিবর্তনের অনুরোধ করেছেন, এবং পরিবর্তনটি প্রক্রিয়া করা হচ্ছে৷

FULFILLED স্ট্যাটাস অবমূল্যায়ন করা হয়েছে এবং DELIVERED দিয়ে প্রতিস্থাপিত হয়েছে।

জাভা v3 তে স্থানান্তর করুন

জাভা ক্লায়েন্ট লাইব্রেরি ব্যবহার করে এমন একটি অ্যাকশন স্থানান্তর করতে এই পদক্ষেপগুলি অনুসরণ করুন।

1. আপনার কার্ট সমাবেশ আপডেট করুন

ProposedOrder প্রকারটি আরও বিস্তারিত Order অবজেক্ট দিয়ে প্রতিস্থাপিত হয়েছে। আপনার ProposedOrder কার্টকে একটি Order কার্টে রূপান্তর করতে JSON রেফারেন্স দেখুন।

2. পেমেন্ট প্যারামিটার আপডেট করুন

অর্ডার প্রস্তাব ধাপে অর্থপ্রদানের তথ্যের কাঠামো API সংস্করণগুলির মধ্যে আলাদা।

আপনার actions.intent.TRANSACTION_DECISION ইন্টেন্ট অনুরোধে, পুরানো paymentOptions অবজেক্টটিকে নতুন paymentParameters অবজেক্ট দিয়ে প্রতিস্থাপন করুন। বেশিরভাগ অন্তর্ভুক্ত ক্ষেত্র একই, JSON অবজেক্টের কাঠামোতে কিছু পরিবর্তনের জন্য সংরক্ষণ করুন।

নিম্নলিখিত কোড স্নিপেটগুলি একটি উদাহরণ দেখায় actions.intent.TRANSACTION_DECISION সংস্করণ 3 ব্যবহার করে Google Pay-এর জন্য অভিপ্রায়ের অনুরোধ এবং তুলনা করার জন্য একটি পুরানো সংস্করণ 2 অনুরোধ৷

জাভা (v3)
// Create order options
OrderOptionsV3 orderOptions = new OrderOptionsV3()
    .setRequestDeliveryAddress(false)
    .setUserInfoOptions(new UserInfoOptions()
        .setUserInfoProperties(Collections.singletonList("EMAIL")));

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

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

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

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

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

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

allowedPaymentMethod.put("parameters", allowedPaymentMethodParameters);

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

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

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

facilitationSpec.put("allowedPaymentMethods", allowedPaymentMethods);

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

facilitationSpec.put("transactionInfo", transactionInfo);

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

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

// Ask for transaction decision
return getResponseBuilder(request)
    .add("Placeholder for transaction decision text")
    .add(new TransactionDecision()
        .setOrder(order)
        .setOrderOptions(orderOptions)
        .setPresentationOptions(presentationOptions)
        .setPaymentParameters(paymentParameters)
    )
    .build();
জাভা পুরাতন (v2)
OrderOptions orderOptions;
PaymentOptions paymentOptions;

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

return getResponseBuilder(request)
    .add("Placeholder for transaction decision text")
    .add(
        new TransactionDecision()
            .setOrderOptions(orderOptions)
            .setPaymentOptions(paymentOptions)
            .setProposedOrder(proposedOrder))
    .build();
JSON নতুন (v3)

উল্লেখ্য যে নিচের ডায়ালগফ্লো JSON একটি ওয়েবহুক প্রতিক্রিয়া বর্ণনা করে।

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

উল্লেখ্য যে নিচের ডায়ালগফ্লো JSON একটি ওয়েবহুক প্রতিক্রিয়া বর্ণনা করে।

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

3. অর্ডার API দিয়ে আপডেট পাঠান

অর্ডার API-এর সংস্করণ 3 অর্ডার আপডেটগুলি পরিচালনা করে, তাই আপনাকে আর অ্যাকশন API-এ POST অনুরোধ পাঠাতে হবে না। পরিবর্তে, আপনি অর্ডার এপিআইতে একটি প্যাচ অনুরোধ পাঠান যা আপনার Order অবজেক্টের বিষয়বস্তু আপডেট করে।

একটি নতুন বাহক টোকেন পুনরুদ্ধার করুন

আপনি একই JSON পরিষেবা অ্যাকাউন্ট কী ব্যবহার করতে পারেন যা আপনি অ্যাকশন API-এর জন্য একটি বাহক টোকেন পুনরুদ্ধার করতে ব্যবহার করেছিলেন, আপনাকে অর্ডার API-এর জন্য একটি নতুন বহনকারী টোকেন অনুরোধ করতে হবে। Google APIs ক্লায়েন্ট লাইব্রেরি এবং "https://www.googleapis.com/auth/actions.order.developer" সুযোগ ব্যবহার করে একটি বাহক টোকেনের জন্য আপনার পরিষেবা কী বিনিময় করুন৷

আপনি API ক্লায়েন্ট লাইব্রেরি GitHub পৃষ্ঠায় ইনস্টলেশন পদক্ষেপ এবং উদাহরণ খুঁজে পেতে পারেন। আপনি আমাদের জাভা নমুনায় অর্ডার এপিআই কী এক্সচেঞ্জের উদাহরণের জন্য আপডেট করা order-update.js উল্লেখ করতে পারেন।

আপডেট পাঠান

অর্ডার এপিআই-এর সাথে অর্ডার আপডেট পাঠানোর প্রক্রিয়াটি অ্যাকশন এপিআই-এর সাথে আপডেট পাঠানোর অনুরূপ, যদিও আপনি একটি POST অনুরোধের পরিবর্তে একটি প্যাচ অনুরোধ পাঠান। প্যাচ অনুরোধে নিম্নলিখিত বিন্যাসের একটি JSON বডি নেওয়া উচিত:

{ "orderUpdate": OrderUpdate" }

OrderUpdate ফর্ম্যাটটি সংস্করণ 3-তেও আলাদা । প্যাচ অনুরোধের রেফারেন্স দেখুন এবং সেই অনুযায়ী আপনার OrderUpdate ক্ষেত্রগুলি আপডেট করুন। নিম্নলিখিত কোড স্নিপেটটি প্যাচ অনুরোধের একটি উদাহরণ দেখায় যা একটি অর্ডারের স্থিতিকে " DELIVERED " তে আপডেট করে:

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

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

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

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

অতিরিক্ত অর্ডার স্ট্যাটাস হ্যান্ডেল

অর্ডার API-এর সংস্করণ 3 অতিরিক্ত অর্ডার স্ট্যাটাস মান সমর্থন করে যা 2 সংস্করণে উপলব্ধ ছিল না। প্রতিটি লেনদেনের সাথে প্রাসঙ্গিক প্রতিটি স্ট্যাটাসের জন্য আপনাকে অর্ডার আপডেট পাঠাতে হবে।

নিম্নলিখিত স্থিতি মান সংস্করণ 3 নতুন:

  • IN_PREPARATION - শিপমেন্ট/ডেলিভারির জন্য অর্ডার প্রস্তুত করা হচ্ছে, যেমন খাবার রান্না করা হচ্ছে বা কোনো আইটেম প্যাকেজ করা হচ্ছে।
  • READY_FOR_PICKUP - অর্ডার প্রাপকের দ্বারা পিক-আপের জন্য উপলব্ধ।
  • DELIVERED - অর্ডার প্রাপকের কাছে পৌঁছে দেওয়া হয়েছে
  • OUT_OF_STOCK - অর্ডারের এক বা একাধিক আইটেম স্টকের বাইরে।
  • CHANGE_REQUESTED - ব্যবহারকারী অর্ডারে একটি পরিবর্তনের অনুরোধ করেছেন, এবং পরিবর্তনটি প্রক্রিয়া করা হচ্ছে৷

FULFILLED স্ট্যাটাস অবমূল্যায়ন করা হয়েছে এবং DELIVERED দিয়ে প্রতিস্থাপিত হয়েছে।