Android 接受 PayPal 信用卡付款

在本教程中,我們將學習如何設定 PayPal Android SDK 以通過 PayPal 付款或信用卡購買處理簡單付款。在此示例的末尾,你應該在應用程式中有一個簡單的按鈕,當單擊該按鈕時,會將使用者轉發到 PayPal 以確認設定的付款,然後將使用者返回到應用程式並記錄付款確認。

PayPal Developer Github 儲存庫中提供了此示例的完整應用程式程式碼。

讓我們開始吧。

第一步是獲取 SDK 並將其新增到專案中 。我們新增對 build.gradle 依賴項的引用,如下所示:

dependencies {
    compile 'com.paypal.sdk:paypal-android-sdk:2.14.1'
    ...
}

現在我們轉到我們的 MainActivity.java 檔案(或者你想要新增 PayPal 按鈕整合的任何地方),併為我們將要使用的客戶端 ID 和環境(沙箱)新增 config 物件。

private static PayPalConfiguration config = new PayPalConfiguration()
    .environment(PayPalConfiguration.ENVIRONMENT_SANDBOX)
    .clientId("YOUR CLIENT ID");

現在我們將在 onCreate(...) 方法中建立一個按鈕,這樣我們就可以在點選後通過 PayPal 處理付款。

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final Button button = (Button) findViewById(R.id.paypal_button);
}

我們現在需要定義該按鈕的功能。在 res> layout> main XML 檔案中,你可以為按鈕新增以下定義,該定義將為具有 paypal_button ID 的按鈕定義文字和 onClick 處理程式。

<Button android:id="@+id/paypal_button"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="@string/paypal_button"
    android:onClick="beginPayment" />

單擊時,該按鈕將呼叫 beginPayment(...) 方法。然後我們可以將按鈕的文字新增到 strings.xml 檔案中,如下所示:

<string name="paypal_button">Pay with PayPal</string>

按鈕就位後,我們現在必須處理按鈕點選才能開始付款處理。在我們之前的 onCreate(...) 方法下面新增以下 beginPayment(...) 方法。

public void beginPayment(View view){
    Intent serviceConfig = new Intent(this, PayPalService.class);
    serviceConfig.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
    startService(serviceConfig);

    PayPalPayment payment = new PayPalPayment(new BigDecimal("5.65"), 
        "USD", "My Awesome Item", PayPalPayment.PAYMENT_INTENT_SALE);

    Intent paymentConfig = new Intent(this, PaymentActivity.class);
    paymentConfig.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
    paymentConfig.putExtra(PaymentActivity.EXTRA_PAYMENT, payment);
    startActivityForResult(paymentConfig, 0);
}

我們在這裡做的是首先使用我們之前為客戶端 ID 和沙箱環境定義的 config 來設定服務意圖(serviceConfig)。然後,我們指定要處理的付款物件。為了這個例子,我們設定靜態價格,貨幣和描述。在最終的應用程式中,這些值應該從使用者嘗試在應用程式中購買的內容中獲取。最後,我們設定了 paymentConfig,新增了我們之前定義的 configpayment 物件,並啟動了活動。

此時,將向使用者顯示 PayPal 登入和付款螢幕,允許他們選擇是使用 PayPal 還是使用信用卡付款(如果相機可用,則通過手動輸入或 card.io)。那個螢幕看起來像這樣:

PayPal 付款確認螢幕

完成後,我們需要準備一個處理程式,以便 PayPal 在確認付款或取消後將使用者轉發迴應用程式。讓我們為此目的覆蓋 onActivityResult(...)

@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data){
    if (resultCode == Activity.RESULT_OK){
        PaymentConfirmation confirm = data.getParcelableExtra(
            PaymentActivity.EXTRA_RESULT_CONFIRMATION);
        if (confirm != null){
            try {
                Log.i("sampleapp", confirm.toJSONObject().toString(4));

                // TODO: send 'confirm' to your server for verification

            } catch (JSONException e) {
                Log.e("sampleapp", "no confirmation data: ", e);
            }
        }
    } else if (resultCode == Activity.RESULT_CANCELED) {
        Log.i("sampleapp", "The user canceled.");
    } else if (resultCode == PaymentActivity.RESULT_EXTRAS_INVALID) {
        Log.i("sampleapp", "Invalid payment / config set");
    }
}

onActivityResult(...) 方法中,我們檢查返回的 resultCode 是否為 RESULT_OK(使用者確認付款),RESULT_CANCELED(使用者取消付款)或 RESULT_EXTRAS_INVALID(存在配置問題)。在有效確認的情況下,我們獲得從付款返回的物件,並在此示例中記錄它。將返回給我們的內容應如下所示:

{
    "client": {
        "environment": "sandbox",
        "paypal_sdk_version": "2.14.1",
        "platform": "Android",
        "product_name": "PayPal-Android-SDK"
    },
    "response": {
        "create_time": "2016-05-02T15:33:43Z",
        "id": "PAY-0PG63447RB821630KK1TXGTY",
        "intent": "sale",
        "state": "approved"
    },
    "response_type": "payment"
}

如果我們檢視 response 物件,我們可以看到我們有一個 stateapproved,這意味著付款已經確認。此時,應將該物件傳送到你的伺服器以確認付款實際已通過。有關這些步驟的詳細資訊,請參閱這些文件

我們的最後一步是清理我們的 onDestroy(...)

@Override
public void onDestroy(){
    stopService(new Intent(this, PayPalService.class));
    super.onDestroy();
}

這裡的所有都是它的。在這個例子中,我們建立了一個簡單的按鈕,用 PayPal 或信用卡處理付款。從這一點開始,你可以通過以下幾個步驟擴充套件此示例:

  • 根據 beginPayment(...) 方法中的使用者產品選擇動態提取支付資訊。
  • 將付款確認傳送到你的伺服器並驗證付款是否已實際完成。
  • 在應用程式中處理錯誤和取消使用者案例。