Flutter支付功能插件wepayment的使用
Flutter支付功能插件wepayment的使用
midtrans
非官方插件用于集成 Flutter 和 Midtrans 移动 SDK。该插件在 Midtrans 中运行于 Snap 模式下。你可以阅读文档 此处。
入门指南
要求
- 客户端密钥:从 Midtrans 商户账户获取。
- 商户服务器:需要一个服务器端实现,以便 Midtrans 移动 SDK 可以正常工作。你可以在 商户服务器实现文档 中查看 API 的实现参考,并了解你需要在后端服务器上实施的 API。
完成上述要求后,你需要配置你的项目。
配置项目
- 修改
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
文件
<?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
更多关于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'),
),
],
),
),
);
}
}