You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter移动端应用事件完成后自动扣款的支付方法及实现咨询

商家发起式自动扣款(MIT)方案及Flutter端实现(Stripe/PayPal)

一、该支付方式的专业名称

你描述的场景属于商家发起交易(Merchant Initiated Transaction,MIT),核心逻辑是:用户预先绑定支付方式并完成首次合规授权(如3DS验证)后,商家可在约定场景(如行程结束、服务交付完成)下,无需用户再次操作或验证,直接从绑定的支付渠道扣款。

二、基于Stripe的实现流程

1. 前置准备

  • 注册Stripe商户账号,获取publishable key(前端用)和secret key(后端用)
  • 在Flutter项目中集成flutter_stripe SDK

2. 用户绑定支付方式(首次授权)

  • 引导用户完成支付方式绑定,这一步必须走持卡人发起交易(CIT)流程,完成3DS验证(合规强制要求)
  • 通过Stripe SDK创建PaymentMethod,并将其关联到Stripe的Customer对象,后端存储用户对应的Customer ID和PaymentMethod ID

3. 行程结束后自动扣款

  • 后端调用Stripe的PaymentIntents API,传入存储的Customer ID、PaymentMethod ID,并设置off_session: true(标记为MIT交易),同时传入计算好的订单金额
  • Flutter端只需调用后端的扣款接口,无需用户额外操作

Flutter端绑定支付方式示例代码

import 'package:flutter_stripe/flutter_stripe.dart';

// 初始化Stripe
void initStripe() {
  Stripe.publishableKey = '你的publishable_key';
  Stripe.instance.applySettings();
}

// 创建并绑定支付方式
Future<void> bindPaymentMethod() async {
  try {
    final paymentMethod = await Stripe.instance.createPaymentMethod(
      PaymentMethodParams.card(
        paymentMethodData: PaymentMethodData(
          billingDetails: BillingDetails(
            name: '用户姓名',
            email: 'user@example.com',
          ),
        ),
      ),
    );
    // 将paymentMethod.id发送到后端,关联到用户的Stripe Customer
    await yourBackendAPI.bindPaymentMethod(paymentMethod.id);
  } catch (e) {
    // 处理错误
  }
}

三、基于PayPal的实现流程

1. 前置准备

  • 在PayPal开发者平台创建商户应用,获取Client ID和Secret
  • 集成Flutter端的PayPal SDK(如paypal_sdk)

2. 用户授权自动扣款权限

  • 引导用户通过PayPal登录,创建账单协议(Billing Agreement),获取用户授权的扣款权限
  • 后端存储该协议的Agreement ID,用于后续扣款

3. 服务完成后发起扣款

  • 后端调用PayPal的Orders V2 API,使用已存储的Agreement ID发起即时扣款,传入订单金额和描述
  • Flutter端触发后端接口即可完成扣款

Flutter端创建账单协议示例代码

import 'package:paypal_sdk/paypal_sdk.dart';

// 初始化PayPal客户端
final paypalClient = PayPalHttpClient(
  clientId: '你的Client ID',
  secret: '你的Secret',
  environment: PayPalEnvironment.sandbox, // 正式环境切换为production
);

// 创建账单协议
Future<void> createBillingAgreement() async {
  final billingAgreement = BillingAgreement(
    name: '出租车行程自动扣款协议',
    description: '行程结束后自动扣除费用',
    payer: Payer(paymentMethod: 'paypal'),
    plan: Plan(type: PlanType.fixed, frequency: Frequency.onDemand),
  );

  final response = await paypalClient.createBillingAgreement(billingAgreement);
  // 将response.id发送到后端存储
  await yourBackendAPI.saveAgreementId(response.id);
}

内容的提问来源于stack exchange,提问作者B. Mercan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:10:45