Flutter支付集成插件midtranspayment的使用

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

Flutter支付集成插件midtranspayment的使用

midtrans 是一个非官方插件,用于在 Flutter 和 Midtrans 移动 SDK 之间进行集成。该插件在 Midtrans 的 Snap 模式下运行。您可以在此 文档 中阅读详细说明。


开始使用

必备条件
  1. 客户端密钥:从 Midtrans 商户账户获取。
  2. 商户服务器端实现:Midtrans 移动 SDK 需要后端支持。您可以参考 商户服务器实现指南,并根据您的后端需求实现所需的 API。

完成上述条件后,您需要配置项目。


配置项目
修改 AndroidManifest.xml

将以下内容添加到项目的 AndroidManifest.xml 文件中:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.hello_example" xmlns:tools="http://schemas.android.com/tools">
   <application
        android:label="hello_example"
        android:icon="@mipmap/ic_launcher"
        tools:replace="android:label"
        android:theme="@style/AppTheme">
        .....
    </application>
</manifest>
修改 styles.xml

找到 android/app/src/main/res/values/styles.xml 文件,并将其修改为以下内容:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 启动主题(当系统暗模式设置关闭时) -->
    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <!-- 设置启动画面背景 -->
        <item name="android:windowBackground">@drawable/launch_background</item>
    </style>
    <!-- 应用主题(当进程开始时应用) -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
    <!-- 正常主题 -->
    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
    </style>
</resources>

常见问题排查

如果遇到任何问题,可以打开 GitHub 提交 Issue 或联系开发者。

错误调试

运行时错误(例如调试模式下的崩溃)可能由第三方库引起。错误日志如下:

E/AndroidRuntime(28442): java.lang.AssertionError
E/AndroidRuntime(28442): 	at com.koushikdutta.async.AsyncSSLSocketWrapper.write(AsyncSSLSocketWrapper.java:390)

解决方法:

  • 切换到发布模式运行。
  • 将 Gradle 版本降级至 4.0.2 或更低版本。

修改 android/build.gradle 文件:

dependencies {
        classpath 'com.android.tools.build:gradle:4.0.2'
        .....
}

完整示例代码

以下是一个完整的示例代码,展示如何使用 midtranspayment 插件进行支付集成:

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

import 'package:flutter/services.dart';
import 'package:midtrans/midtranspayment.dart';

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

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

class _MyAppState extends State<MyApp> {
  final midtrans = Midtrans();
  String _platformVersion = 'Unknown';

  [@override](/user/override)
  void initState() {
    super.initState();
    midtrans.init(MidtransConfig(
      clientKey: 'YOUR_CLIENT_KEY', // 替换为您的客户端密钥
      merchantBaseUrl: 'https://YOUR_MERCHANT_URL_DOMAIN.com/', // 替换为您的商户 URL
      colorTheme: MidtransColorTheme(
        lightPrimaryColor: Colors.deepOrange, // 主色调(亮模式)
        darkPrimaryColor: Colors.deepOrange, // 主色调(暗模式)
        secondaryColor: Colors.blueAccent, // 辅助色
      ),
    ));
    midtrans.setTransactionFinishCallback((result) {
      print("Result ${result.status}"); // 打印交易状态
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Midtrans Payment Example'),
        ),
        body: Center(
          child: Text('Running on: $_platformVersion\n'),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            await midtrans.payTransaction(MidtransTransaction(
              amount: 40000, // 支付金额(单位为分)
              skipCustomer: false, // 是否跳过客户信息
              midtransCustomer: MidtransCustomer(
                customerIdentifier: "USER01", // 用户标识符
                phone: "089689008988", // 用户电话
                lastName: "Hanif", // 用户姓氏
                firstName: "Ibrahim", // 用户名字
                email: 'email@mail.com', // 用户邮箱
                billingAddress: MidtransCustomerAddress(
                  address: "Losari Kidul", // 地址
                  city: "Cirebon", // 城市
                  postalCode: "45192", // 邮政编码
                ),
              ),
              items: [
                MidtransItem("id-10", 20000, 2, "Makanan"), // 商品项
              ],
            ));
          },
        ),
      ),
    );
  }
}

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

1 回复

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


Midtrans 是一个流行的支付网关,支持多种支付方式,包括信用卡、银行转账、电子钱包等。在 Flutter 应用中集成 Midtrans 支付,可以使用 midtranspayment 插件。以下是使用 midtranspayment 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  midtranspayment: ^1.0.0  # 请检查最新版本

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

2. 初始化 Midtrans

在使用 Midtrans 支付之前,需要初始化插件。通常,你需要在应用的 main.dart 文件中进行初始化:

import 'package:midtranspayment/midtranspayment.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 Midtrans
  MidtransPayment.init(
    clientKey: 'your_client_key',  // 替换为你的 Midtrans 客户端密钥
    baseUrl: 'your_base_url',      // 替换为你的服务器端 URL
    isProduction: false,           // 设置为 true 以使用生产环境
  );

  runApp(MyApp());
}

3. 创建支付请求

接下来,创建一个支付请求。你可以使用 MidtransPayment.setTransaction 方法来设置交易详情:

void startPayment() async {
  try {
    final transaction = MidtransTransaction(
      transactionDetails: TransactionDetails(
        orderId: 'ORDER123456',  // 替换为你的订单 ID
        grossAmount: 10000,      // 替换为你的订单总金额
      ),
      creditCard: CreditCard(
        saveCard: false,
      ),
    );

    await MidtransPayment.setTransaction(transaction);
    
    // 启动支付流程
    final result = await MidtransPayment.startPayment();

    print('Payment result: $result');
  } catch (e) {
    print('Error: $e');
  }
}

4. 处理支付结果

startPayment 方法会返回一个支付结果,你可以根据结果来处理用户的支付状态:

if (result['status'] == 'success') {
  // 支付成功
} else if (result['status'] == 'failed') {
  // 支付失败
} else if (result['status'] == 'pending') {
  // 支付处理中
} else if (result['status'] == 'cancelled') {
  // 支付取消
}

5. 处理回调

Midtrans 会通过回调 URL 通知你的服务器支付结果。你需要在服务器端处理这些回调,并更新订单状态。

6. 测试与生产环境

在开发阶段,你可以使用 Midtrans 的沙盒环境进行测试。当应用准备上线时,将 isProduction 参数设置为 true,并使用生产环境的 clientKeybaseUrl

7. 其他配置

根据你的需求,你可能还需要配置其他参数,如 customerDetailsitemDetails 等。详细配置可以参考 midtranspayment 插件的文档。

示例代码

以下是一个完整的示例代码:

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  MidtransPayment.init(
    clientKey: 'your_client_key',
    baseUrl: 'your_base_url',
    isProduction: false,
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Midtrans Payment')),
        body: Center(
          child: ElevatedButton(
            onPressed: startPayment,
            child: Text('Pay Now'),
          ),
        ),
      ),
    );
  }
}

void startPayment() async {
  try {
    final transaction = MidtransTransaction(
      transactionDetails: TransactionDetails(
        orderId: 'ORDER123456',
        grossAmount: 10000,
      ),
      creditCard: CreditCard(
        saveCard: false,
      ),
    );

    await MidtransPayment.setTransaction(transaction);
    
    final result = await MidtransPayment.startPayment();

    print('Payment result: $result');
  } catch (e) {
    print('Error: $e');
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!