Среда
Flutter: 3.35.5
Android: minSdkVersion 26
NearPay SDK: последняя версия
Среда: песочница
Устройство: iMin POS (например, S1)
Что работает
NearPay SDK инициализируется успешно
Разрешения NFC предоставлены
Устройство и терминал включены
Проблема
При попытке подключения к терминал, операция завершается со следующей ошибкой: пользователь не найден. Это происходит, даже если инициализация SDK завершается без каких-либо проблем.
import 'package:donations/core/nearpay/terminal_config.dart';
import 'package:flutter/material.dart';
import 'package:flutter_terminal_sdk/flutter_terminal_sdk.dart';
импортировать 'package:flutter_terminal_sdk/models/card_reader_callbacks.dart';
import 'package:flutter_terminal_sdk/models/data/ui_dock_position.dart';
импортировать «пакет: flutter_terminal_sdk/models/nearpay_user_response.dart»;
импортировать «пакет: flutter_terminal_sdk/models/purchase_callbacks.dart»;
импорт 'package:flutter_terminal_sdk/models/terminal_response.dart';
import 'package:uuid/uuid.dart';
final FlutterTerminalSdk _terminalSdk = FlutterTerminalSdk();
Future Initialize() async {
// инициализация TerminalSDK может вызвать исключение, поэтому оберните его в блок try-catch
try {
Код: Выделить всё
await \_terminalSdk.initialize(
environment: Environment.sandbox,
// Choose sandbox, production, internal
googleCloudProjectNumber: 162056333315,
// Add your google cloud project number
huaweiSafetyDetectApiKey:
"3lA5jiaqe14enqRRgsVPj0O5FRmEL4LUjsoDlqqXwNs7Jy7eO0pUFvAGhy4w",
// Add your huawei safety detect api key
uiDockPosition: UiDockPosition.BOTTOM_CENTER,
// Optional: set the location of the Tap to Pay modal
country: Country.sa, // Choose country: sa, tr, usa
);
Код: Выделить всё
print("Error initializing TerminalSDK: $e");
}
Будущее sendOtp(String mobile) async {
попробуй {
Код: Выделить всё
await \_terminalSdk.sendMobileOtp(mobile);
print("✅ OTP sent to $mobile");
Код: Выделить всё
print("❌ Error sending OTP: $e");
Future connectToTerminal() async {
попробуй {
Код: Выделить всё
print("🔄 جاري الاتصال بالـ Terminal (TID: ${TerminalConfig.tid})...");
// await initialize();
final result = await \_terminalSdk.connectTerminal(
tid: TerminalConfig.tid,
userUUID: TerminalConfig.userUUID,
terminalUUID: TerminalConfig.terminalUUID,
);
print(result);
return result;
Код: Выделить всё
print("❌ خطأ أثناء الاتصال: $e");
print(e.toString());
if (e.toString().contains("timeout")) {
print("⏰ الجهاز غير متصل بالشبكة أو بعيد");
} else if (e.toString().contains("invalid")) {
print("🔑 تأكدي من TID أو UUID");
}
return null;
Future транзакция1 (контекст BuildContext, строковая сумма) async {
//await Initialize();
final mobile = "+966509738300";
if (TerminalConfig.userUUID.isEmpty) {
Код: Выделить всё
await sendOtp(mobile);
final code = await promptForOtp(context);
if (code == null || code.isEmpty) {
print("❌ User cancelled OTP entry");
return false;
}
final verified = await verifyOtp(mobile, code);
if (!verified) {
print("❌ OTP verification failed, aborting transaction");
return false;
}
final linkedTerminal = await ConnectToTerminal();
if (connectedTerminal == null) {
Код: Выделить всё
print("فشل الاتصال بالترمينال، لا يمكن إتمام العملية");
return false;
double? sumDouble = double.tryParse(amount.replaceAll(',', ''));
try {
Код: Выделить всё
final intentUUID = const Uuid().v4();
final customerReferenceNumber = "01142674856";
await connectedTerminal?.purchase(
intentUUID: intentUUID,
amount: amountDouble?.toInt() ?? 0,
callbacks: PurchaseCallbacks(
cardReaderCallbacks: CardReaderCallbacks(
onCardReadSuccess: () {
print("success");
},
onReaderDismissed: () {
print("Reader dismissed by user");
},
),
),
);
print("connectedTerminal.tid:${connectedTerminal?.tid}");
Код: Выделить всё
return true;
Код: Выделить всё
print(e.toString());
return false;
}
Future PromptForOtp(BuildContext context) async {
String otp = '';
return showDialog(
Код: Выделить всё
context: context,
barrierDismissible: false,
builder: (context) =\> AlertDialog(
title: Text('Enter OTP'),
content: TextField(
keyboardType: TextInputType.number,
onChanged: (value) =\> otp = value,
decoration: InputDecoration(hintText: "OTP code"),
),
actions: \[
TextButton(
onPressed: () =\> Navigator.of(context).pop(otp),
child: Text('Submit'),
),
\],
),
}
БудущееverifyOtp(String mobile, String code) async {
try {
Код: Выделить всё
final user = await \_terminalSdk.verifyMobileOtp(
mobileNumber: mobile,
code: code,
);
TerminalConfig.userUUID = user.userUUID ?? "";
print("✅ OTP verified, userUUID: ${TerminalConfig.userUUID}");
return TerminalConfig.userUUID.isNotEmpty;
Код: Выделить всё
print("❌ Error verifying OTP: $e");
return false;
Я использую функцию транзакции 1
Вопрос
Означает ли ошибка «Пользователь не найден», что терминал не связан с той же учетной записью продавца/пользователя, что и учетные данные API, даже если инициализация SDK прошла успешно?
Если да, то каков правильный способ проверки или исправления конфигурация терминала-продавца для тестирования в песочнице?
Подробнее здесь: https://stackoverflow.com/questions/798 ... d-error-in
Мобильная версия