A complete Point of Sale (POS) application for Android devices with NFC support, built using Kotlin and Jetpack Compose. This application enables contactless EMV chip card transactions with ISO8583 message processing.
- NFC EMV Card Reading - Contactless chip card processing using Android NFC APIs
- ISO8583 Message Processing - Complete message formatting and parsing
- Transaction Management - Authorization, reversal, and settlement requests
- Host Communication - TCP/IP and SSL/TLS support for payment processors
- Real-time UI Updates - Reactive interface with Jetpack Compose
- Android Keystore Integration - Secure key management
- Data Encryption - Sensitive data protection
- Network Security - SSL/TLS communication with certificate pinning
- Card Data Masking - PCI DSS compliance considerations
- MVVM Pattern - Clean architecture with ViewModel and StateFlow
- Jetpack Compose - Modern declarative UI
- Kotlin Coroutines - Async operations and structured concurrency
- Material Design 3 - Contemporary UI components
- Android device with NFC (API level 23+)
- EMV chip cards for testing
- Network connectivity for payment host communication
- Android Studio Electric Eel (2022.1.1) or newer
- Android SDK API 23-34
- Kotlin 1.9.22+
- Gradle 8.0+
git clone https://github.com/yourusername/soft-pos-android.git
cd soft-pos-android- Open Android Studio
- Select "Open an existing project"
- Navigate to the cloned directory
- Wait for Gradle sync to complete
Update configuration in Constants.kt:
const val DEFAULT_HOST_IP = "your-payment-host.com"
const val DEFAULT_HOST_PORT = 443
const val DEFAULT_TERMINAL_ID = "your-terminal-id"
const val DEFAULT_MERCHANT_ID = "your-merchant-id"./gradlew assembleDebug
./gradlew installDebug-
Launch Application
- Ensure NFC is enabled on device
- Application displays transaction screen
-
Enter Transaction Amount
- Input amount in decimal format (e.g., 10.00)
- Tap "Start Transaction" button
-
Tap Card
- Hold EMV chip card near device NFC antenna
- Application reads card data automatically
-
Process Transaction
- App sends authorization request to payment host
- Displays approval/decline result
Access settings through PreferencesManager:
val prefsManager = PreferencesManager(context)
prefsManager.setHostIP("192.168.1.100")
prefsManager.setHostPort(8080)
prefsManager.setTerminalId("12345678")./gradlew test./gradlew connectedAndroidTest- Use demo mode with mock card data
- Test with EMV test cards
- Verify network communication with test host
- Uses HTTP for localhost testing
- Mock responses for offline development
- Debug logging enabled
- Enable HTTPS only in network security config
- Implement certificate pinning for payment hosts
- Add proper key management for sensitive data
- Follow PCI DSS requirements for card data handling
- Enable ProGuard for code obfuscation
// Example: Secure card data handling
val encryptedPAN = SecurityUtils.encryptData(cardData.pan)
val maskedPAN = cardData.getMaskedPAN() // For display onlyval cardReader = NFCCardReader()
val cardData: EMVCardData = cardReader.readCard(nfcTag)val message = ISO8583Message("0100") // Authorization request
message.setField(2, pan)
message.setField(4, amount)
val packedMessage = message.pack()val hostComm = HostCommunication(hostIP, hostPort)
hostComm.connect()
val response = hostComm.sendMessage(requestData)NFC Not Working
- Verify NFC is enabled in device settings
- Check if device supports ISO-DEP
- Ensure proper card positioning
Network Connection Failed
- Verify host IP and port configuration
- Check network connectivity
- Confirm firewall settings
Card Reading Errors
- Try different EMV cards
- Clean card contacts
- Adjust card positioning
Enable verbose logging in debug builds:
if (BuildConfig.DEBUG) {
Log.d(TAG, "Debug information")
}- Fork the repository
- Create feature branch (
git checkout -b feature/new-feature) - Commit changes (
git commit -am 'Add new feature') - Push to branch (
git push origin feature/new-feature) - Create Pull Request
- Follow Kotlin coding conventions
- Use meaningful variable names
- Add documentation for public APIs
- Include unit tests for new features
This project is licensed under the MIT License - see the LICENSE file for details.
For support and questions:
- Create an issue on GitHub
- Email: support@mpayer.ng
- Documentation: https://softpos-docs.mpayer.ng
- Android NFC documentation and samples
- EMVCo specifications
- ISO8583 standard documentation
- Jetpack Compose development guides