Flutter支付功能插件wepayment的使用

Flutter支付功能插件wepayment的使用

midtrans 非官方插件用于集成 Flutter 和 Midtrans 移动 SDK。该插件在 Midtrans 中运行于 Snap 模式下。你可以阅读文档 此处

入门指南

要求
  1. 客户端密钥:从 Midtrans 商户账户获取。
  2. 商户服务器:需要一个服务器端实现,以便 Midtrans 移动 SDK 可以正常工作。你可以在 商户服务器实现文档 中查看 API 的实现参考,并了解你需要在后端服务器上实施的 API。

完成上述要求后,你需要配置你的项目。

配置项目
  1. 修改 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>
  1. 修改 styles.xml 文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 应用于进程启动时的 Android 窗口主题(当操作系统的暗模式设置关闭时) -->
    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <!-- 显示活动的启动屏幕。自动移除当 Flutter 绘制其第一帧时 -->
        <item name="android:windowBackground">@drawable/launch_background</item>
    </style>
    <!-- 应用于进程启动后的 Android 窗口主题。此主题确定 Flutter 初始化时窗口的颜色,以及 Flutter 运行时背后的颜色。
         此主题仅从 Flutter 的 Android 嵌入版本 2 开始使用。 -->
    <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)
E/AndroidRuntime(28442): 	at com.koushikdutta.async.AsyncSSLSocketWrapper.handleHandshakeStatus(AsyncSSLSocketWrapper.java:276)
E/AndroidRuntime(28442): 	at com.koushikdutta.async.AsyncSSLSocketWrapper.handshake(AsyncSSLSocketWrapper.java:114)
E/AndroidRuntime(28442): 	at com.koushikdutta.async.http.AsyncSSLSocketMiddleware.tryHandshake(AsyncSSLSocketMiddleware.java:89)
E/AndroidRuntime(28442): 	at com.koushikdutta.async.http.AsyncSSLSocketMiddleware$2.onConnectCompleted(AsyncSSLSocketMiddleware.java:106)
E/AndroidRuntime(28442): 	at com.koushikdutta.async.AsyncServer.runLoop(AsyncServer.java:849)
E/AndroidRuntime(28442): 	at com.koushikdutta.async.AsyncServer.run(AsyncServer.java:658)
E/AndroidRuntime(28442): 	at com.koushikdutta.async.AsyncServer.access$800(AsyncServer.java:44)
E/AndroidRuntime(28442): 	at com.koushikdutta.async.AsyncServer$14.run(AsyncServer.java:600)

此错误是由 Midtrans 移动 SDK 使用的第三方库引起的。要解决此问题,你可以切换到发布模式或降低 Gradle 版本至 4.0.2 或更低。

要更改 Gradle 版本,编辑 android/build.gradle 文件如下:

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

完整示例代码

以下是完整的示例代码:

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

import 'package:flutter/services.dart';
import 'package:wepayment/wepayment.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/',
        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('Plugin example app'),
        ),
        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: "08991585001",
                  lastName: "Mas",
                  firstName: "Wend",
                  email: 'maswend.2020@gmail.com',
                  billingAddress: MidtransCustomerAddress(
                      address: "Widasari",
                      city: "Indramayu",
                      postalCode: "45271"),
                  shippingAddress: MidtransCustomerAddress(
                      address: "Widasari",
                      city: "Indramayu",
                      postalCode: "45271")),
              items: [
                MidtransItem(
                    id: '123456', price: 10000, quantity: 1, name: 'Gopayment'),
              ],
            ));
          },
        ),
      ),
    );
  }
}

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

1 回复

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


wepayment 是一个用于 Flutter 的支付插件,支持微信支付和支付宝支付。以下是如何在 Flutter 项目中使用 wepayment 插件的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  wepayment: ^1.0.0  # 请使用最新版本

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

2. 配置项目

Android 配置

android/app/build.gradle 文件中,确保 minSdkVersion 至少为 16:

defaultConfig {
    minSdkVersion 16
    targetSdkVersion 30
    ...
}

iOS 配置

ios/Runner/Info.plist 文件中,添加以下内容以支持 URL Scheme:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLName</key>
        <string>wechat</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>your_app_id</string>  <!-- 替换为你的微信 AppID -->
        </array>
    </dict>
</array>

3. 初始化插件

main.dart 文件中初始化 wepayment 插件:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PaymentScreen(),
    );
  }
}

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

class _PaymentScreenState extends State<PaymentScreen> {
  final Wepayment _wepayment = Wepayment();

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

  Future<void> _initPayment() async {
    await _wepayment.initWeChat("your_app_id");  // 替换为你的微信 AppID
  }

  Future<void> _payWithWeChat() async {
    final response = await _wepayment.payWithWeChat(
      appId: "your_app_id",
      partnerId: "your_partner_id",
      prepayId: "your_prepay_id",
      packageValue: "Sign=WXPay",
      nonceStr: "your_nonce_str",
      timeStamp: "your_timestamp",
      sign: "your_sign",
    );

    if (response == "success") {
      // 支付成功
    } else {
      // 支付失败
    }
  }

  Future<void> _payWithAliPay() async {
    final response = await _wepayment.payWithAliPay(
      orderInfo: "your_order_info",
    );

    if (response == "success") {
      // 支付成功
    } else {
      // 支付失败
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Payment Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _payWithWeChat,
              child: Text('Pay with WeChat'),
            ),
            ElevatedButton(
              onPressed: _payWithAliPay,
              child: Text('Pay with AliPay'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部