Flutter支付集成插件adyen_dropin的使用
Flutter支付集成插件adyen_dropin的使用
adyen_dropin
注意:此库并非官方Adyen库。
Flutter插件用于集成Adyen的Android和iOS库。此库使您能够通过调用一个函数来打开Adyen的Drop-in方法。
该插件支持3D Secure v2和一次性支付。尚未在循环支付场景中进行测试。
前提条件
凭证
在调用插件之前,您需要拥有以下信息:
- publicKey(来自Adyen)
- clientKey(来自Adyen)
- 金额与货币
- shopperReference(例如用户ID)
- 后端baseUrl
- Adyen环境(测试、LIVE_EU等)
- 语言环境(de_DE、en_US等)
- 支付后返回URL(iOS应用的URL Scheme)以重定向回应用
支付方式
在调用插件之前,确保从后端获取支付方式。为此,请调用/paymentMethods端点:
以下是支付方式响应的一个示例:
{
"groups": [
{
"name": "信用卡",
"types": [
"amex",
"mc",
"visa"
]
}
],
"paymentMethods": [
{
"brands": [
"amex",
"mc",
"visa"
],
"details": [
{
"key": "encryptedCardNumber",
"type": "cardToken"
},
{
"key": "encryptedSecurityCode",
"type": "cardToken"
},
{
"key": "encryptedExpiryMonth",
"type": "cardToken"
},
{
"key": "encryptedExpiryYear",
"type": "cardToken"
},
{
"key": "holderName",
"optional": true,
"type": "text"
}
],
"name": "信用卡",
"type": "scheme"
},
{
"name": "PayPal",
"supportsRecurring": true,
"type": "paypal"
}
]
}
应用程序使用这些端点进行支付提交和支付详情调用:
<您的基础URL>/payment
<您的基础URL>/payment/details
插件将包装数据并发送到支付提交调用,格式如下:
{
payment: <所有需要发送给Adyen的支付数据>,
additionalData: {key: value}
}
// additionalData可以用于向您自己的后端发送附加数据
设置
Android
在AndroidManifest.xml文件的应用程序标签中添加此服务,这允许Adyen告知Android应用程序支付结果。
<application ...>
...
<service
android:name="app.adyen.flutter_adyen.AdyenDropinService"
android:permission="android.permission.BIND_JOB_SERVICE"/>
</application>
ProGuard
您需要将以下内容添加到您的ProGuard规则中:
-keep class com.adyen.** { *; }
-keep class app.adyen.flutter_adyen.** { *; }
iOS
如果还没有,则需要添加URL_SCHEME。
Flutter实现
要开始支付,请按如下方式调用插件:
try {
String dropInResponse = await FlutterAdyen.openDropIn(
paymentMethods: paymentMethods, // 您的支付方式调用结果
baseUrl: 'https://your-server.com/',
clientKey: '<ADYEN_CLIENT_KEY>',
amount: '1000', // 金额(单位为分)
lineItem: {'id': '您的产品ID', 'description': '您的产品描述'},
additionalData: {
'someKey': 'Some String'
},
shopperReference: '<YouShopperReference>',
returnUrl: 'yourAppScheme://payment', // iOS需要
environment: 'TEST', // 生产环境:LIVE_US, LIVE_AUSTRALIA 或 LIVE_EUROPE
locale: 'de_DE', // 您偏好的语言环境
publicKey: '<您的Adyen公钥>',
currency: 'EUR'); // 您偏好的货币
} on PlatformException {
// 网络错误或其他系统错误
return PaymentResponse.paymentError.rawValue;
}
// Drop-in 返回以下响应字符串
PAYMENT_CANCELLED
PAYMENT_ERROR
Authorised
Refused
Pending
Cancelled
Error
Received
示例代码
import 'dart:convert';
import 'package:adyen_dropin/flutter_adyen.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'mock_data.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String? _payment_result = '未知';
String? dropInResponse;
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () async {
try {
dropInResponse = await FlutterAdyen.openDropIn(
paymentMethods: jsonEncode(examplePaymentMethods),
baseUrl: 'https://yourdomain.com',
clientKey: 'clientkey',
publicKey: 'publickey',
locale: 'de_DE',
shopperReference: 'asdasda',
returnUrl: 'http://asd.de',
amount: '1230',
lineItem: {'id': '1', 'description': 'adyen 测试'},
currency: 'EUR',
additionalData: {});
} on PlatformException catch (e) {
if (e.code == 'PAYMENT_CANCELLED')
dropInResponse = '支付已取消';
else
dropInResponse = '支付错误';
}
setState(() {
_payment_result = dropInResponse;
});
},
),
appBar: AppBar(
title: const Text('Flutter Adyen'),
),
body: Center(
child: Text('支付结果: $_payment_result\n'),
),
),
);
}
}
更多关于Flutter支付集成插件adyen_dropin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter支付集成插件adyen_dropin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter项目中集成Adyen的Drop-in组件adyen_dropin
以处理支付流程,可以极大简化支付UI的实现和支付数据的处理。以下是一个基本的代码示例,展示了如何在Flutter应用中集成和使用adyen_dropin
插件。
首先,确保你的Flutter项目已经设置好,并且已经添加了adyen_dropin
依赖。在你的pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
adyen_dropin: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,配置你的Flutter应用以使用Adyen Drop-in。这通常涉及几个步骤:
-
初始化Adyen配置: 在你的应用中,你需要创建一个Adyen配置对象,这个对象包含了进行支付所需的所有必要信息。
-
显示Drop-in界面: 使用
AdyenDropIn
组件来显示支付界面。 -
处理支付结果: 处理用户完成支付后的结果。
以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:adyen_dropin/adyen_dropin.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Adyen Drop-in Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final AdyenDropInController _controller = AdyenDropInController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Adyen Drop-in Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () async {
// 初始化Adyen配置
final configuration = AdyenConfiguration(
environment: AdyenEnvironment.test, // 或 AdyenEnvironment.production
clientKey: 'your_adyen_client_key_here', // 替换为你的Adyen客户端密钥
publicKey: 'your_adyen_public_key_here', // 替换为你的Adyen公钥
);
// 显示Drop-in界面
final result = await showCupertinoModalPopup<PaymentResult>(
context: context,
builder: (context) {
return AdyenDropIn(
controller: _controller,
configuration: configuration,
paymentMethodTypes: [
PaymentMethodType.card,
// 可以添加其他支付方式,如 PaymentMethodType.ideal, PaymentMethodType.sepaDirectDebit 等
],
onPaymentCompleted: (result) {
// 处理支付结果
Navigator.of(context).pop(result);
},
onError: (error) {
// 处理错误
print('Error: $error');
Navigator.of(context).pop();
},
);
},
);
if (result != null) {
// 处理支付成功后的逻辑
print('Payment successful: ${result.toJson()}');
}
},
child: Text('Start Payment'),
),
),
);
}
}
注意事项:
- Client Key和Public Key:确保你已经从Adyen获取了正确的
clientKey
和publicKey
,并在代码中正确替换。 - 环境设置:在开发阶段使用
AdyenEnvironment.test
,在生产环境中使用AdyenEnvironment.production
。 - 支付方式:根据你的业务需求配置
paymentMethodTypes
。
以上代码提供了一个基本的框架,展示了如何在Flutter应用中集成Adyen Drop-in,并处理支付流程。根据你的具体需求,你可能需要进一步定制和扩展这个示例。