Flutter支付插件flutter_payu_unofficial的使用

Flutter支付插件flutter_payu_unofficial的使用

flutter_payu_unofficial 插件支持Android和iOS平台。它使用了由PayU Money开发团队提供的移动SDK。

![截图1](Screenshot 1)
![截图3](Screenshot 3)
![截图4](Screenshot 4)。

开始使用

pubspec.yaml文件中添加依赖:

dependencies:
  flutter_payu_unofficial: 1.0.3

特性

特性 描述
插件即用 安装简单,开箱即用的UI
自动读取OTP 在支持的平台上自动读取OTP
PayU Money移动SDK 基于PayU Money的iOS和Android SDK
空安全

Android安装

编辑AndroidManifest.xml

<manifest>标签中添加以下行:

xmlns:tools="http://schemas.android.com/tools"

<application>标签中添加以下行:

tools:replace="android:label"

iOS安装

对于iOS,无需进行任何配置。

使用示例

准备支付参数

// 准备支付参数。
PaymentParams _paymentParam = PaymentParams(
  merchantID: "商户ID",  
  merchantKey: "商户密钥",  
  salt: "盐值",  
  amount: "100",  
  transactionID: "TXNID1234567890",  
  firstName: "FirstName",
  email: "Test@test.com",  
  productName: "测试产品",  
  phone: "9876543210",  
  fURL: "https://www.payumoney.com/mobileapp/payumoney/failure.php",  
  sURL: "https://www.payumoney.com/mobileapp/payumoney/success.php",  
  udf1: "udf1",  
  udf2: "udf2",  
  udf3: "udf3",  
  udf4: "udf4",  
  udf5: "udf5",  
  udf6: "",  
  udf7: "",  
  udf8: "",  
  udf9: "",  
  udf10: "",  
  hash: "",  
  isDebug: true, // 测试模式为true,生产模式为false
);

发起支付

// 返回PayuPaymentResult对象

PayuPaymentResult _paymentResult = await FlutterPayuUnofficial.initiatePayment(
  paymentParams: _paymentParam, 
  showCompletionScreen: false, // false将不显示内置的成功/失败屏幕,默认为true
);

比较结果

// PayuPaymentResult.status是字符串,PayuPaymentStatus类有一些通用的状态来干净地比较。
// 实际响应在PayuPaymentResult.response中。
// 响应是Map<dynamic,dynamic>,直接来自SDK没有任何更改。

if (_paymentResult.status == PayuPaymentStatus.success) {  
  print("Success: ${_paymentResult.response}");  
} else if (_paymentResult.status == PayuPaymentStatus.failed) {  
  print("Failed: ${_paymentResult.response}");  
} else if (_paymentResult.status == PayuPaymentStatus.cancelled) {  
  print("Cancelled by User: ${_paymentResult.response}");  
} else {  
  print("Response: ${_paymentResult.response}");  
  print("Status: ${_paymentResult.status}");  
}

完整示例代码

import 'dart:convert';
import 'package:crypto/crypto.dart';
import 'package:flutter/material.dart';
import 'package:flutter_payu_unofficial/flutter_payu_unofficial.dart';
import 'package:flutter_payu_unofficial/models/payment_params_model.dart';
import 'package:flutter_payu_unofficial/models/payment_result.dart';
import 'package:flutter_payu_unofficial/models/payment_status.dart';
import 'package:flutter_payu_unofficial_example/credentials.dart';
import 'package:flutter_payu_unofficial_example/widgets/common_text_field.dart';

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

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

class _MyAppState extends State<MyApp> {
  TextEditingController _merchantIDTextFieldController = TextEditingController(text: merchantID);
  TextEditingController _merchantKeyTextFieldController = TextEditingController(text: merchantKey);
  TextEditingController _saltTextFieldController = TextEditingController(text: salt);
  TextEditingController _amountTextFieldController = TextEditingController(text: "100");
  TextEditingController _transactionIDTextFieldController = TextEditingController(text: DateTime.now().millisecondsSinceEpoch.toString());
  TextEditingController _nameTextFieldController = TextEditingController(text: "Test Name");
  TextEditingController _productInfoTextFieldController = TextEditingController(text: "Test Product");
  TextEditingController _emailTextFieldController = TextEditingController(text: "Test@test.com");

  Future<void> pay() async {
    PaymentParams _paymentParam = PaymentParams(
      merchantID: _merchantIDTextFieldController.text,
      merchantKey: _merchantKeyTextFieldController.text,
      salt: _saltTextFieldController.text,
      amount: _amountTextFieldController.text,
      transactionID: _transactionIDTextFieldController.text,
      firstName: _nameTextFieldController.text,
      email: _emailTextFieldController.text,
      productName: _productInfoTextFieldController.text,
      phone: "9876543210",
      fURL: "https://www.payumoney.com/mobileapp/payumoney/failure.php",
      sURL: "https://www.payumoney.com/mobileapp/payumoney/success.php",
      udf1: "udf1",
      udf2: "udf2",
      udf3: "udf3",
      udf4: "udf4",
      udf5: "udf5",
      udf6: "",
      udf7: "",
      udf8: "",
      udf9: "",
      udf10: "",
      hash: "", // Hash是必需的,现在初始化为空字符串以稍后设置实际的哈希值
      isDebug: true, // 测试模式为true,生产模式为false
    );

    // 生成本地哈希
    var bytes = utf8.encode(
        "${_paymentParam.merchantKey}|${_paymentParam.transactionID}|${_paymentParam.amount}|${_paymentParam.productName}|${_paymentParam.firstName}|${_paymentParam.email}|udf1|udf2|udf3|udf4|udf5||||||${_paymentParam.salt}");
    String localHash = sha512.convert(bytes).toString();
    _paymentParam.hash = localHash;

    try {
      PayuPaymentResult _paymentResult = await FlutterPayuUnofficial.initiatePayment(
        paymentParams: _paymentParam, 
        showCompletionScreen: true,
      );

      // 检查成功并打印结果
      if (_paymentResult != null) {
        if (_paymentResult.status == PayuPaymentStatus.success) {
          print("Success: ${_paymentResult.response}");
        } else if (_paymentResult.status == PayuPaymentStatus.failed) {
          print("Failed: ${_paymentResult.response}");
        } else if (_paymentResult.status == PayuPaymentStatus.cancelled) {
          print("Cancelled by User: ${_paymentResult.response}");
        } else {
          print("Response: ${_paymentResult.response}");
          print("Status: ${_paymentResult.status}");
        }
      } else {
        print("Something's rotten here");
      }
    } catch (e) {
      print(e);
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('PayU Money Example'),
        ),
        body: SingleChildScrollView(
          child: Column(
            children: [
              CommonTextField(
                hint: "Merchant ID",
                controller: _merchantIDTextFieldController,
              ),
              CommonTextField(
                hint: "Merchant Key",
                controller: _merchantKeyTextFieldController,
              ),
              CommonTextField(
                hint: "Salt",
                controller: _saltTextFieldController,
              ),
              CommonTextField(
                hint: "Amount",
                controller: _amountTextFieldController,
              ),
              CommonTextField(
                hint: "Transaction ID",
                controller: _transactionIDTextFieldController,
              ),
              CommonTextField(
                hint: "Name",
                controller: _nameTextFieldController,
              ),
              CommonTextField(
                hint: "Product Info",
                controller: _productInfoTextFieldController,
              ),
              CommonTextField(
                hint: "Email",
                controller: _emailTextFieldController,
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: RaisedButton(
                  onPressed: pay,
                  child: Text("Pay"),
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用flutter_payu_unofficial插件进行支付的代码示例。这个插件允许你集成PayU支付网关到你的Flutter应用中。请注意,这只是一个基本的示例,实际使用时你可能需要根据具体需求进行调整。

首先,确保你已经在pubspec.yaml文件中添加了flutter_payu_unofficial依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_payu_unofficial: ^最新版本号 # 请替换为实际的最新版本号

然后运行flutter pub get来获取依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤配置和使用flutter_payu_unofficial插件:

  1. 初始化插件并配置支付参数

在你的Dart文件中(例如payment_screen.dart),首先导入插件:

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

然后,定义一个函数来初始化支付插件并启动支付流程:

void _startPayment() async {
  // 配置PayU支付参数
  final Map<String, dynamic> payUConfig = {
    'key': '你的PayU密钥',           // 替换为你的PayU密钥
    'salt': '你的PayU盐值',          // 替换为你的PayU盐值
    'merchantId': '你的商户ID',      // 替换为你的PayU商户ID
    'baseUrl': 'https://test.payu.in/_payment', // 测试环境URL,生产环境需替换
    'hash': '生成的哈希值',          // 根据你的参数生成的哈希值,用于验证请求
    'txnid': '唯一的交易ID',         // 替换为实际的交易ID
    'amount': '支付金额',            // 替换为实际的支付金额
    'productinfo': '产品信息',       // 替换为实际的产品信息
    'firstname': '用户姓名',          // 替换为实际的用户姓名
    'email': '用户邮箱',             // 替换为实际的用户邮箱
    'phone': '用户电话',             // 替换为实际的用户电话
    'udf1': '', // 用户自定义数据1
    'udf2': '', // 用户自定义数据2
    'udf3': '', // 用户自定义数据3
    'udf4': '', // 用户自定义数据4
    'udf5': '', // 用户自定义数据5
    'surl': '支付成功后的回调URL',   // 支付成功后的回调URL
    'furl': '支付失败后的回调URL',   // 支付失败后的回调URL
  };

  // 启动支付流程
  try {
    final result = await FlutterPayuUnofficial.startPayment(payUConfig);
    print('支付结果: $result');
    // 根据支付结果进行相应的处理
  } catch (e) {
    print('支付失败: $e');
  }
}

注意:hash字段通常需要根据keysalttxnidamount等参数通过特定的算法生成。你需要查阅PayU的文档来了解如何生成这个哈希值。

  1. 在UI中触发支付

现在,你可以在你的UI中添加一个按钮来触发支付流程:

class PaymentScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('支付页面'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _startPayment,
          child: Text('开始支付'),
        ),
      ),
    );
  }
}
  1. 运行应用

确保你的设备或模拟器已经连接,然后运行你的Flutter应用:

flutter run

现在,当你点击“开始支付”按钮时,应该会启动PayU的支付流程。

请记住,这只是一个基本的示例。在实际应用中,你可能需要处理更多的边缘情况和错误处理,同时确保你的支付参数正确无误,并符合PayU的安全要求。

回到顶部