stripe支付集成

最近公司要做一下Stripe支付的集成,浅浅地谈一下自己的一点理解

1、stripe是什么?

stripe是第三方的支付平台,就像国内的支付宝、微信支付。。。

stripe官方文档:Developer tools | Stripe Documentation

关于stripe支付,文档写得还是很清楚的

stripe支持三种支付方式

(1)Stripe Checkout

这是stripe提供的页面,可以将用户重定向到这个页面进行一些简单的购买,其余两种方式则可以自定义支付流程

(2)Charges API支付 

这是一种比较旧的支付方式了,缺点也写的比较清楚,无非就是不支持印度、不支持强客户认证(Stripe的强客户认证(SCA)是一种欧洲支付服务指令(PSD2)的要求,旨在增强客户的支付安全性。它要求客户在进行交易时进行额外的身份验证,例如输入密码或使用指纹识别等生物识别技术。这有助于减少欺诈和非法交易。)等等

(3)Payment Intents API

这是stripe推荐的方式,现在我们来比较一下两种方式的优缺点

Source优点:

  1. 简单易用,只需要一个API请求即可完成支付;
  2. 支持多种支付方式,包括信用卡、银行转账等;
  3. 支持多种支付场景,包括一次性支付、订阅等;
  4. 支持多种支付功能,包括支付验证、支付取消等。

Source缺点:

  1. 不支持支付宝、微信支付等流行的支付方式;
  2. 不支持分期付款等复杂的支付场景;
  3. 不支持3D Secure、欺诈检测等支付安全功能;

PaymentIntent优点:

  1. 支持更多的支付方式,包括信用卡、银行转账、支付宝、微信支付等;
  2. 支持更多的支付场景,包括一次性支付、分期付款、订阅等;
  3. 支持更多的支付功能,包括支付验证、支付确认、支付取消等;
  4. 支持更多的支付安全性,包括3D Secure、欺诈检测等。

PaymentIntent缺点:

  1. 需要更多的开发工作,包括前端和后端的开发;
  2. 需要更多的支付流程,包括创建PaymentIntent、确认PaymentIntent、支付等;
  3. 需要更多的支付费用,包括Stripe的手续费和支付渠道的手续费。

2、自定义支付流程这两种方式的处理逻辑

先来说charges API这种方式,这种方式比较简单

import com.stripe.Stripe;
import com.stripe.exception.StripeException;
import com.stripe.model.Charge;
import java.util.HashMap;
import java.util.Map;
public class StripeDemo {    
	public static void main(String[] args) {

        // 开发完毕后替换为生产秘钥        
		Stripe.apiKey = "sk_test_XXXXXXXXXXXXXXXXXXXXXXXX";        
		Map<String, Object> chargeParams = new HashMap<>();
        chargeParams.put("amount", 2000);
		chargeParams.put("currency", "usd");
		chargeParams.put("source", "tok_visa");
		chargeParams.put("description", "Test Charge");
		try {            
			Charge charge = Charge.create(chargeParams);
            System.out.println(charge);
		} catch (StripeException e) {
			e.printStackTrace();
		}
	}
}

如果是正式开发,需要前端收集用户付款的银行卡信息生成stripeToken用于charge对象的创建

第二种Payment Intents API方式 

这种方式的处理流程如下图所示:

首先创建paymentIntent,根据paymentIntent.getClientSecret和用户输入的银行卡信息去调用stripe接口,接下来就是我们正常的业务,支付成功就可以进行正常的业务操作

PaymentIntentCreateParams params =
                    PaymentIntentCreateParams.builder()
                             // 设置要收取的金额
                            .setAmount(amount)
                            // 设置收取的币种
                            .setCurrency("cny")
                            .setAutomaticPaymentMethods(
                                    PaymentIntentCreateParams.AutomaticPaymentMethods
                                            .builder()
                                            .setEnabled(true)
                                            .build()
                            )
                            .build();

            // Create a PaymentIntent with the order amount and currency
            PaymentIntent paymentIntent = null;
            try {
                paymentIntent = PaymentIntent.create(params);
            } catch (StripeException e) {
                e.printStackTrace();
            }

            CreatePaymentResponse paymentResponse = new CreatePaymentResponse(paymentIntent.getClientSecret());
            return new Gson().toJson(paymentResponse);

接下来是我们前端处理逻辑,前端接收到后端传递clientSecret和用户输入的银行卡信息去请求stripe接口进行支付

const response = await fetch("/", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ items }),
  });
  const { clientSecret } = await response.json();

  const appearance = {
    theme: 'stripe',
  };
  elements = stripe.elements({ appearance, clientSecret });


async function handleSubmit(e) {
  e.preventDefault();
  setLoading(true);

  const { error } = await stripe.confirmPayment({
    elements,
    confirmParams: {
      // Make sure to change this to your payment completion page
      return_url: "http://localhost:4242/checkout.html",
      receipt_email: emailAddress,
    },
  });


const { paymentIntent } = await stripe.retrievePaymentIntent(clientSecret);

  switch (paymentIntent.status) {
    case "succeeded":
      alert("支付成功");
      break;
    case "processing":
      showMessage("Your payment is processing.");
      break;
    case "requires_payment_method":
      showMessage("Your payment was not successful, please try again.");
      break;
    default:
      showMessage("Something went wrong.");
      break;
  }

这是前端的部分代码,主要就是获取paymentIntent对象的的clientSecret并收集银行卡信息进行支付,验证支付结果,如果还有业务上的逻辑,就可以根据支付结果进行相应的处理。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值