1.0.3: Fixed iOS confirmation flow. Refactored TokenizationResult, now it's have SuccessTokenizationResult, ErrorTokenizationResult and CanceledTokenizationResult versions.

This commit is contained in:
Искандар Р. Шабаев
2022-09-08 11:32:35 +03:00
parent 187f2a4af5
commit 6b72dfee66
15 changed files with 267 additions and 164 deletions
+29 -12
View File
@@ -6,11 +6,16 @@ class PaymentMethodTypes {
return paymentMethodTypes.map((e) => e.toString()).toList();
}
static const PaymentMethodTypes bankCard = PaymentMethodTypes([PaymentMethod.bankCard]);
static const PaymentMethodTypes yooMoney = PaymentMethodTypes([PaymentMethod.yooMoney]);
static const PaymentMethodTypes sberbank = PaymentMethodTypes([PaymentMethod.sberbank]);
static const PaymentMethodTypes applePay = PaymentMethodTypes([PaymentMethod.applePay]);
static const PaymentMethodTypes googlePay = PaymentMethodTypes([PaymentMethod.googlePay]);
static const PaymentMethodTypes bankCard =
PaymentMethodTypes([PaymentMethod.bankCard]);
static const PaymentMethodTypes yooMoney =
PaymentMethodTypes([PaymentMethod.yooMoney]);
static const PaymentMethodTypes sberbank =
PaymentMethodTypes([PaymentMethod.sberbank]);
static const PaymentMethodTypes applePay =
PaymentMethodTypes([PaymentMethod.applePay]);
static const PaymentMethodTypes googlePay =
PaymentMethodTypes([PaymentMethod.googlePay]);
static const PaymentMethodTypes all = PaymentMethodTypes([
PaymentMethod.bankCard,
PaymentMethod.yooMoney,
@@ -20,10 +25,22 @@ class PaymentMethodTypes {
]);
}
enum PaymentMethod {
bankCard,
yooMoney,
applePay,
googlePay,
sberbank
}
enum PaymentMethod { bankCard, yooMoney, applePay, googlePay, sberbank }
extension PaymentMethodExtension on PaymentMethod {
static PaymentMethod fromStringValue(String rawValue) {
switch (rawValue) {
case 'bank_card':
return PaymentMethod.bankCard;
case 'yoo_money':
return PaymentMethod.yooMoney;
case 'sberbank':
return PaymentMethod.sberbank;
case 'apple_pay':
return PaymentMethod.applePay;
case 'google_pay':
return PaymentMethod.googlePay;
}
return PaymentMethod.bankCard;
}
}
+53 -26
View File
@@ -1,35 +1,62 @@
import 'package:yookassa_payments_flutter/models/payment_method_types.dart';
class TokenizationResult {
String token;
PaymentMethod? paymentMethodType;
TokenizationResult._();
TokenizationResult(this.token, this.paymentMethodType);
factory TokenizationResult.success(
String token, PaymentMethod? paymentMethodType) =
SuccessTokenizationResult;
factory TokenizationResult.canceled() = CanceledTokenizationResult;
factory TokenizationResult.error(String error) = ErrorTokenizationResult;
factory TokenizationResult.fromJson(Map<String, dynamic> json) {
var token = json['paymentToken'];
PaymentMethod? paymentMethodType;
switch(json['paymentMethodType']){
case "sberbank":
paymentMethodType = PaymentMethod.sberbank;
break;
case "bank_card":
paymentMethodType = PaymentMethod.bankCard;
break;
case "yoo_money":
paymentMethodType = PaymentMethod.yooMoney;
break;
case "apple_pay":
paymentMethodType = PaymentMethod.applePay;
break;
case "google_pay":
paymentMethodType = PaymentMethod.googlePay;
break;
final status = json['status'];
switch (status) {
case 'success':
{
final token = json['paymentToken'];
PaymentMethod? paymentMethodType =
_paymentMethodFromString(json['paymentMethodType']);
return TokenizationResult.success(token, paymentMethodType);
}
case 'canceled':
return TokenizationResult.canceled();
default:
break;
return TokenizationResult.error(json['error'] ?? 'Unknown error');
}
return TokenizationResult(token, paymentMethodType);
}
}
}
class SuccessTokenizationResult extends TokenizationResult {
final String token;
final PaymentMethod? paymentMethodType;
SuccessTokenizationResult(this.token, this.paymentMethodType) : super._();
}
class CanceledTokenizationResult extends TokenizationResult {
CanceledTokenizationResult() : super._();
}
class ErrorTokenizationResult extends TokenizationResult {
final String error;
ErrorTokenizationResult(this.error) : super._();
}
PaymentMethod? _paymentMethodFromString(String type) {
switch (type) {
case "sberbank":
return PaymentMethod.sberbank;
case "bank_card":
return PaymentMethod.bankCard;
case "yoo_money":
return PaymentMethod.yooMoney;
case "apple_pay":
return PaymentMethod.applePay;
case "google_pay":
return PaymentMethod.googlePay;
default:
return null;
}
}
+17 -13
View File
@@ -6,6 +6,7 @@ export 'models/tokenization_settings.dart';
export 'models/customization_settings.dart';
export 'models/google_pay_parameters.dart';
export 'models/test_mode_settings.dart';
export 'models/tokenization_result.dart';
export 'input_data/tokenization_module_input_data.dart';
import 'input_data/saved_card_module_input_data.dart';
@@ -14,28 +15,31 @@ import 'package:flutter/services.dart';
import 'package:yookassa_payments_flutter/models/tokenization_result.dart';
import 'input_data/tokenization_module_input_data.dart';
import 'models/payment_method_types.dart';
import 'models/tokenization_result.dart';
class YookassaPaymentsFlutter {
static const MethodChannel _channel = MethodChannel('ru.yoomoney.yookassa_payments_flutter/yoomoney');
static const MethodChannel _channel =
MethodChannel('ru.yoomoney.yookassa_payments_flutter/yoomoney');
static Future<TokenizationResult> tokenization(TokenizationModuleInputData data) async {
static Future<TokenizationResult> tokenization(
TokenizationModuleInputData data) async {
var inputData = data.toJson();
return await _channel
.invokeMethod('tokenization', inputData).then((value) => TokenizationResult.fromJson(json.decode(value)));
.invokeMethod('tokenization', inputData)
.then((value) => TokenizationResult.fromJson(json.decode(value)));
}
static Future<void> confirmation(String url, PaymentMethod? paymentMethod) async {
await _channel
.invokeMethod('confirmation',
{
'url': url,
'paymentMethod': paymentMethod?.name
}
);
static Future<void> confirmation(
String url, PaymentMethod? paymentMethod) async {
var inputData = {'url': url, 'paymentMethod': paymentMethod?.name};
return await _channel.invokeMethod('confirmation', inputData);
}
static Future<TokenizationResult> bankCardRepeat(SavedBankCardModuleInputData data) async {
return await _channel.invokeMethod('repeat', data.toJson()).then((value) => TokenizationResult.fromJson(json.decode(value)));
static Future<TokenizationResult> bankCardRepeat(
SavedBankCardModuleInputData data) async {
return await _channel
.invokeMethod('repeat', data.toJson())
.then((value) => TokenizationResult.fromJson(json.decode(value)));
}
}