Quick Start: Your First Transaction
This guide helps you create your first successful payment transaction using the Get Smart App2App integration. You'll create an Intent, submit a payment request, and handle the transaction result—all in a few minutes.
What You'll Build
In this tutorial, you'll create a simple Android method that creates a payment intent, adds the required transaction parameters, launches the Get Smart application, and handles the transaction result.
Requirements
Before you begin, ensure you have:
- The Get Smart application installed on your test device
- An Android project set up with a working Activity
- Basic familiarity with Android development and Intents
Tip: Make sure the Get Smart application is updated to the latest version to ensure compatibility.
Step 1: Define the Request Code
First, add a constant to your Activity to identify this payment request:
public class MainActivity extends AppCompatActivity {
// Request code to identify the payment transaction
private static final int REQUEST_CODE_PAYMENT = 1001;
// ... rest of your Activity code
}public class MainActivity extends AppCompatActivity {
// Request code to identify the payment transaction
private static final int REQUEST_CODE_PAYMENT = 1001;
// ... rest of your Activity code
}Step 2: Create the Payment Method
Add a method to initiate the payment transaction:
private void startPayment(double amount, String invoice) {
// 1. Create the Intent with the specific action name
Intent intent = new Intent("es.android.redsys.mPOS.movil.tpvAndroid_PAYMENT_REQUEST");
// 2. Add the required parameters
intent.putExtra("amount", amount);
intent.putExtra("invoice", invoice);
intent.putExtra("type", 1); // 1 = Sale transaction
// 3. Launch the Get Smart app with error handling
try {
startActivityForResult(intent, REQUEST_CODE_PAYMENT);
} catch (ActivityNotFoundException e) {
// The Get Smart app is not installed
showErrorDialog();
}
}
private void showErrorDialog() {
new AlertDialog.Builder(this)
.setTitle("Payment App Not Found")
.setMessage("Please ensure the Get Smart application is installed and updated.")
.setPositiveButton("OK", null)
.show();
}private void startPayment(double amount, String invoice) {
// 1. Create the Intent with the specific action name
Intent intent = new Intent("es.android.redsys.mPOS.movil.tpvAndroid_PAYMENT_REQUEST");
// 2. Add the required parameters
intent.putExtra("amount", amount);
intent.putExtra("invoice", invoice);
intent.putExtra("type", 1); // 1 = Sale transaction
// 3. Launch the Get Smart app with error handling
try {
startActivityForResult(intent, REQUEST_CODE_PAYMENT);
} catch (ActivityNotFoundException e) {
// The Get Smart app is not installed
showErrorDialog();
}
}
private void showErrorDialog() {
new AlertDialog.Builder(this)
.setTitle("Payment App Not Found")
.setMessage("Please ensure the Get Smart application is installed and updated.")
.setPositiveButton("OK", null)
.show();
}Note: The request codeREQUEST_CODE_PAYMENTis an integer constant defined by you. You will use this same code in theonActivityResultmethod to identify which request is returning.
Step 3: Handle the Transaction Result
onActivityResult method to receive the transaction outcome:@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_PAYMENT) {
if (resultCode == RESULT_OK && data != null) {
// Transaction completed - check if it was authorized
String result = data.getStringExtra("RESULT");
if ("AUTORIZADA".equals(result)) {
// Payment successful!
String authNumber = data.getStringExtra("AUTORIZATION_NUMBER");
String orderNumber = data.getStringExtra("ORDER");
showSuccessMessage("Payment approved! Auth: " + authNumber);
} else {
// Payment denied
String errorMsg = data.getStringExtra("ERROR_MSG");
showErrorMessage("Payment denied: " + errorMsg);
}
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the transaction
showInfoMessage("Transaction cancelled by user");
}
}
}
private void showSuccessMessage(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
private void showErrorMessage(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
private void showInfoMessage(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_PAYMENT) {
if (resultCode == RESULT_OK && data != null) {
// Transaction completed - check if it was authorized
String result = data.getStringExtra("RESULT");
if ("AUTORIZADA".equals(result)) {
// Payment successful!
String authNumber = data.getStringExtra("AUTORIZATION_NUMBER");
String orderNumber = data.getStringExtra("ORDER");
showSuccessMessage("Payment approved! Auth: " + authNumber);
} else {
// Payment denied
String errorMsg = data.getStringExtra("ERROR_MSG");
showErrorMessage("Payment denied: " + errorMsg);
}
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the transaction
showInfoMessage("Transaction cancelled by user");
}
}
}
private void showSuccessMessage(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
private void showErrorMessage(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
private void showInfoMessage(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}Important:RESULT_OKdoes not mean the payment was authorized. It only means the Get Smart app completed its process. You must check theRESULTextra to determine if the payment was actually approved.
Step 4: Trigger the Payment
Add a button click handler (or trigger method) to start the payment:
// Example: Button click handler
public void onPayButtonClick(View view) {
// Process a payment of 10.50 euros
startPayment(10.50, "ORDER-001");
}// Example: Button click handler
public void onPayButtonClick(View view) {
// Process a payment of 10.50 euros
startPayment(10.50, "ORDER-001");
}Tip: Replace the hardcoded amount with your actual transaction amount based on the customer's order.
Here's the complete code in one place:
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CODE_PAYMENT = 1001;
private void startPayment(double amount, String invoice) {
Intent intent = new Intent("es.android.redsys.mPOS.movil.tpvAndroid_PAYMENT_REQUEST");
intent.putExtra("amount", amount);
intent.putExtra("invoice", invoice);
intent.putExtra("type", 1); // Sale
try {
startActivityForResult(intent, REQUEST_CODE_PAYMENT);
} catch (ActivityNotFoundException e) {
new AlertDialog.Builder(this)
.setTitle("Payment App Not Found")
.setMessage("Please install the Get Smart application.")
.setPositiveButton("OK", null)
.show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_PAYMENT) {
if (resultCode == RESULT_OK && data != null) {
String result = data.getStringExtra("RESULT");
if ("AUTORIZADA".equals(result)) {
String authNumber = data.getStringExtra("AUTORIZATION_NUMBER");
Toast.makeText(this, "Payment approved! Auth: " + authNumber,
Toast.LENGTH_LONG).show();
} else {
String errorMsg = data.getStringExtra("ERROR_MSG");
Toast.makeText(this, "Payment denied: " + errorMsg,
Toast.LENGTH_LONG).show();
}
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(this, "Transaction cancelled", Toast.LENGTH_SHORT).show();
}
}
}
}public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CODE_PAYMENT = 1001;
private void startPayment(double amount, String invoice) {
Intent intent = new Intent("es.android.redsys.mPOS.movil.tpvAndroid_PAYMENT_REQUEST");
intent.putExtra("amount", amount);
intent.putExtra("invoice", invoice);
intent.putExtra("type", 1); // Sale
try {
startActivityForResult(intent, REQUEST_CODE_PAYMENT);
} catch (ActivityNotFoundException e) {
new AlertDialog.Builder(this)
.setTitle("Payment App Not Found")
.setMessage("Please install the Get Smart application.")
.setPositiveButton("OK", null)
.show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_PAYMENT) {
if (resultCode == RESULT_OK && data != null) {
String result = data.getStringExtra("RESULT");
if ("AUTORIZADA".equals(result)) {
String authNumber = data.getStringExtra("AUTORIZATION_NUMBER");
Toast.makeText(this, "Payment approved! Auth: " + authNumber,
Toast.LENGTH_LONG).show();
} else {
String errorMsg = data.getStringExtra("ERROR_MSG");
Toast.makeText(this, "Payment denied: " + errorMsg,
Toast.LENGTH_LONG).show();
}
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(this, "Transaction cancelled", Toast.LENGTH_SHORT).show();
}
}
}
}Congratulations! You've successfully created your first payment transaction using the Get Smart App2App integration. This complete example demonstrates the essential components needed to process payments: creating the Intent, handling responses, and managing error scenarios. You can now build upon this foundation to add more sophisticated payment features to your application.
Troubleshooting
If you encounter issues during integration or at runtime, refer to the table below:
| Issue / Exception | Description & Potential Causes | Recommended Action |
|---|---|---|
ActivityNotFoundException | The Get Smart application is not installed on the device. | Install the app via your device management system or contact a Get Smart representative. |
RESULT_CANCELED | The user manually exited the interface or pressed the back button. | Handle this as a standard user cancellation; ensure your UI returns to a neutral state. |
No data in onActivityResult | The Intent data is null. This occurs if the app crashed, the device ran out of memory, or the system killed the process. | Log the error details and prompt the user to attempt the transaction again. |
| Payment "DENEGADA" | The payment gateway declined the transaction (e.g., insufficient funds, expired card, or blocked account). | Parse the ERROR_MSG field and display it to the user so they know why the card was rejected. |
What You've Learned
In this tutorial, you've learned how to:
- Create and configure a payment Intent
- Launch the Get Smart application
- Handle transaction results
- Implement proper error handling
Next Steps
Now that you have a working integration:
- Learn how to process refunds in Process a Refund Transaction
- Explore all available parameters in Request Parameters Reference
- Understand the complete transaction flow in Transaction Flow
On this page