Flutter支付集成插件paytm的使用

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

Flutter支付集成插件paytm的使用

paytm

这是一个Flutter插件,用于在Flutter应用程序中使用Paytm作为支付网关接受在线付款。

测试/预生产环境凭证注意事项

对于测试或预生产环境的凭证,请确保appInvokeEnabled设置为FALSE,或者设备上未安装Paytm应用。

获取Paytm凭证

请访问Paytm仪表板获取您的凭证。请注意,此插件仅支持使用生产密钥。

iOS配置

  1. LSApplicationQueriesSchemes:在Info.plist文件中添加一个数组项paytm
  2. URL Scheme:添加URL Scheme,格式为“paytm”+“MID”。

iOS配置

启动支付流程

以下是启动支付的示例代码:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:paytm/paytm.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String payment_response;

  // Live environment credentials
  String mid = "LIVE_MID_HERE";
  String PAYTM_MERCHANT_KEY = "LIVE_KEY_HERE";
  String website = "DEFAULT";
  bool testing = false;

  // Testing environment credentials
  // String mid = "TEST_MID_HERE";
  // String PAYTM_MERCHANT_KEY = "TEST_KEY_HERE";
  // String website = "WEBSTAGING";
  // bool testing = true;

  double amount = 1;
  bool loading = false;

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Paytm example app'),
        ),
        body: SingleChildScrollView(
          child: Padding(
            padding: EdgeInsets.all(10.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                    'For Testing Credentials make sure appInvokeEnabled set to FALSE or Paytm APP is not installed on the device.'),

                SizedBox(
                  height: 10,
                ),

                TextField(
                  onChanged: (value) {
                    mid = value;
                  },
                  decoration: InputDecoration(hintText: "Enter MID here"),
                  keyboardType: TextInputType.text,
                ),
                TextField(
                  onChanged: (value) {
                    PAYTM_MERCHANT_KEY = value;
                  },
                  decoration:
                      InputDecoration(hintText: "Enter Merchant Key here"),
                  keyboardType: TextInputType.text,
                ),
                TextField(
                  onChanged: (value) {
                    website = value;
                  },
                  decoration: InputDecoration(
                      hintText: "Enter Website here (Probably DEFAULT)"),
                  keyboardType: TextInputType.text,
                ),
                TextField(
                  onChanged: (value) {
                    try {
                      amount = double.tryParse(value);
                    } catch (e) {
                      print(e);
                    }
                  },
                  decoration: InputDecoration(hintText: "Enter Amount here"),
                  keyboardType: TextInputType.number,
                ),
                SizedBox(
                  height: 10,
                ),
                payment_response != null
                    ? Text('Response: $payment_response\n')
                    : Container(),
                RaisedButton(
                  onPressed: () {
                    generateTxnToken(0);
                  },
                  color: Colors.blue,
                  child: Text(
                    "Pay using Wallet",
                    style: TextStyle(color: Colors.white),
                  ),
                ),
                RaisedButton(
                  onPressed: () {
                    generateTxnToken(1);
                  },
                  color: Colors.blue,
                  child: Text(
                    "Pay using Net Banking",
                    style: TextStyle(color: Colors.white),
                  ),
                ),
                RaisedButton(
                  onPressed: () {
                    generateTxnToken(2);
                  },
                  color: Colors.blue,
                  child: Text(
                    "Pay using UPI",
                    style: TextStyle(color: Colors.white),
                  ),
                ),
                RaisedButton(
                  onPressed: () {
                    generateTxnToken(3);
                  },
                  color: Colors.blue,
                  child: Text(
                    "Pay using Credit Card",
                    style: TextStyle(color: Colors.white),
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }

  void generateTxnToken(int mode) async {
    setState(() {
      loading = true;
    });
    String orderId = DateTime.now().millisecondsSinceEpoch.toString();

    String callBackUrl = (testing
            ? 'https://securegw-stage.paytm.in'
            : 'https://securegw.paytm.in') +
        '/theia/paytmCallback?ORDER_ID=' +
        orderId;

    var url = 'https://desolate-anchorage-29312.herokuapp.com/generateTxnToken';

    var body = json.encode({
      "mid": mid,
      "key_secret": PAYTM_MERCHANT_KEY,
      "website": website,
      "orderId": orderId,
      "amount": amount.toString(),
      "callbackUrl": callBackUrl,
      "custId": "122",
      "mode": mode.toString(),
      "testing": testing ? 0 : 1
    });

    try {
      final response = await http.post(
        Uri.parse(url),
        body: body,
        headers: {'Content-type': "application/json"},
      );

      print("Response is");
      print(response.body);
      String txnToken = response.body;
      setState(() {
        payment_response = txnToken;
      });

      var paytmResponse = Paytm.payWithPaytm(
          mId: mid,
          orderId: orderId,
          txnToken: txnToken,
          txnAmount: amount.toString(),
          callBackUrl: callBackUrl,
          staging: testing,
          appInvokeEnabled: false);

      paytmResponse.then((value) {
        print(value);
        setState(() {
          loading = false;
          print("Value is ");
          print(value);
          if (value['error']) {
            payment_response = value['errorMessage'];
          } else {
            if (value['response'] != null) {
              payment_response = value['response']['STATUS'];
            }
          }
          payment_response += "\n" + value.toString();
        });
      });
    } catch (e) {
      print(e);
    }
  }
}

生成令牌

为了生成支付所需的校验和(CheckSum),您需要在服务器端实现相关逻辑。可以参考Paytm Plugin Server Code

支持与帮助

如果您有任何问题,可以通过邮件联系我:mr.dishantmahajan@gmail.com

希望这些信息对您有所帮助!如果您需要进一步的帮助或有其他问题,请随时告诉我。


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

1 回复

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


在Flutter中集成Paytm支付插件通常涉及几个步骤,包括添加依赖项、配置Android和iOS平台、以及实现支付功能。以下是一个基本的代码示例,展示如何在Flutter项目中集成和使用Paytm支付插件。

1. 添加依赖项

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

dependencies:
  flutter:
    sdk: flutter
  paytm: ^latest_version  # 请替换为最新的版本号

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

2. 配置Android平台

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

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

    <!-- 其他配置 -->

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

    <application
        <!-- 其他配置 -->
        >
        <meta-data
            android:name="com.paytm.sdk.MERCHANT_ID"
            android:value="YOUR_PAYTM_MERCHANT_ID" /> <!-- 替换为你的Paytm商户ID -->
        <meta-data
            android:name="com.paytm.sdk.CHANNEL_ID"
            android:value="WEBSTAGING" /> <!-- 根据环境选择WEBSTAGING或PRODUCTION -->
        <meta-data
            android:name="com.paytm.sdk.CHECKSUMHASH"
            android:value="YOUR_CHECKSUM_HASH_GENERATION_KEY" /> <!-- 替换为你的校验哈希生成密钥 -->
        <activity
            android:name="io.paytm.paytmwallet.PaytmPGActivity"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|screenLayout|density|uiMode"
            android:launchMode="singleTop"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="paytm" android:host="staging" /> <!-- 根据环境选择staging或production -->
            </intent-filter>
        </activity>
    </application>
</manifest>

3. 配置iOS平台

对于iOS,你需要在Info.plist中添加一些配置,并且可能需要处理一些额外的设置,但通常Paytm插件在iOS上的集成较为简单,因为大部分配置都是在服务器端完成的。确保你已经按照Paytm的iOS SDK文档在服务器端配置了必要的参数。

4. 实现支付功能

在你的Dart代码中,你可以这样使用Paytm插件:

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

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

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

  Future<void> _initiatePayment() async {
    try {
      // 替换以下参数为你的实际值
      String mid = "YOUR_PAYTM_MERCHANT_ID";
      String orderId = "ORDER_${DateTime.now().millisecondsSinceEpoch}";
      String customerId = "CUSTOMER_ID";
      double amount = 100.0; // 支付金额
      String phone = "CUSTOMER_PHONE";
      String email = "CUSTOMER_EMAIL";
      Map<String, dynamic> params = {
        "MID": mid,
        "ORDER_ID": orderId,
        "CUST_ID": customerId,
        "INDUSTRY_TYPE_ID": "Retail",
        "CHANNEL_ID": "WEB",
        "TXN_AMOUNT": amount.toString(),
        "WEBSITE": "YOUR_WEBSITE",
        "CHECKSUMHASH": await generateChecksum(mid, orderId, amount, "YOUR_CHECKSUM_HASH_GENERATION_KEY"), // 需要实现generateChecksum函数
        "MOBILE_NO": phone,
        "EMAIL": email,
      };

      bool status = await Paytm.startPayment(params);
      if (status) {
        // 支付成功处理
        print("Payment successful");
      } else {
        // 支付失败处理
        print("Payment failed");
      }
    } catch (e) {
      print("Error initiating payment: $e");
    }
  }

  // 需要实现一个函数来生成校验哈希(这里只是示例,具体实现需参考Paytm文档)
  Future<String> generateChecksum(String mid, String orderId, double amount, String key) async {
    // TODO: 实现校验哈希的生成逻辑
    // 通常这需要发送请求到你的服务器,由服务器生成并返回校验哈希
    return "GENERATED_CHECKSUM_HASH"; // 替换为实际生成的校验哈希
  }
}

注意:在实际应用中,generateChecksum函数需要实现与Paytm服务器通信的逻辑,以生成校验哈希。这通常涉及发送一个包含商户ID、订单ID、金额等信息的请求到你的服务器,服务器再与Paytm服务器通信生成校验哈希并返回给你的Flutter应用。

这个示例提供了一个基本的框架,但你需要根据你的具体需求和环境进行进一步的配置和调整。务必参考Paytm的官方文档来获取最新的集成指南和最佳实践。

回到顶部