Flutter支付集成插件paytm的使用
Flutter支付集成插件paytm的使用
paytm
这是一个Flutter插件,用于在Flutter应用程序中使用Paytm作为支付网关接受在线付款。
测试/预生产环境凭证注意事项
对于测试或预生产环境的凭证,请确保appInvokeEnabled
设置为FALSE
,或者设备上未安装Paytm应用。
获取Paytm凭证
请访问Paytm仪表板获取您的凭证。请注意,此插件仅支持使用生产密钥。
iOS配置
- LSApplicationQueriesSchemes:在Info.plist文件中添加一个数组项
paytm
。 - URL Scheme:添加URL Scheme,格式为“paytm”+“MID”。
启动支付流程
以下是启动支付的示例代码:
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
更多关于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的官方文档来获取最新的集成指南和最佳实践。