Thiết lập quy trình thanh toán

Quy trình thanh toán được gọi khi người dùng tạo một giỏ hàng. Nội dung giỏ hàng của người dùng và thông tin chi tiết về đơn đặt hàng sẽ được gửi đến dịch vụ web Đặt hàng bằng Google. Thông tin này được dịch vụ web của bạn xác thực, sau đó bạn có thể tiếp tục hoặc điều chỉnh giỏ hàng của họ nếu cần.

Trình xử lý thanh toán dành cho dịch vụ web của bạn phải phản hồi các yêu cầu POST. Khi khách hàng chọn thanh toán, Google sẽ gửi cho dịch vụ web Đặt hàng qua Google một nội dung yêu cầu JSON ở dạng CheckoutRequestMessage, chứa thông tin chi tiết về Cart của khách hàng. Sau đó, dịch vụ web của bạn sẽ phản hồi lại bằng CheckoutResponseMessage. Sơ đồ dưới đây minh hoạ quy trình.

CheckoutResponseMessage trả về một giỏ hàng chưa sửa đổi hoặc lỗi.

Sau khi nhận được yêu cầu thanh toán, dịch vụ web Order with Google của bạn phải làm những việc sau:

  • Kiểm tra tính hợp lệ của giỏ hàng dựa trên giá, tình trạng còn hàng và dịch vụ của nhà cung cấp hiện tại.
  • Tính tổng giá (bao gồm mọi khoản chiết khấu, thuế và phí giao hàng).
  • Nếu thành công, hãy phản hồi bằng giỏ hàng chưa sửa đổi.
  • Nếu không thành công, hãy trả lời kèm theo thông báo lỗi và đơn đặt hàng mới được đề xuất.

Trước khi bắt đầu triển khai quy trình thanh toán, bạn nên xem lại tài liệu Tổng quan về quá trình thực hiện.

Thông báo Yêu cầu Checkout

Để xác thực giỏ hàng của khách hàng, khi khách hàng chọn thanh toán, Google sẽ gửi yêu cầu đến dịch vụ web của bạn cùng với nội dung JSON ở dạng CheckoutRequestMessage. Đơn đặt hàng của khách hàng sẽ không được gửi cho đến sau trong quy trình Đặt món bằng Google.

Dữ liệu có trong CheckoutRequestMessage bao gồm:

  • Ý định: Trường inputs[0].intent của mỗi nội dung yêu cầu thanh toán đều chứa giá trị chuỗi actions.foodordering.intent.CHECKOUT.
  • Giỏ hàng: Trường inputs[0].arguments[0].extension của yêu cầu thanh toán chứa đối tượng Cart đại diện cho giỏ hàng của khách hàng.
  • Phân phối hoặc trích xuất: Trường phần mở rộng của đối tượng Cart chứa đối tượng FoodCartExtension chỉ định các thuộc tính phân phối hoặc trích xuất:
    • Đối với đơn đặt hàng giao, đối tượng FoodCartExtension bao gồm địa chỉ giao hàng.
    • Đối với đơn đặt hàng tự đến lấy hoặc lấy hàng, đối tượng FoodCartExtension không chứa bất kỳ thông tin vị trí nào.
  • Hộp cát: Trường isInSandbox của yêu cầu thanh toán chứa giá trị boolean cho biết giao dịch có sử dụng thanh toán hộp cát hay không.

Ví dụ về yêu cầu thanh toán

Dưới đây là ví dụ về CheckoutRequestMessage:

{
    "user": {},
    "conversation": {
        "conversationId": "CTZbZfUlHCybEdcz_5PB3Ttf"
    },
    "inputs": [
        {
            "intent": "actions.foodordering.intent.CHECKOUT",
            "arguments": [
                {
                    "extension": {
                        "@type": "type.googleapis.com/google.actions.v2.orders.Cart",
                        "merchant": {
                            "id": "restaurant/Restaurant/QWERTY",
                            "name": "Tep Tep Chicken Club"
                        },
                        "lineItems": [
                            {
                                "name": "Spicy Fried Chicken",
                                "type": "REGULAR",
                                "id": "299977679",
                                "quantity": 2,
                                "price": {
                                    "type": "ESTIMATE",
                                    "amount": {
                                        "currencyCode": "AUD",
                                        "units": "39",
                                        "nanos": 600000000
                                    }
                                },
                                "offerId": "MenuItemOffer/QWERTY/scheduleId/496/itemId/143",
                                "extension": {
                                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
                                }
                            }
                        ],
                        "extension": {
                            "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
                            "fulfillmentPreference": {
                                "fulfillmentInfo": {
                                    "delivery": {
                                        "deliveryTimeIso8601": "P0M"
                                    }
                                }
                            },
                            "location": {
                                "coordinates": {
                                    "latitude": -33.8376441,
                                    "longitude": 151.0868736
                                },
                                "formattedAddress": "Killoola St, 1, Concord West NSW 2138",
                                "zipCode": "2138",
                                "city": "Concord West",
                                "postalAddress": {
                                    "regionCode": "AU",
                                    "postalCode": "2138",
                                    "administrativeArea": "NSW",
                                    "locality": "Concord West",
                                    "addressLines": [
                                        "Killoola St",
                                        "1"
                                    ]
                                }
                            }
                        }
                    }
                }
            ]
        }
    ],
    "directActionOnly": true,
    "isInSandbox": true
}

Thông báo phản hồi Checkout

Sau khi nhận được yêu cầu từ dịch vụ Order with Google, dịch vụ web checkout của bạn phải xử lý yêu cầu đó và phản hồi bằng CheckoutResponseMessage. CheckoutResponseMessage cần đáp ứng yêu cầu thành công hoặc không thành công.

Yêu cầu thành công

Nếu yêu cầu thanh toán thành công, CheckoutResponseMessage cần bao gồm ProposedOrderPaymentOptions:

  • ProposedOrder

    • cart: Đối tượng cart giống với giỏ hàng được cung cấp trong CheckoutRequestMessage. Nếu cần thay đổi bất kỳ nội dung nào của giỏ hàng, CheckoutResponseMessage phải bao gồm một FoodErrorExtension với ProposedOrder đã sửa.
    • otherItems: Các mục do nhà cung cấp thêm vào, chẳng hạn như phí giao hàng, thuế và các khoản phí khác. Cũng có thể chứa tiền thưởng của người dùng.
    • totalPrice: Tổng giá của đơn đặt hàng.
    • extension: Một FoodOrderExtension xác định thông tin thực hiện đơn đặt hàng, chẳng hạn như thời gian giao hàng.
  • PaymentOptions

    • Việc thiết lập tính năng xử lý thanh toán sẽ được đề cập ở phần sau trong phần Thiết lập Google Pay. Bạn có thể sử dụng JSON giữ chỗ trong CheckoutResponseMessage cho đến khi sẵn sàng triển khai quá trình xử lý thanh toán.
    • Để thêm các tuỳ chọn thanh toán giữ chỗ trong CheckoutResponseMessage, hãy tham khảo ví dụ dưới đây, trong đó sử dụng cổng thanh toán mẫu cho PaymentOptions.

Ví dụ về phản hồi thành công

{
    "finalResponse": {
        "richResponse": {
            "items": [
                {
                    "structuredResponse": {
                        "checkoutResponse": {
                            "proposedOrder": {
                                "cart": {
                                    "merchant": {
                                        "id": "restaurant/Restaurant/QWERTY",
                                        "name": "Tep Tep Chicken Club"
                                    },
                                    "lineItems": [
                                        {
                                            "name": "Spicy Fried Chicken",
                                            "type": "REGULAR",
                                            "id": "299977679",
                                            "quantity": 2,
                                            "price": {
                                                "type": "ESTIMATE",
                                                "amount": {
                                                    "currencyCode": "AUD",
                                                    "units": "39",
                                                    "nanos": 600000000
                                                }
                                            },
                                            "offerId": "MenuItemOffer/QWERTY/scheduleId/496/itemId/143",
                                            "extension": {
                                                "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
                                            }
                                        }
                                    ],
                                    "extension": {
                                        "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
                                        "fulfillmentPreference": {
                                            "fulfillmentInfo": {
                                                "delivery": {
                                                    "deliveryTimeIso8601": "P0M"
                                                }
                                            }
                                        },
                                        "location": {
                                            "coordinates": {
                                                "latitude": -33.8376441,
                                                "longitude": 151.0868736
                                            },
                                            "formattedAddress": "Killoola St, 1, Concord West NSW 2138",
                                            "zipCode": "2138",
                                            "city": "Concord West",
                                            "postalAddress": {
                                                "regionCode": "AU",
                                                "postalCode": "2138",
                                                "administrativeArea": "NSW",
                                                "locality": "Concord West",
                                                "addressLines": [
                                                    "Killoola St",
                                                    "1"
                                                ]
                                            }
                                        }
                                    }
                                },
                                "totalPrice": {
                                    "type": "ESTIMATE",
                                    "amount": {
                                        "currencyCode": "AUD",
                                        "units": "43",
                                        "nanos": 100000000
                                    }
                                },
                                "extension": {
                                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
                                    "availableFulfillmentOptions": [
                                        {
                                            "fulfillmentInfo": {
                                                "delivery": {
                                                    "deliveryTimeIso8601": "P0M"
                                                }
                                            }
                                        }
                                    ]
                                },
                                "otherItems": [
                                    {
                                        "name": "Delivery fee",
                                        "price": {
                                            "type": "ESTIMATE",
                                            "amount": {
                                                "currencyCode": "AUD",
                                                "units": "3",
                                                "nanos": 500000000
                                            }
                                        },
                                        "type": "DELIVERY"
                                    }
                                ]
                            },
                            "paymentOptions": {
                                "googleProvidedOptions": {
                                    "facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gatewayMerchantId\":\"YOUR_MERCHANT_ID\",\"gateway\":\"cybersource\"}}}],\"transactionInfo\":{\"currencyCode\":\"AUD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"43.1\"}} "
                                }
                            },
                            "additionalPaymentOptions": [
                                {
                                    "actionProvidedOptions": {
                                        "paymentType": "ON_FULFILLMENT",
                                        "displayName": "Pay when you get your food.",
                                        "onFulfillmentPaymentData": {
                                            "supportedPaymentOptions": []
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
            ]
        }
    }
}

Yêu cầu không thành công

Nếu yêu cầu thanh toán không thành công, CheckoutResponseMessage cần đưa vào FoodErrorExtension, danh sách này chứa danh sách các mục FoodOrderError mô tả mọi lỗi đã xảy ra. Nếu có bất kỳ lỗi nào có thể khôi phục cho đơn đặt hàng, chẳng hạn như thay đổi giá của một mặt hàng trong giỏ hàng, thì FoodErrorExtension phải bao gồm correctedProposedOrder.

Ví dụ về phản hồi không thành công

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "error": {
              "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
              "foodOrderErrors": [
                {
                  "error": "CLOSED",
                  "description": "The restaurant is closed."
                }
              ]
            }
          }
        }
      ]
    }
  }
}