【Android】Stripe支付

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、Stripe是什么?

二、使用步骤

1.引入库

2.配置publishable key 来和Stripe通讯

3.创建订单,从服务端获取client secret

4.获取银行卡信息

5. 开始支付

6.支付结果回调

 

总结


 

前言

最近公司做海外项目用到了Stripe支付,这里就安卓端集成Stripe支付流程记录一下。总体来说接入集成Stripe还是比较简单的。

 

一、Stripe是什么?

Stripe是由20多岁的两兄弟Patrick Collison和John Collison创办的Stripe为公司提供网上支付的解决方案。Stripe向服务的公司收取每笔交易的2.9%加上30美分的手续费。

Stripe官网: https://stripe.com/

二、使用步骤

1.引入库

在app模块build.gradle里加入。最新版本:https://github.com/stripe/stripe-android/releases

implementation 'com.stripe:stripe-android:16.3.0'

2.配置publishable key 来和Stripe通讯

在你的Application里配置

import com.stripe.android.PaymentConfiguration;

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        PaymentConfiguration.init(
            getApplicationContext(),
            "pk_test_TYooMQauvdEDq54NiTphI7jx"
        );
    }
}

publishable key需要在Stripe官网里面申请。

3.创建订单,从服务端获取client secret

客户端创建订单,从服务器返回临时的client secret。这个是用来和银行卡信息绑定在一起进行支付。

服务端获取client secret的方法

// Set your secret key. Remember to switch to your live secret key in production!
// See your keys here: https://dashboard.stripe.com/account/apikeys
Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc";

PaymentIntentCreateParams params =
  PaymentIntentCreateParams.builder()
    .setAmount(1099L)
    .setCurrency("usd")
    .build();

PaymentIntent intent = PaymentIntent.create(params);
String clientSecret = intent.getClientSecret();
// Pass the client secret to the client
 

4.获取银行卡信息

创建界面获取用户输入的银行卡信息,包含卡号,日期,CVV码。

可以使用Stripe定义好的控件CardInputWidget来轻松获取。CardInputWidget控件会对输入的内容进行校验。如果是自己的布局实现的,需要调用API来校验。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="20dp"
    tools:showIn="@layout/activity_checkout">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="请输入银行卡信息"
        android:textSize="16sp" />


    <com.stripe.android.view.CardInputWidget
        android:id="@+id/cardInputWidget"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/dp_10" />

    <Button
        android:id="@+id/payButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:backgroundTint="@android:color/holo_green_light"
        android:text="@string/pay" />

</LinearLayout>

5. 开始支付

CardInputWidget控件获取到参数,然后和Client Secret绑定在一起。创建Stripe对象来确认支付。

Button payButton = findViewById(R.id.payButton);
        payButton.setOnClickListener((View view) -> {
            CardInputWidget cardInputWidget = findViewById(R.id.cardInputWidget);
            PaymentMethodCreateParams params = cardInputWidget.getPaymentMethodCreateParams();
            if (params != null) {
                if (paymentIntentClientSecret == null) {
                    return;
                }
                ConfirmPaymentIntentParams confirmParams = ConfirmPaymentIntentParams
                        .createWithPaymentMethodCreateParams(params, paymentIntentClientSecret);

                String stripePublishableKey = PaymentConfiguration.getInstance(this).getPublishableKey();
                LogUtils.d("stripePublishableKey==" + stripePublishableKey);
                // Configure the SDK with your Stripe publishable key so that it can make requests to the Stripe API
                stripe = new Stripe(
                        getApplicationContext(),
                        Objects.requireNonNull(stripePublishableKey)
                );

                stripe.confirmPayment(this, confirmParams);
            }
        });

6.支付结果回调

在onActivityResult里获取支付的结果回调。

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Handle the result of stripe.confirmPayment
        stripe.onPaymentResult(requestCode, data, new PaymentResultCallback(this));
    }

    private static final class PaymentResultCallback
            implements ApiResultCallback<PaymentIntentResult> {
        @NonNull
        private final WeakReference<StripPaymentActivity> activityRef;

        PaymentResultCallback(@NonNull StripPaymentActivity activity) {
            activityRef = new WeakReference<>(activity);
        }

        @Override
        public void onSuccess(@NonNull PaymentIntentResult result) {
            final StripPaymentActivity activity = activityRef.get();
            if (activity == null) {
                return;
            }

            PaymentIntent paymentIntent = result.getIntent();
            PaymentIntent.Status status = paymentIntent.getStatus();
            if (status == PaymentIntent.Status.Succeeded) {
                // Payment completed successfully
               /* Gson gson = new GsonBuilder().setPrettyPrinting().create();
                String toJson = gson.toJson(paymentIntent);
                activity.displayAlert(
                        activity.getString(R.string.payment_successful),
                        "",
                        true
                );*/
                activity.showDialogPaySuccess();

            } else if (status == PaymentIntent.Status.RequiresPaymentMethod) {
                // Payment failed – allow retrying using a different payment method
                activity.displayAlert(
                        activity.getString(R.string.payment_failed),
                        Objects.requireNonNull(paymentIntent.getLastPaymentError()).getMessage(),
                        false
                );
            }
        }

        @Override
        public void one rror(@NonNull Exception e) {
            final StripPaymentActivity activity = activityRef.get();
            if (activity == null) {
                return;
            }

            // Payment request failed – allow retrying using the same payment method
            activity.displayAlert(activity.getString(R.string.payment_failed), e.getMessage(), false);
        }
    }

 

总结

Stripe的支付流程就是这样。具体的使用可以查看官方文档。文档里面还有保存银行卡的功能。这个实现起来会比较富足,可以根据具体业务来添加。

上一篇:1045 Favorite Color Stripe (30 分)(最长公共子序列改编)


下一篇:GFS分布式文件系统