### Check AliPay Installation Source: https://github.com/openflutter/tobias/blob/main/README.md Verify if the AliPay app is installed on the device. ```dart Tobias tobias = Tobias(); var result = await tobias.isAliPayInstalled; ``` -------------------------------- ### Get AliPay SDK Version Source: https://context7.com/openflutter/tobias/llms.txt Retrieve the version of the installed AliPay SDK. This information is valuable for debugging purposes and for ensuring compatibility with specific SDK features. ```dart import 'package:tobias/tobias.dart'; final tobias = Tobias(); // Get AliPay SDK version String version = await tobias.aliPayVersion; print('AliPay SDK version: $version'); ``` -------------------------------- ### Install Tobias Plugin Source: https://context7.com/openflutter/tobias/llms.txt Add the Tobias plugin to your pubspec.yaml file. Configure the iOS URL scheme and OpenHarmony schemes as required. ```yaml dependencies: tobias: ^5.3.4 # iOS URL scheme configuration (required for iOS) tobias: url_scheme: "your_unique_scheme" # Must not contain underscores no_utdid: false # Set to true if facing utdid conflicts ``` ```json5 { "module": { "querySchemes": [ "alipays" ] } } ``` -------------------------------- ### AliPay Payment Result Sample Source: https://github.com/openflutter/tobias/blob/main/README.md Example of the map returned by the AliPay SDK, including the platform field. ```dart { result: partner="2088411752388544"&seller_id="etongka123@163.com"&out_trade_no="180926084213001"&subject="test pay"&total_fee="0.01"¬ify_url="http://127.0.0.1/alipay001"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&return_url="m.alipay.com"&success="true"&sign_type="RSA"&sign="nCZ8MDhsNvYNAbrLZJZ2VUy6vydgAp+JCq1aQo6ORDYtI9zwtnja3qNGQNiDJCuktoIj7fSTM487XhjPDqnOreZjIA1GJpxu9D1I3nMXIn1M7DfZ0noDwXcYZ438/jbYac7g8mhpwdKGweLCAni9mO3Y6q3iBFkox8i9PcsGxJY=", resultStatus: 9000, memo: , platform:iOS } ``` -------------------------------- ### Check AliPay HK Installation Source: https://context7.com/openflutter/tobias/llms.txt Determine if the AliPay Hong Kong app is installed. This is particularly useful for applications targeting users in the Hong Kong region. ```dart import 'package:tobias/tobias.dart'; final tobias = Tobias(); // Check if AliPay HK is installed bool isHKInstalled = await tobias.isAliPayHKInstalled; if (isHKInstalled) { print('AliPay HK is installed'); } else { print('AliPay HK is not installed'); } ``` -------------------------------- ### Complete AliPay Payment Flow in Dart Source: https://context7.com/openflutter/tobias/llms.txt This Dart code implements a `PaymentService` class to handle the complete AliPay payment flow. It includes initialization, checking for AliPay installation, processing payments, and parsing the results with detailed error handling for various status codes. Use this for integrating AliPay payments in your Flutter app. ```dart import 'package:flutter/material.dart'; import 'package:tobias/tobias.dart'; class PaymentService { final Tobias _tobias = Tobias(); Future initialize(String appId, {String? universalLink}) async { // Register app for anti-fraud features await _tobias.registerApp(appId, universalLink: universalLink); } Future processPayment(String orderInfo, {String? universalLink}) async { // Check AliPay installation first bool isInstalled = await _tobias.isAliPayInstalled; if (!isInstalled) { return PaymentResult( success: false, message: 'AliPay app is not installed', code: 'APP_NOT_INSTALLED', ); } try { Map result = await _tobias.pay( orderInfo, evn: AliPayEvn.online, showPayLoading: true, universalLink: universalLink, ); return _parseResult(result); } catch (e) { return PaymentResult( success: false, message: 'Payment error: $e', code: 'ERROR', ); } } PaymentResult _parseResult(Map result) { String status = result['resultStatus']?.toString() ?? ''; String memo = result['memo']?.toString() ?? ''; String platform = result['platform']?.toString() ?? ''; switch (status) { case '9000': return PaymentResult(success: true, message: 'Payment successful', code: status, platform: platform); case '8000': return PaymentResult(success: false, message: 'Payment processing', code: status, platform: platform); case '4000': return PaymentResult(success: false, message: 'Payment failed: $memo', code: status, platform: platform); case '5000': return PaymentResult(success: false, message: 'Duplicate request', code: status, platform: platform); case '6001': return PaymentResult(success: false, message: 'User cancelled', code: status, platform: platform); case '6002': return PaymentResult(success: false, message: 'Network error', code: status, platform: platform); case '6004': return PaymentResult(success: false, message: 'Unknown result, check server', code: status, platform: platform); default: return PaymentResult(success: false, message: 'Unknown status: $status', code: status, platform: platform); } } } class PaymentResult { final bool success; final String message; final String code; final String? platform; PaymentResult({ required this.success, required this.message, required this.code, this.platform, }); } ``` -------------------------------- ### Configure OpenHarmony Query Schemes Source: https://github.com/openflutter/tobias/blob/main/README.md Add the alipays scheme to your module.json5 file for OpenHarmony support. ```json5 { "module": { "querySchemes": [ "alipays" ], } } ``` -------------------------------- ### Initialize Flutter Web Engine Source: https://github.com/openflutter/tobias/blob/main/example/web/index.html Standard entrypoint script for loading the Flutter web application. Ensure the serviceWorkerVersion is correctly injected during the build process. ```javascript tobias_example // The value below is injected by flutter build, do not touch. var serviceWorkerVersion = null; window.addEventListener('load', function(ev) { // Download main.dart.js _flutter.loader.loadEntrypoint({ serviceWorker: { serviceWorkerVersion: serviceWorkerVersion, }, onEntrypointLoaded: function(engineInitializer) { engineInitializer.initializeEngine().then(function(appRunner) { appRunner.runApp(); }); } }); }); ``` -------------------------------- ### Process AliPay Payment Source: https://github.com/openflutter/tobias/blob/main/README.md Initialize the Tobias instance and pass the order information to initiate a payment. ```dart import 'package:tobias/tobias.dart' ; Tobias tobias = Tobias(); tobias.pay(yourOrder); ``` -------------------------------- ### Process Alipay Payments Source: https://context7.com/openflutter/tobias/llms.txt Initiate payments by passing a signed order string. Handles production and sandbox environments, loading indicators, and iOS universal links. The result includes status codes and platform information. ```dart import 'package:tobias/tobias.dart'; final tobias = Tobias(); // Order string should be generated and signed on your server String orderInfo = 'partner="2088411752388544"&seller_id="seller@example.com"' '&out_trade_no="order_123456"&subject="Product Name"&total_fee="10.00"' '¬ify_url="https://your-server.com/alipay/notify"' '&service="mobile.securitypay.pay"&payment_type="1"' '&_input_charset="utf-8"&sign="..."&sign_type="RSA2"'; try { // Basic payment (production environment) Map result = await tobias.pay(orderInfo); // Payment with options Map resultWithOptions = await tobias.pay( orderInfo, evn: AliPayEvn.online, // Use AliPayEvn.sandbox for testing (Android only) showPayLoading: true, // Show loading indicator (Android/OpenHarmony) universalLink: 'https://yourdomain.com/app/', // Required for iOS ); // Handle payment result if (result['resultStatus'] == '9000') { print('Payment successful!'); print('Trade number: ${result['result']}'); } else if (result['resultStatus'] == '6001') { print('Payment cancelled by user'); } else { print('Payment failed: ${result['memo']}'); } // Result includes platform info print('Platform: ${result['platform']}'); // 'iOS', 'android', or 'ohos' } catch (e) { print('Payment error: $e'); } ``` -------------------------------- ### Perform AliPay Authentication Source: https://github.com/openflutter/tobias/blob/main/README.md Use the auth method to authenticate with the provided string. ```dart import 'package:tobias/tobias.dart' ; Tobias tobias = Tobias(); tobias.auth("your auth str); ``` -------------------------------- ### Register Alipay App Source: https://context7.com/openflutter/tobias/llms.txt Register your merchant appId before initiating payments. For iOS, include the universal link. This step is crucial for AliPay's security features and payment optimization. ```dart import 'package:tobias/tobias.dart'; final tobias = Tobias(); // Register app on Android/OpenHarmony await tobias.registerApp('your_alipay_app_id'); // Register app on iOS with Universal Link await tobias.registerApp( 'your_alipay_app_id', universalLink: 'https://yourdomain.com/app/', ); ``` -------------------------------- ### Process OpenHarmony Auto Subscription Source: https://context7.com/openflutter/tobias/llms.txt Handle automatic subscription payments on OpenHarmony. This method is specific to the platform and requires a signed subscription order string from your server. ```dart import 'package:tobias/tobias.dart'; final tobias = Tobias(); // Auto subscription order string from your server String subscriptionOrder = 'your_signed_subscription_order_string'; try { Map result = await tobias.payOhosAutoSub(subscriptionOrder); if (result['resultStatus'] == '9000') { print('Subscription setup successful!'); } else { print('Subscription failed: ${result['memo']}'); } } catch (e) { print('Subscription error: $e'); } ``` -------------------------------- ### Authenticate Users with AliPay OAuth Source: https://context7.com/openflutter/tobias/llms.txt Use this snippet to authenticate users via AliPay's OAuth service. Ensure the auth string is generated on your server. Handle success, cancellation, or failure based on the result status. ```dart import 'package:tobias/tobias.dart'; final tobias = Tobias(); // Auth string should be generated on your server String authInfo = 'app_id=your_app_id&app_name=mc&biz_type=openservice' '&pid=your_partner_id&product_id=APP_FAST_LOGIN' '&scope=kuaijie&target_id=unique_id&auth_type=AUTHACCOUNT' '&sign_type=RSA2&sign=...'; try { Map result = await tobias.auth(authInfo); if (result['resultStatus'] == '9000') { print('Authentication successful!'); // Parse auth_code from result for token exchange String authResult = result['result']; // Extract auth_code and user_id from authResult print('Auth result: $authResult'); } else if (result['resultStatus'] == '6001') { print('Authentication cancelled by user'); } else { print('Authentication failed: ${result['memo']}'); } } catch (e) { print('Auth error: $e'); } ``` -------------------------------- ### Override AppDelegate with Super Call Source: https://github.com/openflutter/tobias/blob/main/README.md If you must override these functions, ensure you call the super implementation. ```objective-c - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [super application:application openURL:url sourceApplication:sourceApplication annotation:annotation]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { return [super application:application openURL:url options:options]; } ``` -------------------------------- ### Remove Legacy AppDelegate Overrides Source: https://github.com/openflutter/tobias/blob/main/README.md Remove these methods from your AppDelegate if you are upgrading to version 1.0.0 or later. ```objective-c - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [TobiasPlugin handleOpenURL:url]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { return [TobiasPlugin handleOpenURL:url]; } ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.