Tích hợp giải pháp SaaS của bạn với API Google Cloud Marketplace bằng Producer Portal (Python)

1. Giới thiệu

Các giải pháp SaaS trên Google Cloud Marketplace là những giải pháp phần mềm chạy trên cơ sở hạ tầng của bạn, bất kể vị trí nào, nhưng do Google tính phí.

Trong lớp học lập trình này, bạn sẽ thiết lập một giải pháp SaaS cơ bản tích hợp với Google Cloud Marketplace để:

  • Nhận thông báo khi người dùng đăng ký giải pháp mẫu.
  • Phê duyệt những khách hàng muốn đăng ký và thêm họ vào cơ sở dữ liệu của bạn.
  • Xử lý các trường hợp khách hàng muốn thay đổi hoặc huỷ gói thanh toán.
  • Gửi báo cáo sử dụng cho Google.

Lớp học lập trình này giúp bạn làm quen với các API kiểm soát dịch vụ và mua sắm của Google Cloud Marketplace. Xin lưu ý rằng hướng dẫn này không cung cấp môi trường sản phẩm đầy đủ để kiểm thử.

2. Trước khi bắt đầu

  • Sử dụng Producer Portal để bật lớp học lập trình cho dự án của bạn (nếu bạn chưa bật).

Đường liên kết trực tiếp đến Producer Portal là:

https://console.cloud.google.com/producer-portal?project=YOUR_PROJECT_ID

Để bật codelab, hãy nhấp vào Bật trong bảng Codelabs ở bên phải màn hình.

Để cài đặt các mô-đun Python, hãy dùng lệnh sau:

pip install --upgrade google-api-python-client google-cloud-pubsub
  • Sao chép hoặc tải kho lưu trữ GitHub xuống cho lớp học lập trình này bằng lệnh sau:
git clone https://github.com/googlecodelabs/gcp-marketplace-integrated-saas.git
cd gcp-marketplace-integrated-saas

  • Đặt biến môi trường GOOGLE_CLOUD_PROJECT thành mã nhận dạng của dự án này:
  • Linux:
export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"
  • Windows:
set GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID
  • Đặt biến môi trường GOOGLE_APPLICATION_CREDENTIALS thành đường dẫn đầy đủ đến tệp đã tải xuống:
  • Linux:
export GOOGLE_APPLICATION_CREDENTIALS="[YOUR_MACHINE]/path/service-account-key.json"
  • Windows:
set GOOGLE_APPLICATION_CREDENTIALS=[YOUR_MACHINE]/path/service-account-key.json
  • Để xem một giải pháp mẫu trong Google Cloud Marketplace, hãy truy cập vào Cổng thông tin nhà sản xuất rồi nhấp vào Sản phẩm lớp học lập trình trong bảng điều khiển Lớp học lập trình. Bạn cũng có thể truy cập trực tiếp vào giải pháp tại https://console.cloud.google.com/marketplace/product/DEMO-YOUR_PROJECT_ID/isaas-codelab
  • Trong Google Cloud Console, trong dự án mới của bạn, hãy bật Partner Procurement API.

Tiếp theo, hãy thiết lập phần phụ trợ cho giải pháp mẫu.

3. Tích hợp với Google Cloud Marketplace

Nhìn chung, bạn tích hợp giải pháp mẫu với Google Cloud Marketplace theo những cách sau:

  • Tích hợp với Cloud Pub/Sub để nhận thông báo từ Google Cloud Marketplace, chẳng hạn như khi người dùng đăng ký giải pháp của bạn. Kỹ sư đối tác sẽ tạo một chủ đề Cloud Pub/Sub mà bạn phải đăng ký để nhận thông báo.
  • Tích hợp với Partner Procurement API để tạo tài khoản cho khách hàng mới. Bạn sử dụng Partner Procurement API để cập nhật tài khoản khi người dùng chọn, thay đổi hoặc huỷ gói thuê bao. Để tích hợp với API này, bạn sẽ cần tạo thư viện ứng dụng của riêng mình.
  • Tích hợp với chế độ Kiểm soát dịch vụ của Google để báo cáo thông tin sử dụng.

4. Đăng ký theo dõi chủ đề Cloud Pub/Sub

Khi người dùng chọn một gói thuê bao, bạn sẽ nhận được thông báo từ Google Cloud Marketplace thông qua một chủ đề Cloud Pub/Sub.

Để theo dõi các thông báo trên một chủ đề Cloud Pub/Sub, trước tiên, bạn phải tạo một gói thuê bao.

Để tạo một gói thuê bao, hãy dùng tập lệnh create_subscription.py:

cd gcp-marketplace-integrated-saas/tools
python create_subscription.py

Để xem gói thuê bao, hãy mở trang tổng quan Cloud Pub/Sub trong Cloud Console:

https://console.cloud.google.com/cloudpubsub/subscriptions

Thử yêu cầu đăng ký thử nghiệm

Để kiểm thử ứng dụng mẫu này với tư cách là người dùng, hãy mở sản phẩm trong lớp học lập trình trên Marketplace bằng cách truy cập vào https://console.cloud.google.com/marketplace/product/DEMO-YOUR_PROJECT_ID/isaas-codelab. Đảm bảo bạn đã chọn dự án codelab và chọn một gói thuê bao.

Để xem các thông báo Cloud Pub/Sub được gửi khi bạn chọn một kế hoạch, hãy chuyển đến thư mục gốc của thư mục python3 trong kho lưu trữ rồi chạy lệnh sau:

~/gcp-marketplace-integrated-saas/python3$ python -m impl.step_1_pubsub.app

Để xem mã mẫu theo dõi các thông báo Cloud Pub/Sub, hãy xem https://github.com/googlecodelabs/gcp-marketplace-integrated-saas/blob/master/python3/impl/step_1_pubsub/app.py.

Trong thông báo Cloud Pub/Sub, trường eventType cho biết lý do gửi thông báo. Khi chọn một gói, bạn sẽ thấy thông báo cho eventType: ENTITLEMENT_CREATION_REQUESTED, tức là gói thuê bao bạn đã chọn trước đó.

Nếu huỷ gói trong khi tập lệnh này đang chạy, bạn sẽ thấy một thông báo mới cho eventType: ENTITLEMENT_CANCELLED.

Xin lưu ý rằng mẫu trên không xác nhận các thông báo. Điều này giúp bạn kiểm thử dễ dàng hơn bằng cách nhận cùng một thông báo mỗi khi chạy ứng dụng.

Để đóng tập lệnh, hãy nhấn CTRL + \.

5. Phê duyệt yêu cầu về tài khoản

Giờ đây, bạn có thể nhận thông báo từ Google Cloud Marketplace, bạn phải bắt đầu xử lý các tài nguyên mà dịch vụ Mua sắm của Google Cloud Marketplace tạo thay cho khách hàng.

Đầu tiên là tài nguyên tài khoản. Tài khoản đại diện cho mối kết nối của khách hàng với sản phẩm của bạn. Bạn phải lưu trữ mã tài khoản Mua hàng của khách hàng trong cơ sở dữ liệu để liên kết mối quan hệ giữa Tài khoản Google của họ và tài khoản của họ cho dịch vụ của bạn.

Khi khách hàng chọn một gói, Google Cloud Marketplace sẽ gửi một thông báo Cloud Pub/Sub cho biết rằng khách hàng đang yêu cầu một tài khoản. Ứng dụng của bạn phải phê duyệt yêu cầu này. Trong lớp học lập trình này, bạn sẽ phê duyệt các yêu cầu về tài khoản khi nhận được thông báo Cloud Pub/Sub.

Tạo cơ sở dữ liệu cho thông tin tài khoản

Trong lớp học lập trình này, chúng ta sẽ sử dụng một cơ sở dữ liệu JSON đơn giản có thể theo dõi tài khoản và giao dịch mua của khách hàng.

Để kiểm thử mẫu này, hãy tạo một tệp có đối tượng JSON trống ở bất kỳ đâu trên máy trạm của bạn:

{}

Đặt biến môi trường PROCUREMENT_CODELAB_DATABASE thành đường dẫn đầy đủ đến tệp này:

  • Linux:
export PROCUREMENT_CODELAB_DATABASE="YOUR_MACHINE/path/EMPTY_JSON_OBJECT.json"
  • Windows:
set PROCUREMENT_CODELAB_DATABASE=YOUR_MACHINE/path/EMPTY_JSON_OBJECT.json

Mô-đun đọc và ghi cơ sở dữ liệu nằm trong python3/impl/database.

Mẫu triển khai này sử dụng một giản đồ có thể mở rộng nếu bạn đang tích hợp nhiều sản phẩm với Google Cloud Marketplace. Sau đây là một mục nhập cơ sở dữ liệu mẫu cho người dùng đã đăng ký gói Rất tốt trong ứng dụng mẫu:

{
   "a2b3c4d5-b3f1-4dea-b134-generated_id":{
      "procurement_account_id":"generated-b3f1-4dea-b134-4a1d100c0335",
      "internal_account_id":"generated-45b7-4f4d-1bcd-2abb114f77de",
      "products":{
         "isaas-codelab":{
            "start_time":"2019-01-04T01:21:16.188Z",
            "plan_id":"very-good",
            "product_id":"isaas-codelab",
            "consumer_id":"project_number:123123345345"
         }
      }
   }
}

Trong quá trình triển khai cuối cùng, bạn phải kết nối ứng dụng của mình với cơ sở dữ liệu riêng để liên kết tài khoản Google Cloud Marketplace của khách hàng với tài nguyên khách hàng của riêng bạn.

Phê duyệt tài khoản

Để phê duyệt yêu cầu về tài khoản, hãy chạy lệnh sau:

~/gcp-marketplace-integrated-saas/python3$ python3 -m impl.step_2_account.app

Mã mẫu để phê duyệt tài khoản nằm trong impl/step_2_account.

Quy trình triển khai mẫu sử dụng lớp Procurement, xử lý các hoạt động tương tác với Procurement API. Sau đây là các phương thức get_account()approve_account() của lớp này:

step_2_account/app.py

def _get_account_name(self, account_id):
    return 'providers/DEMO-{}/accounts/{}'.format(PROJECT_ID,
                                                  account_id)

def get_account(self, account_id):
    """Gets an account from the Procurement Service."""
    name = self._get_account_name(account_id)
    request = self.service.providers().accounts().get(name=name)
    try:
        response = request.execute()
        return response
    except HttpError as err:
        if err.resp.status == 404:
            return None

def approve_account(self, account_id):
    """Approves the account in the Procurement Service."""
    name = self._get_account_name(account_id)
    request = self.service.providers().accounts().approve(
        name=name, body={'approvalName': 'signup'})
    request.execute()

Trong lớp học lập trình này, trong dịch vụ Mua sắm, mã nhận dạng nhà cung cấp là DEMO-YOUR_PROJECT_ID, trong đó YOUR_PROJECT_ID là dự án bạn đã tạo. Khi tương tác với Procurement API, tên tài khoản phải sử dụng định dạng sau:

providers/DEMO-YOUR_PROJECT_ID/accounts/account-id

Tiếp theo, bạn phê duyệt một quyền, đây là bản ghi về giao dịch mua của khách hàng.

6. Phê duyệt quyền

Khi khách hàng chọn một gói thuê bao trong Google Cloud Marketplace, một tài khoản sẽ được tạo và sau đó, một yêu cầu quyền mới sẽ được tạo ngay lập tức. Quyền này đại diện cho việc mua một dịch vụ. Trước khi khách hàng có thể bắt đầu sử dụng dịch vụ, bạn phải phê duyệt yêu cầu cấp quyền, sau đó thiết lập dịch vụ để khách hàng bắt đầu sử dụng.

Khi ứng dụng mẫu nhận được một thông báo Cloud Pub/Sub có eventType ENTITLEMENT_CREATION_REQUESTED, quyền sẽ được phê duyệt và ứng dụng phải đợi thông báo ENTITLEMENT_ACTIVE để ghi lại quyền trong cơ sở dữ liệu, sau đó thiết lập tài nguyên cho khách hàng.

Để tạo quyền, hãy chạy lệnh sau:

~/gcp-marketplace-integrated-saas/python3$ python3 -m impl.step_3_entitlement_create.app

Mã để phê duyệt quyền nằm trong quy trình triển khai mẫu.

Tiếp theo, bạn xử lý các trường hợp khách hàng yêu cầu thay đổi gói thuê bao.

7. Phê duyệt các thay đổi đối với quyền

Nếu dịch vụ của bạn có nhiều gói, bạn phải xử lý các yêu cầu của khách hàng có thể muốn nâng cấp hoặc hạ cấp gói hiện tại của họ.

Nếu dịch vụ của bạn chỉ có một gói, hãy chuyển đến phần Xử lý giao dịch mua bị huỷ.

Không có sự khác biệt về kỹ thuật giữa việc một quyền trở nên hoạt động lần đầu tiên và việc quyền đó trở nên hoạt động sau khi thay đổi gói. Vì lý do này, mẫu triển khai có một phương thức handleActiveEntitlement() dùng chung cho cả hai trường hợp. Phương thức này kiểm tra các thông báo đến để biết các sự kiện liên quan đến quyền:

step_4_entitlement_change/app.py

def handleActiveEntitlement(self, entitlement, customer, accountId):
  """Updates the database to match the active entitlement."""

  product = {
      'product_id': entitlement['product'],
      'plan_id': entitlement['plan'],
  }

  if 'consumerId' in entitlement:
    product['consumer_id'] = entitlement['consumerId']

  customer['products'][entitlement['product']] = product

  self.db.write(accountId, customer)

Đoạn mã sau đây kiểm tra xem eventType có phải là ENTITLEMENT_PLAN_CHANGE_REQUESTED hay ENTITLEMENT_PLAN_CHANGED hay không:

step_4_entitlement_change/app.py

elif eventType == 'ENTITLEMENT_PLAN_CHANGE_REQUESTED':
  if state == 'ENTITLEMENT_PENDING_PLAN_CHANGE_APPROVAL':
    # Don't write anything to our database until the entitlement becomes
    # active within the Procurement Service.
    self.approveEntitlementPlanChange(id, entitlement['newPendingPlan'])
    return True

elif eventType == 'ENTITLEMENT_PLAN_CHANGED':
  if state == 'ENTITLEMENT_ACTIVE':
    # Handle an active entitlement after a plan change.
    self.handleActiveEntitlement(entitlement, customer, accountId)
    return True

Trong quá trình triển khai cuối cùng, khi quyền chuyển về trạng thái ENTITLEMENT_ACTIVE, phương thức trình nghe của bạn sẽ cập nhật cơ sở dữ liệu để phản ánh thay đổi và thực hiện mọi hoạt động cung cấp cần thiết.

Tuỳ thuộc vào cách bạn thiết lập sản phẩm với Kỹ sư đối tác, dịch vụ của bạn có thể không cho phép hạ cấp hoặc huỷ cho đến khi kết thúc một chu kỳ thanh toán. Trong những trường hợp như vậy, yêu cầu thay đổi gói sẽ tiếp tục ở trạng thái đang chờ xử lý ngay cả sau khi được phê duyệt, nhưng quyền sẽ không quay về trạng thái ENTITLEMENT_ACTIVE cho đến khi yêu cầu thay đổi gói hoàn tất.

Để biết mã kiểm tra và phê duyệt các thay đổi về quyền, hãy xem ví dụ về cách triển khai.

Tiếp theo, bạn xử lý các trường hợp khách hàng huỷ giao dịch mua.

8. Xử lý giao dịch mua bị huỷ

Khách hàng có thể chọn huỷ giao dịch mua. Tuỳ thuộc vào cách bạn thiết lập sản phẩm với Kỹ sư đối tác, việc huỷ có thể có hiệu lực ngay lập tức hoặc vào cuối chu kỳ thanh toán.

Khi khách hàng huỷ giao dịch mua, một thông báo có eventType ENTITLEMENT_PENDING_CANCELLATION sẽ được gửi. Nếu bạn đã thiết lập sản phẩm để xử lý yêu cầu huỷ ngay lập tức, thì một thông báo có eventType ENTITLEMENT_CANCELLED sẽ được gửi ngay sau đó.

step_5_entitlement_cancel/app.py

elif eventType == 'ENTITLEMENT_CANCELLED':
  # Clear out our records of the customer's plan.
  if entitlement['product'] in customer['products']:
    del customer['products'][entitlement['product']]

  ### TODO: Turn off customer's service. ###
  self.db.write(accountId, customer)
  return True

elif eventType == 'ENTITLEMENT_PENDING_CANCELLATION':
  # Do nothing. We want to cancel once it's truly canceled. For now it's
  # just set to not renew at the end of the billing cycle.
  return True

elif eventType == 'ENTITLEMENT_CANCELLATION_REVERTED':
  # Do nothing. The service was already active, but now it's set to renew
  # automatically at the end of the billing cycle.
  return True

Dịch vụ của bạn phải đợi thông báo ENTITLEMENT_CANCELLED rồi xoá quyền khỏi cơ sở dữ liệu và tắt dịch vụ cho khách hàng.

Sau khi bị huỷ, quyền sẽ bị xoá khỏi hệ thống của Google và một thông báo có eventType ENTITLEMENT_DELETED sẽ được gửi:

step_5_entitlement_cancel/app.py

elif eventType == 'ENTITLEMENT_DELETED':
  # Do nothing. Entitlements can only be deleted when they are already
  # cancelled, so our state is already up-to-date.
  return True

Để biết mã huỷ quyền, hãy xem ví dụ về cách triển khai.

9. Gửi báo cáo sử dụng

Một số dịch vụ có các thành phần dựa trên mức sử dụng, trong đó Google cần biết về mức sử dụng dịch vụ của khách hàng để tính cho khách hàng số tiền chính xác. Dịch vụ của bạn phải báo cáo mức sử dụng thông qua Google Service Control API.

Nếu dịch vụ của bạn không có thành phần dựa trên mức sử dụng, hãy bỏ qua phần này.

Để biết thông tin chi tiết về cách gửi báo cáo sử dụng, hãy xem tài liệu giới thiệu.

Báo cáo sử dụng phải được gửi đến Google Service Control API hằng giờ. Trong lớp học lập trình này, các báo cáo được gửi bằng một tập lệnh mà bạn có thể lên lịch dưới dạng một công việc định kỳ. Tập lệnh này lưu trữ thời gian của báo cáo sử dụng gần đây nhất trong cơ sở dữ liệu và sử dụng thời gian đó làm thời gian bắt đầu để đo lường mức sử dụng.

Tập lệnh này kiểm tra từng khách hàng đang sử dụng dịch vụ và gửi báo cáo sử dụng cho Google Service Control bằng cách sử dụng trường consumer_id của quyền của khách hàng. Sau đó, tập lệnh sẽ cập nhật mục nhập cơ sở dữ liệu cho khách hàng để có last_report_time được đặt thành thời gian kết thúc của báo cáo sử dụng vừa gửi.

Google Service Control cung cấp 2 phương thức: checkreport. Bạn phải luôn gọi phương thức trước ngay trước khi gọi phương thức sau. Nếu có lỗi trong trường hợp trước, thì dịch vụ của khách hàng sẽ bị vô hiệu hoá cho đến khi lỗi được khắc phục.

Tất cả mức sử dụng cho một quyền cụ thể đều được gán cho một usageReportingId. Tuy nhiên, đối với các sản phẩm SaaS, mức sử dụng này được liên kết với mục [Charges not specific to a project] trong Google Cloud Billing. Nếu sản phẩm SaaS của bạn có thể được chia sẻ rộng rãi trong tổ chức của khách hàng và bạn muốn hỗ trợ việc phân bổ chi phí, thì bạn nên thêm trường userLabels không bắt buộc vào tất cả các dịch vụ của mình trong hoạt động báo cáo mức sử dụng.

Google Cloud Marketplace dành riêng các khoá nhãn cloudmarketplace.googleapis.com/resource_name và cloudmarketplace.googleapis.com/container_name. Các nhãn này nhằm mục đích nắm bắt bối cảnh sử dụng trong hệ thống phân cấp tài nguyên và dịch vụ gốc của bạn. Tên do khách hàng chỉ định của các tài nguyên này sẽ được đưa vào làm giá trị nhãn trong báo cáo mức sử dụng. Bạn nên thêm các nhãn này vào báo cáo sử dụng theo mặc định.

Khoá nhãn

Giá trị nhãn

Mô tả

cloudmarketplace.googleapis.com/resource_name

RESOURCE_NAME

Tên của tài nguyên được liên kết với một chỉ số sử dụng.

cloudmarketplace.googleapis.com/container_name

CONTAINER_NAME

Tên của một vùng chứa tài nguyên.

Đoạn mã sau đây báo cáo mức sử dụng cho ứng dụng minh hoạ và phân bổ mức sử dụng cho sản phẩm SaaS cho tài nguyên do khách hàng chỉ định có tên là products_db. Trong lớp học lập trình này, service_nameisaas-codelab.mp-marketplace-partner-demos.appspot.com.

operation = {
  'operationId': '<UUID>',
  'operationName': 'Codelab Usage Report',
  'consumerId': 'project_number:<Project Number>',
  'startTime': '<Timestamp>',
  'endTime': '<Timestamp>',
  'metricValues': [{
      'int64Value': 100,
  }],
  'userLabels': {
    'cloudmarketplace.googleapis.com/container_name': 'saas-storage-solutions',
    'cloudmarketplace.googleapis.com/resource_name': 'products_db'
  }
}

service.services().report(
    serviceName=service_name, body={
        'operations': [operation]
    }).execute()
product['last_report_time'] = end_time
database.write(customer_id, customer)

Hãy xem mẫu triển khai của tập lệnh này để biết mã đầy đủ. Để tạo báo cáo mẫu về mức sử dụng, hãy chạy lệnh sau:

~/gcp-marketplace-integrated-saas/python3$ python3 -m impl.step_6_usage_reporting.report isaas-codelab.mp-marketplace-partner-demos.appspot.com

10. Xin chúc mừng!

Bạn đã tìm hiểu cách giải pháp SaaS của mình có thể tích hợp với Google Cloud Marketplace để xử lý tài khoản và quyền của khách hàng, cũng như báo cáo mức sử dụng đối với một dịch vụ. Để biết các bước tích hợp đầy đủ, hãy tham khảo tài liệu tích hợp phần phụ trợ.

Dọn dẹp

Nếu bạn không có ý định sử dụng các tài nguyên này nữa, hãy xoá các tài nguyên sau:

  • Gói thuê bao Cloud Pub/Sub
  • Tài khoản dịch vụ và các khoá của tài khoản đó
  • Nếu muốn, bạn có thể chọn dự án mà bạn đã tạo
  • (Không bắt buộc) Tài khoản thanh toán mà bạn đã tạo

Bước tiếp theo

Tích hợp giao diện người dùng

Các mẫu trong lớp học lập trình này sẽ tự động phê duyệt tài khoản và quyền. Trên thực tế, khách hàng phải được chuyển đến một trang đăng ký mà bạn tạo, nơi họ có thể tạo tài khoản trong hệ thống của bạn. Sau khi họ đăng ký thành công, bạn phải đưa ra các yêu cầu API để phê duyệt tài khoản và quyền của họ.

Để biết thông tin về cách tích hợp giao diện người dùng của ứng dụng, hãy xem tài liệu về Google Cloud Marketplace.

Tìm hiểu thêm về việc cung cấp các giải pháp SaaS

Để biết thông tin tổng quan về việc cung cấp các giải pháp SaaS trên Google Cloud Marketplace, hãy xem phần Cung cấp các giải pháp SaaS.