You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter中集成Adyen支付的实现咨询(基于adyen_checkout: ^1.1.0包)

Flutter中集成Adyen支付的实现咨询(基于adyen_checkout: ^1.1.0包)

嘿,我之前刚好在Flutter项目里用过adyen_checkout: ^1.1.0这个包,给你梳理一下完整的实现流程和踩过的坑,应该能帮你快速落地!

一、先搞定Adyen后台的必要配置

这一步是基础,没配置好后面代码再对也没用:

  • 首先得在Adyen商户后台注册账号,拿到API密钥商户代码(Merchant Account),注意区分沙箱(sandbox)和生产(live)环境的密钥,别搞混了
  • 后台要开启你需要的支付方式(比如信用卡、PayPal、Apple Pay这些),还要配置返回URL——移动端一般用自定义Scheme,比如adyen://payment/callback,这个后面代码和平台配置里都要用到
  • 确认沙箱环境的测试权限是否开启,Adyen沙箱有专门的测试数据,后面测试会用到

二、项目端的依赖与平台配置

1. 添加依赖

在你的pubspec.yaml里加入:

dependencies:
  adyen_checkout: ^1.1.0

然后执行flutter pub get拉取依赖。

2. iOS平台配置

打开ios/Runner/Info.plist,添加以下配置:

  • 允许Adyen相关的Scheme查询,避免支付跳转被拦截:
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>adyencheckout</string>
  <string>adyen</string>
  <!-- 如果你用Apple Pay,还要加applepay -->
</array>
  • 配置自定义返回Scheme的URL类型:
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>adyen</string> <!-- 这里要和你后台配置的返回URL Scheme一致 -->
    </array>
  </dict>
</array>

3. Android平台配置

打开android/app/src/main/AndroidManifest.xml

  • 确保添加了网络权限:
<uses-permission android:name="android.permission.INTERNET" />
  • 添加处理自定义Scheme的Intent Filter,放在<activity>标签内(比如MainActivity):
<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="adyen" /> <!-- 和后台、iOS配置一致 -->
</intent-filter>

三、核心代码实现

1. 初始化Checkout实例

在你的支付页面初始化Checkout,注意环境要和后台对应:

import 'package:adyen_checkout/adyen_checkout.dart';

final checkout = AdyenCheckout(
  environment: Environment.test, // 测试用test,上线换live
  merchantAccount: "你的商户代码",
  returnUrl: "adyen://payment/callback", // 和后台配置一致
);

2. 构建支付请求

创建支付请求对象,指定金额、货币、支付方式等:

final paymentRequest = PaymentRequest(
  amount: Amount(value: 1000, currency: "EUR"), // 金额是最小单位,比如1000代表10.00 EUR
  paymentMethodTypes: const [PaymentMethodType.card], // 支持的支付方式,比如card、paypal
  reference: "订单号_${DateTime.now().millisecondsSinceEpoch}", // 唯一订单标识,自己生成
);

3. 启动支付流程并处理结果

调用startPayment方法,然后处理回调:

void startAdyenPayment() async {
  try {
    final result = await checkout.startPayment(paymentRequest);
    // 处理支付结果
    switch (result.resultCode) {
      case ResultCode.authorised:
        // 支付成功,这里可以调用你的后端接口验证订单状态
        print("支付成功!");
        break;
      case ResultCode.refused:
        // 支付被拒绝
        print("支付被拒绝:${result.refusalReason}");
        break;
      case ResultCode.canceled:
        // 用户取消支付
        print("用户取消支付");
        break;
      default:
        // 其他异常情况
        print("支付异常:${result.resultCode}");
    }
  } catch (e) {
    // 捕获初始化或支付过程中的错误
    print("支付出错:$e");
  }
}

四、测试要点

  • 用Adyen官方提供的测试卡号,比如信用卡:4111 1111 1111 1111,到期日选未来的月份/年份(比如12/30),CVV填737,测试支付成功的场景
  • 测试拒绝场景可以用4111 1111 1111 1112,这个卡号会模拟支付被拒
  • 沙箱环境的所有支付都是模拟的,不会产生真实交易,放心测

五、常见坑点排查

  • 支付页面打不开:检查后台是否开启了对应的支付方式,还有网络权限是否配置
  • 回调没触发:确认自定义Scheme在iOS和Android的配置是否正确,返回URL和后台完全一致
  • API密钥错误:检查用的是沙箱还是生产环境的密钥,两个环境密钥不通用
  • 金额格式错误:Adyen的金额是最小货币单位,比如人民币要传分,欧元传欧分,别直接传元/欧元

备注:内容来源于stack exchange,提问作者amirhossein ghabeli

火山引擎 最新活动