Flutter支付功能插件payment_flutter的使用
Flutter支付功能插件payment_flutter的使用
payment_flutter
是一个用于原生支付库(Android 和 iOS)的 Flutter 插件。
安装
添加依赖到 pubspec.yaml
文件
在你的 pubspec.yaml
文件中添加 payment_flutter
作为依赖项。
dependencies:
payment_flutter: ^版本号
Android
打开项目中的 android
文件夹里的 Android Studio 项目。
1. 添加令牌以获取 Terra 库
在 local.properties
文件中添加 TekoGoogleRegistryToken。请联系 trung.cs@teko.vn
获取该令牌。
// android/local.properties
TekoGoogleRegistry.password=您的令牌
在项目的 build.gradle
文件(即 android/build.gradle
)中添加以下代码:
// android/build.gradle
allprojects {
repositories {
...
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
maven {
setUrl("https://asia-southeast1-maven.pkg.dev/teko-development/teko-mobile-sdks")
authentication {
basic(BasicAuthentication)
}
credentials {
username = "_json_key_base64"
password = properties.getProperty('TekoGoogleRegistry.password')
}
}
}
}
2. 启用数据绑定和多 DEX 支持
在应用模块的 build.gradle
文件(即 android/app/build.gradle
)中添加以下代码:
//...
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
// add line below
apply plugin: 'kotlin-kapt'
//...
android {
//...
defaultConfig {
//...
multiDexEnabled true // 添加此行
}
// 添加以下三行以启用数据绑定
buildFeatures {
dataBinding true
}
//...
}
3. 设置回调 URL 用于支付
支付完成后,银行应用或第三方支付应用将调用成功 URL 来通知支付结果。因此,需要配置回调 URL。
步骤 1:在 Terra 仪表板上设置支付服务
- 步骤 1:转到 Terra 项目
- 步骤 2:打开支付服务并添加回调 URL 到
callback.success
和callback.cancel
步骤 2:配置 AndroidManifest.xml
- 步骤 1:转到项目中的
AndroidManifest.xml
- 步骤 2:添加以下意图过滤器来处理传入链接
//...
<activity android:name="vn.teko.android.payment.ui.PaymentActivity">
<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:host="您的域名" // 例如:payment.teko.vn
android:path="您的路径" // 可选
android:scheme="https" />
</intent-filter>
</activity>
//...
注意: 确保 回调 URL
在 Terra 仪表板配置和 AndroidManifest.xml
中一致。
4. 如果应用使用 VNPay 电子钱包,则向应用模块添加 VNPay 电子钱包
请遵循以下页面的说明:https://demomb.vnpay.vn:20157/sdk/sdkwallet/index.html
如果有任何问题,请联系 Terra 团队。
注意: 目前,sdkwallet 只能在真实设备上运行。
iOS
打开项目中的 ios
文件夹里的 Xcode 项目。
1. 设置 GitHub 访问令牌以访问 Teko iOS 框架
请通过 trung.cs@teko.vn
联系获取令牌,并在计算机上添加新环境变量,键为 GITHUB_USER_TOKEN
。
2. 设置 Podfile
步骤 1:定义源
在本地机器上:
source 'https://github.com/teko-vn/Specs-ios.git'
在 CI 环境中:
source 'https://' + ENV['GITHUB_USER_TOKEN'] + '@github.com/teko-vn/Specs-ios.git'
步骤 2:配置目标框架
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
# 设置有效架构
config.build_settings['VALID_ARCHS'] = 'arm64 armv7 armv7s x86_64'
# Xcode12 必须排除 arm64 作为模拟器架构
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
config.build_settings["BUILD_LIBRARY_FOR_DISTRIBUTION"] = "YES"
end
end
end
正常情况下,Podfile
中有以下代码:
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end
在这种情况下,我们更新现有代码:
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
# 新代码
target.build_configurations.each do |config|
# 设置有效架构
config.build_settings['VALID_ARCHS'] = 'arm64 armv7 armv7s x86_64'
# Xcode12 必须排除 arm64 作为模拟器架构
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
config.build_settings["BUILD_LIBRARY_FOR_DISTRIBUTION"] = "YES"
end
# 结束新代码
end
end
注意: 请不要将 <your_token_secret>
提交到 GitHub,否则它将被撤销。
3. 设置 URL 方案以处理结果
在 Info.plist
文件中添加 URL 方案:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>app.scheme</string>
</array>
</dict>
</array>
4. 如果应用使用 VNPay 电子钱包,则向主包添加 VNPay 电子钱包
复制资源文件 VnpayWalletSDKBundleResouce.bundle
(来自 https://demomb.vnpay.vn:20157/sdk/sdkwallet/index.html
)到主包。
如有任何问题,请联系 Terra 团队。
注意: 目前,sdkwallet 只能在真实设备上运行。
库的使用
初始化/获取 TerraPayment 实例
静态方法:TerraPayment.getInstance(String appName) → Future<TerraPayment>
应在应用程序初始化阶段调用,并且必须在成功初始化 TerraApp 之后调用。
final terraPayment = await TerraPayment.getInstance(terraAppName);
切换商户配置
方法:TerraPayment.switchMerchantConfig(String merchantCode, String terminalCode) → Future<void>
final result = terraPayment.switchMerchantConfig("预期的商户代码", "预期的终端代码");
使用 TerraPayment 进行订单支付
方法:TerraPayment.payWith(PaymentUIRequest request) → Future<PaymentUIResult>
生成支付请求
打开可用方法屏幕
final paymentRequestBuilder = PaymentUIRequestBuilder(Order(amount: 1000, orderCode: "order-code"))
.setMainMethod(MainMethodAll(1000))
.setExtraOptions(ExtraOptions(shouldShowPaymentResultScreen: true));
直接支付(无需可用方法屏幕)
final paymentRequestBuilder = PaymentUIRequestBuilder(Order(amount: 1000, orderCode: "order-code"))
.setMainMethod(MainMethodVNPayGatewayQr(1000)) // 使用预期的方法,但不是 MainMethodAll
.setExtraOptions(ExtraOptions(shouldShowPaymentResultScreen: true));
支持的支付方法包括:
MainMethodAll(int amount)
MainMethodVNPayGatewayQr(int amount)
MainMethodVNPayGatewayAtm(int amount)
MainMethodVNPayGatewayInternationalCard(int amount)
MainMethodVNPayGatewayMobileBanking(int amount)
MainMethodVNPayQrMms(int amount)
MainMethodVNPayEWallet(int amount)
MainMethodVNPayCustomer(int amount)
MainMethodVNPaySposCard(int amount)
MainMethodMomoGateway(int amount)
MainMethodCod(int amount)
MainMethodCash(int amount)
MainMethodRefInput(int amount, string methodCode)
MainMethodBankTransfer(int amount)
MainMethodInstallment(int amount)
选择性地传递支付方法元数据
某些方法需要额外的配置才能进行支付。例如,使用 VNPayEWallet 时,必须传递元数据到 paymentRequestBuilder
之前调用 startUI
。
paymentRequestBuilder.setMetadata(
Metadata(
vnPayEWallet: MetadataVnPayEWallet(
partnerId: "0912345678", // 使用电话号码作为 partnerId,这是从 E-Wallet 团队推荐的
phone: "0912345678",
name: "Nguyen Van A",
email: "a.nv@mail.com"
),
),
);
请求支付
final paymentResult = await terraPayment.payWith(paymentRequestBuilder.build());
switch (paymentResult.code) {
case PaymentUIResultCode.success:
// TODO
break;
case PaymentUIResultCode.failure:
// TODO
break;
case PaymentUIResultCode.cancelled:
// TODO: 可能忽略这种情况
break;
}
打开 VNPay 电子钱包
方法:TerraPayment.openVnPayEWallet(VnPayEWalletUser user) → Future<void>
final eWalletUser = VnPayEWalletUser(
partnerId: "0912345678", // 使用电话号码作为 partnerId,这是从 E-Wallet 团队推荐的
phone: "0912345678",
name: "Nguyen Van A",
email: "a.nv@mail.com"
)
final terraPayment = await TerraPayment.getInstance(terraAppName);
terraPayment.openVnPayEWallet(eWalletUser);
获取 VNPay 电子钱包用户信息
方法:TerraPayment.getVnPayEWalletUserInfo(String phone) → Future<VnPayEWalletUserInfoResult>
final terraPayment = await TerraPayment.getInstance(terraAppName);
final result = await terraPayment.getVnPayEWalletUserInfo("0912345678");
结果格式
{
"code": "0", // 0 - 成功;-1 -> 用户未与电子钱包关联;其他错误:仅显示错误消息
"desc": "成功", // 响应消息
"data": {
"kycStatus": "1", // 1 - KYC 已批准;0 - 未 KYC 或 KYC 未批准
"balance": 20000.0, // 钱包余额
"bankLinked": 0 // 1 - 已关联;0 - 尚未关联
}
}
示例代码
import 'package:flutter/material.dart';
import 'package:payment_flutter_example/screens/home_screen.dart';
void main() {
runApp(const MaterialApp(
title: 'Payment Demo',
home: HomeScreen(),
));
}
更多关于Flutter支付功能插件payment_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter支付功能插件payment_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
payment_flutter
是一个用于在 Flutter 应用中集成支付功能的插件。它支持多种支付方式,如支付宝、微信支付、Apple Pay、Google Pay 等。通过使用 payment_flutter
,开发者可以轻松地在应用中实现支付功能。
以下是使用 payment_flutter
插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 payment_flutter
插件的依赖:
dependencies:
flutter:
sdk: flutter
payment_flutter: ^最新版本
然后运行 flutter pub get
来获取依赖。
2. 配置支付平台
根据你选择的支付平台(如支付宝、微信支付等),你需要在项目中配置相应的平台设置。
Android
在 android/app/build.gradle
文件中,确保你启用了 multidex
并添加了必要的依赖:
android {
defaultConfig {
multiDexEnabled true
}
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
iOS
在 ios/Runner/Info.plist
文件中,添加必要的权限和配置:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
3. 初始化支付插件
在你的 Flutter 应用中初始化 payment_flutter
插件。通常在 main.dart
文件中进行初始化:
import 'package:payment_flutter/payment_flutter.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await PaymentFlutter.initialize();
runApp(MyApp());
}
4. 实现支付功能
在需要支付的地方,使用 PaymentFlutter
插件提供的 API 来实现支付功能。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:payment_flutter/payment_flutter.dart';
class PaymentPage extends StatelessWidget {
Future<void> _makePayment() async {
try {
PaymentResponse response = await PaymentFlutter.makePayment(
amount: '10.00', // 支付金额
currency: 'USD', // 货币类型
paymentMethod: PaymentMethod.alipay, // 支付方式
// 其他必要的参数
);
if (response.status == PaymentStatus.success) {
// 支付成功
print('Payment successful: ${response.transactionId}');
} else {
// 支付失败
print('Payment failed: ${response.message}');
}
} catch (e) {
print('Error: $e');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Payment'),
),
body: Center(
child: ElevatedButton(
onPressed: _makePayment,
child: Text('Pay Now'),
),
),
);
}
}
5. 处理支付结果
在支付完成后,PaymentFlutter.makePayment
方法会返回一个 PaymentResponse
对象,你可以根据 response.status
来判断支付是否成功,并处理相应的业务逻辑。
6. 调试和测试
在开发过程中,建议使用沙盒环境进行测试,以避免真实的支付交易。你可以在初始化 PaymentFlutter
时设置 sandboxMode
为 true
:
await PaymentFlutter.initialize(sandboxMode: true);