Flutter支付集成插件flutter_onpay_sdk的使用

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

Flutter支付集成插件flutter_onpay_sdk的使用

该插件用于将Flutter应用程序与支付服务onpay.ru进行集成。

通过此插件,用户可以在应用内使用银行卡和其他支持的支付方式(如银行快速支付系统)完成支付,而无需离开应用程序。

重要信息

此插件仅能在已拥有onpay.ru商户账户的情况下使用。

功能

  • 在应用程序内支付商品和服务费用
  • 支持Visa/Mastercard支付
  • 支持俄罗斯央行的银行快速支付系统(СБП)
  • 支持所有可用的支付方式
  • 生成二维码以支持线下支付通过СБП

开始使用

对于接受Visa/Mastercard/МИР卡支付

  1. 注册并登录到 https://onpay.ru
  2. 填写接收信用卡支付的申请(支付方式为"CRD" / “UNR” / “CRW”)
  3. 请求OnPay的技术支持激活支付表单API (https://wiki.onpay.ru/doku.php?id=api-for-pay-form)

安装

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

dependencies:
  flutter_onpay_sdk: any # 或者使用最新版本

Android 配置

确保在<项目根目录>/android/app/src/main/AndroidManifest.xml文件中添加了以下权限:

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

使用示例

默认支付方法

import 'package:flutter_onpay_sdk/flutter_onpay_sdk.dart';

// 1. 创建支付对象
OnPayOrder order = OnPayOrder(
    reference: "SOMEUNIQ", // 唯一标识符
    payAmount: 100, // 价格(单位:分)
    payFor: '产品1', // 商品描述
    payMode: 'fix', // 固定价格模式
    recipient: 'cloud_sciencejet_net', // 商户在onpay的代码
    userEmail: 'some@mail.ru', // 用户邮箱
    note: "商品备注", // 可选。购买商品的额外描述
    interfaceTicker:  "CRW", // 指定商户可用的支付方式
    additionalParams: { // 额外参数。将在check和pay请求中通过API传递
      "someid": "1"
    },
);

// 2. 在当前上下文中打开支付表单。这将打开一个新屏幕,展示支付表单。结果是一个包含支付状态的OnPayResult对象
OnPayResult result = await OnPaySdk.openPaymentForm(context, order); 

// 3. 处理支付结果
switch (result.status) {
  case OnPayResultCode.success:
    // "支付成功";
    break;
  case OnPayResultCode.fail:
    // "支付失败";
    break;
  case OnPayResultCode.notCompleted:
    // "支付未完成";
    break;
}

通过银行快速支付系统(СБП)进行支付

import 'package:flutter_onpay_sdk/flutter_onpay_sdk.dart';

// 1. 创建支付对象
OnPayOrder order = OnPayOrder(
    reference: "SOMEUNIQ", // 唯一标识符
    payAmount: 100, // 价格(单位:分)
    payFor: '产品1', // 商品描述
    payMode: 'fix', // 固定价格模式
    recipient: 'onpay', // 商户在onpay的代码
    userEmail: 'some@mail.ru', // 用户邮箱
    note: "商品备注", // 可选。购买商品的额外描述
    interfaceTicker:  "QRW", // 指定支付方式为СБП
);

// 2. 在当前上下文中打开支付表单。这将打开一个新屏幕,展示支付表单。结果是一个包含支付状态的OnPayResult对象
OnPayResult result = await OnPaySdk.openPaymentForm(context, order, method: OnPayMethod.sbp); 

示例代码

// 忽略_for_file: avoid_print, use_build_context_synchronously

import 'package:flutter/material.dart';
import 'package:flutter_onpay_sdk/data_models/pay_method.dart';
import 'package:flutter_onpay_sdk/data_models/pay_order.dart';
import 'package:flutter_onpay_sdk/data_models/pay_result.dart';
import 'package:flutter_onpay_sdk/sdk/onpay.dart';

class ExampleAppMyHomePage extends StatefulWidget {
  const ExampleAppMyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  [@override](/user/override)
  State<ExampleAppMyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<ExampleAppMyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            _apiPayment(),
            _apiFailedPayment(),
            _sbpPayment(),
            _qrCodePayment(),
          ],
        ),
      ),
    );
  }

  Widget _apiFailedPayment() {
    OnPayOrder order = OnPayOrder(
      reference: "SALE1",
      amount: 0.99,
      payFor: '信用卡支付',
      payMode: 'fix',
      recipient: 'cloud_sciencejet_net',
      userEmail: 'some@mail.ru',
      interfaceTicker: 'UNR',
      note: "会返回错误",
    );
    return _saleItem(order, () => _openPaymentForm(order));
  }

  Widget _apiPayment() {
    OnPayOrder order = OnPayOrder(
      reference: "SALE2",
      payFor: '产品2',
      amount: 10,
      recipient: 'onpay',
      userEmail: 'some@mail.ru',
      interfaceTicker: 'UNR',
      note: "商品备注。可以支付",
    );
    return _saleItem(order, () => _openPaymentForm(order));
  }

  Widget _sbpPayment() {
    OnPayOrder order = OnPayOrder(
      reference: "SALE3",
      payFor: 'СБП支付',
      amount: 20,
      recipient: 'onpay',
      userEmail: 'some@mail.ru',
      interfaceTicker: 'QRW',
      note: "通过СБП系统支付",
    );
    return _saleItem(order, () => _openPaymentForm(order, method: OnPayMethod.sbp));
  }

  Widget _qrCodePayment() {
    OnPayOrder order = OnPayOrder(
      reference: "SALE3",
      payFor: '生成二维码支付',
      amount: 20,
      recipient: 'onpay',
      userEmail: 'some@mail.ru',
      interfaceTicker: '',
      note: "生成二维码支付",
    );
    return _saleItem(order, () => _openPaymentForm(order, method: OnPayMethod.qrCode));
  }

  Widget _saleItem(OnPayOrder order, void Function() onPressed) {
    return Padding(
      padding: const EdgeInsets.fromLTRB(20, 5, 20, 5),
      child: Card(
          child: Row(
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          const Expanded(flex: 1, child: Icon(Icons.card_giftcard, size: 30)),
          Expanded(
            flex: 3,
            child: Column(
              children: [
                Text(order.payFor),
                Text(order.note ?? ""),
                Text("${order.amount} ${order.ticker}"),
                OutlinedButton(
                  onPressed: onPressed,
                  child: const Text("购买"),
                )
              ],
            ),
          ),
        ],
      )),
    );
  }

  void _openPaymentForm(OnPayOrder order, {OnPayMethod method = OnPayMethod.api}) async {
    OnPayResult result = await OnPaySdk.openPaymentForm(context, order, method: method);
    print("_openPaymentForm RESULT: ${result.status.toString()}");
    print("_openPaymentForm RESULT: ${result.message}");

    String msg;
    switch (result.status) {
      case OnPayResultCode.success:
        msg = "支付成功";
        break;
      case OnPayResultCode.fail:
        msg = "支付失败";
        break;
      case OnPayResultCode.notCompleted:
        msg = "支付未完成";
        break;
    }

    ScaffoldMessenger.of(context)
      ..removeCurrentSnackBar()
      ..showSnackBar(SnackBar(content: Text('${result.order.payFor}: $msg [${result.message}]')));
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中集成并使用flutter_onpay_sdk插件的详细步骤和相关代码案例。

1. 添加依赖

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

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

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

2. 导入插件

在你需要使用支付功能的Dart文件中导入插件:

import 'package:flutter_onpay_sdk/flutter_onpay_sdk.dart';

3. 配置Android和iOS

Android

android/app/src/main/AndroidManifest.xml中添加必要的权限和配置:

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

<!-- 其他必要的权限 -->

<application
    ... >
    <!-- 添加必要的meta-data -->
    <meta-data
        android:name="com.onpay.sdk.API_KEY"
        android:value="你的API_KEY"/>
    <!-- 其他配置 -->
</application>

iOS

ios/Runner/Info.plist中添加必要的权限和配置。你还需要在ios/Runner/AppDelegate.swiftios/Runner/AppDelegate.m中进行一些配置。

对于AppDelegate.swift

import UIKit
import Flutter
import flutter_onpay_sdk  // 导入插件

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    OnpaySDK.configure(with: "你的API_KEY")  // 配置API_KEY
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

4. 初始化并使用SDK

在你的Flutter代码中初始化并使用SDK。例如,在一个按钮点击事件中启动支付:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter OnPay SDK Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _startPayment,
            child: Text('Start Payment'),
          ),
        ),
      ),
    );
  }

  void _startPayment() async {
    try {
      final result = await OnpaySDK.startPayment(
        orderId: '你的订单ID',
        amount: 100,  // 金额,单位根据你的需求(如:分)
        currencyCode: 'USD',  // 货币代码
        description: '商品描述',
        // 其他可选参数
      );

      if (result.isSuccess) {
        print('支付成功: ${result.response}');
      } else {
        print('支付失败: ${result.errorMessage}');
      }
    } catch (e) {
      print('支付异常: $e');
    }
  }
}

5. 处理支付结果

在上面的代码中,OnpaySDK.startPayment会返回一个PaymentResult对象,你可以根据isSuccess字段来判断支付是否成功,并处理相应的逻辑。

注意事项

  • 确保你已经在OnPay平台注册并获取了API_KEY。
  • 在生产环境中,请务必保护好你的API_KEY,不要硬编码在客户端代码中。
  • 根据实际需要,调整金额单位、货币代码等参数。
  • 仔细阅读flutter_onpay_sdk的官方文档,以获取更多高级功能和配置选项。

这样,你就可以在Flutter项目中集成并使用flutter_onpay_sdk插件来处理支付了。

回到顶部