Flutter支付集成插件fxendit的使用

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

Flutter支付集成插件fxendit的使用

使用Xendit在Flutter应用程序中进行支付集成。

开始使用

在你的项目中添加依赖:

$ flutter pub add fxendit

使用说明

  1. 获取公钥: 访问Xendit开发者设置页面获取你的公钥。

  2. 配置AndroidManifest.xml: 在AndroidManifest.xml文件中添加必要的权限和活动。

    <manifest...>
      ...
      
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
      <uses-permission android:name="android.permission.INTERNET"/>
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    
      <application...>
        ...
        
        <activity
          android:name="com.xendit.example.CreateTokenActivity"
          android:theme="@style/NormalTheme"/>
          
        <activity
          android:name="com.xendit.example.AuthenticationActivity"
          android:theme="@style/NormalTheme"/>
          
        <activity
          android:name="com.xendit.example.ValidationUtilActivity"
          android:theme="@style/NormalTheme"/>
          
        <activity android:name="com.xendit.XenditActivity"/>
        ...
      </application>
    </manifest>
    
  3. 初始化Xendit: 在你的Dart代码中导入并初始化Xendit插件。

    import 'package:fxendit/fxendit.dart';
    
    Xendit xendit = Xendit('your_xendit_public_key');
    
  4. 创建单次使用的Token

    XCard card = XCard(
      creditCardNumber: '4111111111111111', // 示例卡号
      creditCardCVN: '123', // 卡背面的CVV码
      expirationMonth: '09', // 过期月份
      expirationYear: '2021', // 过期年份
    );
    
    TokenResult result = await xendit.createSingleUseToken(
      card,
      amount: 75000, // 交易金额
      shouldAuthenticate: true, // 是否需要认证
      onBehalfOf: '', // 代理账户ID
    );
    
    if (result.isSuccess) {
      tokenId = result.token!.id;
      print('Token ID: ${result.token!.id}');
    } else {
      print('SingleUseToken Error: ${result.errorCode} - ${result.errorMessage}');
    }
    
  5. 创建多次使用的Token

    XCard card = XCard(
      creditCardNumber: '4111111111111111',
      creditCardCVN: '123',
      expirationMonth: '09',
      expirationYear: '2021',
    );
    
    TokenResult result = await xendit.createMultipleUseToken(card);
    
    if (result.isSuccess) {
      tokenId = result.token!.id;
      print('Token ID: ${result.token!.id}');
    } else {
      print('MultipleUseToken Error: ${result.errorCode} - ${result.errorMessage}');
    }
    
  6. 创建3DS认证

    AuthenticationResult result = await xendit.createAuthentication(tokenId, amount: 50000);
    
    if (result.isSuccess) {
      print('Authentication ID: ${result.authentication!.id}');
    } else {
      print('Authentication Error: ${result.errorCode} - ${result.errorMessage}');
    }
    
  7. 验证信用卡号码的有效性

    String cardNumber = '4111111111111111';
    
    bool isValid = CardValidator.isCardNumberValid(cardNumber);
    
  8. 验证信用卡过期日期的有效性

    String expirationMonth = '09';
    String expirationYear = '2021';
    
    bool isValid = CardValidator.isExpiryValid(expirationMonth, expirationYear);
    
  9. 验证信用卡CVN的有效性

    String cardCVN = '123';
    
    bool isValid = CardValidator.isCvnValid(cardCVN);
    
  10. 获取信用卡类型

    String cardNumber = '4111111111111111';
    
    CardType cardType = CardValidator.getCardType(cardNumber);
    print('${cardType.cardName} - ${cardType.cardKey}');
    
  11. 验证信用卡CVN长度是否符合其类型的要求

    String cardNumber = '4111111111111111';
    String cardCVN = '123';
    
    bool isValid = CardValidator.isCvnValidForCardType(cardCVN, cardNumber);
    

示例代码

查看完整的示例代码可以从这里获取。

示例代码:example/lib/main.dart

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

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // 使用你自己的公钥
  Xendit xendit = Xendit(
      'xnd_public_development_RGUHB7gkrX2QTfeWMMCZhoUMAoVBmEadosxVOGfCCIX92kdCacGBoDlrjldsm7');
  String tokenId = '';

  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsBinding.instance?.addPostFrameCallback((_) async {
      await _testSingleUseToken();
      await _testMultipleUseToken();
      await _testAuthentication();
    });
  }

  Future _testSingleUseToken() async {
    XCard card = XCard(
      creditCardNumber: '4111111111111111',
      creditCardCVN: '123',
      expirationMonth: '09',
      expirationYear: '2021',
    );

    TokenResult result = await xendit.createSingleUseToken(
      card,
      amount: 75000,
      shouldAuthenticate: true,
      onBehalfOf: '',
    );

    if (result.isSuccess) {
      tokenId = result.token!.id;
      print('Token ID: ${result.token!.id}');
    } else {
      print(
          'SingleUseToken Error: ${result.errorCode} - ${result.errorMessage}');
    }
  }

  Future _testMultipleUseToken() async {
    XCard card = XCard(
      creditCardNumber: '4111111111111111',
      creditCardCVN: '123',
      expirationMonth: '09',
      expirationYear: '2021',
    );

    TokenResult result = await xendit.createMultipleUseToken(card);

    if (result.isSuccess) {
      tokenId = result.token!.id;
      print('Token ID: ${result.token!.id}');
    } else {
      print(
          'MultipleUseToken Error: ${result.errorCode} - ${result.errorMessage}');
    }
  }

  Future _testAuthentication() async {
    if (tokenId.isNotEmpty) {
      AuthenticationResult result =
          await xendit.createAuthentication(tokenId, amount: 50000);

      if (result.isSuccess) {
        print('Authentication ID: ${result.authentication!.id}');
      } else {
        print(
            'Authentication Error: ${result.errorCode} - ${result.errorMessage}');
      }
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('FXendit Example'),
        ),
        body: Center(
          child: Text(''),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中集成和使用fxendit插件来进行支付的示例代码。fxendit是一个Flutter插件,用于集成印尼的支付网关Xendit。请注意,实际使用时需要根据Xendit的API文档和插件文档进行详细的配置和调整。

首先,确保你已经在pubspec.yaml文件中添加了fxendit依赖:

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

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

接下来,是一个简单的Flutter应用示例,展示如何使用fxendit插件进行支付集成。

1. 初始化FXEndit客户端

在你的main.dart文件中,首先导入必要的包,并初始化FXEndit客户端:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Xendit Integration',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final FxEndit fxEndit = FxEndit(
    environment: 'sandbox',  // 使用'production'进行生产环境支付
    secretKey: '你的Xendit Secret Key',
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Xendit Integration'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            await initiatePayment();
          },
          child: Text('Initiate Payment'),
        ),
      ),
    );
  }

  Future<void> initiatePayment() async {
    try {
      // 创建一个支付请求
      var paymentRequest = PaymentRequest(
        externalId: 'unique-payment-id-12345',
        amount: 100000,  // 金额,单位为印尼卢比(IDR)
        currency: 'IDR',
        description: 'Test Payment',
        redirectUrl: 'https://your-redirect-url.com',
        paymentType: PaymentType.creditCard,  // 或使用其他支持的支付方式,如Ewallet等
      );

      // 发起支付请求
      var paymentResponse = await fxEndit.createPayment(paymentRequest);

      // 处理支付响应
      if (paymentResponse.status == 'success') {
        // 支付成功,可以展示支付成功页面或进行其他处理
        print('Payment successful: ${paymentResponse.data}');
      } else {
        // 支付失败,处理错误
        print('Payment failed: ${paymentResponse.errorMessage}');
      }
    } catch (e) {
      // 捕获并处理异常
      print('Error: $e');
    }
  }
}

2. 配置支付参数

在上面的代码中,你需要注意以下几点:

  • environment:设置为'sandbox'用于测试环境,设置为'production'用于生产环境。
  • secretKey:替换为你的Xendit Secret Key。
  • PaymentRequest参数:根据你的实际需求设置支付请求的参数,如externalIdamountcurrencydescriptionredirectUrlpaymentType等。

3. 处理支付响应

initiatePayment函数中,我们发起支付请求并处理响应。如果支付成功,你可以展示支付成功页面或进行其他处理;如果支付失败,你可以处理错误并展示相应的错误信息。

注意事项

  1. 安全性:不要将你的Secret Key硬编码在客户端代码中,特别是在生产环境中。通常,你应该在后端服务器上处理敏感信息,并通过API与客户端通信。
  2. 错误处理:在实际应用中,你需要更详细的错误处理逻辑,以提供用户友好的错误提示。
  3. 测试环境:在开发过程中,确保使用Xendit的Sandbox环境进行测试,以避免产生实际的支付交易。

希望这个示例能帮助你在Flutter项目中集成fxendit插件进行支付。如果你有任何其他问题或需要进一步的帮助,请查阅Xendit的官方文档或插件的README文件。

回到顶部