halyk token decline response parse

backend_nfc
suvaissov 2021-06-25 14:09:21 +06:00
parent cb6e68bb1e
commit 33897977a8
6 changed files with 184 additions and 61 deletions

View File

@ -2,18 +2,74 @@ import 'package:intl/intl.dart';
class HalykPosSession {
const HalykPosSession(
{this.login, this.token, this.serverTime, this.tokenTimeout});
{this.login,
this.token,
this.serverTime,
this.tokenTimeout,
this.result});
final String login;
final String token;
final DateTime serverTime;
final int tokenTimeout;
final ResultBean result;
static HalykPosSession fromJson(Map<String, dynamic> data) => HalykPosSession(
login: data['login'],
token: data['token'],
result: ResultBean.fromMap(data['result']),
serverTime: data['ServerTime'] != null
? new DateFormat("dd.MM.yyyy HH:mm:ss ZZZ").parse(data['ServerTime'])
: null,
tokenTimeout: data['TokenTimeout']);
}
/// ServerTime : "25.06.2021 13:18:00 GMT+06:00"
/// ResultCode : "040"
/// ResultStr : "Unknown operator login. Check the correctness of the data or contact support."
/// Response : {"Code":"040","Description":"Unknown operator login. Check the correctness of the data or contact support."}
class ResultBean {
String ServerTime;
String ResultCode;
String ResultStr;
ResponseBean Response;
static ResultBean fromMap(Map<String, dynamic> map) {
if (map == null) return null;
ResultBean resultBean = ResultBean();
resultBean.ServerTime = map['ServerTime'];
resultBean.ResultCode = map['ResultCode'];
resultBean.ResultStr = map['ResultStr'];
resultBean.Response = ResponseBean.fromMap(map['Response']);
return resultBean;
}
Map toJson() => {
"ServerTime": ServerTime,
"ResultCode": ResultCode,
"ResultStr": ResultStr,
"Response": Response,
};
}
/// Code : "040"
/// Description : "Unknown operator login. Check the correctness of the data or contact support."
class ResponseBean {
String Code;
String Description;
static ResponseBean fromMap(Map<String, dynamic> map) {
if (map == null) return null;
ResponseBean responseBean = ResponseBean();
responseBean.Code = map['Code'];
responseBean.Description = map['Description'];
return responseBean;
}
Map toJson() => {
"Code": Code,
"Description": Description,
};
}

View File

@ -74,6 +74,7 @@ class ApiService extends BaseService {
Map<String, String> requestBody = <String, String>{'login': login, 'hash': hash};
var response = await requestFormData('/hb/pos/gettoken', requestBody, bodyEntry: true, posEndPoint: true, statusCheck: false);
print(response);
return HalykPosSession.fromJson(jsonDecode(response));
}

View File

@ -3,7 +3,7 @@ import 'package:aman_kassa_flutter/core/base/base_service.dart';
import 'package:aman_kassa_flutter/core/locator.dart';
import 'package:aman_kassa_flutter/core/models/close_day_data.dart';
import 'package:aman_kassa_flutter/core/models/halyk/halyk_close_day_dao.dart' as Cd;
import 'package:aman_kassa_flutter/core/models/halyk/halyk_post_session.dart';
import 'package:aman_kassa_flutter/core/models/halyk/halyk_post_session.dart' as Ps;
import 'package:aman_kassa_flutter/core/models/halyk/halyk_response_dao.dart';
import 'package:aman_kassa_flutter/core/models/transaction_item.dart';
import 'package:aman_kassa_flutter/core/services/ApiService.dart';
@ -31,8 +31,8 @@ class BankService extends BaseService {
return int.parse(result) ?? 0;
}
Future<HalykPosSession> renewToken({String token, String login, String password}) async {
HalykPosSession result;
Future<Ps.HalykPosSession> renewToken({String token, String login, String password}) async {
Ps.HalykPosSession result;
try {
result = await _api.halykPosToken(token, login, password);
} catch (e, stack) {

View File

@ -205,7 +205,15 @@ class _MyFloatingActionButtonState extends State<MyFloatingActionButton> {
color: whiteColor,
),
onPressed: () async {
var today = new DateTime.now();
var yesterday = today.subtract(new Duration(days: 1));
if( Redux.store.state.userState == null
|| Redux.store.state.userState.smena == null
|| Redux.store.state.userState.smena.startedAt == null
|| yesterday.isAfter(Redux.store.state.userState.smena.startedAt)) {
_dialog.showDialog(description: 'Текущая смена открыта более 24 ч. Необходимо закрыть смену и открыть ее заново.');
return;
}
try {
await Redux.store.dispatch(changePinSkipFromSetting(true));
AmanDao<CardData> response = await reversalHalykPos(widget.data.cardData, widget.data.voucher.total);
@ -237,6 +245,15 @@ class _MyFloatingActionButtonState extends State<MyFloatingActionButton> {
color: whiteColor,
),
onPressed: () async {
var today = new DateTime.now();
var yesterday = today.subtract(new Duration(days: 1));
if( Redux.store.state.userState == null
|| Redux.store.state.userState.smena == null
|| Redux.store.state.userState.smena.startedAt == null
|| yesterday.isAfter(Redux.store.state.userState.smena.startedAt)) {
_dialog.showDialog(description: 'Текущая смена открыта более 24 ч. Необходимо закрыть смену и открыть ее заново.');
return;
}
try {
await Redux.store.dispatch(changePinSkipFromSetting(true));

View File

@ -1,6 +1,7 @@
import 'package:aman_kassa_flutter/core/locator.dart';
import 'package:aman_kassa_flutter/core/logger.dart';
import 'package:aman_kassa_flutter/core/models/halyk/halyk_close_day_dao.dart' as Cd;
import 'package:aman_kassa_flutter/core/models/halyk/halyk_close_day_dao.dart'
as Cd;
import 'package:aman_kassa_flutter/core/models/halyk/halyk_response_dao.dart';
import 'package:aman_kassa_flutter/core/services/DataService.dart';
import 'package:aman_kassa_flutter/core/services/dialog_service.dart';
@ -24,80 +25,118 @@ Future<AmanDao<CardData>> paymentHalykPos(double total) async {
String token = Redux.store.state.userState.user.token;
BankState bankState = Redux.store.state.bankState;
//права доступа
HalykPosSession session =
await _bankService.renewToken(token: token, login: bankState.login, password: bankState.password);
HalykPosSession session = await _bankService.renewToken(
token: token, login: bankState.login, password: bankState.password);
if (session.token == null) {
return AmanDao<CardData>(success: false, msg: 'Отказано в доступе к API банка');
return sessionDeclineDao(session);
}
//Инициализация
HalykResponse response = await _bankService.pay(token: session.token, amount: total);
HalykResponse response =
await _bankService.pay(token: session.token, amount: total);
if (response.result.code == 0) {
CardData cardData = new CardData(
authorizationCode: response.transaction.instrumentSpecificData.authorizationCode,
cardholderName: response.transaction.instrumentSpecificData.cardholderName,
cardNumber: response.transaction.instrumentSpecificData.maskedPan,
operationDay: response.transaction.operationDay,
transactionNumber: response.transaction.transactionNumber,
terminalId: response.transaction.terminalId,
transactionType: 'payment'
);
return AmanDao<CardData>(msg: response.result.description, success: true, data: cardData);
}
return AmanDao<CardData>(msg: response.result.errorData !=null ? response.result.errorData.description : response.result.description, success: false);
}
Future<AmanDao<CardData>> refundHalykPos(CardData refundData, double total) async {
//Авторизация
String token = Redux.store.state.userState.user.token;
BankState bankState = Redux.store.state.bankState;
//права доступа
HalykPosSession session =
await _bankService.renewToken(token: token, login: bankState.login, password: bankState.password);
if (session.token == null) {
return AmanDao<CardData>(success: false, msg: 'Отказано в доступе к API банка');
}
HalykResponse response = await _bankService.refund(token: session.token, amount: total, operDay: refundData.operationDay, terminalId: refundData.terminalId, transNum: refundData.transactionNumber );
if (response.result.code == 0) {
CardData cardData = new CardData(
authorizationCode: response.transaction.instrumentSpecificData.authorizationCode,
cardholderName: response.transaction.instrumentSpecificData.cardholderName,
authorizationCode:
response.transaction.instrumentSpecificData.authorizationCode,
cardholderName:
response.transaction.instrumentSpecificData.cardholderName,
cardNumber: response.transaction.instrumentSpecificData.maskedPan,
operationDay: response.transaction.operationDay,
transactionNumber: response.transaction.transactionNumber,
terminalId: response.transaction.terminalId,
transactionType: 'refund'
);
return AmanDao<CardData>(msg: response.result.description, success: true, data: cardData);
transactionType: 'payment');
return AmanDao<CardData>(
msg: response.result.description, success: true, data: cardData);
}
return AmanDao<CardData>(msg: response.result.errorData !=null ? response.result.errorData.description : response.result.description, success: false);
return AmanDao<CardData>(
msg: response.result.errorData != null
? response.result.errorData.description
: response.result.description,
success: false);
}
Future<AmanDao<CardData>> reversalHalykPos(CardData refundData, double total) async {
AmanDao<CardData> sessionDeclineDao(HalykPosSession session) {
String msg = 'Отказано в доступе к API банка';
if(session.result?.Response?.Description != null) {
msg = '${session.result.Response.Description} (${session.result.Response.Code}) ';
}
return AmanDao<CardData>(success: false, msg: msg);
}
Future<AmanDao<CardData>> refundHalykPos(
CardData refundData, double total) async {
//Авторизация
String token = Redux.store.state.userState.user.token;
BankState bankState = Redux.store.state.bankState;
//права доступа
HalykPosSession session =
await _bankService.renewToken(token: token, login: bankState.login, password: bankState.password);
HalykPosSession session = await _bankService.renewToken(
token: token, login: bankState.login, password: bankState.password);
if (session.token == null) {
return AmanDao<CardData>(success: false, msg: 'Отказано в доступе к API банка');
return sessionDeclineDao(session);
}
HalykResponse response = await _bankService.refund(
token: session.token,
amount: total,
operDay: refundData.operationDay,
terminalId: refundData.terminalId,
transNum: refundData.transactionNumber);
if (response.result.code == 0) {
CardData cardData = new CardData(
authorizationCode:
response.transaction.instrumentSpecificData.authorizationCode,
cardholderName:
response.transaction.instrumentSpecificData.cardholderName,
cardNumber: response.transaction.instrumentSpecificData.maskedPan,
operationDay: response.transaction.operationDay,
transactionNumber: response.transaction.transactionNumber,
terminalId: response.transaction.terminalId,
transactionType: 'refund');
return AmanDao<CardData>(
msg: response.result.description, success: true, data: cardData);
}
return AmanDao<CardData>(
msg: response.result.errorData != null
? response.result.errorData.description
: response.result.description,
success: false);
}
Future<AmanDao<CardData>> reversalHalykPos(
CardData refundData, double total) async {
//Авторизация
String token = Redux.store.state.userState.user.token;
BankState bankState = Redux.store.state.bankState;
//права доступа
HalykPosSession session = await _bankService.renewToken(
token: token, login: bankState.login, password: bankState.password);
if (session.token == null) {
return sessionDeclineDao(session);
}
log.i(refundData.toJson());
HalykResponse response = await _bankService.reversal(token: session.token, operDay: refundData.operationDay, terminalId: refundData.terminalId, transNum: refundData.transactionNumber );
HalykResponse response = await _bankService.reversal(
token: session.token,
operDay: refundData.operationDay,
terminalId: refundData.terminalId,
transNum: refundData.transactionNumber);
if (response.result.code == 0) {
CardData cardData = new CardData(
authorizationCode: response.transaction.instrumentSpecificData.authorizationCode,
cardholderName: response.transaction.instrumentSpecificData.cardholderName,
authorizationCode:
response.transaction.instrumentSpecificData.authorizationCode,
cardholderName:
response.transaction.instrumentSpecificData.cardholderName,
cardNumber: response.transaction.instrumentSpecificData.maskedPan,
operationDay: response.transaction.operationDay,
transactionNumber: response.transaction.transactionNumber,
terminalId: response.transaction.terminalId,
transactionType: 'reversal'
);
return AmanDao<CardData>(msg: response.result.description, success: true, data: cardData);
transactionType: 'reversal');
return AmanDao<CardData>(
msg: response.result.description, success: true, data: cardData);
}
return AmanDao<CardData>(msg: response.result.errorData !=null ? response.result.errorData.description : response.result.description, success: false);
return AmanDao<CardData>(
msg: response.result.errorData != null
? response.result.errorData.description
: response.result.description,
success: false);
}
Future<Cd.HalykCloseDayDao> closeDayHalykPos() async {
@ -105,16 +144,15 @@ Future<Cd.HalykCloseDayDao> closeDayHalykPos() async {
String token = Redux.store.state.userState.user.token;
BankState bankState = Redux.store.state.bankState;
//права доступа
HalykPosSession session =
await _bankService.renewToken(token: token, login: bankState.login, password: bankState.password);
HalykPosSession session = await _bankService.renewToken(
token: token, login: bankState.login, password: bankState.password);
if (session.token == null) {
return new Cd.HalykCloseDayDao(result: Cd.ResultBean(description: 'Отказано в доступе к API банка', code: -1));
return new Cd.HalykCloseDayDao(
result: Cd.ResultBean(
description: 'Отказано в доступе к API банка', code: -1));
}
//Инициализация
Cd.HalykCloseDayDao response = await _bankService.closeDay(token: session.token);
Cd.HalykCloseDayDao response =
await _bankService.closeDay(token: session.token);
return response;
}

View File

@ -217,6 +217,17 @@ class _PaymentViewState extends State<PaymentView> {
}
return InkWell(
onTap: () async {
var today = new DateTime.now();
var yesterday = today.subtract(new Duration(days: 1));
if( Redux.store.state.userState == null
|| Redux.store.state.userState.smena == null
|| Redux.store.state.userState.smena.startedAt == null
|| yesterday.isAfter(Redux.store.state.userState.smena.startedAt)) {
_dialogService.showDialog(description: 'Текущая смена открыта более 24 ч. Необходимо закрыть смену и открыть ее заново.');
return;
}
try {
await Redux.store.dispatch(changePinSkipFromSetting(true));
AmanDao<CardData> data = await paymentHalykPos(_total);