Flutter支付插件paynow的使用

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

Flutter支付插件paynow的使用

简介

paynow 是一个用于在 Flutter 应用中集成 Paynow 支付系统的插件。本文将详细介绍如何安装、配置和使用 paynow 插件来实现支付功能。

注册并获取集成详情

在开始使用 Paynow 的 API 之前,你需要从 Paynow 获取集成 ID 和集成密钥。关于如何获取这些信息的详细说明可以在 此页面 找到。

前提条件

为了使项目正常工作,需要满足以下前提条件:

  1. 最新的 Flutter SDK 版本

安装

要使用 Flutter Paynow SDK,你需要在项目的 pubspec.yaml 文件中添加最新版本的依赖。

pubspec.yaml

dependencies:
  paynow: ^latest_version

你可以通过访问 pub.dev 来获取最新版本号。

入门

导入 paynow

在你的 Dart 文件中导入 paynow 包:

import 'package:paynow/paynow.dart';

初始化 Paynow

创建一个 Paynow 实例,并关联你在 Paynow 获取的集成 ID 和集成密钥。同时,设置返回 URL 和结果 URL。

Paynow paynow = Paynow(
  integrationKey: "INTEGRATION_KEY",
  integrationId: "INTEGRATION_ID",
  returnUrl: "http://yourReturnUrl.com",
  resultUrl: "http://yourResultUrl.com"
);

创建支付实例

使用 createPayment 方法创建一个新的支付实例,确保传递一个唯一的支付引用(例如发票 ID)。如果还传递了电子邮件地址,Paynow 将尝试使用该电子邮件地址自动登录客户。

Payment payment = paynow.createPayment("Invoice 32", "client@email.com");

添加商品到购物车

创建一个商品并将其添加到购物车中。你可以指定商品的数量。

final cartItem = PaynowCartItem(title: 'Banana', amount: 20.0);

// 添加到购物车
payment.addToCart(cartItem);

// 添加特定数量的商品
payment.addToCart(cartItem, quantity: 5);

从购物车中移除商品

你可以从购物车中移除商品或特定数量的商品。

// 移除 1 单位的商品
payment.removeFromCart(cartItem);

// 移除特定数量的商品
payment.removeFromCart(cartItem, quantity: 5);

// 完全移除商品
payment.deleteCartItem(cartItem);

发起基于 Web 的交易

基于 Web 的交易通过 Paynow 网站进行。你可以设置结果 URL 和返回 URL。

paynow.setResultUrl("http://example.com/gateways/paynow/update");
paynow.setReturnUrl("http://example.com/return?gateway=paynow&merchantReference=1234");

InitResponse response = await paynow.send(payment);

InitResponse 响应将包含各种信息,包括:

  • 重定向客户完成支付的 URL
  • 检查交易是否已支付的轮询 URL

发起基于移动的交易

基于移动的交易使用移动支付方式(如 Ecocash)进行。目前仅支持 Ecocash 和 Econet 号码以及 OneMoney 和 Netone 号码。

InitResponse response = await paynow.sendMobile(payment, "0784442662", MobilePaymentMethod.ecocash);

检查响应结果

InitResponse 响应将包含各种信息,包括:

  • 重定向客户完成支付的 URL
  • 检查交易是否已支付的轮询 URL
// 显示结果
print(response());

// 打印指令
print(response.instructions);

// 对于 Web Checkout,你将获得重定向 URL 以重定向客户
String redirectUrl = response.redirectUrl;

轮询交易以检查支付状态

你可以检查交易的状态,即支付是否已成功。为此,需要在发起交易后记录轮询 URL,并使用 pollTransaction 方法检查状态。

InitResponse response = await paynow.send(payment);
StatusResponse statusResponse = await paynow.checkTransactionStatus(response.pollUrl);

if (statusResponse.status == "Paid") {
  print("Client Paid");
} else {
  print("Transaction was unsuccessful");
}

无服务器快速结账(流式交易状态)

你可以使用 streamTransactionStatus 方法流式轮询交易状态,这对于没有服务器来检查 Paynow 结果 URL 和返回 URL 的情况非常有用。

// 从 `StatusResponse` 对象或数据库中获取轮询 URL
var pollUrl = statusResponse.pollUrl;

// 在 Widget build 方法中
// 你可以这样做
StreamBuilder(
  stream: paynow.streamTransactionStatus(pollUrl),
  builder: (context, AsyncSnapshot<StatusResponse> snapshot) {
    if (snapshot.hasData) {
      var response = snapshot.data;

      // 检查状态或布尔标志
      return _trxnStatus(response.status);
    } else {
      return CircularProgressIndicator();
    }
  }
);

// 根据流中的状态返回一个 Widget
Widget _trxnStatus(String status) {
  switch (status) {
    case 'Paid':
      return Text('Transaction Successfully Paid');
    case 'Sent':
      return Container(
        height: 130,
        child: Column(
          children: [
            Text('Payment request sent'),
            SizedBox(height: 20),
            CircularProgressIndicator(),
            Text('waiting for response...'),
          ],
        ),
      );
    case 'Cancelled':
      return Text('You have cancelled payment request');
    default:
      return SizedBox.shrink();
  }
}

完整使用示例

以下是一个基于移动交易的完整使用示例。更多示例请参阅 example 文件夹。

import 'package:paynow/paynow.dart';

main() async {
  Paynow paynow = Paynow(
    integrationId: '',
    integrationKey: '',
    resultUrl: '',
    returnUrl: ''
  );

  Payment payment = paynow.createPayment('Invoice 32', 'user@email.com');

  // 添加商品到购物车
  payment.add('Banana', 10.0);

  // 开始移动支付
  InitResponse response = await paynow.sendMobile(payment, '0784442662', MobilePaymentMethod.ecocash);

  // 延迟
  await Future.delayed(Duration(seconds: 3));

  // 检查交易状态
  StatusResponse status = await paynow.checkTransactionStatus(response.pollUrl);

  if (status.status == "Paid") {
    print('Yes!!!!!');
  } else {
    print('You didn\'t pay');
  }
}

注意事项

下一个版本的 paynow 包将启用空安全,这将是一个破坏性更改,版本 2.x.x 将很快发布。

快乐编码 :)

希望本文对你有所帮助,祝你开发愉快!


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

1 回复

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


当然,以下是如何在Flutter项目中集成和使用Paynow支付插件的示例代码。需要注意的是,实际使用时需要根据Paynow的官方文档进行调整,并确保你拥有Paynow的API密钥和其他必要的配置信息。

首先,你需要在pubspec.yaml文件中添加Paynow的Flutter插件依赖。假设Paynow有一个官方的Flutter插件(注意:这里是一个假设的插件名,你需要根据实际的插件名进行替换):

dependencies:
  flutter:
    sdk: flutter
  paynow_flutter: ^x.y.z  # 替换为实际的版本号

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

接下来,在你的Flutter项目中配置Paynow插件。通常,这包括初始化插件和设置必要的API密钥。以下是一个基本的示例代码:

import 'package:flutter/material.dart';
import 'package:paynow_flutter/paynow_flutter.dart';  // 假设的插件导入路径

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final PaynowFlutter _paynow = PaynowFlutter();

  @override
  void initState() {
    super.initState();
    // 初始化Paynow插件,设置API密钥等(这里是一个假设的方法)
    _paynow.initialize(
      apiKey: 'your_paynow_api_key',  // 替换为你的Paynow API密钥
      environment: 'sandbox',  // 通常会有沙盒环境和生产环境的选择
    );
  }

  void _initiatePayment() async {
    try {
      // 假设的支付参数,具体参数需要根据Paynow文档进行调整
      final Map<String, dynamic> paymentDetails = {
        'amount': 100.0,  // 支付金额
        'currency': 'USD',  // 货币类型
        'description': 'Test Payment',  // 支付描述
        // 其他必要的支付参数...
      };

      // 发起支付请求
      final PaynowResponse response = await _paynow.makePayment(paymentDetails);

      if (response.status == 'success') {
        // 支付成功处理
        showDialog(
          context: context,
          builder: (context) => AlertDialog(
            title: Text('Payment Successful'),
            content: Text('Payment ID: ${response.paymentId}'),
            actions: <Widget>[
              FlatButton(
                child: Text('OK'),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              ),
            ],
          ),
        );
      } else {
        // 支付失败处理
        showDialog(
          context: context,
          builder: (context) => AlertDialog(
            title: Text('Payment Failed'),
            content: Text('Error: ${response.errorMessage}'),
            actions: <Widget>[
              FlatButton(
                child: Text('OK'),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              ),
            ],
          ),
        );
      }
    } catch (e) {
      // 处理异常
      print('Error initiating payment: $e');
      showDialog(
        context: context,
        builder: (context) => AlertDialog(
          title: Text('Error'),
          content: Text('An error occurred while initiating payment.'),
          actions: <Widget>[
            FlatButton(
              child: Text('OK'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        ),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Paynow Payment Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _initiatePayment,
          child: Text('Initiate Payment'),
        ),
      ),
    );
  }
}

// 假设的Paynow响应类(你需要根据实际的响应结构进行调整)
class PaynowResponse {
  String status;
  String paymentId;
  String errorMessage;

  PaynowResponse({required this.status, this.paymentId, this.errorMessage});

  factory PaynowResponse.fromJson(Map<String, dynamic> json) {
    return PaynowResponse(
      status: json['status'] ?? '',
      paymentId: json['paymentId'] ?? '',
      errorMessage: json['errorMessage'] ?? '',
    );
  }
}

请注意,上面的代码是基于假设的Paynow Flutter插件和API结构编写的。在实际使用中,你需要参考Paynow的官方文档来调整代码,包括插件的初始化、支付参数的设置、以及响应的处理。

另外,由于支付涉及到敏感信息和安全性,务必确保你的API密钥和其他敏感信息不会泄露给未经授权的用户。在生产环境中,建议使用安全的存储和传输方式来保护这些信息。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!