Flutter支付功能插件payu_payment的使用

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

Flutter支付功能插件payu_payment的使用

简单集成PayU支付到Flutter应用。

使用方法

目前,你可以使用PayUWebView小部件来构建你的PayU WebView。首先你需要:

  1. 创建并配置PayUFlutter对象。
  2. 使用prepareOrder方法创建并放置PayUOrder
  3. 将从prepareOrder获取的响应传递给PayUWebView小部件。

示例

创建并配置PayUFlutter对象

PayUFlutter payuFlutter = PayUFlutter(
  clientId: 1,
  clientSecret: 'SUPER_SECRET',
  isProduction: false,
);

创建并放置PayUOrder使用prepareOrder方法

PayUOrder order = PayUOrder(
  posId: 398870,
  description: 'ZAKUPY',
  currencyCode: 'PLN',
  buyer: PayUBuyer(
    email: 'thatlukeurban@gmail.com',
    firstName: 'null',
    language: 'pl',
    lastName: 'null',
    phone: '555555555',
  ),
  products: [
    PayUProduct(
      name: 'Air',
      unitPrice: 100,
      quantity: 10,
    )
  ]
);

PayUOrderResponse payUOrderResponse = await payuFlutter.prepareOrder(order);

将响应传递给PayUWebView小部件

PayUWebView(
  builder: (WebViewController controller, Widget child) {
    return child;
  },
  orderResponse: payUOrderResponse,
  redirectUrl: redirectUrl,
  onPaymentEnd: (bool paymentSuccessful) {
    // 如果不覆盖`onPaymentEnd`方法,则默认会执行`Navigator.pop(context);`
    Navigator.of(context).pop(paymentSuccessful);
  }
)
  • builder - 必需 - 构建器公开以便访问WebViewController。这允许开发者包装child以提供一些功能,如重新加载、刷新、后退等。参见WebViewController文档
  • orderResponse - 必需 - <strong>PayUOrderResponse</strong> - 来自payuFlutter.prepareOrder(order);的响应对象。
  • onPaymentEnd - 可选 - <strong>Function(bool)</strong> - 默认情况下它会执行Navigator.of(context).pop();,但你可以覆盖此行为。
  • customLoadingWidget - 可选 - <strong>Widget</strong> - 当webView正在加载时显示。默认为CircularProgressIndicator
  • redirectUrl - 必需 - <strong>String</strong> - 重定向URL是payu_payment设置的重要部分。它需要与PayU商店中的“网站地址”相同(如下图所示)。该URL是WebView中的PayU流程结束的地方。插件使用该URL来检测用户是否成功付款。

payU屏幕

记住在代码中放置有效的PayU账户设置。

完整示例

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

void main() {
  runApp(MaterialApp(home: MyApp()));
}

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

class _MyAppState extends State<MyApp> {
  // 确保这是PayU设置的商店“网站地址”
  String redirectUrl = 'https://lukeurban.tech';
  
  PayUOrder order = PayUOrder(
    posId: 398870,
    description: 'ZAKUPY',
    currencyCode: 'PLN',
    buyer: PayUBuyer(
      email: 'thatlukeurban@gmail.com',
      firstName: 'null',
      language: 'pl',
      lastName: 'null',
      phone: '555555555',
    ),
    products: [
      PayUProduct(
        name: 'Air',
        unitPrice: 100,
        quantity: 10,
      )
    ]
  );

  PayUFlutter payuFlutter = PayUFlutter(
    clientId: 1,
    clientSecret: 'SUPER_SECRET',
    isProduction: false,
  );

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

  openAsBottomModal(PayUOrderResponse payUOrderResponse) {
    return showModalBottomSheet(
      useRootNavigator: true,
      elevation: 20,
      enableDrag: false,
      isDismissible: false,
      isScrollControlled: true,
      context: context,
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.only(
          topLeft: Radius.circular(25.0),
          topRight: Radius.circular(25.0),
        ),
      ),
      backgroundColor: Colors.white,
      builder: (BuildContext context) {
        return Center(
          child: Container(
            child: PayUWebView(
              builder: (WebViewController controller, Widget child) {
                return child;
              },
              orderResponse: payUOrderResponse,
              redirectUrl: redirectUrl,
            ),
          ),
        );
      },
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('插件示例应用'),
      ),
      body: Builder(
        builder: (BuildContext context) {
          return Column(
            children: [
              TextButton(
                onPressed: () async {
                  PayUOrderResponse payUOrderResponse = await payuFlutter.prepareOrder(order);
                  openAsBottomModal(payUOrderResponse).then((value) {
                    String result = value == true ? '成功' : '失败';
                    print('支付结果: $result');
                  });
                },
                child: Text("授权在底部模态框"),
              ),
              TextButton(
                onPressed: () async {
                  PayUOrderResponse payUOrderResponse = await payuFlutter.prepareOrder(order);

                  Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (context) => Scaffold(
                              appBar: AppBar(),
                              body: PayUWebView(
                                builder: (WebViewController controller, Widget child) {
                                  return child;
                                },
                                orderResponse: payUOrderResponse,
                                redirectUrl: redirectUrl,
                                onPaymentEnd: (bool paymentSuccessful) {
                                  print('我的自定义支付回调');
                                  Navigator.of(context).pop(paymentSuccessful);
                                },
                              ),
                            )),
                  ).then((value) {
                    String result = value == true ? '成功' : '失败';
                    print('支付结果: $result');
                  });
                },
                child: Text("授权其他视图"),
              ),
            ],
          );
        },
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中集成和使用payu_payment插件进行支付功能的示例代码。payu_payment插件通常用于集成PayU支付网关。

1. 添加依赖

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

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

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

2. 配置Android和iOS

Android

在你的android/app/src/main/AndroidManifest.xml文件中,确保你有互联网权限:

<uses-permission android:name="android.permission.INTERNET"/>

iOS

对于iOS,你可能需要在Info.plist中添加一些权限配置,具体取决于PayU SDK的要求。不过通常payu_payment插件已经处理好了大部分配置。

3. 使用payu_payment插件

在你的Flutter代码中,你可以按照以下步骤使用payu_payment插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('PayU Payment Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 配置支付参数
              Map<String, dynamic> paymentParams = {
                'key': '你的PayU商户密钥',
                'salt': '你的PayU盐值',
                'txnid': '唯一交易ID',
                'amount': '支付金额',
                'productinfo': '商品信息',
                'firstname': '用户名字',
                'email': '用户邮箱',
                'phone': '用户手机号',
                'udf1': '', // 用户自定义参数1
                'udf2': '', // 用户自定义参数2
                'udf3': '', // 用户自定义参数3
                'udf4': '', // 用户自定义参数4
                'udf5': '', // 用户自定义参数5
                'surl': '支付成功回调URL',
                'furl': '支付失败回调URL',
                'hash': '通过PayU SDK生成的hash值', // 注意:这个hash值需要通过PayU提供的算法生成
                'var1': '', // 可选参数
                'var2': '', // 可选参数
                'var3': '', // 可选参数
                'var4': '', // 可选参数
                'var5': '', // 可选参数
                'pg': '支付网关(如PAYU_PAISAPAY, CCAVENUE, etc.)',
              };

              // 初始化PayU支付
              PayUPayment payUPayment = PayUPayment();

              // 发起支付请求
              try {
                bool result = await payUPayment.startPayment(paymentParams);
                if (result) {
                  // 支付成功处理逻辑
                  print('支付成功');
                } else {
                  // 支付失败处理逻辑
                  print('支付失败');
                }
              } catch (e) {
                // 错误处理
                print('支付发生错误: $e');
              }
            },
            child: Text('发起支付'),
          ),
        ),
      ),
    );
  }
}

4. 生成hash值

注意在上面的代码中,hash参数是通过PayU提供的算法生成的。你需要根据PayU的文档来实现这个hash值的生成。通常,你需要使用商户密钥、盐值和其他支付参数来生成这个hash值。

以下是一个简化的hash生成示例(注意:这只是一个示例,实际的hash生成算法需要参考PayU的官方文档):

String generateHash(String key, String salt, Map<String, String> params) {
  // 将参数按键名排序并拼接成字符串
  List<String> keys = params.keys.toList()..sort();
  StringBuffer stringBuffer = StringBuffer();
  for (String key in keys) {
    stringBuffer.write(key);
    stringBuffer.write(params[key] ?? '');
  }
  
  // 添加key和salt
  stringBuffer.write(key);
  stringBuffer.write(salt);

  // 使用SHA-256或指定的算法生成hash值
  List<int> bytes = utf8.encode(stringBuffer.toString());
  Digest digest = sha256.convert(bytes);
  return digest.toString();
}

注意:上面的generateHash函数只是一个示例,实际的hash生成逻辑需要按照PayU的文档来实现,可能涉及到不同的算法和参数处理。

希望这个示例代码能帮助你在Flutter项目中集成和使用payu_payment插件。如果有任何进一步的问题,请查阅PayU的官方文档或联系他们的技术支持。

回到顶部