Flutter支付集成插件flutter_tappay_sdk的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter支付集成插件flutter_tappay_sdk的使用

本项目是一个用于台湾流行支付网关TapPay的Flutter SDK。

警告: 这不是由TapPay官方维护的SDK。由于TapPay没有为Flutter提供官方SDK,因此创建了此项目来封装TapPay的官方SDK。

特性

  • DirectPay(获取支付卡的prime)
  • Apple Pay(获取prime)
  • Google Pay(获取prime)

开始使用

Android
  1. 在你的项目的android文件夹中,找到AndroidManifest.xml,并在application标签内添加以下属性:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" 
    >
  ...
  <application
      android:label="flutter_tappay_sdk_example"
      android:name="${applicationName}"
      android:icon="@mipmap/ic_launcher"
      tools:replace="android:label" 
      ...>
  ...
</manifest>
  1. (可选。如果你需要使用Google Pay,则需要执行此步骤。)在你的项目的android文件夹中,将MainActivity的父类从FlutterActivity更改为FlutterFragmentActivity:
import io.flutter.embedding.android.FlutterFragmentActivity

class MainActivity: FlutterFragmentActivity() {
    // ...
}
iOS

(如果你需要使用Apple Pay,则需要执行此步骤。)打开Xcode并打开你的项目的Runner.xcworkspace文件。在Signing & Capabilities选项卡中,添加Apple Pay功能。别忘了在能力中添加Apple Pay商户ID。

Dart/Flutter项目

pubspec.yaml文件中添加以下内容:

dependencies:
  flutter_tappay_sdk: ^0.3.0

使用方法

DirectPay
import 'package:flutter_tappay_sdk/flutter_tappay_sdk.dart';

// ...

final tappay = FlutterTappaySdk();
tappay.init(
  appId: 'your app id',
  appKey: 'your app key',
  serverType: ServerType.sandbox, // 或者 ServerType.production
);

// ...

final result = await tappay.getCardPrime(
  cardNumber: '4242424242424242',
  dueMonth: '01',
  dueYear: '23',
  cvv: '123',
);

if (result?.success) {
  print(result?.prime);
} else {
  print(result?.message);
}

更多示例可以在示例文件夹中找到。

完整示例Demo

import 'dart:developer';

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:flutter_tappay_sdk/flutter_tappay_sdk.dart';
import 'package:flutter_tappay_sdk/tappay/cart_item.dart';

import 'constants.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _tapPaySdk = FlutterTapPaySdk();

  String _tapPaySdkVersion = 'Unknown';
  bool _isTapPayReady = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    initTapPay();
  }

  Future<void> initTapPay() async {
    String tapPaySdkVersion = 'Unknown';
    bool isTapPayReady = false;

    try {
      var initResult = await _tapPaySdk.initTapPay(
          appId: kTapPayAppId, appKey: kTapPayAppKey, isSandbox: true);
      log(initResult?.toJson() ?? 'no initResult');
      isTapPayReady = initResult?.success == true;

      if (isTapPayReady) {
        tapPaySdkVersion =
            await _tapPaySdk.tapPaySdkVersion ?? 'Unknown TapPay SDK version';
      }
    } on PlatformException {
      log('PlatformException');
    }

    if (!mounted) return;

    setState(() {
      _tapPaySdkVersion = tapPaySdkVersion;
      _isTapPayReady = isTapPayReady;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter TapPay SDK Example'),
        ),
        body: ListView(
          children: [
            Text('TapPay SDK initial result: $_isTapPayReady'),

            // 显示TapPay SDK版本
            Text('TapPay SDK version: $_tapPaySdkVersion'),

            // 使用支付卡信息获取prime
            if (_isTapPayReady)
              ListTile(
                title: const Text('通过支付卡获取Prime'),
                onTap: () async {
                  try {
                    final prime = await _tapPaySdk.getCardPrime(
                      cardNumber: kDefaultTestingCardNumber,
                      dueMonth: kDefaultTestingDueMonth,
                      dueYear: kDefaultTestingDueYear,
                      cvv: kDefaultTestingCvv,
                    );
                    log('prime: ${prime?.toJson()}');
                  } on PlatformException {
                    log('PlatformException');
                  }
                },
              ),

            if (_isTapPayReady)
              ListTile(
                title: const Text('启动Google Pay'),
                onTap: () async {
                  try {
                    final isGooglePayReady = await _tapPaySdk.initGooglePay(
                        merchantName: 'Flutter Cafe');
                    log('isGooglePayReady: ${isGooglePayReady?.toJson()}');

                    if (isGooglePayReady?.success == true) {
                      var payResult =
                          await _tapPaySdk.requestGooglePay(price: 2);
                      log('payResult: ${payResult?.toJson()}');
                    }
                  } on PlatformException {
                    log('PlatformException');
                  }
                },
              ),

            if (_isTapPayReady)
              ListTile(
                title: const Text('启动Apple Pay'),
                onTap: () async {
                  try {
                    final isApplePayReady = await _tapPaySdk.initApplePay(
                        merchantId: kTapPayApplePayMerchantId,
                        merchantName: 'Flutter Cafe');
                    log('isApplePayReady: ${isApplePayReady?.toJson()}');

                    if (isApplePayReady?.success == true) {
                      var payResult = await _tapPaySdk.requestApplePay(
                        cartItems: [
                          CartItem(name: "Cupcake", price: 2),
                          CartItem(name: "Donut", price: 3),
                        ],
                      );
                      log('payResult: ${payResult?.toJson()}');

                      if (payResult?.success == true) {
                        var reportResult =
                            await _tapPaySdk.applePayResult(result: true);
                        log('reportResult: ${reportResult?.toJson()}');
                      }
                    }
                  } on PlatformException {
                    log('PlatformException');
                  }
                },
              ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter支付集成插件flutter_tappay_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter支付集成插件flutter_tappay_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中集成并使用flutter_tappay_sdk插件来实现支付功能,可以按照以下步骤进行。这里提供一个基本的代码案例来展示如何使用该插件。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加flutter_tappay_sdk依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_tappay_sdk: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

2. 配置iOS和Android

iOS

ios/Runner/Info.plist中,你可能需要添加一些支付相关的权限配置,具体配置请参考TapPay官方文档。

Android

android/app/src/main/AndroidManifest.xml中添加必要的权限和配置,同样参考TapPay官方文档。

3. 初始化TapPay SDK

在你的Flutter项目中,初始化TapPay SDK。这通常在你的主页面或支付页面进行。

import 'package:flutter/material.dart';
import 'package:flutter_tappay_sdk/flutter_tappay_sdk.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PaymentPage(),
    );
  }
}

class PaymentPage extends StatefulWidget {
  @override
  _PaymentPageState createState() => _PaymentPageState();
}

class _PaymentPageState extends State<PaymentPage> {
  @override
  void initState() {
    super.initState();
    // 初始化TapPay SDK
    _initTapPay();
  }

  Future<void> _initTapPay() async {
    // TapPay配置信息,请根据实际情况填写
    final TapPayConfig config = TapPayConfig(
      merchantId: '你的商户ID',
      merchantKey: '你的商户密钥',
      sandbox: true, // 如果是测试环境,设置为true;生产环境设置为false
    );

    try {
      await FlutterTapPaySdk.init(config);
      print('TapPay SDK 初始化成功');
    } catch (e) {
      print('TapPay SDK 初始化失败: $e');
    }
  }

  Future<void> _startPayment() async {
    // 支付信息,请根据实际情况填写
    final Map<String, dynamic> paymentInfo = {
      'order': {
        'amount': 100, // 支付金额,单位:分
        'currency': 'TWD', // 货币种类
        'orderNumber': '订单号${DateTime.now().millisecondsSinceEpoch}', // 订单号
        'description': '商品描述', // 商品描述
      },
      'customer': {
        'email': 'customer@example.com', // 顾客邮箱
        'name': '顾客姓名', // 顾客姓名
        'phone': '0912345678', // 顾客手机号
      },
      'returnUrl': 'https://yourwebsite.com/return', // 支付完成后的回调URL
    };

    try {
      final TapPayResponse response = await FlutterTapPaySdk.startPayment(paymentInfo);
      if (response.status == 'SUCCESS') {
        print('支付成功: ${response.data}');
      } else {
        print('支付失败: ${response.message}');
      }
    } catch (e) {
      print('支付发生错误: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('支付页面'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _startPayment,
          child: Text('开始支付'),
        ),
      ),
    );
  }
}

4. 处理支付回调

在你的服务器端配置支付回调URL,以处理支付结果。Flutter客户端代码中的returnUrl是用于跳转回你的应用或网站的URL,你可以在这个URL对应的页面上处理支付结果。

注意事项

  • 确保你已经在TapPay后台正确配置了相关信息,包括商户ID、密钥、回调URL等。
  • 测试环境和生产环境的配置要区分开,不要在生产环境中使用测试环境的配置。
  • 根据TapPay的官方文档,可能还有其他配置和步骤需要完成,请仔细阅读并遵循。

以上代码提供了一个基本的集成案例,具体实现可能需要根据你的实际需求进行调整。

回到顶部