Flutter支付集成插件flutter_pinelabs的使用

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

Flutter支付集成插件flutter_pinelabs的使用

本项目提供了访问Pinelabs API的接口。通过使用Pinelabs设备的Android实现,而不是混合应用程序方法。这是一个诚实的尝试,为访问Pinelabs API提供一个简单且易于使用的界面。

Pinelabs请求和响应

doTransaction

如Pinelabs所述:

此API将在计费应用完成产品选择并准备接受客户付款时调用。计费应用会在其应用中添加所有必要的支付选项,并调用此API,例如销售、预付卡兑换等。
此API还可用于加载、激活、撤销交易等。参考交易类型以获取支持的所有交易列表。

此API采用以下参数:

  1. transactionType:可以是TransactionType枚举中的任何选项。目前支持现金、卡、UPI和BharatQR。
  2. billingRefNo:这是由计费应用生成的参考编号。这用于标识交易。它可以为空。
  3. paymentAmount:这是要支付的金额。这是计费应用所在货币中的金额。
  4. overrideHeader:这是要在交易中使用的标头。这用于覆盖在初始化flutter_pinelabs时配置的标头。只有在初始化时提供了标头的情况下才能为空。
  5. mobileNumberForEChargeSlip:可以发送电子收费单的手机号码。此功能必须由Pinelabs启用后才能使用。它可以为空。
// 实现doTransaction的片段

final response = await _flutterPinelabsPlugin.doTransaction(
      transactionType: TransactionType.cash,
      billingRefNo: '12345',
      paymentAmount: 32.52,
      overrideHeader: HeaderModel(
        applicationId: 'your application id issued by pinelabs.',
        methodId: '1001',
        versionNo: '1.0',
        userId: 'logged in user id. nullable',
      ),
      mobileNumberForEChargeSlip: '9876543210',
    );

  /// 提供包含来自pinelabs设备响应的ResponseModel。
  setState(() {
    _responseMessage = response?.responseMsg ?? '';
  });

在调用上述方法时,向设备发送的JSON格式请求将如下所示:

{
  "Header": {
    "ApplicationId": "your application id issued by pinelabs.",
    "UserId": "1",
    "MethodId": "1001",
    "VersionNo": "1.0"
  },
  "Detail": {
    "TransactionType": "4001",
    "BillingRefNo": "12345",
    "PaymentAmount": "32.52",
    "MobileNumberForEChargeSlip": "9876543210"
  }
}

getUpiStatus

此方法可用于查询给定UPI交易的状态。提供计费参考号和UPI支付的金额。

此API采用以下参数:

  1. billingRefNo:这是由计费应用生成的参考编号。这用于标识交易。它可以为空。
  2. paymentAmount:这是要支付的金额。这是计费应用所在货币中的金额。
  3. overrideHeader:这是要在交易中使用的标头。这用于覆盖在初始化flutter_pinelabs时配置的标头。只有在初始化时提供了标头的情况下才能为空。
// 实现getUpiStatus的片段

final response = await _flutterPinelabsPlugin.getUpiStatus(
      paymentAmount: [Amount],
      billingRefNo: [BillingNumber],
      overrideHeader: HeaderModel(
        applicationId: 'your application id issued by pinelabs.',
        methodId: '1001',
        versionNo: '1.0',
        userId: 'logged in user id. nullable',
      ),
    );

 /// 提供包含来自pinelabs设备响应的ResponseModel。
  setState(() {
    _responseMessage = response?.responseMsg ?? '';
  });

setBluetooth

此方法可用于在PineLab设备与PineLab充电基座之间建立蓝牙连接。

此API采用以下参数:

  1. baseSerialNumber:这是PineLab充电基座的序列号。
  2. overrideHeader:这是要在交易中使用的标头。这用于覆盖在初始化flutter_pinelabs时配置的标头。只有在初始化时提供了标头的情况下才能为空。
// 实现setBluetooth的片段

final response = await _flutterPinelabsPlugin.setBluetooth(
      baseSerialNumber: [BaseSerialNumber]
      overrideHeader: HeaderModel(
        applicationId: 'your application id issued by pinelabs.',
        methodId: '1005',
        versionNo: '1.0',
        userId: 'logged in user id. nullable',
      ),
    );

 /// 提供包含来自pinelabs设备响应的ResponseModel。
  setState(() {
    _responseMessage = response?.responseMsg ?? '';
  });

startScan

此方法可用于从连接到PineLab设备充电基座的扫描仪获取扫描数据。 需要在PineLab设备和充电基座之间建立蓝牙连接。

此API采用以下参数:

  1. baseSerialNumber:这是PineLab充电基座的序列号。
  2. overrideHeader:这是要在交易中使用的标头。这用于覆盖在初始化flutter_pinelabs时配置的标头。只有在初始化时提供了标头的情况下才能为空。
// 实现startScan的片段

final response = await _flutterPinelabsPlugin.startScan(
      baseSerialNumber: [BaseSerialNumber]
      overrideHeader: HeaderModel(
        applicationId: 'your application id issued by pinelabs.',
        methodId: '1007',
        versionNo: '1.0',
        userId: 'logged in user id. nullable',
      ),
    );

 /// 提供包含来自pinelabs设备响应的ResponseModel。
  setState(() {
    _responseMessage = response?.scannedData ?? '';
  });

stopScan

此方法可用于重置并停止扫描服务。 需要在PineLab设备和充电基座之间建立蓝牙连接。

此API采用以下参数:

  1. baseSerialNumber:这是PineLab充电基座的序列号。
  2. overrideHeader:这是要在交易中使用的标头。这用于覆盖在初始化flutter_pinelabs时配置的标头。只有在初始化时提供了标头的情况下才能为空。
// 实现stopScan的片段

final response = await _flutterPinelabsPlugin.stopScan(
      baseSerialNumber: [BaseSerialNumber]
      overrideHeader: HeaderModel(
        applicationId: 'your application id issued by pinelabs.',
        methodId: '1012',
        versionNo: '1.0',
        userId: 'logged in user id. nullable',
      ),
    );

 /// 提供包含来自pinelabs设备响应的ResponseModel。
  setState(() {
    _responseMessage = response?.responseMsg ?? '';
  });

sendRequest

sendRequest 方法用于直接向设备发送JSON请求而无需任何操作。您可以使用此方法传递JSON并从设备接收JSON响应。

// 实现sendRequest的片段

  final response = await _flutterPinelabsPlugin.sendRequest(
      requestJson: '{"Header":{"ApplicationId":"your application id issued by pinelabs.","UserId":"1","MethodId":"1001","VersionNo":"1.0"},"Detail":{"TransactionType":"4001","BillingRefNo":"12345","PaymentAmount":"32.52","MobileNumberForEChargeSlip":"9876543210"}}');

  /// 提供包含来自pinelabs设备响应的ResponseModel。
  setState(() {
    _responseMessage = response["Response"]["ResponseMsg"];
  });

printData

当计费应用想要在Plutus Smart设备上打印纸质收据时会调用此方法。

此方法采用2个参数:

  1. overrideHeader:此参数用于覆盖在初始化FlutterPinelabs时提供的标头。如果它是空的,则使用初始化时的标头。
  2. printRequest:打印请求包含所有需要打印的数据。(当前仅测试了打印文本)

额外说明

设备超时时的失败响应:

{
  "Header": {
    "ApplicationId": "something",
    "MethodId": "1001",
    "UserId": "1",
    "VersionNo": "1.0"
  },
  "Response": {
    "AppVersion": "638",
    "ParameterJson": "parameter",
    "ResponseCode": 7,
    "ResponseMsg": "Something went wrong!"
  }
}

设备返回的失败响应(返回键时):

{
  "Header": {
    "ApplicationId": "something",
    "MethodId": "1001",
    "UserId": "1",
    "VersionNo": "1.0"
  },
  "Response": {
    "AppVersion": "638",
    "ParameterJson": "parameter",
    "ResponseCode": 7,
    "ResponseMsg": "Card reading Error"
  }
}

设备返回的成功响应:

{
  "Detail": {
    "AcquirerName": "ICICI BANK",
    "AcquiringBankCode": "02",
    "ApprovalCode": "00",
    "AuthAmoutPaise": "9999000",
    "BatchNumber": 4,
    "BillingRefNo": "TXN12345678",
    "CardEntryMode": "CARD_CHIP",
    "CardNumber": "************abcd",
    "CardType": "VISA",
    "CardholderName": "Some Person",
    "ExpiryDate": "XXXX",
    "HostResponse": "APPROVED",
    "InvoiceNumber": 1,
    "LoyaltyPointsAwarded": 0,
    "MerchantAddress": "JANAKPURI",
    "MerchantCity": "NEW DELHI    DEL       ",
    "MerchantId": "               ",
    "MerchantName": "LOVE COMMUNICATION",
    "PlutusTransactionLogID": "4295187240",
    "PlutusVersion": "Plutus v2.12 MT ICICI BANK",
    "PosEntryMode": 2,
    "PrintCardholderName": 1,
    "Remark": "PROCESSED",
    "RetrievalReferenceNumber": "000000000020",
    "TerminalId": "30365626",
    "TransactionDate": "06132022",
    "TransactionTime": "150726",
    "TransactionType": 4001
  },
  "Header": {
    "ApplicationId": "something",
    "MethodId": "1001",
    "UserId": "1",
    "VersionNo": "1.0"
  },
  "Response": {
    "AppVersion": "638",
    "ParameterJson": "parameter",
    "ResponseCode": 0,
    "ResponseMsg": "APPROVED"
  }
}

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

1 回复

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


在Flutter应用中集成支付功能可以通过使用flutter_pinelabs插件来实现。下面是一个示例代码,展示如何在Flutter项目中集成和使用flutter_pinelabs插件。

步骤 1: 添加依赖

首先,你需要在pubspec.yaml文件中添加flutter_pinelabs依赖:

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

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

步骤 2: 配置Android和iOS

Android配置

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- 其他必要权限 -->

    <application
        ... >
        <!-- 其他配置 -->
    </application>
</manifest>

你还需要在android/app/build.gradle文件中添加必要的配置,比如ProGuard规则(如果需要)。

iOS配置

对于iOS,你可能需要在Info.plist中添加一些必要的配置,具体取决于flutter_pinelabs插件的要求。此外,确保你的Xcode项目配置正确,包括必要的Capabilities和Entitlements。

步骤 3: 使用插件进行支付

在你的Flutter代码中,你可以按照以下方式使用flutter_pinelabs插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Pinelabs Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _initiatePayment,
            child: Text('Initiate Payment'),
          ),
        ),
      ),
    );
  }

  Future<void> _initiatePayment() async {
    try {
      // 替换为实际的支付配置参数
      final FlutterPinelabs flutterPinelabs = FlutterPinelabs(
        merchantId: 'your_merchant_id', // 商户ID
        merchantKey: 'your_merchant_key', // 商户密钥
        environment: FlutterPinelabsEnvironment.TEST, // 测试或生产环境
      );

      final PaymentRequest paymentRequest = PaymentRequest(
        amount: 100.0, // 支付金额
        currencyCode: 'INR', // 货币代码
        orderId: 'unique_order_id', // 订单ID
        // 其他可选参数,如customerId, mobileNumber等
      );

      final PaymentResponse response = await flutterPinelabs.startPayment(paymentRequest);

      if (response.status == PaymentStatus.SUCCESS) {
        // 支付成功处理
        print('Payment Successful: ${response.paymentData}');
      } else {
        // 支付失败处理
        print('Payment Failed: ${response.errorMessage}');
      }
    } catch (e) {
      // 错误处理
      print('Error: $e');
    }
  }
}

注意事项

  1. 安全性:确保在生产环境中使用安全的商户ID和密钥,并且不要在客户端代码中硬编码这些敏感信息。
  2. 错误处理:在实际应用中,添加更详细的错误处理和用户反馈。
  3. 环境配置:在测试和生产环境中分别使用FlutterPinelabsEnvironment.TESTFlutterPinelabsEnvironment.PRODUCTION

这个示例展示了如何使用flutter_pinelabs插件在Flutter应用中发起支付请求,并处理支付响应。请根据你的具体需求调整代码中的参数和逻辑。

回到顶部