Flutter功能集成插件tamara_flutter_sdk的使用

Flutter功能集成插件tamara_flutter_sdk的使用

需求

  • Dart SDK: “^3.5.0”
  • Flutter: “>=3.24.0”
  • Android:
    • minSdkVersion >= 21
    • compileSdk >= 34
    • AGP(使用 Android Studio - Android Gradle 插件升级助手进行帮助)
    • 支持 androidx(查看 AndroidX 迁移进行现有应用迁移)
  • iOS 12.0+:
    • --ios-language swift
    • Xcode 版本 >= 15.0
  • MacOS 12+:
    • Xcode 版本 >= 15.0
  • Windows:
    • NuGet CLI 可用在您的 PATH 环境变量中

设置SDK

将 Tamara SDK 添加到你的项目中:

dependencies:
  tamara_flutter_sdk: version

安装

运行以下命令安装 Tamara SDK:

  1. 清理并获取新库:

    flutter clean
    flutter pub get
    
  2. 进入 iOS 文件夹并安装依赖库:

    cd ios
    pod install
    

如何使用它

初始化

在使用之前初始化 Tamara SDK:

TamaraPayment.initialize(
  AUTH_TOKEN, 
  API_URL, 
  NOTIFICATION_WEB_HOOK_URL, 
  PUBLISH_KEY, 
  NOTIFICATION_TOKEN, 
  isSandbox
);

创建并支付订单

在添加订单信息之前,通过调用此方法创建订单。referenceOrderId 是你的订单唯一标识。

TamaraPayment.createOrder(referenceOrderId, description);

必须的信息

设置客户信息:

TamaraPayment.setCustomerInfo(
  firstName, 
  lastName,
  phoneNumber, 
  email, 
  isFirstOrder
);

设置支付类型(可选,默认为 PAY_BY_INSTALMENTS):

TamaraPayment.setPaymentType(paymentType);

添加商品信息及其价格、税额和折扣:

TamaraPayment.addItem(
  name, 
  referenceId, 
  sku, 
  type, 
  unitPrice,
  taxAmount, 
  discountAmount, 
  quantity
);

设置配送地址和账单地址:

TamaraPayment.setShippingAddress(
  firstName, 
  lastName, 
  phone,
  addressLine1, 
  addressLine2, 
  country, 
  region, 
  city
);

TamaraPayment.setBillingAddress(
  firstName, 
  lastName, 
  phone,
  addressLine1, 
  addressLine2, 
  country, 
  region, 
  city
);

设置配送费用:

TamaraPayment.setShippingAmount(shippingFee);

设置折扣(可选):

TamaraPayment.setDiscount(discount, name);

设置分期付款:

TamaraPayment.setInstalments(instalments);

设置语言环境:

TamaraPayment.setLocale(locale);

设置订单号:

TamaraPayment.setOrderNumber(orderNumber);

设置订单过期时间(分钟):

TamaraPayment.setExpiresInMinutes(expiresInMinutes);

设置风险评估:

bool result = await TamaraPayment.setRiskAssessment(jsonData);
if (result) {
  // json ok
}

设置额外数据:

TamaraPayment.setAdditionalData(jsonData);

添加自定义字段额外数据:

TamaraPayment.addCustomFieldsAdditionalData(jsonData);

跳转到 Tamara 支付页面:

TamaraPayment.paymentOrder();

获取订单详情

获取订单详情:

String result = await TamaraPayment.getOrderDetail(orderId);
final orderDetail = OrderDetail.fromJson(jsonDecode(result));

class OrderDetail {
  BillingAddress? billingAddress;
  CanceledAmount? canceledAmount;
  CanceledAmount? capturedAmount;
  Consumer? consumer;
  String? countryCode;
  String? createdAt;
  String? description;
  CanceledAmount? discountAmount;
  List<Items>? items;
  String? orderId;
  String? orderNumber;
  String? orderReferenceId;
  CanceledAmount? paidAmount;
  String? paymentType;
  String? platform;
  CanceledAmount? refundedAmount;
  String? settlementStatus;
  BillingAddress? shippingAddress;
  CanceledAmount? shippingAmount;
  String? status;
  CanceledAmount? taxAmount;
  CanceledAmount? totalAmount;
  CanceledAmount? walletPrepaidAmount;

  OrderDetail({
    this.billingAddress,
    this.canceledAmount,
    this.capturedAmount,
    this.consumer,
    this.countryCode,
    this.createdAt,
    this.description,
    this.discountAmount,
    this.items,
    this.orderId,
    this.orderNumber,
    this.orderReferenceId,
    this.paidAmount,
    this.paymentType,
    this.platform,
    this.refundedAmount,
    this.settlementStatus,
    this.shippingAddress,
    this.shippingAmount,
    this.status,
    this.taxAmount,
    this.totalAmount,
    this.walletPrepaidAmount,
  });

  factory OrderDetail.fromJson(Map<String, dynamic> json) {
    return OrderDetail(
      billingAddress: json['billing_address'] != null
          ? BillingAddress.fromJson(json['billing_address'])
          : null,
      canceledAmount: json['canceled_amount'] != null
          ? CanceledAmount.fromJson(json['canceled_amount'])
          : null,
      capturedAmount: json['captured_amount'] != null
          ? CanceledAmount.fromJson(json['captured_amount'])
          : null,
      consumer: json['consumer'] != null
          ? Consumer.fromJson(json['consumer'])
          : null,
      countryCode: json['country_code'],
      createdAt: json['created_at'],
      description: json['description'],
      discountAmount: json['discount_amount'] != null
          ? CanceledAmount.fromJson(json['discount_amount'])
          : null,
      items: json['items'] != null
          ? (json['items'] as List)
              .map((i) => Items.fromJson(i))
              .toList()
          : null,
      orderId: json['order_id'],
      orderNumber: json['order_number'],
      orderReferenceId: json['order_reference_id'],
      paidAmount: json['paid_amount'] != null
          ? CanceledAmount.fromJson(json['paid_amount'])
          : null,
      paymentType: json['payment_type'],
      platform: json['platform'],
      refundedAmount: json['refunded_amount'] != null
          ? CanceledAmount.fromJson(json['refunded_amount'])
          : null,
      settlementStatus: json['settlement_status'],
      shippingAddress: json['shipping_address'] != null
          ? BillingAddress.fromJson(json['shipping_address'])
          : null,
      shippingAmount: json['shipping_amount'] != null
          ? CanceledAmount.fromJson(json['shipping_amount'])
          : null,
      status: json['status'],
      taxAmount: json['tax_amount'] != null
          ? CanceledAmount.fromJson(json['tax_amount'])
          : null,
      totalAmount: json['total_amount'] != null
          ? CanceledAmount.fromJson(json['total_amount'])
          : null,
      walletPrepaidAmount: json['wallet_prepaid_amount'] != null
          ? CanceledAmount.fromJson(json['wallet_prepaid_amount'])
          : null,
    );
  }
}

授权订单

通过调用此方法授权订单。orderId 是必需参数。

String result = await TamaraPayment.authoriseOrder(orderId);
final authoriseOrder = AuthoriseOrder.fromJson(jsonDecode(result));

class AuthoriseOrder {
  bool? autoCaptured;
  String? orderExpiryTime;
  String? orderId;
  String? paymentType;
  String? status;

  AuthoriseOrder({
    this.autoCaptured,
    this.orderExpiryTime,
    this.orderId,
    this.paymentType,
    this.status,
  });

  factory AuthoriseOrder.fromJson(Map<String, dynamic> json) {
    return AuthoriseOrder(
      autoCaptured: json['auto_captured'],
      orderExpiryTime: json['order_expiry_time'],
      orderId: json['order_id'],
      paymentType: json['payment_type'],
      status: json['status'],
    );
  }
}

取消订单

注意:需要先调用授权订单方法再取消订单。通过调用此方法取消订单。orderIdjsonData 是必需参数。

final cancelOrder = CancelOrder.fromJson(jsonDecode(result));

class CancelOrder {
  // 请根据实际需求定义取消订单的类
}

更新订单参考

通过调用此方法更新订单参考。orderIdorderReference 是必需参数。

final orderReference = OrderReference.fromJson(jsonDecode(result));

class OrderReference {
  String? message;

  OrderReference({
    this.message,
  });

  factory OrderReference.fromJson(Map<String, dynamic> json) {
    return OrderReference(
      message: json['message'],
    );
  }
}

捕获支付

注意:需要先调用授权订单方法再捕获支付。通过调用此方法捕获支付。orderIdjsonData 是必需参数。

TamaraSdk.getCapturePayment(jsonEncode(capture.toJson()));

class Capture {
  String? orderId;
  EAmount? totalAmount;
  EAmount? taxAmount;
  EAmount? shippingAmount;
  EAmount? discountAmount;
  List<Items>? items;

  Capture({
    this.orderId,
    this.totalAmount,
    this.taxAmount,
    this.shippingAmount,
    this.discountAmount,
    this.items,
  });

  factory Capture.fromJson(Map<String, dynamic> json) {
    return Capture(
      orderId: json['order_id'],
      totalAmount: EAmount.fromJson(json['total_amount']),
      taxAmount: EAmount.fromJson(json['tax_amount']),
      shippingAmount: EAmount.fromJson(json['shipping_amount']),
      discountAmount: EAmount.fromJson(json['discount_amount']),
      items: json['items'] != null
          ? (json['items'] as List)
              .map((i) => Items.fromJson(i))
              .toList()
          : null,
    );
  }
}

退款

取消订单参考。注意:需要先调用授权订单方法再退款。orderIdjsonData 是必需参数。

Refund refund = Refund(totalAmount: totalAmount, comment: comment);
final result = await TamaraSdk.refunds(orderId, jsonEncode(refund));

class Refund {
  EAmount? totalAmount;
  String? comment;

  Refund({
    this.totalAmount,
    this.comment,
  });

  factory Refund.fromJson(Map<String, dynamic> json) {
    return Refund(
      totalAmount: EAmount.fromJson(json['total_amount']),
      comment: json['comment'],
    );
  }
}

渲染购物车页面

通过调用此方法渲染购物车页面。language, country, publicKey, amount 是必需参数。

String result = await TamaraSdk.renderCartPage(language, country, publicKey, amount);
final cartPage = CartPage.fromJson(jsonDecode(result));

class CartPage {
  String? script;
  String? url;

  CartPage({
    this.script,
    this.url,
  });

  factory CartPage.fromJson(Map<String, dynamic> json) {
    return CartPage(
      script: json['script'],
      url: json['url'],
    );
  }
}

渲染产品页面

通过调用此方法渲染产品页面。language, country, publicKey, amount 是必需参数。

String result = await TamaraSdk.renderProduct(language, country, publicKey, amount);
Product product = Product.fromJson(jsonDecode(result));

class Product {
  String? script;
  String? url;

  Product({
    this.script,
    this.url,
  });

  factory Product.fromJson(Map<String, dynamic> json) {
    return Product(
      script: json['script'],
      url: json['url'],
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中集成和使用tamara_flutter_sdk插件的示例代码。请注意,具体的API调用和功能可能会根据tamara_flutter_sdk的版本有所不同,因此请参考最新的官方文档以获取最新和最准确的信息。

1. 添加依赖

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

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

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

2. 初始化SDK

在你的Flutter应用的入口文件(通常是main.dart)中初始化tamara_flutter_sdk

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化Tamara SDK,这里需要替换为你的实际API密钥或配置
  TamaraFlutterSdk.instance.init(
    apiKey: 'YOUR_API_KEY',
    // 其他初始化参数(如果有)
  );

  runApp(MyApp());
}

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

3. 使用SDK功能

假设tamara_flutter_sdk提供了一个用户登录的功能,你可以在你的页面或组件中调用这个功能:

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

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

class _MyHomePageState extends State<MyHomePage> {
  String loginStatus = '';

  Future<void> loginUser(String email, String password) async {
    try {
      // 调用SDK的登录方法
      var result = await TamaraFlutterSdk.instance.login(email: email, password: password);
      // 根据返回值更新登录状态
      setState(() {
        loginStatus = '登录成功: ${result.user?.email}';
      });
    } catch (e) {
      // 处理登录错误
      setState(() {
        loginStatus = '登录失败: ${e.message}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Tamara Flutter SDK Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              decoration: InputDecoration(labelText: 'Email'),
              keyboardType: TextInputType.emailAddress,
              onChanged: (value) { /* 处理输入 */ },
            ),
            SizedBox(height: 16),
            TextField(
              decoration: InputDecoration(labelText: 'Password'),
              obscureText: true,
              onChanged: (value) { /* 处理输入 */ },
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                // 这里假设你已经从TextField中获取了email和password的值
                String email = 'example@example.com'; // 替换为实际输入
                String password = 'password123'; // 替换为实际输入
                loginUser(email, password);
              },
              child: Text('登录'),
            ),
            SizedBox(height: 16),
            Text(loginStatus),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. API密钥:确保在初始化SDK时使用了正确的API密钥。
  2. 错误处理:在实际应用中,应添加更完善的错误处理逻辑。
  3. UI/UX:上述示例代码中的UI部分较为简单,实际开发中应根据需求进行优化。
  4. 文档:始终参考tamara_flutter_sdk的官方文档,以获取最新的API信息和最佳实践。

希望这个示例能帮助你在Flutter项目中集成和使用tamara_flutter_sdk插件。

回到顶部