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按钮集成的任何位置),并config为我们的客户端ID和将要使用的环境(沙盒)添加一个对象。

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>

放置好按钮后,我们现在必须处理按钮单击才能开始付款处理。在beginPayment(...)我们之前的onCreate(...)方法下面添加以下方法。

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);
}

我们在这里要做的是首先serviceConfig使用config我们先前为客户ID和沙盒环境定义的来设置服务意图()。然后,我们指定要处理的付款对象。为了这个示例,我们设置了静态价格,货币和描述。在最终应用程序中,这些值应从用户尝试在应用程序中购买的内容中获取。最后,我们设置paymentConfig,同时添加先前定义的config和payment对象,然后开始活动。

此时,将向用户显示PayPal登录和付款屏幕,使他们可以选择使用PayPal还是信用卡付款(通过手动输入或card.io如果有摄像头)。该屏幕将如下所示:

完成后,我们需要准备好处理程序,以便在确认付款或取消后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));

                // 待办事项:将“确认”发送到您的服务器以进行验证

            } catch (JSONException e) {
                Log.e("sampleapp", "没有确认数据: ", e);
            }
        }
    } else if (resultCode == Activity.RESULT_CANCELED) {
        Log.i("sampleapp", "用户已取消。");
    } 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的对象,我们可以看到,我们有一个state的approved,这意味着支付确认。此时,应该将该对象发送到您的服务器,以确认是否确实付款。有关这些步骤的更多信息,请参阅这些文档。

我们的最后一步是清理我们的计算机onDestroy(...)。

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

这里的所有都是它的。在此示例中,我们创建了一个简单的按钮来处理使用PayPal或信用卡进行的付款。从这一点出发,您可以采取一些后续步骤来扩展此样本:

  • 该beginPayment(...)方法基于用户产品选择动态提取付款信息。

  • 将付款确认发送到您的服务器,并验证付款是否实际通过。

  • 处理应用内的错误和取消用户案例。