一、Apple Pay 集成流程(Flutter)
1. 环境配置
yaml:
# pubspec.yaml
dependencies:
flutter_apple_pay: ^2.0.0 # 使用第三方插件
2. iOS 原生配置
- 在苹果开发者后台创建 Merchant ID(如:merchant.com.yourcompany)
- 在 Xcode 项目配置中启用 Apple Pay 并添加对应的 Merchant ID
- 生成证书签名请求(CSR)并提交给支付网关提供商
3. Flutter 实现代码
dart:
import 'package:flutter_apple_pay/flutter_apple_pay.dart';
Future<void> initiateApplePay() async {
// 1. 检查设备支持
final canMakePayments = await FlutterApplePay.canMakePayments();
if (!canMakePayments) return;
// 2. 创建支付请求
final paymentItems = [
ApplePayPaymentSummaryItem(
label: 'Total',
amount: '99.99',
isPending: false,
)
];
final paymentRequest = ApplePayRequest(
countryCode: 'US',
currencyCode: 'USD',
merchantIdentifier: 'merchant.com.yourcompany',
paymentSummaryItems: paymentItems,
);
try {
// 3. 发起支付请求
final paymentToken = await FlutterApplePay.makePayment(paymentRequest);
// 4. 更新网关会话
final response = await updateGatewaySession(
paymentToken: paymentToken,
provider: 'APPLE_PAY'
);
// 5. 处理支付结果
if (response.success) {
// 完成交易
}
} catch (e) {
print('Apple Pay Error: $e');
}
}
Future<Map<String, dynamic>> updateGatewaySession({
required String paymentToken,
required String provider,
}) async {
// 实现与网关的通信
final response = await http.post(
Uri.parse('https://api.gateway.com/sessions/update'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({
'sourceOfFunds': {
'provided': {
'card': {
'devicePayment': {'paymentToken': paymentToken}
}
}
},
'order': {'walletProvider': provider}
}),
);
return jsonDecode(response.body);
}
二、Google Pay 集成流程(Flutter)
1. 环境配置
yaml
# pubspec.yaml
dependencies:
google_pay: ^3.0.0 # 使用第三方插件
http: ^0.13.3
2. Android 原生配置
- 在 Google Pay API 控制台注册应用
- 配置
build.gradle
:
gradle
dependencies {
implementation 'com.google.android.gms:play-services-wallet:19.1.0'
}
- 在
AndroidManifest.xml
添加 meta-data:
xml
<meta-data
android:name="com.google.android.gms.wallet.api.enabled"
android:value="true"/>
3. Flutter 实现代码
dart
import 'package:google_pay/google_pay.dart';
final _googlePay = GooglePay(
environment: Environment.Test,
paymentProfile: PaymentProfile(
gateway: 'mpgs',
gatewayMerchantId: 'YOUR_MERCHANT_ID',
),
currencyCode: 'USD',
countryCode: 'US',
);
void initGooglePay() {
_googlePay.init(
price: '99.99',
items: const [
GooglePayItem(
label: 'Total',
price: '99.99',
status: GooglePayItemStatus.Final,
)
],
);
}
Future<void> launchGooglePay() async {
// 1. 检查设备支持
final isReady = await _googlePay.isReadyToPay();
if (!isReady) return;
// 2. 发起支付请求
final paymentData = await _googlePay.makePayment();
// 3. 处理支付令牌
if (paymentData != null) {
final token = paymentData['paymentMethodData']['tokenizationData']['token'];
final response = await updateGatewaySession(
paymentToken: token,
provider: 'GOOGLE_PAY'
);
// 4. 处理交易结果
if (response['status'] == 'SUCCESS') {
// 完成交易
}
}
}
// 网关会话更新函数与Apple Pay示例相同
三、通用处理流程
1. 后端网关通信示例
dart
Future<Map<String, dynamic>> completePayment({
required String sessionId,
required double amount,
required String currency,
}) async {
final response = await http.post(
Uri.parse('https://api.gateway.com/payments'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({
'sessionId': sessionId,
'transaction': {
'type': 'PAY',
'amount': amount,
'currency': currency
}
}),
);
return jsonDecode(response.body);
}
2. 错误处理建议
dart
try {
// 支付操作...
} on PlatformException catch (e) {
// 处理原生平台错误
print('Platform Error: ${e.message}');
} on HttpException catch (e) {
// 处理网络错误
print('HTTP Error: ${e.message}');
} catch (e) {
// 通用错误处理
print('Unexpected Error: $e');
}
四、测试注意事项
-
Apple Pay 测试:
- 使用沙盒测试账户
- 在 TestFlight 中测试
- 验证证书链有效性
-
Google Pay 测试:
- 使用
Environment.Test
- 配置测试卡号:4111 1111 1111 1111
- 检查 Google Play Services 版本
- 使用
-
网关测试:
- 使用测试商家 ID
- 验证响应代码(如 00 表示成功)
- 测试 3DS 验证流程
五、上线检查清单
-
证书验证:
- 确认生产环境证书已部署
- 更新网关商户 ID 为生产环境值
-
配置更新:
dart
// 生产环境配置 const gatewayUrl = 'https://api.gateway.com/production'; _googlePay.environment = Environment.Production;
-
监控配置:
- 实施支付成功率监控
- 设置错误报警阈值
- 定期检查令牌有效性
以上实现基于典型支付网关的通用集成模式,具体参数(如网关URL、商户ID等)需要根据实际支付服务提供商的文档进行调整。建议开发时结合官方文档和沙盒环境进行充分测试。