Я работаю с SDK для Android-терминала https://docs.stripe.com/terminal/quickstart?reader=wp3 во Flutter, потому что для Flutter нет SDK. Я пытаюсь много дней. Терминал Stripe инициализировался, но не обнаруживает устройство чтения Wisepad 3. Код Flutter =
package com.example.np_casse
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.os.BatteryManager
import androidx.annotation.NonNull
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import com.stripe.stripeterminal.Terminal
import com.stripe.stripeterminal.external.callable.*
import com.stripe.stripeterminal.external.models.*
import com.stripe.stripeterminal.log.LogLevel
import android.util.Log
import com.stripe.stripeterminal.external.models.Reader
class MainActivity : FlutterActivity() {
private val CHANNEL = "com.example.case/stripe"
private var terminalInitialized = false
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
when (call.method) {
"initializeStripe" -> initializeTerminal(result)
"discoverReaders" -> {
if (terminalInitialized) {
discoverReaders(result)
} else {
result.error("TERMINAL_NOT_INITIALIZED", "Terminal must be initialized first", null)
}
}
"scanCard" -> {
if (terminalInitialized) {
startCardScan(result)
} else {
result.error("TERMINAL_NOT_INITIALIZED", "Terminal must be initialized first", null)
}
}
"makePayment" -> {
if (terminalInitialized) {
makePayment(result)
} else {
result.error("TERMINAL_NOT_INITIALIZED", "Terminal must be initialized first", null)
}
}
"getBatteryLevel" -> getBatteryLevel(result)
"getConnectedDeviceInfo" -> getConnectedDeviceInfo(result) // Fetch device info
else -> result.notImplemented()
}
}
}
private fun initializeTerminal(result: MethodChannel.Result) {
if (!Terminal.isInitialized()) {
try {
Terminal.initTerminal(applicationContext, LogLevel.VERBOSE, TokenProvider(), TerminalEventListener())
terminalInitialized = true
result.success("Stripe Initialized")
} catch (e: TerminalException) {
terminalInitialized = false
result.error("INITIALIZATION_ERROR", "Error initializing Terminal: ${e.message}", null)
}
} else {
terminalInitialized = true
result.success("Stripe Already Initialized")
}
}
private fun discoverReaders(result: MethodChannel.Result) {
if (checkLocationPermissions() && checkBluetoothPermissions()) {
val discoveryConfig = DiscoveryConfiguration.BluetoothDiscoveryConfiguration(isSimulated = false)
val discoveryCallback = object : Callback {
override fun onSuccess() {
result.success("Reader discovery started")
}
override fun onFailure(e: TerminalException) {
result.error("DISCOVERY_ERROR", e.message, null)
}
}
val discoveryListener = object : DiscoveryListener {
override fun onUpdateDiscoveredReaders(readers: List) {
if (readers.isEmpty()) {
result.success("No readers detected.")
} else {
for (reader in readers) {
result.success("Reader found: ${reader.label}")
}
}
}
}
Terminal.getInstance().discoverReaders(discoveryConfig, discoveryListener, discoveryCallback)
} else {
requestPermissions()
}
}
// New method to get connected device info
private fun getConnectedDeviceInfo(result: MethodChannel.Result) {
val reader: Reader? = Terminal.getInstance().connectedReader
if (reader != null) {
val deviceInfo = "Label: ${reader.label}, Serial Number: ${reader.serialNumber}"
result.success(deviceInfo)
} else {
result.success("No reader connected")
}
}
private fun startCardScan(result: MethodChannel.Result) {
val reader = Terminal.getInstance().connectedReader
if (reader != null) {
val paymentIntentParams = PaymentIntentParameters.Builder(listOf(PaymentMethodType.CARD_PRESENT))
.setAmount(1)
.setCurrency("usd")
.build()
Terminal.getInstance().createPaymentIntent(paymentIntentParams, object : PaymentIntentCallback {
override fun onSuccess(paymentIntent: PaymentIntent) {
Terminal.getInstance().collectPaymentMethod(paymentIntent, object : PaymentIntentCallback {
override fun onSuccess(paymentIntent: PaymentIntent) {
Terminal.getInstance().confirmPaymentIntent(paymentIntent, object : PaymentIntentCallback {
override fun onSuccess(paymentIntent: PaymentIntent) {
result.success("Payment Successful")
}
override fun onFailure(e: TerminalException) {
result.error("PAYMENT_CONFIRM_ERROR", "Error confirming payment: ${e.message}", null)
}
})
}
override fun onFailure(e: TerminalException) {
result.error("PAYMENT_METHOD_ERROR", "Error collecting payment method: ${e.message}", null)
}
})
}
override fun onFailure(e: TerminalException) {
result.error("PAYMENT_INTENT_ERROR", "Error creating payment intent: ${e.message}", null)
}
})
} else {
result.error("NO_READER", "No reader connected", null)
}
}
private fun makePayment(result: MethodChannel.Result) {
val reader = Terminal.getInstance().connectedReader
if (reader != null) {
val paymentIntentParams = PaymentIntentParameters.Builder(listOf(PaymentMethodType.CARD_PRESENT))
.setAmount(1)
.setCurrency("usd")
.build()
Terminal.getInstance().createPaymentIntent(paymentIntentParams, object : PaymentIntentCallback {
override fun onSuccess(paymentIntent: PaymentIntent) {
Terminal.getInstance().collectPaymentMethod(paymentIntent, object : PaymentIntentCallback {
override fun onSuccess(paymentIntent: PaymentIntent) {
Terminal.getInstance().confirmPaymentIntent(paymentIntent, object : PaymentIntentCallback {
override fun onSuccess(paymentIntent: PaymentIntent) {
result.success("Payment Successful")
}
override fun onFailure(e: TerminalException) {
result.error("PAYMENT_CONFIRM_ERROR", "Error confirming payment: ${e.message}", null)
}
})
}
override fun onFailure(e: TerminalException) {
result.error("PAYMENT_METHOD_ERROR", "Error collecting payment method: ${e.message}", null)
}
})
}
override fun onFailure(e: TerminalException) {
result.error("PAYMENT_INTENT_ERROR", "Error creating payment intent: ${e.message}", null)
}
})
} else {
result.error("NO_READER", "No reader connected", null)
}
}
private fun getBatteryLevel(result: MethodChannel.Result) {
val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
val batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
result.success(batteryLevel)
}
private fun checkLocationPermissions(): Boolean {
return ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
}
private fun checkBluetoothPermissions(): Boolean {
return ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH) == PackageManager.PERMISSION_GRANTED
}
private fun requestPermissions() {
ActivityCompat.requestPermissions(
this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BLUETOOTH), 1
)
}
}
Я пробовал разные вещи, но не смог найти решения. Если кто-то сталкивался с такой же проблемой и знает, как ее решить, пожалуйста, дайте мне знать. Спасибо
Я работаю с SDK для Android-терминала https://docs.stripe.com/terminal/quickstart?reader=wp3 во Flutter, потому что для Flutter нет SDK. Я пытаюсь много дней. Терминал Stripe инициализировался, но не обнаруживает устройство чтения Wisepad 3. [b]Код Flutter =[/b] [code]import 'package:flutter/material.dart'; import 'package:flutter/services.dart';
class BluetoothConfigurationScreen extends StatefulWidget { const BluetoothConfigurationScreen({super.key});
@override State createState() => _BluetoothConfigurationScreenState(); }
// Method to discover Bluetooth devices and fetch connected device info Future _discoverReaders() async { if (!isTerminalInitialized) { setState(() { _cardInfo = 'Terminal is not initialized yet. Please initialize first.'; }); return; }
try { final result = await platform.invokeMethod('discoverReaders'); setState(() { _cardInfo = result; isReaderConnected = true; // Assuming reader is connected after discovery });
// Method to make a 0.1 cent payment Future _makePayment() async { if (!isTerminalInitialized || !isReaderConnected) { setState(() { _cardInfo = 'Terminal or Reader is not connected. Please initialize and connect first.'; }); return; }
// New method to get connected device info private fun getConnectedDeviceInfo(result: MethodChannel.Result) { val reader: Reader? = Terminal.getInstance().connectedReader if (reader != null) { val deviceInfo = "Label: ${reader.label}, Serial Number: ${reader.serialNumber}" result.success(deviceInfo) } else { result.success("No reader connected") } }
private fun startCardScan(result: MethodChannel.Result) { val reader = Terminal.getInstance().connectedReader if (reader != null) { val paymentIntentParams = PaymentIntentParameters.Builder(listOf(PaymentMethodType.CARD_PRESENT)) .setAmount(1) .setCurrency("usd") .build()
private fun getBatteryLevel(result: MethodChannel.Result) { val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager val batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) result.success(batteryLevel) }
private fun requestPermissions() { ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BLUETOOTH), 1 ) } } [/code] Я пробовал разные вещи, но не смог найти решения. Если кто-то сталкивался с такой же проблемой и знает, как ее решить, пожалуйста, дайте мне знать. Спасибо
В настоящее время я занимаюсь разработкой POS-приложения на базе Flutter, которое позволяет мне обрабатывать платежи по кредитным картам. Первоначально я использовал triPOS Mobile для подключения своего приложения к сканеру кредитных карт. Однако...
Я пытаюсь реализовать шлюз интеграции платежей с использованием полосы в моем приложении andorid. Я использую правильный СЕКРЕТНЫЙ ключ и ПУБЛИКУЕМЫЙ ключ. сервер полосы отправляет ответ на мой запрос, но когда он отправляет ephermal_key, платежный...
Я не использую Stripe.JS, потому что мне нужен собственный пользовательский интерфейс. Я получил данные карты моего клиента. Я использую PHP SDK. Мой рабочий процесс:
создать клиента добавить/прикрепить способ оплаты для клиента создать намерение...