Release 1.0.4 version

This commit is contained in:
Александр Кургин
2023-05-12 18:17:35 +03:00
parent 6b72dfee66
commit d60cd55d88
130 changed files with 3091 additions and 25 deletions
+43
View File
@@ -0,0 +1,43 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'flavors.dart';
import 'tokenization_screen.dart';
class App extends StatelessWidget {
const App({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: F.title,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: _flavorBanner(
child: const TokenizationScreen(),
show: kDebugMode,
),
);
}
Widget _flavorBanner({
required Widget child,
bool show = true,
}) =>
show
? Banner(
child: child,
location: BannerLocation.topStart,
message: F.name,
color: Colors.green.withOpacity(0.6),
textStyle: const TextStyle(
fontWeight: FontWeight.w700,
fontSize: 12.0,
letterSpacing: 1.0),
textDirection: TextDirection.ltr,
)
: Container(
child: child,
);
}
+34
View File
@@ -0,0 +1,34 @@
import 'package:yookassa_payments_flutter/models/host_parameters.dart';
class Config {
String shopId;
String? gatewayId;
String clientApplicationKey;
String moneyAuthClientId;
String applePayID;
String applicationScheme;
HostParameters? hostParameters;
Config(
this.shopId,
this.gatewayId,
this.clientApplicationKey,
this.moneyAuthClientId,
this.applePayID,
this.applicationScheme,
this.hostParameters
);
factory Config.fromJson(Map<String, dynamic> json) {
return Config(
json['shopId'] as String,
json['gatewayId'] as String?,
json['clientApplicationKey'] as String,
json['moneyAuthClientId'] as String,
json['applePayID'] as String,
json['applicationScheme'] as String,
json['hostParameters'] == null ? null : HostParameters.fromJson(json['hostParameters']),
);
}
}
+44
View File
@@ -0,0 +1,44 @@
import 'config.dart';
import 'dart:convert';
import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;
enum Flavor {
dev,
prod,
}
class F {
static Flavor? appFlavor;
static String get name => appFlavor?.name ?? '';
static String get title {
switch (appFlavor) {
case Flavor.dev:
return 'dev_yookassa_payments_flutter_example';
case Flavor.prod:
return 'prod_yookassa_payments_flutter_example';
default:
return 'title';
}
}
static Future<Config> getConfig() async {
String json;
switch (appFlavor) {
case Flavor.dev:
json = await loadAsset('assets/schemes/dev.json');
break;
case Flavor.prod:
json = await loadAsset('assets/schemes/prod.json');
break;
default:
json = await loadAsset('assets/schemes/prod.json');
}
return Config.fromJson(jsonDecode(json));
}
static Future<String> loadAsset(path) => rootBundle.loadString(path);
}
+8
View File
@@ -0,0 +1,8 @@
import 'package:flutter/material.dart';
import 'app.dart';
import 'flavors.dart';
void main() {
F.appFlavor = Flavor.prod;
runApp(const App());
}
+8
View File
@@ -0,0 +1,8 @@
import 'package:flutter/material.dart';
import 'app.dart';
import 'flavors.dart';
void main() {
F.appFlavor = Flavor.dev;
runApp(const App());
}
+8
View File
@@ -0,0 +1,8 @@
import 'package:flutter/material.dart';
import 'app.dart';
import 'flavors.dart';
void main() {
F.appFlavor = Flavor.prod;
runApp(const App());
}
+91
View File
@@ -0,0 +1,91 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:yookassa_payments_flutter/input_data/saved_card_module_input_data.dart';
import 'package:yookassa_payments_flutter/models/tokenization_result.dart';
import 'package:yookassa_payments_flutter/yookassa_payments_flutter.dart';
class SuccessTokenizationScreen extends StatefulWidget {
const SuccessTokenizationScreen(
{Key? key, required this.result, this.tokenizationData, this.repeatData})
: super(key: key);
final SuccessTokenizationResult result;
final TokenizationModuleInputData? tokenizationData;
final SavedBankCardModuleInputData? repeatData;
@override
State<StatefulWidget> createState() =>
SuccessTokenizationScreenState(result, tokenizationData, repeatData);
}
class SuccessTokenizationScreenState extends State<SuccessTokenizationScreen> {
final SuccessTokenizationResult result;
final TokenizationModuleInputData? tokenizationData;
final SavedBankCardModuleInputData? repeatData;
SuccessTokenizationScreenState(
this.result, this.tokenizationData, this.repeatData);
late TextEditingController controller;
@override
void initState() {
controller = TextEditingController();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Flutter Demo App"),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const ListTile(
leading: Icon(Icons.done, color: Colors.green),
title: Text("Токен готов"),
),
Container(
padding: const EdgeInsets.all(20.0),
child: TextField(
controller: controller,
decoration:
const InputDecoration(hintText: "3ds / App2App ссылка"),
),
),
ElevatedButton(
onPressed: () async {
await YookassaPaymentsFlutter.confirmation(
controller.text, result.paymentMethodType);
showDialog(
context: context,
builder: (context) => const AlertDialog(
content: Text("Confirmation process is done"),
));
},
child: const Text("Подтвердить")),
TextButton(
onPressed: () async {
showDialog(
context: context,
builder: (context) => AlertDialog(
content: Text(result.token),
actions: <Widget>[
TextButton(
onPressed: () {
Clipboard.setData(
ClipboardData(text: result.token));
Navigator.of(context).pop();
},
child: const Text('Скопировать'),
),
]));
},
child: const Text("Показать токен"))
],
),
);
}
}
+141
View File
@@ -0,0 +1,141 @@
import 'package:flutter/material.dart';
import 'package:yookassa_payments_flutter/input_data/saved_card_module_input_data.dart';
import 'package:yookassa_payments_flutter/models/tokenization_result.dart';
import 'package:yookassa_payments_flutter/yookassa_payments_flutter.dart';
import 'package:yookassa_payments_flutter_example/success_tokenization_screen.dart';
import 'package:yookassa_payments_flutter_example/config.dart';
import 'package:yookassa_payments_flutter_example/flavors.dart';
class TokenizationScreen extends StatefulWidget {
const TokenizationScreen({Key? key}) : super(key: key);
@override
State<TokenizationScreen> createState() => TokenizationScreenState();
}
class TokenizationScreenState extends State<TokenizationScreen> {
late TextEditingController controller;
@override
void initState() {
controller = TextEditingController(text: "10.0");
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Flutter Demo App"),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
padding: const EdgeInsets.all(20.0),
child: TextField(
controller: controller,
),
),
ElevatedButton(
onPressed: () async {
Config config = await F.getConfig();
startTokenization(config);
//startBankCardRepeat(config, "29fb30f8-000f-5000-8000-107f20fa0136");
},
child: const Text("Оплатить"))
],
),
);
}
void startTokenization(Config config) async {
var clientApplicationKey = config.clientApplicationKey;
var amount =
Amount(value: double.parse(controller.text), currency: Currency.rub);
var moneyAuthClientId = config.moneyAuthClientId;
var applePayID = config.applePayID;
var gatewayId = config.gatewayId;
var applicationScheme = config.applicationScheme + "://";
var shopId = config.shopId;
// var testSettings = TestModeSettings(true, 5, amount, false);
var tokenizationModuleInputData = TokenizationModuleInputData(
clientApplicationKey: clientApplicationKey,
title: "Космические объекты",
subtitle: "Комета повышенной яркости, период обращения — 112 лет",
amount: amount,
savePaymentMethod: SavePaymentMethod.userSelects,
isLoggingEnabled: true,
moneyAuthClientId: moneyAuthClientId,
applePayID: applePayID,
shopId: shopId,
customerId: "app.example.demo.payments.yookassa",
gatewayId: gatewayId,
applicationScheme: applicationScheme,
hostParameters: config.hostParameters,
tokenizationSettings: const TokenizationSettings(PaymentMethodTypes([
PaymentMethod.bankCard,
PaymentMethod.yooMoney,
PaymentMethod.sberbank,
PaymentMethod.applePay,
PaymentMethod.googlePay
])),
testModeSettings: null);
var result =
await YookassaPaymentsFlutter.tokenization(tokenizationModuleInputData);
if (result is SuccessTokenizationResult) {
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => SuccessTokenizationScreen(
result: result,
tokenizationData: tokenizationModuleInputData)));
} else if (result is ErrorTokenizationResult) {
showDialog(
context: context,
builder: (context) => AlertDialog(content: Text(result.error)));
return;
}
}
void startBankCardRepeat(Config config, String paymentMethodId) async {
var clientApplicationKey = config.clientApplicationKey;
var amount =
Amount(value: double.parse(controller.text), currency: Currency.rub);
var applePayID = config.applePayID;
var shopId = config.shopId;
var gatewayId = config.gatewayId;
//var testSettings = TestModeSettings(false, 1, amount, false);
var savedBankCardModuleInputData = SavedBankCardModuleInputData(
clientApplicationKey: clientApplicationKey,
title: "Космические объекты",
subtitle: "Комета повышенной яркости, период обращения — 112 лет",
amount: amount,
savePaymentMethod: SavePaymentMethod.on,
applePayID: applePayID,
shopId: shopId,
paymentMethodId: paymentMethodId,
isSafeDeal: false,
gatewayId: gatewayId,
testModeSettings: null,
isLoggingEnabled: true,
customizationSettings: const CustomizationSettings(),
customerId: "app.example.demo.payments.yookassa",
hostParameters: config.hostParameters,
);
var result = await YookassaPaymentsFlutter.bankCardRepeat(
savedBankCardModuleInputData);
if (result is SuccessTokenizationResult) {
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => SuccessTokenizationScreen(
result: result, repeatData: savedBankCardModuleInputData)));
} else if (result is ErrorTokenizationResult) {
showDialog(
context: context,
builder: (context) => AlertDialog(content: Text(result.error)));
return;
}
}
}