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(...) 方法中的用户产品选择动态提取支付信息。
  • 将付款确认发送到你的服务器并验证付款是否已实际完成。
  • 在应用程序中处理错误和取消用户案例。