透過通知付款

快速付款示範整合說明

部分企業需要提供快速付款的功能,以便客戶取得或重新獲得服務的存取權 (例如:行動數據方案、家庭帳單、服務升級或先前遭拒的款項)。商家通常會透過行動裝置來通知使用者這類事件。不過,如要實際執行付款動作,使用者就必須切換內容,花費大量時間瀏覽所有表單,而這大大降低了完成付款的可能性。

此模式可協助您將付款動作直接新增至通知中,讓使用者可以立即採取行動,只要輕觸兩下便能迅速付款。本指南將說明如何在 Android 應用程式中建立類似的體驗。

需求條件

本指南假設您的 Android 應用程式已整合了有效的 Google Pay。如果您尚未加入整合服務,不妨先參考我們的教學課程逐步指南程式碼研究室

構成要素

將 Google Pay 按鈕新增至通知時,是以 Android 上的兩個基本構成要素為基礎:

自訂通知版面配置

Android 裝置上的一般通知具有完善的剖析定義,可適應多種視覺環境。使用標準範本能幫助您確保不論裝置螢幕方向、板型規格和 OS 版本,通知都能正常顯示,因此建議您以此方式告知使用者需注意的事件。

如果標準的版面配置不符合需求,您也可使用自訂通知版面配置來提供自己的版面配置。在本指南中,您將使用自訂版面配置,將 Google Pay 按鈕新增至通知,好讓使用者直接從該畫面辦理付款。

活動

活動可協助您在應用程式中向使用者展示功能。一般來說,活動會有相關的使用者介面,並構成應用程式中可瀏覽的畫面階層結構。

當使用者按一下 Google Pay 按鈕時,Google 會傳回可用的付款方式清單,以供使用者完成交易。此付款畫面必須透過代管活動啟動。您可以利用透明的活動來建立外觀,讓付款畫面直接顯示在通知之上。

定義通知的版面配置

替通知建立版面配置的程序,和替一般活動定義使用者介面的方式非常類似。通知 (例如小工具) 會使用 RemoteViews 類別來管理版面配置中的元素。這可減少一般版面配置的支援的可用檢視畫面清單

首先,請在 res/layout/ 資料夾中建立版面配置資源檔案,說明您所想要的通知外觀。請參考範例應用程式中的 notification_account_top_up.xml

自訂通知版面配置範例
圖 1.自訂通知版面配置範例。

新增 Google Pay 按鈕

一旦版面配置準備就緒,最後一步就是加入 Google Pay 按鈕。方法很簡單,只要從預先建立的 Google Pay 素材資源集合,將適當的按鈕資源加入至您的版面配置 XML 檔案中即可。這些素材資源包含各種按鈕用圖像資源,可配合多種螢幕大小、解析度及語言,而且遵循 Google Pay 品牌宣傳指南。您可以直接透過品牌宣傳指南專區下載這些資源。

<include
  android:id="@+id/googlePayButton"
  layout="@layout/buy_with_googlepay_button"
  android:layout_width="wrap_content"
  android:layout_height="48sp" />

現在,當您查看版面配置的設計檢視畫面時,就能看到 Google Pay 按鈕:

含有 Google Pay 按鈕的自訂通知範例
圖 2.含有 Google Pay 按鈕的自訂通知範例。

觸發通知

視應用程式或服務的互動流程而定,您可以依據不同事件分別發送通知。常見的模式是使用訊息服務,從後端伺服器發出推播通知。如果您尚未在 Android 應用程式中加入推送功能,請參閱 Firebase 雲端通訊絕佳教學課程,以瞭解如何開始使用。

建立及設定檢視畫面

為了初始化通知的版面配置及其內含的檢視畫面,程序的運作方式會與一般活動稍有不同。請分別設定檢視畫面的結構與回應使用者互動的方式。每次狀態有所更新時,您都必須重繪通知。

首先,建立 RemoteViews 物件以存放版面配置階層:

Kotlin

    val notificationLayout = RemoteViews(packageName, R.layout.large_notification)

Java

    RemoteViews notificationLayout = new RemoteViews(packageName, R.layout.large_notification);

您現在可以使用 notificationLayout 物件來變更基礎檢視畫面 (按鈕、文字、圖片等),例如修改其樣式,或是設為回應使用者互動。在此範例中,Google Pay 按鈕會擷取輕觸事件,以啟動付款流程:

Kotlin

    val selectOptionIntent = Intent(context, PaymentNotificationIntentService::class.java)
      selectOptionIntent.action = ACTION_SELECT_PREFIX + option
      notificationLayout.setOnClickPendingIntent(buttonId, PendingIntent.getService(
              context, 0, selectOptionIntent, PendingIntent.FLAG_UPDATE_CURRENT))

Java

    Intent payIntent = new Intent(context, PaymentTransparentActivity.class);
    payIntent.setAction(ACTION_PAY_GOOGLE_PAY);
    payIntent.putExtra(OPTION_PRICE_EXTRA, OPTION_PRICE_CENTS.get(selectedOption));
    notificationLayout.setOnClickPendingIntent(
        R.id.googlePayButton, pendingIntentForActivity(context, payIntent));

在這個執行個體中,顯示付款畫面的 Intent 包含指明了 Intent 目的之動作,並包含其他資訊 (例如所選項目的價格)。此外,Intent 還將事件與 Google Pay 按鈕建立關聯,如此一來每當使用者輕觸按鈕,Intent 便會執行,並將付款活動置於前景。

顯示通知

在您建立及設定通知後,最後一步便是要對使用者顯示通知。為此,請使用上述定義的參數和其他設定來建構通知物件,以決定其運作方式:

Kotlin

    val notification = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(context.getString(R.string.notification_title))
            .setContentText(context.getString(R.string.notification_text))
            .setCustomBigContentView(notificationLayout)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setAutoCancel(false)
            .setOnlyAlertOnce(true)
            .build()

Java

    Notification notification = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
        .setSmallIcon(R.mipmap.ic_launcher)
        .setContentTitle(context.getString(R.string.notification_title))
        .setContentText(context.getString(R.string.notification_text))
        .setCustomBigContentView(notificationLayout)
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setAutoCancel(false)
        .setOnlyAlertOnce(true)
        .build();

此設定中有部分屬性顯示了此通知的運作方式,但在您的應用程式中,其他屬性則可能依據您的偏好和用途而有所不同。在此將這類欄位列舉如下:

欄位 說明
通知管道 NOTIFICATION_CHANNEL_ID 從 Android 8.0 (API 級別 26) 開始,您必須將所有通知指派給某個管道。管道會按照使用者可管理的類別主題將通知分門別類。詳情請參閱 Android 說明文件中的通知管道
自訂大型內容檢視畫面 notificationLayout 這就是您先前準備的版面配置連結至通知之處。
自動取消 false 如果您將通知設為互動 (如這個範例所使用的參數),那麼就可將自動取消參數設為 false,以確保通知不會在使用者碰到其內的任何檢視畫面時自動關閉。
僅提醒一次 true 這則通知會回應使用者輸入的內容。請將此參數設為 true,以避免在通知更新時發出音效、提示和震動。

如要瞭解關於通知的其他設定和一般概念,請參閱 Android 說明文件中的自訂通知總覽章節。

最後,如要觸發並顯示通知,請使用 notify 方法傳入先前建立的 notification 物件:

Kotlin

    NotificationManagerCompat.from(context).notify(NOTIFICATION_ID, notification)

Java

    NotificationManagerCompat.from(context).notify(NOTIFICATION_ID, notification);

NOTIFICATION_ID 是可識別通知的任意整數,於日後更新或移除通知時需要用到。

付款

當使用者輕觸 Google Pay 按鈕時,即顯示付款畫面,以便使用者選擇用來完成交易的付款方式。您可以使用 Google Pay API 在活動之上顯示付款畫面。由於通知會開始新的付款處理,故將此活動設為透明,便能在不開啟應用程式的情況下,給予使用者操作已完成的印象。查看此活動的 onCreate 方法:

Kotlin

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // Dismiss the notification UI if the activity was opened from a notification
    if (Notifications.ACTION_PAY_GOOGLE_PAY == intent.action) {
      sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
    }

    // Initialise the payments client
    startPayment()
  }

Java

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Dismiss the notification UI if the activity was opened from a notification
    if (Notifications.ACTION_PAY_GOOGLE_PAY.equals(getIntent().getAction())) {
      sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
    }

    // Initialise the payments client
    startPayment();
  }

如您所見,此活動並不複雜。包含意圖常數 ACTION_CLOSE_SYSTEM_DIALOGS 的廣播會關閉通知選單。提醒您,這項活動只會透過通知中的 Google Pay 按鈕存取,而且若無廣播,通知對話方塊就會保持開啟。

此外,此活動所需的唯一動作,就是顯示付款畫面,也就是透過 showPaymentsSheet 方法啟動的付款畫面。接著只要呼叫 Google Pay API 中的 loadPaymentData 方法即可。請查看範例應用程式中的 PaymentTransparentActivity.java 檔案,以探索該活動中的所有邏輯。