Release 1.0.4 version
This commit is contained in:
@@ -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,
|
||||
);
|
||||
}
|
||||
@@ -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']),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'app.dart';
|
||||
import 'flavors.dart';
|
||||
|
||||
void main() {
|
||||
F.appFlavor = Flavor.prod;
|
||||
runApp(const App());
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'app.dart';
|
||||
import 'flavors.dart';
|
||||
|
||||
void main() {
|
||||
F.appFlavor = Flavor.dev;
|
||||
runApp(const App());
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'app.dart';
|
||||
import 'flavors.dart';
|
||||
|
||||
void main() {
|
||||
F.appFlavor = Flavor.prod;
|
||||
runApp(const App());
|
||||
}
|
||||
@@ -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("Показать токен"))
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user