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

Flutter使用flutter_stripe ^9.0.0+1生成Stripe卡片令牌:未传卡信息如何实现?

在Flutter中使用flutter_stripe ^9.0.0+1生成卡片令牌

你的现有代码问题

你提供的代码不符合Stripe API的要求——生成卡片令牌必须传入卡号、有效期、CVC这些核心参数。这段代码如果直接运行,会抛出参数缺失的错误,无法生成有效令牌。你看到的“能生成令牌”的情况大概率是测试环境的异常,或是有未展示的上下文逻辑,绝非标准用法。

正确实现步骤(合规且标准)

flutter_stripe推荐使用Stripe Elements卡片表单组件收集卡片信息(符合PCI合规,无需自行处理敏感数据),再基于表单数据生成令牌,步骤如下:

1. 初始化Stripe

确保在应用入口处完成Stripe初始化(使用你的Stripe公钥):

await Stripe.instance.initialize(
  publishableKey: 'pk_你的Stripe公钥',
);

2. 集成卡片表单收集信息

使用CardFormField组件渲染安全的卡片输入表单,它会自动处理卡号格式化、有效期验证、CVC校验等逻辑,并返回CardInputDetails对象(包含所有必要的卡片信息)。

3. 生成令牌

基于CardInputDetails中的数据,构建CardTokenParams并调用createToken方法。

完整代码示例

import 'package:flutter/material.dart';
import 'package:flutter_stripe/flutter_stripe.dart';

class CardTokenGenerator extends StatefulWidget {
  const CardTokenGenerator({super.key});

  @override
  State<CardTokenGenerator> createState() => _CardTokenGeneratorState();
}

class _CardTokenGeneratorState extends State<CardTokenGenerator> {
  CardInputDetails? _cardInfo;
  final _formKey = GlobalKey<FormState>();

  Future<void> generateCardToken() async {
    if (_cardInfo == null || !_cardInfo!.complete) return;

    try {
      final TokenData tokenData = await Stripe.instance.createToken(
        CreateTokenParams.card(
          params: CardTokenParams(
            number: _cardInfo!.number,
            expMonth: _cardInfo!.expMonth,
            expYear: _cardInfo!.expYear,
            cvc: _cardInfo!.cvc,
          ),
        ),
      );

      // 令牌生成成功,可用于支付或关联客户
      print('卡片令牌: ${tokenData.token.id}');
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('令牌生成成功: ${tokenData.token.id}')),
      );
    } catch (e) {
      print('令牌生成失败: ${e.toString()}');
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('生成失败: ${e.toString()}')),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('生成卡片令牌')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              // Stripe官方卡片表单组件
              CardFormField(
                onCardChanged: (details) {
                  setState(() {
                    _cardInfo = details;
                  });
                },
                enabled: true,
              ),
              const SizedBox(height: 24),
              // 只有表单填写完整时才允许点击
              ElevatedButton(
                onPressed: _cardInfo?.complete == true ? generateCardToken : null,
                child: const Text('生成令牌'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

关键注意事项

  • 合规性:禁止使用自定义TextField收集卡片信息,否则会违反PCI合规标准,CardFormField是Stripe提供的合规组件,敏感数据会在本地加密处理,不会传到你的服务器。
  • 令牌有效期:生成的卡片令牌有效期极短(通常几分钟),仅用于一次性支付或关联到客户对象,不要长期存储。如需重复使用,应创建客户ID或支付方法ID。

内容的提问来源于stack exchange,提问作者Shivam Shashank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:52:39