Flutter支付集成插件sberbank_acquiring的使用

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

Flutter支付集成插件sberbank_acquiring的使用

概述

Sberbank Acquiring SDK允许您将Sberbank互联网收单功能集成到iOS和Android平台的移动应用中。该SDK提供了多种支付方式,包括普通支付、重复支付以及通过Apple Pay或Google Pay进行支付等。

安装

在您的pubspec.yaml文件中添加以下依赖项:

dependencies:
  sberbank_acquiring: <latest_version>

请确保替换<latest_version>为实际的最新版本号。

使用前准备

在开始使用SDK之前,您需要获取以下信息:

  • userName: 商户服务账户的登录名。
  • password: 商户账户的密码。
  • token: 用于验证商户发送请求到支付网关时的身份令牌(如果使用token则不需要提供userNamepassword)。

这些值可以在您的个人账户中连接到Sberbank互联网收单后获得。

配置示例

使用用户名和密码配置

final SberbankAcquiring acquiring = SberbankAcquiring(
  SberbankAcquiringConfig.credential(
    userName: 'your_username',
    password: 'your_password',
    isDebugMode: false,
  ),
);

使用Token配置

final SberbankAcquiring acquiring = SberbankAcquiring(
  SberbankAcquiringConfig.token(
    token: 'your_token',
    isDebugMode: false,
  ),
);

使用代理配置

final SberbankAcquiring acquiring = SberbankAcquiring(
  SberbankAcquiringConfig.proxy(
    proxyDomain: 'server.com',
    proxyPath: 'api/v1/',
    globalHeaders: <String, String>{'auth': 'test'},
    mapping: (AcquiringRequest request, bool isDebugMode) {
      if(request is RegisterRequest) return ProxyMapping(path: '/register');
      return;
    }
  ),
);

示例代码

以下是一个完整的Flutter应用程序示例,展示了如何使用sberbank_acquiring插件进行支付操作。

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:sberbank_acquiring/sberbank_acquiring_core.dart';
import 'package:sberbank_acquiring/sberbank_acquiring_ui.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  final List<PaymentItem> items = [
    PaymentItem(name: 'T-Shirt', price: 2000),
    PaymentItem(name: 'Trousers', price: 1600),
  ];
  SberbankAcquiring acquiring = SberbankAcquiring(
    SberbankAcquiringConfig.token(token: 'YRF3C5RFICWISEWFR6GJ'),
  );

  OrderStatus? orderStatus;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Status: $orderStatus'),
            ElevatedButton(
              onPressed: () async {
                await webviewPayment();
              },
              child: const Text('Webview Buy'),
            ),
            ElevatedButton(
              onPressed: () async {
                await tokenPayment();
              },
              child: const Text('Apple/Google Buy'),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> webviewPayment() async {
    final RegisterResponse register = await acquiring.register(
      RegisterRequest(
        amount: 1000,
        returnUrl: 'https://test.ru/return.html',
        failUrl: 'https://test.ru/fail.html',
        orderNumber: 'test',
        pageView: 'MOBILE',
      ),
    );

    final String? formUrl = register.formUrl;

    if (!register.hasError && formUrl != null) {
      Navigator.of(context).push(
        MaterialPageRoute<void>(
          builder: (BuildContext context) => Scaffold(
            body: WebViewPayment(
              logger: acquiring.logger,
              formUrl: formUrl,
              returnUrl: 'https://test.ru/return.html',
              failUrl: 'https://test.ru/fail.html',
              onLoad: (bool v) {
                debugPrint('WebView load: $v');
              },
              onError: () {
                debugPrint('WebView Error');
              },
              onFinished: (String? v) async {
                final GetOrderStatusExtendedResponse status =
                    await acquiring.getOrderStatusExtended(
                  GetOrderStatusExtendedRequest(orderId: v),
                );

                orderStatus = status.orderStatus;
                setState(() {});
                Navigator.of(context).pop();
              },
            ),
          ),
        ),
      );
    }
  }

  Future<void> tokenPayment() async {
    // 假设madPay已经正确初始化
    final String? token = 'your_payment_token'; // 获取支付令牌

    if (token != null) {
      String orderId = '';

      if (Platform.isIOS) {
        final ApplePayResponse applePay = await acquiring.applePay(
          ApplePayRequest(
            merchant: 'test',
            language: 'ru',
            paymentToken: token,
          ),
        );

        if (applePay.success == true) {
          orderId = applePay.data?.orderId ?? '';
        }
      }

      if (Platform.isAndroid) {
        final GooglePayResponse googlePay = await acquiring.googlePay(
          GooglePayRequest(
            orderNumber: '',
            merchant: 'test',
            language: 'ru',
            amount: items.map((PaymentItem v) => v.price).reduce((double i1, double i2) => i1 + i2).toInt(),
            paymentToken: token,
            failUrl: 'https://test.ru/fail',
            returnUrl: 'https://test.ru/return',
          ),
        );

        if (googlePay.success == true) {
          orderId = googlePay.data?.orderId ?? '';
        }
      }

      if (orderId.isNotEmpty) {
        final GetOrderStatusExtendedResponse status =
            await acquiring.getOrderStatusExtended(
          GetOrderStatusExtendedRequest(
            orderId: orderId,
            language: 'ru',
          ),
        );

        orderStatus = status.orderStatus;
        setState(() {});
      }
    }
  }
}

以上示例展示了如何通过WebView和Apple/Google Pay进行支付,并获取支付状态。请根据实际需求调整代码中的参数和逻辑。


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

1 回复

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


当然,以下是如何在Flutter项目中集成和使用sberbank_acquiring插件进行支付的代码示例。这个插件用于集成Sberbank Acquiring支付系统。

1. 添加依赖

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

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

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

2. 配置Android和iOS

Android

在你的android/app/src/main/AndroidManifest.xml文件中添加必要的权限:

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

iOS

通常,iOS的配置较为简单,只需确保你的Info.plist文件包含必要的配置(如果有特定要求)。sberbank_acquiring插件本身可能没有特别的iOS配置需求,但请遵循Sberbank的官方文档确保所有必要配置都已到位。

3. 初始化插件并创建支付请求

在你的Flutter代码中,你需要初始化SberbankAcquiring插件并创建一个支付请求。以下是一个简单的示例:

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

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

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

class PaymentScreen extends StatefulWidget {
  @override
  _PaymentScreenState createState() => _PaymentScreenState();
}

class _PaymentScreenState extends State<PaymentScreen> {
  SberbankAcquiring? _sberbankAcquiring;

  @override
  void initState() {
    super.initState();
    _initSberbankAcquiring();
  }

  Future<void> _initSberbankAcquiring() async {
    _sberbankAcquiring = SberbankAcquiring(
      publicKey: '你的公钥',  // 替换为你的公钥
      testMode: true,  // 如果是测试环境,设置为true;生产环境设置为false
    );

    // 注册支付结果回调
    _sberbankAcquiring!.onPaymentResult = (result) {
      // 处理支付结果
      print('支付结果: $result');
      if (result.status == PaymentStatus.success) {
        // 支付成功处理逻辑
      } else if (result.status == PaymentStatus.failed) {
        // 支付失败处理逻辑
      } else if (result.status == PaymentStatus.cancelled) {
        // 支付取消处理逻辑
      }
    };
  }

  Future<void> _startPayment() async {
    if (_sberbankAcquiring != null) {
      final paymentData = PaymentData(
        amount: '100.00',  // 支付金额
        orderDescription: '测试订单',  // 订单描述
        orderId: '123456',  // 订单ID
        returnUrl: 'https://your-return-url.com',  // 支付完成后的返回URL
      );

      try {
        await _sberbankAcquiring!.startPayment(paymentData);
      } catch (e) {
        print('支付初始化失败: $e');
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sberbank Acquiring Payment Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _startPayment,
          child: Text('开始支付'),
        ),
      ),
    );
  }
}

注意事项

  1. 公钥和私钥:确保你已经从Sberbank Acquiring获取了必要的公钥和私钥,并且在测试和生产环境中使用正确的密钥对。
  2. 测试环境:在测试环境中,testMode应设置为true。在生产环境中,请将其设置为false
  3. 返回URLreturnUrl是支付完成后用户将被重定向到的URL。确保这个URL是有效的,并且你能够处理支付结果。
  4. 错误处理:在实际应用中,添加更多的错误处理和用户反馈机制。

这段代码提供了一个基本的框架,你可以根据具体需求进行扩展和修改。详细的使用说明和更多配置选项,请参考sberbank_acquiring插件的官方文档和Sberbank Acquiring的开发者指南。

回到顶部