telr_mobile_payment_sdk 4.3.0
telr_mobile_payment_sdk: ^4.3.0 copied to clipboard
Flutter plugin that wraps Telr native iOS/Android SDKs via platform channels to present the payment UI.
Telr Flutter Payments SDK #
Accept Telr payments in your Flutter app with a single call. The SDK presents the Telr checkout, handles the flow, and returns a clear success/failure result.
Requirements #
- Flutter: ≥ 3.19 (Dart ≥ 3)
- iOS: ≥ 15.1
- Android: minSdk ≥ 21, targetSdk ≥ 34
- Backend: HTTPS
tokenURLandorderURL
Install #
Add to pubspec.yaml and fetch:
dependencies:
telr_mobile_payment_sdk: ^4.3.0
flutter pub get
Updating the plugin version #
- Update the version in
pubspec.yamland run:
flutter clean
flutter pub get
- For iOS, update pods to the latest TelrSDK:
cd ios
pod deintegrate
pod install --repo-update
pod update TelrSDK
iOS setup #
- Set minimum iOS in
ios/Podfileand enable static frameworks:
platform :ios, '15.1'
target 'Runner' do
use_frameworks! :linkage => :static
end
- Install pods:
cd ios && pod install
- If CocoaPods cannot find
TelrSDK, runpod repo updatethen re-install. TheTelrSDKpod is published from github.com/Telr-PG/telr-sdk-ios and resolves via the standard CocoaPods CDN.
Android setup #
- Ensure repositories in
android/settings.gradle:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
- Set SDK versions in
android/app/build.gradle:
android {
compileSdkVersion 34
defaultConfig {
minSdkVersion 21
targetSdkVersion 34
}
}
- Optional: initialize on app load (configure language / wallet options)
Call the SDK initializer early (e.g., in main() before runApp()) when you need runtime configuration.
- On iOS,
initapplies language, debug logging, and Apple Pay options. - On Android,
initapplies language, debug logging, Samsung Pay, and Google Pay runtime configuration. - If you do not need runtime configuration, you can call
presentPayment(...)directly.
import 'package:flutter/widgets.dart';
import 'package:telr_mobile_payment_sdk/telr_mobile_payment_sdk.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await TelrSdk.init(
preferredLanguageCode: 'en',
debugLoggingEnabled: true,
samsungPayServiceId: null,
samsungPayMerchantId: null,
googlePayGatewayMerchantId: null,
googlePayMerchantId: null,
// iOS-only options (ignored on Android):
applePayMerchantIdentifier: null, // e.g. 'merchant.com.yourcompany.yourapp'
applePayButtonType: 'buy', // optional
applePayButtonStyle: 'automatic', // optional
);
runApp(const MyApp());
}
Supported Payment Methods #
The SDK supports the following payment methods (availability is controlled by your Telr account and order configuration):
- Credit/Debit Cards — Visa, Mastercard, Amex, mada (with 3D Secure)
- Apple Pay (iOS) — requires Merchant Identity setup (see below)
- Google Pay (Android) — requires Google Pay merchant configuration (see below)
- Samsung Pay (Android) — requires Samsung device and manifest setup (see below)
- Click to Pay — Mastercard, Visa (with 3D Secure)
- Tabby — Buy Now Pay Later
- Tamara — Buy Now Pay Later
- STC Bank — direct bank payment
Use #
Minimal example:
import 'package:flutter/material.dart';
import 'package:telr_mobile_payment_sdk/telr_mobile_payment_sdk.dart';
class PayButton extends StatelessWidget {
const PayButton({super.key});
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () async {
try {
final res = await TelrSdk.presentPayment(
'https://merchant.example.com/token',
'https://merchant.example.com/order',
);
final msg = res.success
? 'Payment successful'
: 'Payment failed: ${res.message}';
if (context.mounted) {
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text(msg)));
}
} catch (e) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Unexpected error: $e')),
);
}
}
},
child: const Text('Pay with Telr'),
);
}
}
If you need to set language or iOS Apple Pay options, initialize once on app load as shown above, then call presentPayment when needed.
API #
Methods
- init({ preferredLanguageCode, debugLoggingEnabled, samsungPayServiceId, samsungPayMerchantId, googlePayGatewayMerchantId, googlePayMerchantId, applePayMerchantIdentifier, applePayButtonType, applePayButtonStyle }) →
Future<PaymentResponse>- Initializes the SDK bridge and applies supported runtime configuration for the current platform.
- presentPayment(tokenURL, orderURL) →
Future<PaymentResponse>- Presents the full Telr payment UI (all payment methods) and resolves when completed.
- payWithCard(tokenURL, orderURL) →
Future<PaymentResponse>- Presents a card-only payment form. Use this when building a custom merchant checkout page.
- payWithSavedCard(tokenURL, orderURL, savedCard) →
Future<PaymentResponse>- Pays using a previously saved card. The
savedCardparameter is aTelrSavedCardobject obtained from a prioraddCardcall.
- Pays using a previously saved card. The
- addCard(tokenURL, orderURL) →
Future<AddCardResponse>- Presents a form to save a card without charging. Returns saved card tokens that can be stored on your backend and used with
payWithSavedCard.
- Presents a form to save a card without charging. Returns saved card tokens that can be stored on your backend and used with
- getSdkVersion() →
Future<String>- Returns the underlying native SDK version string.
Types
enum TelrPaymentStatus { success, pending, failure, cancelled }
class PaymentResponse {
final bool success;
final TelrPaymentStatus status;
final String message;
final String? errorCode;
}
class AddCardResponse extends PaymentResponse {
final String? ref;
final String? maskedName;
final List<TelrSavedCard>? savedCards;
}
class TelrSavedCard {
final String token;
final String maskedCard;
final String expiry;
final String scheme;
final String? maskedName;
}
Merchant checkout page example
Build a custom checkout page using the individual payment methods:
// 1. Save a card
final addCardResult = await TelrSdk.addCard(tokenURL, orderURL);
if (addCardResult.status == TelrPaymentStatus.success) {
// Store addCardResult.savedCards on your backend
}
// 2. Pay with a saved card
final result = await TelrSdk.payWithSavedCard(tokenURL, orderURL, savedCard);
// 3. Pay with a new card (card-only form)
final result = await TelrSdk.payWithCard(tokenURL, orderURL);
Merchant checklist #
- Expose HTTPS
tokenURLandorderURLfrom your backend. - Ensure device/emulator can reach both URLs.
- Handle the returned result to confirm/cancel the order server-side.
Apple Pay (iOS) #
- Apple Developer Portal: Enable Apple Pay for your App ID and create a Merchant Identity Certificate under Certificates, Identifiers & Profiles > Identifiers > Merchant IDs.
- Xcode: Open
ios/Runner.xcworkspace, add the Apple Pay capability to the Runner target, and select your Merchant ID. - SDK init: Pass your Merchant Identifier:
await TelrSdk.init(
applePayMerchantIdentifier: 'merchant.com.yourcompany.yourapp',
);
The SDK shows Apple Pay automatically when the device supports it and the user has cards in Wallet.
Samsung Pay (Android) #
- Samsung Developers Portal: Register as a Samsung Pay partner at the Samsung Pay Developers portal and obtain a Service ID. Samsung registers the Service ID against your app's package name and signing certificate SHA-256 — debug and release builds have different SHAs, so register both (or use separate sandbox / production Service IDs).
- AndroidManifest.xml: Add under the
<application>tag inandroid/app/src/main/AndroidManifest.xml:
<meta-data android:name="spay_sdk_api_level" android:value="2.22" />
<meta-data android:name="debug_mode" android:value="N" />
- Use
spay_sdk_api_level="2.22"exactly — this matches the Samsung Pay SDK bundled inside the Telr SDK. If a future Telr SDK release upgrades it, this value will be updated here. debug_modemust beNin production. Set toYonly in development builds — shippingYto production causes Samsung Pay to behave unpredictably.
- SDK init: Pass your Service ID:
await TelrSdk.init(
samsungPayServiceId: '<YOUR_SERVICE_ID>',
);
Samsung Pay only appears on Samsung devices with Samsung Wallet installed and provisioned, in supported regions.
Common reasons Samsung Pay does not appear
- App not registered with Samsung against your package name + signing SHA-256 — the most common cause. Debug and release builds have different SHAs. Use a sandbox Service ID with the debug-keystore SHA and a production Service ID with the release-keystore SHA, or register both SHAs against one Service ID.
- Device is not Samsung, or Samsung Wallet has no provisioned card — the SDK reports
SPAY_NOT_READYand hides the option. - Backend did not return
order._links.samsungPay.href— confirm with your Telr account manager that Samsung Pay is enabled for your merchant account. - Country / region not supported — Samsung Pay is region-locked. The device must be in a supported country.
- Manifest meta-data missing or wrong version —
spay_sdk_api_levelmust match the value documented above. Filter logcat forSamsungPayRequirementsto see validation warnings emitted by the SDK.
Google Pay (Android) #
- Configure Google Pay for your Telr merchant account so the backend order includes
order._links.googlePay.href. - Initialize the SDK with your Android Google Pay settings:
await TelrSdk.init(
googlePayGatewayMerchantId: '<YOUR_GATEWAY_MERCHANT_ID>',
googlePayMerchantId: '<YOUR_GOOGLE_MERCHANT_ID>',
);
Google Pay only appears when the backend enables it and Google Wallet is available and ready on the device.
Click to Pay #
Click to Pay appears when your order enables allowedPaymentMethods.type = CLICK_TO_PAY (or order._links.clicktopay.href is present).
- No SDK configuration or merchant registration required.
dpaId, acquirer config, and locale come from the order response — Telr's backend owns the network registration. - The SDK handles consumer recognition, email entry, OTP authentication, saved-card listing, manual card entry, the network DCF challenge UI, and 3DS internally.
- Recognition tokens are persisted on-device per
dpaIdso returning users skip the email/OTP step on the next session.
No additional Flutter-side configuration is required — the option appears automatically in the payment sheet when the backend enables it.
Troubleshooting #
- Android: E002 "Unable to register for Activity Result": Ensure initialization happens during app load. Call
TelrSdk.init(...)inmain()beforerunApp(). - iOS: CocoaPods cannot find
TelrSDK: Configure Telr spec source, runpod repo update, thenpod install. - iOS: Build fails due to iOS version: Set
platform :ios, '15.1'or newer. - Android: minSdk/targetSdk mismatch: Use min 21 / target 34 / compile 34.
- Network/HTTP errors: Verify backend endpoints and connectivity.
Security #
- Always use HTTPS; validate server responses.
- Never embed secrets in the app or log cardholder data.
Links #
- Package on pub.dev: telr_mobile_payment_sdk
- Example app: see
example/
License #
MIT