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




