Flutter支付集成插件payhere_mobilesdk_flutter的使用

Flutter支付集成插件payhere_mobilesdk_flutter的使用

集成PayHere到你的Flutter应用非常简单。只需将插件添加到项目的依赖项中,调用其方法来发起支付并获取支付状态即可。该SDK允许用户在不离开应用的情况下完成支付。

使用指南

1. 在应用中包含PayHere移动SDK

打开你的Flutter项目的pubspec.yaml文件,并添加PayHere Flutter SDK依赖。

dependencies:
  payhere_mobilesdk_flutter: ^3.0.12

然后在Flutter项目目录中运行以下命令:

flutter pub get
2. Android预设条件
a. 添加PayHere Android SDK的Maven仓库

在你的Android项目的(外层) build.gradle文件中添加仓库:

allprojects {
    repositories {
        mavenLocal()
        maven {
            url 'https://jitpack.io' 
        }
    }
}
b. 允许Manifest属性合并

在你的Android项目的AndroidManifest.xml文件中进行以下更改:

i. 在<manifest>元素中声明Android tools命名空间:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.domain.name"
    xmlns:tools="http://schemas.android.com/tools">

ii. 在<application>元素中添加replace合并规则以替换android:label属性:

<application tools:replace="android:label">
3. iOS预设条件

在iOS项目中运行以下命令:

pod install
4. 白名单移动应用包名
a. 登录到你的PayHere商户账户并导航到集成部分。
b. 点击“添加域/应用”按钮。
c. 从第一个下拉菜单中选择“应用”。
d. 添加你的Flutter应用包名(例如:lk.bhasha.helakuru)。
e. 记住最后一个字段中的哈希值。这是特定移动应用的商户密钥。
f. 点击“请求批准”。

注意:如果你使用的是PayHere实时商户账户,你的应用包名必须由我们的运营团队手动审核。请允许最多一天的时间完成此审核过程。

更多信息,请联系:techsupport@payhere.lk
5. 向PayHere支付网关发起支付请求
a. 一次性支付请求

创建一个仅收取一次的支付请求。要从服务器捕获支付详情,请阅读文档。

import 'package:payhere_mobilesdk_flutter/payhere_mobilesdk_flutter.dart';

Map paymentObject = {
  "sandbox": false,                 // 如果使用沙箱商户ID则为true
  "merchant_id": "1223220",        // 替换为你的商户ID
  "notify_url": "https://ent13zfovoz7d.x.pipedream.net/",
  "order_id": "ItemNo12345",
  "items": "Hello from Flutter!",
  "item_number_1": "001",
  "item_name_1": "Test Item #1",
  "amount_1": "5.00",
  "quantity_1": "2",
  "item_number_2": "002",
  "item_name_2": "Test Item #2",
  "amount_2": "20.00",
  "quantity_2": "1",
  "amount": 30.00,
  "currency": "LKR",
  "first_name": "Saman",
  "last_name": "Perera",
  "email": "samanp@gmail.com",
  "phone": "0771234567",
  "address": "No.1, Galle Road",
  "city": "Colombo",
  "country": "Sri Lanka",
  "delivery_address": "No. 46, Galle road, Kalutara South",
  "delivery_city": "Kalutara",
  "delivery_country": "Sri Lanka",
  "custom_1": "",
  "custom_2": ""
};

PayHere.startPayment(
  paymentObject, (paymentId) {
    print("One Time Payment Success. Payment Id: $paymentId");
  }, (error) { 
    print("One Time Payment Failed. Error: $error");
  }, () { 
    print("One Time Payment Dismissed");
  }
);
b. 定期支付请求

创建一个定期支付订阅,按固定频率收费。要从服务器捕获支付详情,请阅读文档。

import 'package:payhere_mobilesdk_flutter/payhere_mobilesdk_flutter.dart';

Map paymentObject = {
  "sandbox": false,                 // 如果使用沙箱商户ID则为true
  "merchant_id": "1223220",        // 替换为你的商户ID
  "notify_url": "https://ent13zfovoz7d.x.pipedream.net/",
  "order_id": "ItemNo12345",
  "items": "Hello from Flutter!",
  "item_number_1": "001",
  "item_name_1": "Test Item #1",
  "amount_1": 50.00,
  "quantity_1": "1",
  "item_number_2": "002",
  "item_name_2": "Test Item #1",
  "amount_2": "25.00",
  "quantity_2": "2",
  "amount": 100.00,
  "recurrence": "1 Month",         // 定期支付频率
  "duration": "1 Year",            // 定期支付持续时间
  "currency": "LKR",
  "first_name": "Saman",
  "last_name": "Perera",
  "email": "samanp@gmail.com",
  "phone": "0771234567",
  "address": "No.1, Galle Road",
  "city": "Colombo",
  "country": "Sri Lanka",
  "delivery_address": "No. 46, Galle road, Kalutara South",
  "delivery_city": "Kalutara",
  "delivery_country": "Sri Lanka",
  "custom_1": "",
  "custom_2": ""
};

PayHere.startPayment(paymentObject, (paymentId) {
  print("Recurring Payment Success. Payment Id: $paymentId");
}, (error) {
  print("Recurring Payment Failed. Error: $error");
}, () {
  print("Recurring Payment Dismissed");
});
c. 预授权请求

令牌化客户卡详细信息以便后续使用。要从服务器捕获支付详情,请阅读文档。

import 'package:payhere_mobilesdk_flutter/payhere_mobilesdk_flutter.dart';

Map paymentObject = {
  "sandbox": false,                 // 如果使用沙箱商户ID则为true
  "preapprove": true,              // 必须设置
  "merchant_id": "1223220",        // 替换为你的商户ID
  "notify_url": "https://ent13zfovoz7d.x.pipedream.net/",
  "order_id": "ItemNo12345",
  "items": "Hello from Flutter!",
  "currency": "LKR",
  "first_name": "Saman",
  "last_name": "Perera",
  "email": "samanp@gmail.com",
  "phone": "0771234567",
  "address": "No.1, Galle Road",
  "city": "Colombo",
  "country": "Sri Lanka",
  "amount": 30.00                   // 可选参数,如果需要在预授权时收费
};

PayHere.startPayment(
  paymentObject, (paymentId) {
    print("Tokenization Payment Success. Payment Id: $paymentId");
  }, (error) { 
    print("Tokenization Payment Failed. Error: $error");
  }, () { 
    print("Tokenization Payment Dismissed");
  }
);
d. 卡上保留请求

授权(保留)客户卡上的费用,以便稍后使用。要从服务器捕获支付保留详情,请阅读文档。

import 'package:payhere_mobilesdk_flutter/payhere_mobilesdk_flutter.dart';

Map paymentObject = {
  "sandbox": false,                // 如果使用沙箱商户ID则为true
  "authorize": true,               // 必须设置
  "merchant_id": "1223220",        // 替换为你的商户ID
  "notify_url": "https://ent13zfovoz7d.x.pipedream.net/",
  "order_id": "ItemNo12345",
  "items": "Hello from Flutter!",
  "currency": "LKR",
  "item_number_1": "001",
  "item_name_1": "Test Item #1",
  "amount_1": "15.00",
  "quantity_1": "2",
  "item_number_2": "002",
  "item_name_2": "Test Item #2",
  "amount_2": "20.00",
  "quantity_2": "1",
  "amount": "50.00",
  "first_name": "Saman",
  "last_name": "Perera",
  "email": "samanp@gmail.com",
  "phone": "0771234567",
  "address": "No.1, Galle Road",
  "city": "Colombo",
  "country": "Sri Lanka",
};

PayHere.startPayment(paymentObject, (paymentId) {
  print("Hold-on-Card Payment Success.");
}, (error) {
  print("Hold-on-Card Payment Failed. Error: $error");
}, () {
  print("Hold-on-Card Payment Dismissed");
});
6. 可选地传递商品详细信息

从版本2.0.0开始,你可以选择性地传递订单中每项的商品详细信息。这些详细信息会出现在客户的发票上。商品详细信息支持一次性、订阅和授权支付模式。不支持预授权支付。

每个商品有四个参数。它们的参数名称后面必须跟上该商品的索引。例如:

"item_number_1": "ITM001",
"item_name_1": "PayHere Sticker",
"quantity_1": "2",
"amount_1": "25.0",

下面是一个带有两个商品的一次性支付请求示例。如果有具体问题,请在GitHub的Issues部分提出。

import 'package:payhere_mobilesdk_flutter/payhere_mobilesdk_flutter.dart';

Map paymentObject = {
  "sandbox": false, 
  "merchant_id": "1223220",             // 替换为你的商户ID
  "notify_url": "https://ent13zfovoz7d.x.pipedream.net/",
  "order_id": "ItemNo12345",
  "items": "Hello from Flutter!",

  "item_number_1": "001",               // ** 商品 1 **
  "item_name_1": "Test Item #1",        
  "amount_1": "15.00",                  
  "quantity_1": "2",                    
  "item_number_2": "002",               // ** 商品 2 **
  "item_name_2": "Test Item #2",        
  "amount_2": "20.00",                  
  "quantity_2": "1",                    
  
  "amount": 50.00,
  "currency": "LKR",
  "first_name": "Saman",
  "last_name": "Perera",
  "email": "samanp@gmail.com",
  "phone": "0771234567",
  "address": "No.1, Galle Road",
  "city": "Colombo",
  "country": "Sri Lanka",
  "delivery_address": "No. 46, Galle road, Kalutara South",
  "delivery_city": "Kalutara",
  "delivery_country": "Sri Lanka",
  "custom_1": "",
  "custom_2": ""
};

PayHere.startPayment(
  paymentObject, (paymentId) {
    print("One Time Payment Success. Payment Id: $paymentId");
  }, (error) { 
    print("One Time Payment Failed. Error: $error");
  }, () { 
    print("One Time Payment Dismissed");
  }
);

常见问题

支持哪些版本的Flutter?

支持Flutter版本1.20.0以上。

支持哪些版本的iOS?

此SDK的iOS组件支持iOS 11.0以上版本。

支持哪些版本的Android?

此SDK的Android组件支持API级别17以上版本。

PayHere.startPayment方法有哪些参数?

PayHere.startPayment(
  paymentObject, 
  onCompletedHandler,
  onErrorHandler,
  onDismissedHandler
);
  • paymentObject - 对象:作为Map<String, dynamic>的支付参数。
  • onCompletedHandler - 函数:成功支付时,使用支付ID(字符串)作为参数调用。
  • onErrorHandler - 函数:发生错误时,使用错误(字符串)作为参数调用。
  • onDismissedHandler - 函数:在支付弹窗关闭但支付未处理前调用,无参数。

如何获取支付详情,如支付方式、状态、持卡人等?

你必须设置一个服务器端点,该端点接受异步的PayHere支付通知POST请求,并将其URL传递给paymentObjectnotify_url参数。

每种支付请求类型(一次性/定期/预授权)发送不同的支付通知。请参阅以下部分了解更多信息。

我遇到了一个错误,说“无法获取’https://dl.bintray.com…’”

PayHere Flutter原生SDK版本1.0.2之前的版本(1.0.1及更早版本)依赖于较旧版本的PayHere Android SDK,该版本不再通过bintray.com Maven仓库可用。升级到最新版本1.0.2并再次尝试。

如果仍然遇到问题,请确保已遵循新的“2. Android预设条件”部分中更新的指令,适用于SDK版本1.0.2及以上。

我在iOS中遇到一个运行时错误,提示“PayHere Bundle找不到!”

要解决此问题,请打开./ios/Podfile文件。找到一行use_modular_headers!。在其上方添加use_frameworks!行,如下所示:

target 'Runner' do
  # 添加这一行
  use_frameworks!
  use_modular_headers!

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

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

1 回复

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


payhere_mobilesdk_flutter 是一个用于在 Flutter 应用中集成 PayHere 支付功能的插件。PayHere 是斯里兰卡的一个流行支付网关,支持信用卡、借记卡以及多种本地支付方式。

以下是如何在 Flutter 项目中使用 payhere_mobilesdk_flutter 插件的步骤:

1. 添加依赖

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

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

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

2. 初始化 PayHere SDK

在你的 Dart 文件中导入插件并初始化 PayHere SDK。

import 'package:payhere_mobilesdk_flutter/payhere_mobilesdk_flutter.dart';

initStatemain 函数中初始化 SDK:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  PayHere().init(
    onCompleted: (Map<dynamic, dynamic> data) {
      print("Payment Completed: $data");
    },
    onError: (Map<dynamic, dynamic> error) {
      print("Payment Error: $error");
    },
    onDismissed: () {
      print("Payment Dismissed");
    },
  ).then((_) {
    runApp(MyApp());
  });
}

3. 创建支付请求

创建一个支付请求对象并启动支付流程。

void startPayment() {
  Map<String, dynamic> paymentObject = {
    "sandbox": true, // 设置为 false 以使用生产环境
    "merchant_id": "your_merchant_id",
    "merchant_secret": "your_merchant_secret",
    "notify_url": "https://your.notify.url",
    "order_id": "order_12345",
    "items": "Test Item",
    "currency": "LKR",
    "amount": 100.00,
    "first_name": "John",
    "last_name": "Doe",
    "email": "john.doe@example.com",
    "phone": "0771234567",
    "address": "No.1, Galle Road",
    "city": "Colombo",
    "country": "Sri Lanka",
    "delivery_address": "No.1, Galle Road",
    "delivery_city": "Colombo",
    "delivery_country": "Sri Lanka",
    "custom_1": "",
    "custom_2": ""
  };

  PayHere().startPayment(paymentObject);
}
回到顶部