payme_miniapp_flutter 1.0.0
payme_miniapp_flutter: ^1.0.0 copied to clipboard
PayME Miniapp Flutter is plugin for application integrate with PayME Platform
example/lib/main.dart
import 'dart:math';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:payme_miniapp_flutter/payme_miniapp_flutter.dart';
import 'package:payme_miniapp_flutter/payme_miniapp_type.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: 'Your App Title',
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
const HomeScreen({Key? key}) : super(key: key);
@override
HomeScreenState createState() => HomeScreenState();
}
class HomeScreenState extends State<HomeScreen> {
String? selectedService;
String phoneNumber = '0347665645';
String env = "PRODUCTION";
TextEditingController _phoneNumberController = TextEditingController();
List<Map<String, String>> services = [
{"label": "POWE", "value": "POWE"},
{"label": "WATE", "value": "WATE"},
{"label": "ADSL", "value": "ADSL"},
{"label": "TIVI", "value": "TIVI"},
{"label": "MOBILE_CARD", "value": "MOBILE_CARD"},
{"label": "MOBILE_TOPUP", "value": "MOBILE_TOPUP"},
{"label": "GAME_CARD", "value": "GAME_CARD"},
{"label": "PPMB", "value": "PPMB"}
];
List<Map<String, String>> enviroment = [
{"label": "PRODUCTION", "value": "PRODUCTION"},
{"label": "SANDBOX", "value": "SANDBOX"},
];
@override
void initState() {
super.initState();
initPlatformState();
_phoneNumberController.text = phoneNumber;
init();
PaymeMiniappFlutter.onResponse.listen((dynamic response) {
if (response != null) {
_showResponseDialog(response.toString(), "Response");
}
});
// Listen to error events
PaymeMiniappFlutter.onError.listen((dynamic error) {
if (error != null) {
_showResponseDialog(error.toString(), "Error");
}
});
}
Future<void> initPlatformState() async {
if (!mounted) return;
}
Future<void> onOpenMiniApp() async {
PayMEOpeningParam openingParam = PayMEOpeningParam.open(phone: phoneNumber);
await PaymeMiniappFlutter.open(PayMEOpeningType.modal, openingParam);
}
Future<void> onOpenService(String? service) async {
PayMEOpeningParam openingParam = PayMEOpeningParam.service(
phone: phoneNumber, data: PayMEServiceParam(service: service ?? ''));
await PaymeMiniappFlutter.open(PayMEOpeningType.modal, openingParam);
}
Future<void> init() async {
env == "SANDBOX"
? await PaymeMiniappFlutter.init(
'250069027220',
'-----BEGIN PUBLIC KEY-----\nMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIB6eR2SMUCqy7LkXmVF1xf37pJn5yCp\nGMGpOd6fc/dFkqIkNBDHoTRIhMdBucauf3i7S2g+fl6g+Kte4MlaYkcCAwEAAQ==\n-----END PUBLIC KEY-----',
'-----BEGIN RSA PRIVATE KEY-----MIIBOgIBAAJBAIB6eR2SMUCqy7LkXmVF1xf37pJn5yCpGMGpOd6fc/dFkqIkNBDH\noTRIhMdBucauf3i7S2g+fl6g+Kte4MlaYkcCAwEAAQJAUlyxGfjnJBqZvRPTQ77y\n9cWWJjr/mxtr6HJwy7uSnvgNRY1zfpRLccR4NvMS7LtgK47sx1vJmCOgtVCGwCVU\nUQIhALlGTGM1Q4E5L2xCX0SfCY6vdKOdwvD5NyaUSP7ZJVf/AiEAsYXYoEApSorj\ntLg4JjLJhpE8H8Lf6o1AFpX9g83aNbkCICRY1zmLRIAAcP5DEx+KN7zHTRGgLJNL\nwPcPljZw8TOPAiEAg1P0XSD6KwYyzEgYadHamm2pIAoHorpaNhtCEBbinikCIFtk\n7by4tboFtUkXf7X+/Y1jX1owrT4xDO2sBKrUs/9F\n-----END RSA PRIVATE KEY-----',
env: PayMEEnv.SANDBOX)
: await PaymeMiniappFlutter.init(
'441211807214',
'-----BEGIN PUBLIC KEY-----\nMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIVcNKKCs2ekpUcmCnmShO9nNOH7NQtC\n22tOVYwPSsy/BTWNZR+1V36yXPnVRSUTd7OSTuxL5Rs+T6nyRGk7rtECAwEAAQ==\n-----END PUBLIC KEY-----',
'-----BEGIN RSA PRIVATE KEY-----\nMIICWwIBAAKBgFsj37SXIxgLdXXUhIc6Yq7Ccb9EmyieYhg3Kd2DUe9qV7SwN9s9\nSDTXZqkn1UCbnzSeaNlLeeKzuEf4iBxTqbf7E9Yd3o/HVB8vV8WlI1Qh484SStxq\nSZec1wJ31feVb+ID+ZmczfWAt7GcEOX2guUxLATNKfOgj8idJuxqzLG3AgMBAAEC\ngYBDUzDBmpPWA0D1ldOAgWS8a+7St79WNgmIkddfRs6T6R5432OjlJVuU2AGvOIP\nI+ZrXElfmx2ildgfcjw5kKPh3pLQlI0C3hnrL4Z6KuSHkyF6tsyzVLZs4oBPeNgP\nQc54JAfD+CCLjbCvcZpzdf0xIXmJe+DlWSVwjOPSIqytoQJBAKGh8/0oAk3qLFCI\noKi9ENOGiLQj9YjqG9900GizBcSgHSAUmQ4syHSiCnTFq3MH7hhCDAKmCEV52I9v\nTWwISBMCQQCQWew933wB8cdVFMRmUDWvqC5KKqfXMI9tXC2Rn9L81yl0JnIfIsZN\nGpix2WJRpK5icdBno6lkzP9VgSOlXWxNAkEAnFXGZh11pSEUPcz5AFzm0oG05fBG\nBGjUDt2w2yQVNyrbIPVrWR+Nv+ofjPTIsVmBPOtdLI6lP3XsNkgkrZKRCwJAYRca\nfsNCdUxZ9i/xqZ9pfKxx9hCas3JGBhhpzfjhwI43o5f4SljpaBLrgTPlnWRWpoBG\n3G6IEPSRCMHDaAZeQQJAfhfDlJzEik4gzt/JBzHDIW6v4eWA7CxReUXGtf3MLDD/\nYYXcc/Usc13UuGZ+7vYIXgJIQzVoHk+ZYw7fgDFBKQ==\n-----END RSA PRIVATE KEY-----',
env: PayMEEnv.PRODUCTION);
}
Future<void> getBalance() async {
await PaymeMiniappFlutter.getBalance(phoneNumber);
}
Future<void> getAccountInfo() async {
await PaymeMiniappFlutter.getAccountInfo(phoneNumber);
}
Future<void> pay() async {
PayMEOpeningParam openingParam = PayMEOpeningParam.pay(
phone: phoneNumber,
data: PayMEPaymentParam(
amount: 10000,
transactionId: generateRandomSixDigitNumber().toString(),
note: "note"));
await PaymeMiniappFlutter.open(PayMEOpeningType.modal, openingParam);
}
int generateRandomSixDigitNumber() {
// Create a Random object
Random random = Random();
// Generate a random 6-digit number
int min = 100000;
int max = 999999;
return min + random.nextInt(max - min);
}
Future<void> _showResponseDialog(String response, String type) async {
return showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(type),
content: Text(response),
actions: [
ElevatedButton(
onPressed: () {
Navigator.of(context).pop();
},
child: const Text('OK'),
),
],
);
},
);
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
FocusManager.instance.primaryFocus?.unfocus();
},
child: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Center(
child: Column(
children: [
TextField(
controller: _phoneNumberController,
onChanged: (value) {
setState(() {
phoneNumber = value;
});
},
keyboardType: TextInputType.number,
decoration: const InputDecoration(
labelText: 'Nhập số điện thoại',
contentPadding: EdgeInsets.symmetric(horizontal: 16)),
),
const SizedBox(height: 30),
Center(
child: Row(
children: [
DropdownButton(
padding: const EdgeInsets.symmetric(horizontal: 16),
value: env,
items: enviroment.map((Map<String, String> enviroment) {
return DropdownMenuItem<String>(
value: enviroment["value"]!,
child: Text(enviroment["label"]!),
);
}).toList(),
onChanged: (String? value) {
setState(() {
env = value!;
});
},
),
ElevatedButton(
onPressed: init,
child: const Text('Change Enviroment'),
)
],
)),
const SizedBox(height: 30),
ElevatedButton(
onPressed: onOpenMiniApp,
child: const Text('Open Mini App'),
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: getBalance,
child: const Text('Get Balance'),
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: getAccountInfo,
child: const Text('Get Account Info'),
),
const SizedBox(height: 16),
Center(
child: Container(
constraints: BoxConstraints(
maxWidth: MediaQuery.of(context).size.width * 0.8),
padding: const EdgeInsets.all(16.0),
child: Row(
children: [
Expanded(
child: DropdownButton<String>(
value: selectedService,
items: services.map((Map<String, String> service) {
return DropdownMenuItem<String>(
value: service["value"]!,
child: Text(service["label"]!),
);
}).toList(),
onChanged: (String? newValue) {
setState(() {
selectedService = newValue;
});
},
hint: const Text('Select a service'),
),
),
const SizedBox(width: 16),
ElevatedButton(
onPressed: () {
if (selectedService != null) {
// Add your logic to handle the selected service
onOpenService(selectedService);
print('Selected Service: $selectedService');
} else {
print('Please select a service.');
}
},
child: const Text('Open'),
),
],
),
),
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: pay,
child: const Text('Pay'),
),
],
),
),
));
}
}