Flutter支付集成插件sasapay_sdk的使用

Flutter支付集成插件sasapay_sdk的使用

特性

该插件提供了以下功能:

  • [√] C2B(客户到商家)
  • [√] B2C(商家到客户)
  • [√] B2B(商家到商家)
  • [√] 验证交易
  • [√] 交易状态查询
  • [√] 获取商户账户余额
  • [√] 瞬时支付通知 (IPN)
  • ✅ 公用事业支付

开始使用

凭据

  1. SasaPay开发者门户创建一个账户。
  2. 创建一个沙箱应用(C2B / B2C / B2B 范围)。
  3. 点击查看以查看更多应用详情。
  4. 获取您的密钥 - 客户端ID客户端密钥

详细的教程请访问SasaPay文档

使用

要运行示例应用,请进入示例文件夹并更改MERCHANT_CODECALL_BACK_URL

pubspec.yaml文件中添加依赖项:

dependencies:
  sasapay_sdk: [ADD_LATEST_VERSION_HERE]

第一步

初始化SDK,传入客户端ID客户端密钥

final sasaPay = SasaPay(
  clientId: CLIENT_ID,
  clientSecret: CLIENT_SECRET,
  environment: EnvironmentSasaPay.Testing,
);

// 或者使用Getx进行状态管理
Get.lazyPut(
  () => SasaPay(
    clientId: CLIENT_ID,
    clientSecret: CLIENT_SECRET,
    environment: EnvironmentSasaPay.Testing,
  ),
);

商家到客户 (B2C)

var resp = await sasaPay.business2Customer(
  merchantCode: MERCHANT_CODE,
  amount: "1729",
  receiverNumber: "0701234567",
  channelCode: "0",
  callBackURL: CALLBACK_URL,
  transactionDesc: "stock payment",
  accountReference: "071234",
);

处理B2C支付

var res = await sasaPay.processC2Bpayment(
  merchantCode: MERCHANT_CODE,
  checkoutRequestID: "4040359-0f8****1-4779-85b3-44e575166f7a",
  verificationCode: "123456",
);

客户到商家 (C2B)

var resp = await sasaPay.customer2BusinessPhoneNumber(
  merchantCode: MERCHANT_CODE,
  networkCode: "0",
  transactionDesc: "Pay for groceries",
  phoneNumber: "2547******280",
  accountReference: "07******0",
  amount: 1,
  callBackURL: CALLBACK_URL,
);

商家到商家 (B2B)

var resp = await sasaPay.business2Business(
  merchantCode: MERCHANT_CODE,
  amount: 1,
  receiverMerchantCode: "3209",
  transactionReason: "Payment of transportation fee",
  transactiontReference: "87065",
  callBackURL: CALLBACK_URL,
);

获取商户余额

var resp = await sasaPay.queryMerchantAccountBalance(
  merchantCode: MERCHANT_CODE,
);

获取银行代码

List<BanksChannelCode?> result = SasaPay.getBanksCodes();

SDK演示

示例代码

以下是完整的示例代码:

import 'package:example/helpers/custom_button.dart';
import 'package:example/helpers/themes_colors.dart';
import 'package:example/screens/business_to_business.dart';
import 'package:example/screens/business_to_customer.dart';
import 'package:example/screens/check_transaction.dart';
import 'package:example/screens/customer_to_business.dart';
import 'package:example/screens/utilities/utilities_main.dart';
import 'package:example/screens/verify_transaction.dart';
import 'package:example/utils/init_services.dart';
import 'package:example/utils/utils_helpers.dart';
import 'package:flutter/material.dart';
import 'package:flutter_json_view/flutter_json_view.dart';
import 'package:get/get.dart';
import 'package:sasapay_sdk/sasapay_sdk.dart';
import 'package:sasapay_sdk/utils/helper_enums_consts.dart';
import 'package:sasapay_sdk/models/bank_model.dart';

void main() async {
  sasaPayServicesInit();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter SASA PAY SDK'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  SasaPay sasaPay = Get.find<SasaPay>();

  Map<String, dynamic> response = {};
  bool loading = false;

  Future<void> registerConfirmationUrl() async {
    setState(() {
      loading = true;
      response = {"Registering call back url...": "...."};
    });

    var resp = await sasaPay.registerConfirmationUrl(
      merchantCode: MERCHANT_CODE,
      confirmationCallbackURL: CALLBACK_URL,
    );

    setState(() {
      response = resp?.data;
      loading = false;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    var height = MediaQuery.of(context).size.height;
    var width = MediaQuery.of(context).size.width;
    return Scaffold(
      backgroundColor: CustomColor.blueColor.withOpacity(0.7),
      appBar: AppBar(
        backgroundColor: CustomColor.appBarColor,
        centerTitle: true,
        title: Text(widget.title),
      ),
      body: Center(
        child: SingleChildScrollView(
          child: SizedBox(
            height: height * 1.2,
            width: width,
            child: Padding(
              padding: const EdgeInsets.symmetric(horizontal: 20),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Align(
                    alignment: Alignment.topCenter,
                    child: Visibility(
                      visible: loading,
                      child: const Center(
                        child: CircularProgressIndicator(),
                      ),
                    ),
                  ),
                  CustomElevatedButton(
                    onPressed: () {
                      Get.to(() => Customer2Business());
                    },
                    label: "CUSTOMER to Business.",
                  ),
                  SizedBox(height: height / 33),
                  CustomElevatedButton(
                    onPressed: () {
                      Get.to(() => Business2Customer());
                    },
                    label: "BUSINESS to Customer.",
                  ),
                  const SizedBox(height: 20),
                  CustomElevatedButton(
                    onPressed: () {
                      Get.to(() => Business2Business());
                    },
                    label: "BUSINESS to BUSINESS.",
                  ),
                  const SizedBox(height: 20),
                  CustomElevatedButton(
                    label: "Get Merchant Account Balance.",
                    onPressed: () async {
                      setState(() {
                        loading = true;
                        response = {"Getting account balance...": "...."};
                      });

                      var resp = await sasaPay.queryMerchantAccountBalance(
                          merchantCode: MERCHANT_CODE);

                      setState(() {
                        response = resp?.data;
                        loading = false;
                      });
                    },
                    gradient: const LinearGradient(colors: [
                      Color.fromARGB(255, 13, 103, 167),
                      Color(0xff005492),
                      Color(0xff003359),
                    ]),
                  ),
                  const SizedBox(height: 20),
                  CustomElevatedButton(
                    onPressed: () {
                      Get.to(() => CheckTransaction());
                    },
                    label: "CHECK transaction Status.",
                  ),
                  const SizedBox(height: 20),
                  CustomElevatedButton(
                    onPressed: () {
                      Get.to(() => VerifyTransaction());
                    },
                    label: "Verify a transaction.",
                  ),
                  const SizedBox(height: 20),
                  CustomElevatedButton(
                    label: "Register confirmation url",
                    onPressed: () {
                      registerConfirmationUrl();
                    },
                  ),
                  const SizedBox(height: 30),
                  CustomElevatedButton(
                    label: "Get bank channel codes",
                    onPressed: () async {
                      setState(() {
                        loading = true;
                        response = {"Getting bank codes": "...."};
                      });
                      List<BanksChannelCode?> result = SasaPay.getBanksCodes();
                      setState(() {
                        loading = false;
                        response = Map.fromIterable(
                          result,
                          key: (v) => v?.bankName ?? "",
                          value: (v) => v?.bankCode ?? "",
                        );
                      });
                    },
                  ),
                  const SizedBox(height: 10),
                  Divider(color: CustomColor.blueColor, thickness: 2),
                  const SizedBox(height: 10),
                  CustomElevatedButton(
                    onPressed: () {
                      Get.to(() => utilitiesMainPage());
                    },
                    label: "UTILITIES.",
                    gradient: const LinearGradient(colors: [
                      Color.fromARGB(255, 13, 103, 167),
                      Color(0xff005492),
                      Color(0xff003359),
                    ]),
                  ),
                  const SizedBox(height: 30),
                  JsonView.map(response),
                  const SizedBox(height: 30),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


要在Flutter应用中集成SasaPay支付功能,你可以使用 sasapay_sdk 插件。以下是一个简单的步骤指南,帮助你快速集成并使用该插件。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  sasapay_sdk: ^1.0.0  # 请使用最新版本

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

2. 初始化 SasaPay SDK

在你的应用启动时,初始化 SasaPay SDK。通常你可以在 main.dart 中进行初始化:

import 'package:sasapay_sdk/sasapay_sdk.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 SasaPay SDK
  SasaPay.initialize(
    apiKey: 'YOUR_API_KEY', // 你的 SasaPay API 密钥
    merchantCode: 'YOUR_MERCHANT_CODE', // 你的商户代码
    isProduction: false, // 设置为 true 以使用生产环境
  );

  runApp(MyApp());
}

3. 发起支付请求

在需要发起支付的地方,使用 SasaPay 实例来发起支付请求。以下是一个简单的示例:

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

class PaymentPage extends StatelessWidget {
  Future<void> initiatePayment() async {
    try {
      // 创建支付请求
      final paymentResponse = await SasaPay.initiatePayment(
        amount: 100.0, // 支付金额
        phoneNumber: '254712345678', // 用户手机号码
        transactionDesc: 'Payment for goods', // 交易描述
        callbackUrl: 'https://your-callback-url.com', // 回调 URL
      );

      // 处理支付响应
      if (paymentResponse.success) {
        print('Payment initiated successfully: ${paymentResponse.transactionId}');
      } else {
        print('Payment failed: ${paymentResponse.message}');
      }
    } catch (e) {
      print('Error initiating payment: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SasaPay Payment'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: initiatePayment,
          child: Text('Pay with SasaPay'),
        ),
      ),
    );
  }
}

4. 处理支付回调

SasaPay 支付完成后,会将支付结果发送到你提供的回调 URL。你需要在服务器端处理这些回调,并根据支付结果更新订单状态。

5. 查询支付状态

你还可以使用 SasaPay 插件来查询支付状态:

Future<void> checkPaymentStatus(String transactionId) async {
  try {
    final statusResponse = await SasaPay.checkPaymentStatus(transactionId);

    if (statusResponse.success) {
      print('Payment status: ${statusResponse.status}');
    } else {
      print('Failed to check payment status: ${statusResponse.message}');
    }
  } catch (e) {
    print('Error checking payment status: $e');
  }
}
回到顶部