diff --git a/Demo/AndroidManifest.template.xml b/Demo/AndroidManifest.template.xml
new file mode 100644
index 0000000..10c95df
--- /dev/null
+++ b/Demo/AndroidManifest.template.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+ <%uses-permission%>
+
+
+
+ <%provider%>
+ <%application-meta-data%>
+ <%uses-libraries%>
+ <%services%>
+
+
+
+
+
+
+
+
+
+ <%activity%>
+ <%receivers%>
+
+
+
diff --git a/Demo/Demo.deployproj b/Demo/Demo.deployproj
new file mode 100644
index 0000000..176d78c
--- /dev/null
+++ b/Demo/Demo.deployproj
@@ -0,0 +1,277 @@
+
+
+
+ 12
+
+
+ K4AXB6010422F4D
+ K4AXB6010422F4D
+
+ iPhone5
+
+
+
+
+
+ Demo\
+ Demo.exe
+ ProjectOutput
+ 0
+
+
+ True
+ True
+
+
+
+
+
+
+
+ Demo.app\
+ libcgunwind.1.0.dylib
+ DependencyModule
+ 1
+
+
+ True
+
+
+ Demo.app\
+ libpcre.dylib
+ DependencyModule
+ 1
+
+
+ True
+
+
+
+
+ Demo\res\drawable-xlarge\
+ splash_image.png
+ Android_SplashImage960
+ 1
+
+
+ True
+
+
+ Demo\res\drawable-xhdpi\
+ ic_launcher.png
+ Android_LauncherIcon96
+ 1
+
+
+ True
+
+
+ Demo\res\drawable-hdpi\
+ ic_launcher.png
+ Android_LauncherIcon72
+ 1
+
+
+ True
+
+
+ Demo\res\drawable-xhdpi\
+ ic_notification.png
+ Android_NotificationIcon48
+ 1
+
+
+ True
+
+
+ Demo\res\drawable-xxxhdpi\
+ ic_notification.png
+ Android_NotificationIcon96
+ 1
+
+
+ True
+
+
+ Demo\res\drawable-large\
+ splash_image.png
+ Android_SplashImage640
+ 1
+
+
+ True
+
+
+ Demo\res\drawable-xxhdpi\
+ ic_notification.png
+ Android_NotificationIcon72
+ 1
+
+
+ True
+
+
+ Demo\library\lib\armeabi-v7a\
+ libDemo.so
+ AndroidLibnativeArmeabiv7aFile
+ 1
+
+
+ True
+
+
+ Demo\res\drawable-normal\
+ splash_image.png
+ Android_SplashImage470
+ 1
+
+
+ True
+
+
+ Demo\library\lib\mips\
+ libDemo.so
+ AndroidLibnativeMipsFile
+ 1
+
+
+ True
+
+
+ Demo\library\lib\armeabi\
+ libDemo.so
+ AndroidLibnativeArmeabiFile
+ 1
+
+
+ True
+
+
+ Demo\library\lib\arm64-v8a\
+ libDemo.so
+ ProjectOutput
+ 1
+
+
+ True
+ True
+
+
+ Demo\res\drawable-ldpi\
+ ic_launcher.png
+ Android_LauncherIcon36
+ 1
+
+
+ True
+
+
+ Demo\res\drawable-xxhdpi\
+ ic_launcher.png
+ Android_LauncherIcon144
+ 1
+
+
+ True
+
+
+ Demo\res\values\
+ colors.xml
+ Android_Colors
+ 1
+
+
+ True
+
+
+ Demo\
+ AndroidManifest.xml
+ ProjectAndroidManifest
+ 1
+
+
+ True
+
+
+ Demo\res\drawable-mdpi\
+ ic_notification.png
+ Android_NotificationIcon24
+ 1
+
+
+ True
+
+
+ Demo\res\values\
+ styles.xml
+ AndroidSplashStyles
+ 1
+
+
+ True
+
+
+ Demo\res\drawable-hdpi\
+ ic_notification.png
+ Android_NotificationIcon36
+ 1
+
+
+ True
+
+
+ Demo\res\drawable\
+ splash_image_def.xml
+ AndroidSplashImageDef
+ 1
+
+
+ True
+
+
+ Demo\res\drawable-mdpi\
+ ic_launcher.png
+ Android_LauncherIcon48
+ 1
+
+
+ True
+
+
+ Demo\classes\
+ classes.dex
+ AndroidClassesDexFile
+ 1
+
+
+ True
+
+
+ Demo\res\drawable-small\
+ splash_image.png
+ Android_SplashImage426
+ 1
+
+
+ True
+
+
+ Demo\res\values-v21\
+ styles.xml
+ AndroidSplashStylesV21
+ 1
+
+
+ True
+
+
+ Demo\res\values\
+ strings.xml
+ Android_Strings
+ 1
+
+
+ True
+
+
+
diff --git a/Demo/Demo.dpr b/Demo/Demo.dpr
new file mode 100644
index 0000000..b83d63b
--- /dev/null
+++ b/Demo/Demo.dpr
@@ -0,0 +1,14 @@
+program Demo;
+
+uses
+ System.StartUpCopy,
+ FMX.Forms,
+ main in 'main.pas' {Form2};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.CreateForm(TForm2, Form2);
+ Application.Run;
+end.
diff --git a/Demo/Demo.dproj b/Demo/Demo.dproj
new file mode 100644
index 0000000..785560f
--- /dev/null
+++ b/Demo/Demo.dproj
@@ -0,0 +1,1130 @@
+
+
+ {A5D1FD99-4DA1-4D2E-898A-7A6B2AAB2B2F}
+ 19.0
+ FMX
+ True
+ Debug
+ Win32
+ 37915
+ Application
+ Demo.dpr
+
+
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Cfg_1
+ true
+ true
+
+
+ true
+ Cfg_1
+ true
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Cfg_2
+ true
+ true
+
+
+ true
+ Cfg_2
+ true
+ true
+
+
+ .\$(Platform)\$(Config)
+ .\$(Platform)\$(Config)
+ false
+ false
+ false
+ false
+ false
+ System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ $(BDS)\bin\delphi_PROJECTICON.ico
+ $(BDS)\bin\delphi_PROJECTICNS.icns
+ Demo
+
+
+ DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;RestDatawareCORE;ZComponent;FMXComponents;ZCore;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;compCielo;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;ZParseSql;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;AndoridVoiceComponents;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;SGerenciaPix;SGerenciaPago;fmxFireDAC;FireDAC;ZDbc;FireDACSqliteDriver;SGerenciaSeguro;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;SGerenciaNet;bindcomp;ZPlain;IndyIPClient;FrameStandPackage_10_4;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage)
+ package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=
+ Debug
+ true
+ $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png
+ $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png
+ $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png
+ $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png
+ $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png
+ $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png
+ $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png
+ $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png
+ $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png
+ $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png
+ $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png
+ $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png
+ $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png
+ $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png
+ android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar
+
+
+ DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;RestDatawareCORE;ZComponent;ZCore;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;compCielo;RaizeComponentsVcl;fmx;FireDACIBDriver;RaizeComponentsVclDb;FireDACDBXDriver;dbexpress;IndyCore;ZParseSql;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;SGerenciaPix;SGerenciaPago;fmxFireDAC;FireDAC;ZDbc;FireDACSqliteDriver;SGerenciaSeguro;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;SGerenciaNet;bindcomp;ZPlain;IndyIPClient;FrameStandPackage_10_4;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage)
+ package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=
+ Debug
+ true
+ $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png
+ $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png
+ $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png
+ $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png
+ $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png
+ $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png
+ $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png
+ $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png
+ $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png
+ $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png
+ $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png
+ $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png
+ $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png
+ $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png
+ android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar
+
+
+ DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;RestDatawareCORE;ZComponent;ACBr_TEFD;ZCore;emsclientfiredac;tethering;DataSnapFireDAC;ACBr_SATWS;SDriver.Components;ACBr_NFe;bindcompfmx;ACBr_Diversos;RaizeComponentsVcl;ACBr_LCDPR;fmx;FireDACIBDriver;RaizeComponentsVclDb;ACBr_Ponto;FireDACDBXDriver;dbexpress;IndyCore;ZParseSql;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;ACBR_DeSTDA;soapserver;bindengine;CloudService;ACBr_PAF;ACBr_Sintegra;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;ACBr_CTe;ACBr_SATExtratoESCPOS;IndySystem;ACBre_Social;fmxFireDAC;FireDAC;ACBr_SPED;ACBr_MDFe;ACBr_Comum;ZDbc;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;ACBr_Convenio115;bindcomp;ACBr_Serial;ZPlain;IndyIPClient;frce;ACBr_BlocoX;dbxcds;ACBr_ANe;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;ACBr_NFSe;$(DCC_UsePackage)
+ CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers
+ iPhoneAndiPad
+ true
+ Debug
+ $(MSBuildProjectName)
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_87x87.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_114x114.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_29x29.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_58x58.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_72x72.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_144x144.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_50x50.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png
+
+
+ DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;RestDatawareCORE;ZComponent;ZCore;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;ZParseSql;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;ZDbc;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;ZPlain;IndyIPClient;FrameStandPackage_10_4;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage)
+ CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers
+ iPhoneAndiPad
+ true
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_87x87.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_114x114.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_29x29.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_58x58.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png
+ $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_72x72.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_144x144.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_50x50.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png
+ $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png
+ 10.0
+
+
+ DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;RestDatawareCORE;ZComponent;ZCore;emsclientfiredac;tethering;DataSnapFireDAC;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;RaizeComponentsVcl;fmx;FireDACIBDriver;fmxdae;RaizeComponentsVclDb;FireDACDBXDriver;dbexpress;IndyCore;ZParseSql;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;IcsCommonD104Run;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IcsVclD104Run;IndyIPServer;IndySystem;fmxFireDAC;IcsFmxD104Run;FireDAC;ZDbc;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;ZPlain;IndyIPClient;FrameStandPackage_10_4;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage)
+ CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers
+ Debug
+ true
+
+
+ DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;RestDatawareCORE;ZComponent;vclactnband;ACBr_NF3e;vclFireDAC;ACBr_TEFD;FMXComponents;ZCore;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;ACBr_SATWS;FireDACADSDriver;esbpcs_dates_rt_d27;ACBr_BPeDabpeESCPOS;ACBr_BPe;SDriver.Components;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;ACBr_EDI;vcltouch;ACBr_NFe;ACBr_ONE;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;ACBr_NFeDanfeESCPOS;compCielo;ACBr_Diversos;RaizeComponentsVcl;ACBr_LCDPR;emsedge;TMSVCLUIPackPkgWizDXE13;fmx;FireDACIBDriver;fmxdae;RaizeComponentsVclDb;vcledge;DragDropDR104R;esbpcs_calcs_rt_d27;ACBr_Ponto;FireDACDBXDriver;dbexpress;IndyCore;TMSVCLUIPackPkgXlsDXE13;RESTDWDriverFD;vclx;ZParseSql;dsnap;emsclient;DataSnapCommon;esbpcs_calcs_db_rt_d27;FireDACCommon;TRCGooglePlaces_r;RESTBackendComponents;DataSnapConnectors;ACBR_DeSTDA;VCLRESTComponents;ACBr_Reinf;soapserver;ACBr_SAT;MARSServerWizard;TMSVCLUIPackPkgDXE13;vclie;IcsCommonD104Run;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;ACBr_PAF;ACBr_SATECFVirtual;ACBr_Sintegra;FireDACCommonODBC;FireDACCommonDriver;ACBr_GNRE;DataSnapClient;ACBr_ADRCST;AndoridVoiceComponents;inet;FMXComponentEd;TMSVCLUIPackPkgExDXE13;IndyIPCommon;bindcompdbx;ACBr_TCP;IcsVclD104Run;vcl;IndyIPServer;DBXSybaseASEDriver;ACBr_CTe;ACBr_SATExtratoESCPOS;IndySystem;esbpcs_base_rt_d27;FireDACDb2Driver;esbpcs_base_db_rt_d27;ACBr_Integrador;dsnapcon;SGerenciaPix;esbpcs_xtras_rt_d27;ACBre_Social;SGerenciaPago;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;ACBr_SPEDImportar;IcsFmxD104Run;FireDAC;YxdUI;ACBr_SPED;ACBr_MDFe;emshosting;ACBr_Comum;ZDbc;FireDACSqliteDriver;FireDACPgDriver;ACBr_LFD;FireDACASADriver;esbpcs_xtras_db_rt_d27;DBXOdbcDriver;FireDACTDataDriver;SGerenciaSeguro;soaprtl;DbxCommonDriver;ACBr_CIOT;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;ACBr_OpenSSL;DBXSybaseASADriver;esbpcs_stats_rt_d27;CustomIPTransport;vcldsnap;SGerenciaNet;RESTDWDriverZEOS;esbpcs_stats_db_rt_d27;MARSClient.Core;ACBr_Convenio115;bindcomp;appanalytics;ACBr_Serial;DBXInformixDriver;ZPlain;esbpcs_dates_db_rt_d27;IndyIPClient;frce;bindcompvcl;FrameStandPackage_10_4;ACBr_BlocoX;dbxcds;VclSmp;ACBr_NFCeECFVirtual;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;ACBr_Boleto;ACBr_ANe;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;ACBr_SEF2;TRCGooglePlaces_d;FieFox;ACBr_NFSe;ACBr_NF3eDANF3eESCPOS;ACBr_MTER;DataSnapServerMidas;$(DCC_UsePackage)
+ Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)
+ Debug
+ true
+ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
+ 1033
+ $(BDS)\bin\default_app.manifest
+ $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png
+ $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png
+
+
+ DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;RestDatawareCORE;ZComponent;vclactnband;vclFireDAC;ZCore;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;DragDropDR104R;FireDACDBXDriver;dbexpress;IndyCore;RESTDWDriverFD;vclx;ZParseSql;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;TMSVCLUIPackPkgDXE13;vclie;IcsCommonD104Run;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;TMSVCLUIPackPkgExDXE13;IndyIPCommon;bindcompdbx;IcsVclD104Run;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;SGerenciaPix;SGerenciaPago;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;IcsFmxD104Run;FireDAC;emshosting;ZDbc;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;SGerenciaSeguro;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;SGerenciaNet;MARSClient.Core;bindcomp;appanalytics;DBXInformixDriver;ZPlain;IndyIPClient;bindcompvcl;FrameStandPackage_10_4;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage)
+ Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)
+ Debug
+ true
+ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
+ 1033
+ $(BDS)\bin\default_app.manifest
+ $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png
+ $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png
+
+
+ DEBUG;$(DCC_Define)
+ true
+ false
+ true
+ true
+ true
+
+
+ false
+ true
+ PerMonitorV2
+ .\$(Platform)\dcu
+ true
+ 1033
+ .\$(Platform)\
+
+
+ true
+ PerMonitorV2
+
+
+ false
+ RELEASE;$(DCC_Define)
+ 0
+ 0
+
+
+ true
+ PerMonitorV2
+
+
+ true
+ PerMonitorV2
+
+
+
+ MainSource
+
+
+
+ fmx
+
+
+ Cfg_2
+ Base
+
+
+ Base
+
+
+ Cfg_1
+ Base
+
+
+
+ Delphi.Personality.12
+ Application
+
+
+
+
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+
+
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+
+ splash_image.png
+ true
+
+
+
+
+ ic_launcher.png
+ true
+
+
+
+
+ ic_launcher.png
+ true
+
+
+
+
+ ic_notification.png
+ true
+
+
+
+
+ ic_notification.png
+ true
+
+
+
+
+ Demo.exe
+ true
+
+
+
+
+ splash_image.png
+ true
+
+
+
+
+ ic_notification.png
+ true
+
+
+
+
+ libDemo.so
+ true
+
+
+
+
+ splash_image.png
+ true
+
+
+
+
+ libDemo.so
+ true
+
+
+
+
+ libDemo.so
+ true
+
+
+
+
+ libDemo.so
+ true
+
+
+
+
+ ic_launcher.png
+ true
+
+
+
+
+ ic_launcher.png
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ ic_notification.png
+ true
+
+
+
+
+ true
+
+
+
+
+ ic_notification.png
+ true
+
+
+
+
+ true
+
+
+
+
+ ic_launcher.png
+ true
+
+
+
+
+ classes.dex
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ splash_image.png
+ true
+
+
+
+
+ styles.xml
+ true
+
+
+
+
+ true
+
+
+
+
+ 1
+
+
+ Contents\MacOS
+ 1
+
+
+ 0
+
+
+
+
+ classes
+ 1
+
+
+ classes
+ 1
+
+
+
+
+ res\xml
+ 1
+
+
+ res\xml
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ library\lib\armeabi
+ 1
+
+
+ library\lib\armeabi
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ library\lib\mips
+ 1
+
+
+ library\lib\mips
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+ library\lib\arm64-v8a
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ res\drawable
+ 1
+
+
+ res\drawable
+ 1
+
+
+
+
+ res\values
+ 1
+
+
+ res\values
+ 1
+
+
+
+
+ res\values-v21
+ 1
+
+
+ res\values-v21
+ 1
+
+
+
+
+ res\values
+ 1
+
+
+ res\values
+ 1
+
+
+
+
+ res\drawable
+ 1
+
+
+ res\drawable
+ 1
+
+
+
+
+ res\drawable-xxhdpi
+ 1
+
+
+ res\drawable-xxhdpi
+ 1
+
+
+
+
+ res\drawable-ldpi
+ 1
+
+
+ res\drawable-ldpi
+ 1
+
+
+
+
+ res\drawable-mdpi
+ 1
+
+
+ res\drawable-mdpi
+ 1
+
+
+
+
+ res\drawable-hdpi
+ 1
+
+
+ res\drawable-hdpi
+ 1
+
+
+
+
+ res\drawable-xhdpi
+ 1
+
+
+ res\drawable-xhdpi
+ 1
+
+
+
+
+ res\drawable-mdpi
+ 1
+
+
+ res\drawable-mdpi
+ 1
+
+
+
+
+ res\drawable-hdpi
+ 1
+
+
+ res\drawable-hdpi
+ 1
+
+
+
+
+ res\drawable-xhdpi
+ 1
+
+
+ res\drawable-xhdpi
+ 1
+
+
+
+
+ res\drawable-xxhdpi
+ 1
+
+
+ res\drawable-xxhdpi
+ 1
+
+
+
+
+ res\drawable-xxxhdpi
+ 1
+
+
+ res\drawable-xxxhdpi
+ 1
+
+
+
+
+ res\drawable-small
+ 1
+
+
+ res\drawable-small
+ 1
+
+
+
+
+ res\drawable-normal
+ 1
+
+
+ res\drawable-normal
+ 1
+
+
+
+
+ res\drawable-large
+ 1
+
+
+ res\drawable-large
+ 1
+
+
+
+
+ res\drawable-xlarge
+ 1
+
+
+ res\drawable-xlarge
+ 1
+
+
+
+
+ res\values
+ 1
+
+
+ res\values
+ 1
+
+
+
+
+ 1
+
+
+ Contents\MacOS
+ 1
+
+
+ 0
+
+
+
+
+ Contents\MacOS
+ 1
+ .framework
+
+
+ Contents\MacOS
+ 1
+ .framework
+
+
+ 0
+
+
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
+
+
+ 0
+ .dll;.bpl
+
+
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
+
+
+ 0
+ .bpl
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ Contents\Resources\StartUp\
+ 0
+
+
+ Contents\Resources\StartUp\
+ 0
+
+
+ 0
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\
+ 1
+
+
+ ..\
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen
+ 64
+
+
+ ..\$(PROJECTNAME).launchscreen
+ 64
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+
+
+ ..\
+ 1
+
+
+ ..\
+ 1
+
+
+
+
+ Contents
+ 1
+
+
+ Contents
+ 1
+
+
+
+
+ Contents\Resources
+ 1
+
+
+ Contents\Resources
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+ library\lib\arm64-v8a
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ Contents\MacOS
+ 1
+
+
+ Contents\MacOS
+ 1
+
+
+ 0
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
diff --git a/Demo/Demo.dproj.local b/Demo/Demo.dproj.local
new file mode 100644
index 0000000..9e7ae28
--- /dev/null
+++ b/Demo/Demo.dproj.local
@@ -0,0 +1,12 @@
+
+
+
+ 2021/05/12 11:14:37.000.956,=C:\Users\Sergio\Documents\Embarcadero\Studio\Projects\Unit2.pas
+ 2021/05/12 11:26:53.000.486,C:\Users\Sergio\Documents\Embarcadero\Studio\Projects\Unit2.fmx=I:\PagOnLine\GerenciaPago\Demo\main.fmx
+ 2021/05/12 11:26:53.000.486,C:\Users\Sergio\Documents\Embarcadero\Studio\Projects\Unit2.pas=I:\PagOnLine\GerenciaPago\Demo\main.pas
+ 2021/05/12 11:26:59.000.536,C:\Users\Sergio\Documents\Embarcadero\Studio\Projects\Project2.dproj=I:\PagOnLine\GerenciaPago\Demo\Demo.dproj
+
+
+
+
+
diff --git a/Demo/Demo.identcache b/Demo/Demo.identcache
new file mode 100644
index 0000000..6a43447
Binary files /dev/null and b/Demo/Demo.identcache differ
diff --git a/Demo/json b/Demo/json
new file mode 100644
index 0000000..ae204ce
--- /dev/null
+++ b/Demo/json
@@ -0,0 +1,136 @@
+{
+ "paging": {
+ "total": 1,
+ "limit": 30,
+ "offset": 0
+ },
+ "results": [{
+ "acquirer_reconciliation": [],
+ "additional_info": {
+ "available_balance": null,
+ "bank_info": {
+ "is_same_bank_account_owner": true
+ },
+ "nsu_processadora": null
+ },
+ "authorization_code": null,
+ "binary_mode": false,
+ "brand_id": null,
+ "call_for_authorize_id": null,
+ "callback_url": null,
+ "captured": true,
+ "card": {},
+ "charges_details": [],
+ "collector_id": 166957358,
+ "corporation_id": null,
+ "counter_currency": null,
+ "coupon_amount": 0,
+ "currency_id": "BRL",
+ "date_approved": "2021-05-13T00:11:14.000-04:00",
+ "date_created": "2021-05-13T00:09:21.000-04:00",
+ "date_last_updated": "2021-05-13T00:11:14.000-04:00",
+ "date_of_expiration": "2021-05-13T23:00:00.000-04:00",
+ "deduction_schema": null,
+ "description": "LOCAÇÃO DE SISTEMA 132789",
+ "differential_pricing_id": null,
+ "external_reference": "132789",
+ "fee_details": [{
+ "amount": 0.01,
+ "fee_payer": "collector",
+ "type": "mercadopago_fee"
+ }],
+ "id": 14857136091,
+ "installments": 1,
+ "integrator_id": null,
+ "issuer_id": null,
+ "live_mode": true,
+ "marketplace_owner": null,
+ "merchant_account_id": null,
+ "merchant_number": null,
+ "metadata": {},
+ "money_release_date": "2021-05-13T00:11:14.000-04:00",
+ "money_release_schema": null,
+ "notification_url": null,
+ "operation_type": "regular_payment",
+ "order": {},
+ "payer": {
+ "email": "test@test.com",
+ "entity_type": null,
+ "first_name": "Test",
+ "id": "192528586",
+ "identification": {
+ "number": "19119119100",
+ "type": "CPF"
+ },
+ "last_name": "User",
+ "operator_id": null,
+ "phone": {
+ "area_code": null,
+ "extension": null,
+ "number": null
+ },
+ "type": "guest"
+ },
+ "payment_method_id": "pix",
+ "payment_type_id": "bank_transfer",
+ "platform_id": null,
+ "point_of_interaction": {
+ "application_data": {
+ "name": null,
+ "version": null
+ },
+ "sub_type": "INTER_PSP",
+ "transaction_data": {
+ "bank_info": {
+ "collector": {
+ "account_holder_name": "Sergio Alonso de Almeida",
+ "account_id": 62083798652,
+ "long_name": "Mercadopago.com Representações Ltda.",
+ "transfer_account_id": null
+ },
+ "is_same_bank_account_owner": true,
+ "payer": {
+ "account_id": 12840173,
+ "id": null,
+ "long_name": "BANCO INTER S.A."
+ }
+ },
+ "bank_transfer_id": 64805201,
+ "financial_institution": 1,
+ "qr_code": "00020126580014br.gov.bcb.pix01364b0c1fe6-d572-4d2c-b7a8-d03aa85ee8df52040000530398654041.005802BR5915LUAR INFORMTICA6007Itapevi62240520mpqrinter148571360916304AA10",
+ "qr_code_base64": "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",
+ "transaction_id": "PIXE00416968202105130411UpQPkwhu50o"
+ },
+ "type": "OPENPLATFORM"
+ },
+ "pos_id": null,
+ "processing_mode": "aggregator",
+ "refunds": [],
+ "shipping_amount": 0,
+ "sponsor_id": null,
+ "statement_descriptor": null,
+ "status": "approved",
+ "status_detail": "accredited",
+ "store_id": null,
+ "taxes_amount": 0,
+ "transaction_amount": 1,
+ "transaction_amount_refunded": 0,
+ "transaction_details": {
+ "acquirer_reference": null,
+ "bank_transfer_id": 64805201,
+ "external_resource_url": null,
+ "financial_institution": "1",
+ "installment_amount": 0,
+ "net_received_amount": 0.99,
+ "overpaid_amount": 0,
+ "payable_deferral_period": null,
+ "payment_method_reference_id": null,
+ "total_paid_amount": 1,
+ "transaction_id": "PIXE00416968202105130411UpQPkwhu50o"
+ },
+ "shipping_cost": 0
+ }]
+}
diff --git a/Demo/json1.txt b/Demo/json1.txt
new file mode 100644
index 0000000..e95013e
--- /dev/null
+++ b/Demo/json1.txt
@@ -0,0 +1,14 @@
+[
+ {
+ "a":{
+ "username":"aaa",
+ "email":"aaa@gmail.com"
+ }
+ },
+ {
+ "b":{
+ "username":"bbb",
+ "email":"bbb@gmail.com"
+ }
+ }
+]
diff --git a/Demo/lista.json b/Demo/lista.json
new file mode 100644
index 0000000..ae204ce
--- /dev/null
+++ b/Demo/lista.json
@@ -0,0 +1,136 @@
+{
+ "paging": {
+ "total": 1,
+ "limit": 30,
+ "offset": 0
+ },
+ "results": [{
+ "acquirer_reconciliation": [],
+ "additional_info": {
+ "available_balance": null,
+ "bank_info": {
+ "is_same_bank_account_owner": true
+ },
+ "nsu_processadora": null
+ },
+ "authorization_code": null,
+ "binary_mode": false,
+ "brand_id": null,
+ "call_for_authorize_id": null,
+ "callback_url": null,
+ "captured": true,
+ "card": {},
+ "charges_details": [],
+ "collector_id": 166957358,
+ "corporation_id": null,
+ "counter_currency": null,
+ "coupon_amount": 0,
+ "currency_id": "BRL",
+ "date_approved": "2021-05-13T00:11:14.000-04:00",
+ "date_created": "2021-05-13T00:09:21.000-04:00",
+ "date_last_updated": "2021-05-13T00:11:14.000-04:00",
+ "date_of_expiration": "2021-05-13T23:00:00.000-04:00",
+ "deduction_schema": null,
+ "description": "LOCAÇÃO DE SISTEMA 132789",
+ "differential_pricing_id": null,
+ "external_reference": "132789",
+ "fee_details": [{
+ "amount": 0.01,
+ "fee_payer": "collector",
+ "type": "mercadopago_fee"
+ }],
+ "id": 14857136091,
+ "installments": 1,
+ "integrator_id": null,
+ "issuer_id": null,
+ "live_mode": true,
+ "marketplace_owner": null,
+ "merchant_account_id": null,
+ "merchant_number": null,
+ "metadata": {},
+ "money_release_date": "2021-05-13T00:11:14.000-04:00",
+ "money_release_schema": null,
+ "notification_url": null,
+ "operation_type": "regular_payment",
+ "order": {},
+ "payer": {
+ "email": "test@test.com",
+ "entity_type": null,
+ "first_name": "Test",
+ "id": "192528586",
+ "identification": {
+ "number": "19119119100",
+ "type": "CPF"
+ },
+ "last_name": "User",
+ "operator_id": null,
+ "phone": {
+ "area_code": null,
+ "extension": null,
+ "number": null
+ },
+ "type": "guest"
+ },
+ "payment_method_id": "pix",
+ "payment_type_id": "bank_transfer",
+ "platform_id": null,
+ "point_of_interaction": {
+ "application_data": {
+ "name": null,
+ "version": null
+ },
+ "sub_type": "INTER_PSP",
+ "transaction_data": {
+ "bank_info": {
+ "collector": {
+ "account_holder_name": "Sergio Alonso de Almeida",
+ "account_id": 62083798652,
+ "long_name": "Mercadopago.com Representações Ltda.",
+ "transfer_account_id": null
+ },
+ "is_same_bank_account_owner": true,
+ "payer": {
+ "account_id": 12840173,
+ "id": null,
+ "long_name": "BANCO INTER S.A."
+ }
+ },
+ "bank_transfer_id": 64805201,
+ "financial_institution": 1,
+ "qr_code": "00020126580014br.gov.bcb.pix01364b0c1fe6-d572-4d2c-b7a8-d03aa85ee8df52040000530398654041.005802BR5915LUAR INFORMTICA6007Itapevi62240520mpqrinter148571360916304AA10",
+ "qr_code_base64": "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",
+ "transaction_id": "PIXE00416968202105130411UpQPkwhu50o"
+ },
+ "type": "OPENPLATFORM"
+ },
+ "pos_id": null,
+ "processing_mode": "aggregator",
+ "refunds": [],
+ "shipping_amount": 0,
+ "sponsor_id": null,
+ "statement_descriptor": null,
+ "status": "approved",
+ "status_detail": "accredited",
+ "store_id": null,
+ "taxes_amount": 0,
+ "transaction_amount": 1,
+ "transaction_amount_refunded": 0,
+ "transaction_details": {
+ "acquirer_reference": null,
+ "bank_transfer_id": 64805201,
+ "external_resource_url": null,
+ "financial_institution": "1",
+ "installment_amount": 0,
+ "net_received_amount": 0.99,
+ "overpaid_amount": 0,
+ "payable_deferral_period": null,
+ "payment_method_reference_id": null,
+ "total_paid_amount": 1,
+ "transaction_id": "PIXE00416968202105130411UpQPkwhu50o"
+ },
+ "shipping_cost": 0
+ }]
+}
diff --git a/Demo/main.fmx b/Demo/main.fmx
new file mode 100644
index 0000000..9752849
--- /dev/null
+++ b/Demo/main.fmx
@@ -0,0 +1,1124 @@
+object Form2: TForm2
+ Left = 0
+ Top = 0
+ Caption = 'Form2'
+ ClientHeight = 655
+ ClientWidth = 491
+ FormFactor.Width = 320
+ FormFactor.Height = 480
+ FormFactor.Devices = [Desktop]
+ OnCreate = FormCreate
+ DesignerMasterStyle = 3
+ object TabControl1: TTabControl
+ Align = Client
+ Size.Width = 491.000000000000000000
+ Size.Height = 440.000000000000000000
+ Size.PlatformDefault = False
+ TabHeight = 49.000000000000000000
+ TabIndex = 0
+ TabPosition = PlatformDefault
+ OnChange = TabControl1Change
+ Sizes = (
+ 491s
+ 391s
+ 491s
+ 391s
+ 491s
+ 391s
+ 491s
+ 391s
+ 491s
+ 391s
+ 491s
+ 391s)
+ object TabItem1: TTabItem
+ CustomIcon = <
+ item
+ end>
+ IsSelected = True
+ Size.Width = 81.000000000000000000
+ Size.Height = 49.000000000000000000
+ Size.PlatformDefault = False
+ StyleLookup = ''
+ TabOrder = 0
+ Text = 'CHAVES'
+ ExplicitSize.cx = 234.000000000000000000
+ ExplicitSize.cy = 49.000000000000000000
+ object Layout01: TLayout
+ Align = Top
+ Margins.Top = 10.000000000000000000
+ Position.Y = 10.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Edit1: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Position.X = 10.000000000000000000
+ Position.Y = 19.000000000000000000
+ Margins.Left = 10.000000000000000000
+ Margins.Right = 10.000000000000000000
+ Size.Width = 471.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ end
+ object Label1: TLabel
+ Align = Top
+ Margins.Left = 10.000000000000000000
+ Margins.Top = 2.000000000000000000
+ Margins.Right = 10.000000000000000000
+ Position.X = 10.000000000000000000
+ Position.Y = 2.000000000000000000
+ Size.Width = 471.000000000000000000
+ Size.Height = 17.000000000000000000
+ Size.PlatformDefault = False
+ Text = 'Public Key'
+ end
+ end
+ object Layout02: TLayout
+ Align = Top
+ Position.Y = 60.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Edit2: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Position.X = 10.000000000000000000
+ Position.Y = 19.000000000000000000
+ Margins.Left = 10.000000000000000000
+ Margins.Right = 10.000000000000000000
+ Size.Width = 471.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ end
+ object Label2: TLabel
+ Align = Top
+ Margins.Left = 10.000000000000000000
+ Margins.Top = 2.000000000000000000
+ Margins.Right = 10.000000000000000000
+ Position.X = 10.000000000000000000
+ Position.Y = 2.000000000000000000
+ Size.Width = 471.000000000000000000
+ Size.Height = 17.000000000000000000
+ Size.PlatformDefault = False
+ Text = 'Access Token'
+ end
+ end
+ object Layout03: TLayout
+ Align = Top
+ Position.Y = 110.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Edit3: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Position.X = 10.000000000000000000
+ Position.Y = 19.000000000000000000
+ Margins.Left = 10.000000000000000000
+ Margins.Right = 10.000000000000000000
+ Size.Width = 471.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ end
+ object Label3: TLabel
+ Align = Top
+ Margins.Left = 10.000000000000000000
+ Margins.Top = 2.000000000000000000
+ Margins.Right = 10.000000000000000000
+ Position.X = 10.000000000000000000
+ Position.Y = 2.000000000000000000
+ Size.Width = 471.000000000000000000
+ Size.Height = 17.000000000000000000
+ Size.PlatformDefault = False
+ Text = 'Client ID'
+ end
+ end
+ object Layout05: TLayout
+ Align = Top
+ Position.Y = 210.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object CheckBox1: TCheckBox
+ Align = Left
+ IsChecked = True
+ Margins.Left = 10.000000000000000000
+ Position.X = 10.000000000000000000
+ Size.Width = 95.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ Text = 'SendBox'
+ end
+ object Button3: TButton
+ Align = Client
+ Margins.Right = 10.000000000000000000
+ Size.Width = 376.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ Text = 'INICIAR'
+ OnClick = Button3Click
+ end
+ end
+ object Layout04: TLayout
+ Align = Top
+ Position.Y = 160.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Edit4: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Position.X = 10.000000000000000000
+ Position.Y = 19.000000000000000000
+ Margins.Left = 10.000000000000000000
+ Margins.Right = 10.000000000000000000
+ Size.Width = 471.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ end
+ object Label4: TLabel
+ Align = Top
+ Margins.Left = 10.000000000000000000
+ Margins.Top = 2.000000000000000000
+ Margins.Right = 10.000000000000000000
+ Position.X = 10.000000000000000000
+ Position.Y = 2.000000000000000000
+ Size.Width = 471.000000000000000000
+ Size.Height = 17.000000000000000000
+ Size.PlatformDefault = False
+ Text = 'Client Secret'
+ end
+ end
+ end
+ object TabItem2: TTabItem
+ CustomIcon = <
+ item
+ end>
+ IsSelected = False
+ Size.Width = 81.000000000000000000
+ Size.Height = 49.000000000000000000
+ Size.PlatformDefault = False
+ StyleLookup = ''
+ TabOrder = 0
+ Text = 'PRINCIPAL'
+ ExplicitSize.cx = 234.000000000000000000
+ ExplicitSize.cy = 49.000000000000000000
+ object TabControl2: TTabControl
+ Align = Client
+ Size.Width = 491.000000000000000000
+ Size.Height = 391.000000000000000000
+ Size.PlatformDefault = False
+ TabHeight = 49.000000000000000000
+ TabIndex = 0
+ TabPosition = PlatformDefault
+ Sizes = (
+ 491s
+ 342s
+ 491s
+ 342s)
+ object TabItem4: TTabItem
+ CustomIcon = <
+ item
+ end>
+ IsSelected = True
+ Size.Width = 245.000000000000000000
+ Size.Height = 49.000000000000000000
+ Size.PlatformDefault = False
+ StyleLookup = ''
+ TabOrder = 0
+ Text = 'COMPRADOR'
+ ExplicitSize.cx = 245.000000000000000000
+ ExplicitSize.cy = 49.000000000000000000
+ object ListBox1: TListBox
+ Align = Client
+ Margins.Top = 10.000000000000000000
+ Margins.Bottom = 10.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 322.000000000000000000
+ Size.PlatformDefault = False
+ DisableFocusEffect = True
+ DefaultItemStyles.ItemStyle = ''
+ DefaultItemStyles.GroupHeaderStyle = ''
+ DefaultItemStyles.GroupFooterStyle = ''
+ Viewport.Width = 486.000000000000000000
+ Viewport.Height = 322.000000000000000000
+ object ListBoxItem1: TListBoxItem
+ Selectable = False
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditVenc: TDateEdit
+ Date = 44330.000000000000000000
+ Align = VertCenter
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ end
+ end
+ object ListBoxItem2: TListBoxItem
+ Selectable = False
+ Position.Y = 40.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditValor: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Text = '5.00'
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ TextPrompt = 'Valor'
+ end
+ end
+ object ListBoxItem3: TListBoxItem
+ Selectable = False
+ Position.Y = 80.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditPedido: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Text = '123456'
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ TextPrompt = 'N'#250'mero do Pedido'
+ end
+ end
+ object ListBoxItem4: TListBoxItem
+ Selectable = False
+ Position.Y = 120.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditDescri: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Text = 'Presta'#231#227'o de Servi'#231'o'
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ TextPrompt = 'Descri'#231#227'o'
+ end
+ end
+ object ListBoxItem5: TListBoxItem
+ Selectable = False
+ Position.Y = 160.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditPgto: TComboBox
+ Align = VertCenter
+ Items.Strings = (
+ 'BOLETO'
+ 'LOTERICA'
+ 'PIX'
+ 'CARTAO DEBITO'
+ 'CARTAO CREDITO')
+ ItemIndex = 2
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ end
+ end
+ object ListBoxItem6: TListBoxItem
+ Selectable = False
+ Position.Y = 200.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditEmail: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Text = 'test@test.com'
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ TextPrompt = 'Email'
+ end
+ end
+ object ListBoxItem7: TListBoxItem
+ Selectable = False
+ Position.Y = 240.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditNome: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Text = 'Test'
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ TextPrompt = 'Nome'
+ end
+ end
+ object ListBoxItem8: TListBoxItem
+ Selectable = False
+ Position.Y = 280.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditSobre: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Text = 'User'
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ TextPrompt = 'SobreNome'
+ end
+ end
+ object ListBoxItem9: TListBoxItem
+ Selectable = False
+ Position.Y = 320.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditDoc: TComboBox
+ Align = VertCenter
+ Items.Strings = (
+ 'CPF'
+ 'CNPJ')
+ ItemIndex = 0
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ end
+ end
+ object ListBoxItem10: TListBoxItem
+ Selectable = False
+ Position.Y = 360.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditDCN: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Text = '19119119100'
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ TextPrompt = 'N'#250'mero do Documento'
+ end
+ end
+ object ListBoxItem11: TListBoxItem
+ Selectable = False
+ Position.Y = 400.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditCep: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Text = '06663055'
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ TextPrompt = 'Cep'
+ end
+ end
+ object ListBoxItem12: TListBoxItem
+ Selectable = False
+ Position.Y = 440.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditEnd: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Text = 'Rua Sebasti'#227'o Mamede'
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ TextPrompt = 'Endere'#231'o'
+ end
+ end
+ object ListBoxItem13: TListBoxItem
+ Selectable = False
+ Position.Y = 480.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditNumero: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Text = 'Sem Numero'
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ TextPrompt = 'N'#250'mero'
+ end
+ end
+ object ListBoxItem14: TListBoxItem
+ Selectable = False
+ Position.Y = 520.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditBairro: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Text = 'Coahb 1'
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ TextPrompt = 'Bairro'
+ end
+ end
+ object ListBoxItem15: TListBoxItem
+ Selectable = False
+ Position.Y = 560.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditCidade: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Text = 'Itapevi'
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ TextPrompt = 'Cidade'
+ end
+ end
+ object ListBoxItem16: TListBoxItem
+ Selectable = False
+ Position.Y = 600.000000000000000000
+ Size.Width = 486.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ object EditEstado: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Text = 'SP'
+ Position.X = 50.000000000000000000
+ Position.Y = 4.000000000000000000
+ Margins.Left = 50.000000000000000000
+ Margins.Right = 50.000000000000000000
+ Size.Width = 386.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ TextPrompt = 'Estado'
+ end
+ end
+ end
+ end
+ object TabItem8: TTabItem
+ CustomIcon = <
+ item
+ end>
+ IsSelected = False
+ Size.Width = 246.000000000000000000
+ Size.Height = 49.000000000000000000
+ Size.PlatformDefault = False
+ StyleLookup = ''
+ TabOrder = 0
+ Text = 'CART'#195'O'
+ ExplicitSize.cx = 246.000000000000000000
+ ExplicitSize.cy = 49.000000000000000000
+ end
+ end
+ end
+ object TabItem6: TTabItem
+ CustomIcon = <
+ item
+ end>
+ IsSelected = False
+ Size.Width = 81.000000000000000000
+ Size.Height = 49.000000000000000000
+ Size.PlatformDefault = False
+ StyleLookup = ''
+ TabOrder = 0
+ Text = 'EMISS'#195'O'
+ ExplicitSize.cx = 68.000000000000000000
+ ExplicitSize.cy = 49.000000000000000000
+ object Layout17: TLayout
+ Align = Top
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Button2: TButton
+ Align = Client
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ Text = 'GERAR BOLETO BANC'#193'RIO'
+ OnClick = Button2Click
+ end
+ end
+ object Layout10: TLayout
+ Align = Client
+ Size.Width = 491.000000000000000000
+ Size.Height = 259.000000000000000000
+ Size.PlatformDefault = False
+ object QRCodeBitmap: TImage
+ MultiResBitmap = <
+ item
+ end>
+ Align = Center
+ Size.Width = 176.000000000000000000
+ Size.Height = 174.000000000000000000
+ Size.PlatformDefault = False
+ end
+ end
+ object Layout5: TLayout
+ Align = Bottom
+ Position.Y = 341.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Button1: TButton
+ Align = Client
+ Enabled = False
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ Text = 'COPIA E COLA'
+ OnClick = Button1Click
+ end
+ end
+ object Edit6: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = Bottom
+ Position.Y = 309.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ end
+ end
+ object TabItem3: TTabItem
+ CustomIcon = <
+ item
+ end>
+ IsSelected = False
+ Size.Width = 81.000000000000000000
+ Size.Height = 49.000000000000000000
+ Size.PlatformDefault = False
+ StyleLookup = ''
+ TabOrder = 0
+ Text = 'CONSULTAR'
+ ExplicitSize.cx = 156.000000000000000000
+ ExplicitSize.cy = 49.000000000000000000
+ object Layout13: TLayout
+ Align = Top
+ Margins.Top = 10.000000000000000000
+ Position.Y = 60.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 63.000000000000000000
+ Size.PlatformDefault = False
+ object Layout14: TLayout
+ Align = Client
+ Size.Width = 360.000000000000000000
+ Size.Height = 63.000000000000000000
+ Size.PlatformDefault = False
+ object Edit5: TEdit
+ Touch.InteractiveGestures = [LongTap, DoubleTap]
+ Align = VertCenter
+ Position.X = 20.000000000000000000
+ Position.Y = 27.000000000000000000
+ Margins.Left = 20.000000000000000000
+ Margins.Right = 20.000000000000000000
+ Size.Width = 320.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ end
+ object Label11: TLabel
+ Align = Top
+ Margins.Left = 20.000000000000000000
+ Margins.Right = 20.000000000000000000
+ Position.X = 20.000000000000000000
+ Size.Width = 320.000000000000000000
+ Size.Height = 23.000000000000000000
+ Size.PlatformDefault = False
+ Text = 'INFORME O ID DO PEDIDO:'
+ end
+ end
+ object Layout1: TLayout
+ Align = Right
+ Margins.Right = 10.000000000000000000
+ Position.X = 360.000000000000000000
+ Size.Width = 121.000000000000000000
+ Size.Height = 63.000000000000000000
+ Size.PlatformDefault = False
+ object Button6: TButton
+ Align = Bottom
+ Margins.Top = 23.000000000000000000
+ Position.Y = 23.000000000000000000
+ Size.Width = 121.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ Text = 'EXECUTAR'
+ OnClick = Button6Click
+ end
+ end
+ end
+ object Label12: TLabel
+ Align = Top
+ StyledSettings = [Family, Style, FontColor]
+ Margins.Left = 30.000000000000000000
+ Margins.Top = 10.000000000000000000
+ Margins.Right = 30.000000000000000000
+ Position.X = 30.000000000000000000
+ Position.Y = 133.000000000000000000
+ Size.Width = 431.000000000000000000
+ Size.Height = 23.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 22.000000000000000000
+ Text = 'Status:'
+ end
+ object Label13: TLabel
+ Align = Top
+ StyledSettings = [Family, Style, FontColor]
+ Margins.Left = 30.000000000000000000
+ Margins.Top = 10.000000000000000000
+ Margins.Right = 30.000000000000000000
+ Position.X = 30.000000000000000000
+ Position.Y = 166.000000000000000000
+ Size.Width = 431.000000000000000000
+ Size.Height = 23.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 22.000000000000000000
+ Text = 'Creditado:'
+ end
+ object Label14: TLabel
+ Align = Top
+ StyledSettings = [Family, Style]
+ Margins.Left = 30.000000000000000000
+ Margins.Top = 10.000000000000000000
+ Margins.Right = 30.000000000000000000
+ Position.X = 30.000000000000000000
+ Position.Y = 199.000000000000000000
+ Size.Width = 431.000000000000000000
+ Size.Height = 153.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 22.000000000000000000
+ TextSettings.FontColor = xFFC90D0D
+ TextSettings.HorzAlign = Center
+ Text =
+ 'Para a consulta funcionar a chave Access Token tem que ser a de ' +
+ 'produ'#231#227'o.'
+ end
+ object Layout11: TLayout
+ Align = Top
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object BoxTipo: TComboBox
+ Align = VertCenter
+ Items.Strings = (
+ 'BUSCAR'
+ 'CANCELAR')
+ ItemIndex = 0
+ Margins.Left = 100.000000000000000000
+ Margins.Right = 100.000000000000000000
+ Position.X = 100.000000000000000000
+ Position.Y = 9.000000000000000000
+ Size.Width = 291.000000000000000000
+ Size.Height = 32.000000000000000000
+ Size.PlatformDefault = False
+ end
+ end
+ end
+ object TabItem5: TTabItem
+ CustomIcon = <
+ item
+ end>
+ StyledSettings = [Family, Style, FontColor]
+ IsSelected = False
+ Size.Width = 81.000000000000000000
+ Size.Height = 49.000000000000000000
+ Size.PlatformDefault = False
+ StyleLookup = ''
+ TabOrder = 0
+ Text = 'SALDO'
+ ExplicitSize.cx = 67.000000000000000000
+ ExplicitSize.cy = 49.000000000000000000
+ object Layout16: TLayout
+ Align = Top
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Button8: TButton
+ Align = Contents
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ Text = 'BUSCAR SALDO DA CONTA'
+ OnClick = Button8Click
+ end
+ end
+ object Layout8: TLayout
+ Align = Top
+ Margins.Top = 10.000000000000000000
+ Position.Y = 60.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 69.000000000000000000
+ Size.PlatformDefault = False
+ object Label6: TLabel
+ Align = Top
+ StyledSettings = [Family, Style, FontColor]
+ Margins.Left = 30.000000000000000000
+ Margins.Top = 10.000000000000000000
+ Margins.Right = 30.000000000000000000
+ Position.X = 30.000000000000000000
+ Position.Y = 43.000000000000000000
+ Size.Width = 431.000000000000000000
+ Size.Height = 23.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 22.000000000000000000
+ Text = 'Saldo em conta '#233' de:'
+ end
+ object Label9: TLabel
+ Align = Top
+ StyledSettings = [Family, Style, FontColor]
+ Margins.Left = 30.000000000000000000
+ Margins.Top = 10.000000000000000000
+ Margins.Right = 30.000000000000000000
+ Position.X = 30.000000000000000000
+ Position.Y = 10.000000000000000000
+ Size.Width = 431.000000000000000000
+ Size.Height = 23.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 22.000000000000000000
+ Text = 'SALDO CONTA'
+ end
+ end
+ object Label15: TLabel
+ Align = Top
+ StyledSettings = [Family, Style]
+ Margins.Left = 30.000000000000000000
+ Margins.Top = 10.000000000000000000
+ Margins.Right = 30.000000000000000000
+ Position.X = 30.000000000000000000
+ Position.Y = 139.000000000000000000
+ Size.Width = 431.000000000000000000
+ Size.Height = 153.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 22.000000000000000000
+ TextSettings.FontColor = xFFC90D0D
+ TextSettings.HorzAlign = Center
+ Text =
+ 'Para a consulta funcionar a chave Access Token tem que ser a de ' +
+ 'produ'#231#227'o.'
+ end
+ end
+ object TabItem7: TTabItem
+ CustomIcon = <
+ item
+ end>
+ IsSelected = False
+ Size.Width = 86.000000000000000000
+ Size.Height = 49.000000000000000000
+ Size.PlatformDefault = False
+ StyleLookup = ''
+ TabOrder = 0
+ Text = 'SUA ID'
+ ExplicitSize.cx = 71.000000000000000000
+ ExplicitSize.cy = 49.000000000000000000
+ object Layout2: TLayout
+ Align = Top
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Button5: TButton
+ Align = Client
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ Text = 'OBTER DADOS DA SUA ID NO MERCADO PAGO'
+ OnClick = Button5Click
+ end
+ object Button9: TButton
+ Align = Left
+ Position.X = 73.000000000000000000
+ Size.Width = 73.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ Text = '[]'
+ Visible = False
+ OnClick = Button9Click
+ end
+ end
+ object Layout3: TLayout
+ Align = Top
+ Position.Y = 50.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Label16: TLabel
+ Align = VertCenter
+ StyledSettings = [Family, Style, FontColor]
+ Margins.Left = 30.000000000000000000
+ Margins.Right = 30.000000000000000000
+ Position.X = 30.000000000000000000
+ Position.Y = 12.000000000000000000
+ Size.Width = 431.000000000000000000
+ Size.Height = 26.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 22.000000000000000000
+ Text = 'UserID:'
+ end
+ end
+ object Layout4: TLayout
+ Align = Top
+ Position.Y = 100.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Label17: TLabel
+ Align = VertCenter
+ StyledSettings = [Family, Style, FontColor]
+ Margins.Left = 30.000000000000000000
+ Margins.Right = 30.000000000000000000
+ Position.X = 30.000000000000000000
+ Position.Y = 12.000000000000000000
+ Size.Width = 431.000000000000000000
+ Size.Height = 26.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 22.000000000000000000
+ Text = 'Usu'#225'rio:'
+ end
+ end
+ object Layout6: TLayout
+ Align = Top
+ Position.Y = 150.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Label18: TLabel
+ Align = VertCenter
+ StyledSettings = [Family, Style, FontColor]
+ Margins.Left = 30.000000000000000000
+ Margins.Right = 30.000000000000000000
+ Position.X = 30.000000000000000000
+ Position.Y = 12.000000000000000000
+ Size.Width = 431.000000000000000000
+ Size.Height = 26.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 22.000000000000000000
+ Text = 'Name:'
+ end
+ end
+ object Layout18: TLayout
+ Align = Top
+ Position.Y = 200.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Label19: TLabel
+ Align = VertCenter
+ StyledSettings = [Family, Style, FontColor]
+ Margins.Left = 30.000000000000000000
+ Margins.Right = 30.000000000000000000
+ Position.X = 30.000000000000000000
+ Position.Y = 12.000000000000000000
+ Size.Width = 431.000000000000000000
+ Size.Height = 26.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 22.000000000000000000
+ Text = 'Email:'
+ end
+ end
+ end
+ end
+ object Layout9: TLayout
+ Align = Bottom
+ Position.Y = 605.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Rectangle2: TRectangle
+ Align = Contents
+ Fill.Color = claBrown
+ Margins.Left = 5.000000000000000000
+ Margins.Top = 5.000000000000000000
+ Margins.Right = 5.000000000000000000
+ Margins.Bottom = 5.000000000000000000
+ Size.Width = 481.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ Stroke.Kind = None
+ XRadius = 6.000000000000000000
+ YRadius = 6.000000000000000000
+ object Label7: TLabel
+ Align = VertCenter
+ StyledSettings = [Family, Style]
+ Margins.Left = 10.000000000000000000
+ Margins.Right = 10.000000000000000000
+ Margins.Bottom = 2.000000000000000000
+ Position.X = 10.000000000000000000
+ Position.Y = 20.000000000000000000
+ Size.Width = 461.000000000000000000
+ Size.Height = 17.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 14.000000000000000000
+ TextSettings.FontColor = claWhite
+ Text = '...'
+ end
+ object Label10: TLabel
+ Align = Top
+ StyledSettings = [Family]
+ Margins.Left = 10.000000000000000000
+ Margins.Top = 3.000000000000000000
+ Margins.Right = 10.000000000000000000
+ Position.X = 10.000000000000000000
+ Position.Y = 3.000000000000000000
+ Size.Width = 461.000000000000000000
+ Size.Height = 17.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 14.000000000000000000
+ TextSettings.Font.StyleExt = {00070000000000000004000000}
+ TextSettings.FontColor = claWhite
+ Text = 'Error:'
+ end
+ end
+ end
+ object Layout12: TLayout
+ Align = Bottom
+ Position.Y = 440.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 115.000000000000000000
+ Size.PlatformDefault = False
+ object Memo2: TMemo
+ Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
+ DataDetectorTypes = []
+ TextSettings.WordWrap = True
+ Align = Client
+ Size.Width = 491.000000000000000000
+ Size.Height = 115.000000000000000000
+ Size.PlatformDefault = False
+ Viewport.Width = 483.000000000000000000
+ Viewport.Height = 107.000000000000000000
+ end
+ end
+ object Layout7: TLayout
+ Align = Bottom
+ Position.Y = 555.000000000000000000
+ Size.Width = 491.000000000000000000
+ Size.Height = 50.000000000000000000
+ Size.PlatformDefault = False
+ object Rectangle1: TRectangle
+ Align = Contents
+ Fill.Color = claBrown
+ Margins.Left = 5.000000000000000000
+ Margins.Top = 5.000000000000000000
+ Margins.Right = 5.000000000000000000
+ Margins.Bottom = 5.000000000000000000
+ Size.Width = 481.000000000000000000
+ Size.Height = 40.000000000000000000
+ Size.PlatformDefault = False
+ Stroke.Kind = None
+ XRadius = 6.000000000000000000
+ YRadius = 6.000000000000000000
+ object Label8: TLabel
+ Align = Top
+ StyledSettings = [Family]
+ Margins.Left = 10.000000000000000000
+ Margins.Top = 3.000000000000000000
+ Margins.Right = 10.000000000000000000
+ Position.X = 10.000000000000000000
+ Position.Y = 3.000000000000000000
+ Size.Width = 461.000000000000000000
+ Size.Height = 17.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 14.000000000000000000
+ TextSettings.Font.StyleExt = {00070000000000000004000000}
+ TextSettings.FontColor = claWhite
+ Text = 'Status:'
+ end
+ object Label5: TLabel
+ Align = VertCenter
+ StyledSettings = [Family, Style]
+ Margins.Left = 10.000000000000000000
+ Margins.Right = 10.000000000000000000
+ Margins.Bottom = 2.000000000000000000
+ Position.X = 10.000000000000000000
+ Position.Y = 20.000000000000000000
+ Size.Width = 461.000000000000000000
+ Size.Height = 17.000000000000000000
+ Size.PlatformDefault = False
+ TextSettings.Font.Size = 14.000000000000000000
+ TextSettings.FontColor = claWhite
+ Text = '...'
+ end
+ end
+ end
+ object GerenciaPago1: TGerenciaPago
+ Ativo = False
+ ConfigKey.SandBox = False
+ LancarDados.MeioPagar = Boleto
+ OnError = GerenciaPago1Error
+ OnStatus = GerenciaPago1Status
+ OnSaldo = GerenciaPago1Saldo
+ OnBoletoLink = GerenciaPago1BoletoLink
+ OnPixBase64 = GerenciaPago1PixBase64
+ OnPixCopiar = GerenciaPago1PixCopiar
+ Left = 216
+ Top = 504
+ end
+end
diff --git a/Demo/main.pas b/Demo/main.pas
new file mode 100644
index 0000000..e7d985f
--- /dev/null
+++ b/Demo/main.pas
@@ -0,0 +1,608 @@
+unit main;
+
+interface
+
+uses
+ {$IFDEF MSWINDOWS}
+ Winapi.ShellAPI, Winapi.Windows,
+ {$ENDIF MSWINDOWS}
+ {$IFDEF POSIX}
+ Posix.Stdlib,
+ {$ENDIF POSIX}
+
+ System.SysUtils, System.Types, System.UITypes, System.Classes,
+ System.StrUtils, System.Variants, System.Math, System.Character,
+ System.NetEncoding, System.DateUtils,
+
+ GerenciaPago, {DBXJSON,} System.JSON,
+
+ FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf,
+ Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.Stan.StorageBin,
+ FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param,
+
+ FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
+ FMX.Controls.Presentation, FMX.Edit, FMX.Layouts, FMX.StdCtrls,
+ FMX.Memo.Types, FMX.ScrollBox, FMX.Memo, FMXDelphiZXingQRCode,
+ FMX.Objects, FMX.TabControl, FMX.WebBrowser, FMX.ListBox,
+ FMX.DateTimeCtrls, FMX.Platform
+
+ {$IFDEF ANDROID}
+ ,Androidapi.JNI.Provider //TJSettings_Secure GPS
+ ,Androidapi.JNI.OS
+ ,Androidapi.JNI.App
+ ,Androidapi.JNIBridge
+ ,Androidapi.JNI.GraphicsContentViewText // JIntent
+ ,Androidapi.JNI.JavaTypes
+ ,Androidapi.Helpers
+ ,Androidapi.JNI.Location // Sensor de Localização
+ ,Androidapi.JNI.Telephony // Telefone Número
+ {$ENDIF}
+ ;
+
+type
+ TForm2 = class(TForm)
+ Layout01: TLayout;
+ Layout02: TLayout;
+ Layout03: TLayout;
+ Layout04: TLayout;
+ Edit1: TEdit;
+ Edit2: TEdit;
+ Edit3: TEdit;
+ Edit4: TEdit;
+ Label1: TLabel;
+ Label2: TLabel;
+ Label3: TLabel;
+ Label4: TLabel;
+ Layout7: TLayout;
+ Label5: TLabel;
+ Layout8: TLayout;
+ Label6: TLabel;
+ Layout9: TLayout;
+ Label7: TLabel;
+ Label8: TLabel;
+ Label9: TLabel;
+ Label10: TLabel;
+ Layout10: TLayout;
+ QRCodeBitmap: TImage;
+ Layout12: TLayout;
+ Memo2: TMemo;
+ TabControl1: TTabControl;
+ TabItem1: TTabItem;
+ TabItem2: TTabItem;
+ TabItem3: TTabItem;
+ Layout13: TLayout;
+ Label11: TLabel;
+ Edit5: TEdit;
+ Button6: TButton;
+ Layout14: TLayout;
+ Label12: TLabel;
+ Label13: TLabel;
+ Label14: TLabel;
+ TabItem5: TTabItem;
+ Layout16: TLayout;
+ Button8: TButton;
+ Label15: TLabel;
+ TabItem6: TTabItem;
+ Layout17: TLayout;
+ Button2: TButton;
+ Rectangle1: TRectangle;
+ Rectangle2: TRectangle;
+ GerenciaPago1: TGerenciaPago;
+ Layout05: TLayout;
+ CheckBox1: TCheckBox;
+ Button3: TButton;
+ Layout1: TLayout;
+ TabItem7: TTabItem;
+ Layout2: TLayout;
+ Button5: TButton;
+ Button9: TButton;
+ Layout3: TLayout;
+ Layout4: TLayout;
+ Layout6: TLayout;
+ Layout18: TLayout;
+ Label16: TLabel;
+ Label17: TLabel;
+ Label18: TLabel;
+ Label19: TLabel;
+ ListBox1: TListBox;
+ ListBoxItem1: TListBoxItem;
+ ListBoxItem2: TListBoxItem;
+ ListBoxItem3: TListBoxItem;
+ ListBoxItem4: TListBoxItem;
+ ListBoxItem5: TListBoxItem;
+ ListBoxItem6: TListBoxItem;
+ ListBoxItem7: TListBoxItem;
+ ListBoxItem8: TListBoxItem;
+ ListBoxItem9: TListBoxItem;
+ ListBoxItem10: TListBoxItem;
+ ListBoxItem11: TListBoxItem;
+ ListBoxItem12: TListBoxItem;
+ ListBoxItem13: TListBoxItem;
+ ListBoxItem14: TListBoxItem;
+ ListBoxItem15: TListBoxItem;
+ ListBoxItem16: TListBoxItem;
+ EditVenc: TDateEdit;
+ EditValor: TEdit;
+ EditPedido: TEdit;
+ EditDescri: TEdit;
+ EditPgto: TComboBox;
+ EditEmail: TEdit;
+ EditNome: TEdit;
+ EditSobre: TEdit;
+ EditDCN: TEdit;
+ EditCep: TEdit;
+ EditEnd: TEdit;
+ EditNumero: TEdit;
+ EditBairro: TEdit;
+ EditCidade: TEdit;
+ EditEstado: TEdit;
+ EditDoc: TComboBox;
+ Layout5: TLayout;
+ Button1: TButton;
+ Edit6: TEdit;
+ TabControl2: TTabControl;
+ TabItem4: TTabItem;
+ TabItem8: TTabItem;
+ Layout11: TLayout;
+ BoxTipo: TComboBox;
+ procedure GerenciaPago1Status(const Value: string);
+ procedure GerenciaPago1Saldo(const Value: Double);
+ procedure GerenciaPago1Error(const Value: string);
+ procedure GerenciaPago1BoletoLink(const Value: string);
+ procedure Button6Click(Sender: TObject);
+ procedure Button8Click(Sender: TObject);
+ procedure Button2Click(Sender: TObject);
+ procedure Button3Click(Sender: TObject);
+ procedure Button5Click(Sender: TObject);
+ procedure Button9Click(Sender: TObject);
+ procedure TabControl1Change(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure Button1Click(Sender: TObject);
+ procedure GerenciaPago1PixCopiar(const Value: string);
+ procedure GerenciaPago1PixBase64(const Value: WideString);
+ private
+ { Private declarations }
+ procedure QrCodeMobile(imgQRCode: TImage; texto: string);
+ procedure QRCodeWin(imgQRCode: TImage; texto: string);
+ procedure m( s: String );
+ public
+ { Public declarations }
+ end;
+
+var
+ Form2: TForm2;
+
+implementation
+
+{$R *.fmx}
+
+{function OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean;
+var
+ Intent: JIntent;
+begin
+// There may be an issue with the geo: prefix and URLEncode.
+// will need to research
+ Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
+ TJnet_Uri.JavaClass.parse(StringToJString(URL)));
+ try
+ TAndroidHelper.Activity.startActivity(Intent);
+ exit(true);
+ except
+ on e: Exception do
+ begin
+ if DisplayError then ShowMessage('Error: ' + e.Message);
+ exit(false);
+ end;
+ end;
+end;}
+
+function getCamposJsonString(json,value:String): String;
+var
+ LJSONObject: TJSONObject;
+ function TrataObjeto(jObj:TJSONObject):string;
+ var i:integer;
+ jPar: TJSONPair;
+ begin
+ result := '';
+ for i := 0 to jObj.Size - 1 do
+ begin
+ jPar := jObj.Get(i);
+ if jPar.JsonValue Is TJSONObject then
+ result := TrataObjeto((jPar.JsonValue As TJSONObject)) else
+ if sametext(trim(jPar.JsonString.Value),value) then
+ begin
+ Result := jPar.JsonValue.Value;
+ break;
+ end;
+ if result <> '' then
+ break;
+ end;
+ end;
+begin
+ try
+ LJSONObject := nil;
+ LJSONObject := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(json),0) as TJSONObject;
+ result := TrataObjeto(LJSONObject);
+ finally
+ LJSONObject.Free;
+ end;
+end;
+
+function StripNonJson(s: string): string;
+var
+ ch: char;
+ inString: boolean;
+begin
+ Result := '';
+ inString := false;
+ for ch in s do
+ begin
+ if ch = '"' then
+ inString := not inString;
+ if TCharacter.IsWhiteSpace(ch) and not inString then
+ continue;
+ Result := Result + ch;
+ end;
+end;
+
+function JsonSinComillas(s: String): String;
+begin
+ result := StringReplace( s, '"','', [rfReplaceAll] );
+end;
+
+procedure TForm2.Button1Click(Sender: TObject);
+begin
+ GerenciaPago1.CopiaColaPix;
+end;
+
+procedure TForm2.Button2Click(Sender: TObject);
+begin
+ with GerenciaPago1.LancarDados do begin
+ Vencimento := Editvenc.Text;
+ Valor := EditValor.Text;
+ PedidoNumero := EditPedido.Text;
+ Descricao := EditDescri.Text;
+
+ case EditPgto.ItemIndex of
+ 0: MeioPagar := TPgto.Boleto;
+ 1: MeioPagar := TPgto.Loterica;
+ 2: MeioPagar := TPgto.Pix;
+ end;
+
+ Email := EditEmail.Text;
+ Nome := EditNome.Text;
+ SobreNome := EditSobre.Text;
+ Doc := EditDoc.Selected.Text;
+ DocNumero := EditDCN.Text;
+ Cep := EditCep.Text;
+ Endereco := EditEnd.Text;
+ Numero := EditNumero.Text;
+ Bairro := EditBairro.Text;
+ Cidade := EditCidade.Text;
+ Estado := EditEstado.Text;
+ end;
+
+ GerenciaPago1.GerarBoleto;
+
+ if GerenciaPago1.LancarDados.MeioPagar = TPgto.Pix then
+ Button1.Enabled := True else
+ Button1.Enabled := False;
+
+ //m(GerenciaPago1.MemoRetono);
+ m(GerenciaPago1.RetornaID);
+end;
+
+procedure TForm2.Button3Click(Sender: TObject);
+begin
+ if not GerenciaPago1.Ativo then
+ begin
+ with GerenciaPago1 do begin
+ Ativo := True;
+ ConfigKey.PublicKey := Edit1.Text;
+ ConfigKey.AccessToken := Edit2.Text;
+ ConfigKey.Cliente_id := Edit3.Text;
+ ConfigKey.Cliente_Secret := Edit4.Text;
+ ConfigKey.SandBox := CheckBox1.IsChecked;
+ end;
+
+ {lbStatus.Text := MP.lbStatus;
+ MemoCore.Lines.Text := MP.MemoRetono;
+ MemoError.Lines.Text := MP.MemoError;}
+ Button3.Text := 'Stop';
+ end
+ else
+ begin
+ GerenciaPago1.Ativo := False;
+ Button3.Text := 'INICIAR';
+ end;
+end;
+
+procedure TForm2.Button5Click(Sender: TObject);
+begin
+ GerenciaPago1.RetornaConta;
+
+ Label16.Text := 'UserID: ' + GerenciaPago1.DadosConta.ID;
+ Label17.Text := 'Usuário: ' + GerenciaPago1.DadosConta.nickname;
+ Label18.Text := 'Name: ' + GerenciaPago1.DadosConta.first_name+' '+GerenciaPago1.DadosConta.last_name;
+ Label19.Text := 'Email: ' + GerenciaPago1.DadosConta.email;
+end;
+
+function getData2(JsonString: String; User: String; Field: String): String;
+var
+ JSonValue: TJSonValue;
+ JsonArray: TJSONArray;
+ ArrayElement: TJSonValue;
+ FoundValue: TJSonValue;
+begin
+ Result :='';
+
+ // create TJSonObject from string
+ JsonValue := TJSonObject.ParseJSONValue(JsonString);
+
+ // get the array
+ JsonArray := JsonValue as TJSONArray;
+
+ // iterate the array
+ for ArrayElement in JsonArray do begin
+ FoundValue := ArrayElement.FindValue(User);
+ if FoundValue <> nil then begin
+ Result := ArrayElement.GetValue(User + '.' + Field);
+ break;
+ end;
+ end;
+end;
+
+procedure TForm2.Button6Click(Sender: TObject);
+begin
+ case BoxTipo.ItemIndex of
+ 0: begin
+ GerenciaPago1.BuscarPedido(Edit5.Text);
+ Label12.Text := 'Status: '+ GerenciaPago1.RetConsulta.RetStatus;
+ Label13.Text := 'Creditado: '+ GerenciaPago1.RetConsulta.RetDataCredt;
+ end;
+ 1: begin
+ GerenciaPago1.CancelarPedido(Edit5.Text);
+ end;
+ end;
+
+ m( GerenciaPago1.MemoRetono );
+end;
+
+procedure TForm2.Button8Click(Sender: TObject);
+begin
+ GerenciaPago1.ConfigKey.PublicKey := Edit1.Text;
+ GerenciaPago1.ConfigKey.AccessToken := Edit2.Text;
+ GerenciaPago1.ConfigKey.Cliente_id := Edit3.Text;
+ GerenciaPago1.ConfigKey.Cliente_Secret := Edit4.Text;
+
+ GerenciaPago1.SaldoConta;
+end;
+
+procedure TForm2.Button9Click(Sender: TObject);
+var
+ Base64 : WideString;
+ Json : TJSONObject;
+begin
+ // PEGANDO SO O RESULTS E REMOVENDO []
+ {Json := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StripNonJson(Memo1.Text)),0));
+ Base64 := ( TJSONObject(Json.Get('results').JsonValue).ToString );
+ Memo1.Lines.Clear;
+ Memo1.Lines.Add(Base64);
+
+ Json := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StripNonJson(Memo1.Text)),0));
+ Base64 := ( TJSONObject(Json.Get('point_of_interaction').JsonValue).ToString );
+ Base64 := getCamposJsonString(Base64, 'qr_code');
+ Memo2.Lines.Add(Base64);
+ Base64 := ( TJSONObject(Json.Get('point_of_interaction').JsonValue).ToString );
+ Base64 := getCamposJsonString(Base64, 'qr_code_base64');
+
Memo2.Lines.Add(Base64);
+ Base64 := getCamposJsonString(Memo1.Text, 'status');
+ Memo2.Lines.Add(Base64);}
+end;
+
+procedure TForm2.FormCreate(Sender: TObject);
+begin
+ TabControl1.TabIndex := 0;
+ TabControl1.OnChange(Sender);
+end;
+
+procedure TForm2.GerenciaPago1BoletoLink(const Value: string);
+{$IF Defined(ANDROID)}
+var
+ Intent: JIntent;
+{$ENDIF}
+begin
+ {$IF Defined(ANDROID)}
+ Intent := TJIntent.Create;
+ Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
+ Intent.setData(StrToJURI(Value));
+ tandroidhelper.Activity.startActivity(Intent);
+ // SharedActivity.startActivity(Intent);
+ {$ELSEIF Defined(MSWINDOWS)}
+ ShellExecute(0, 'OPEN', PChar(Value), '', '', SW_SHOWNORMAL);
+ {$ELSEIF Defined(IOS)}
+ SharedApplication.OpenURL(StrToNSUrl(Value));
+ {$ELSEIF Defined(MACOS)}
+ _system(PAnsiChar('open ' + AnsiString(Value)));
+ {$ENDIF}
+end;
+
+procedure TForm2.GerenciaPago1Error(const Value: string);
+begin
+ Label7.Text := Value;
+end;
+
+procedure TForm2.GerenciaPago1PixBase64(const Value: WideString);
+begin
+ m(Value);
+end;
+
+procedure TForm2.GerenciaPago1PixCopiar(const Value: string);
+begin
+ Edit6.Text := Value;
+
+ {$IFDEF MSWINDOWS}
+ QRCodeWin(QRCodeBitmap, Value);
+ {$ELSE}
+ QRCodeMobile(QRCodeBitmap, Value);
+ {$ENDIF}
+end;
+
+procedure TForm2.GerenciaPago1Saldo(const Value: Double);
+begin
+ Label6.Text := 'Saldo em conta é de: '+Value.ToString;
+end;
+
+procedure TForm2.GerenciaPago1Status(const Value: string);
+begin
+ Label5.Text := Value;
+end;
+
+procedure TForm2.m(s: String);
+begin
+ //Memo2.Lines.Clear;
+ Memo2.Lines.Add(s);
+end;
+
+procedure TForm2.QrCodeMobile(imgQRCode: TImage; texto: string);
+const
+ downsizeQuality: Integer = 2; // bigger value, better quality, slower rendering
+var
+ QRCode: TDelphiZXingQRCode;
+ Row, Column: Integer;
+ pixelColor : TAlphaColor;
+ vBitMapData : TBitmapData;
+ pixelCount, y, x: Integer;
+ columnPixel, rowPixel: Integer;
+
+ function GetPixelCount(AWidth, AHeight: Single): Integer;
+ begin
+ if QRCode.Rows > 0 then
+ Result := Trunc(Min(AWidth, AHeight)) div QRCode.Rows
+ else
+ Result := 0;
+ end;
+begin
+ // Not a good idea to stretch the QR Code...
+ if imgQRCode.WrapMode = TImageWrapMode.iwStretch then
+ imgQRCode.WrapMode := TImageWrapMode.Fit;
+
+
+ QRCode := TDelphiZXingQRCode.Create;
+
+ try
+ QRCode.Data := ' ' + texto;
+ QRCode.Encoding := TQRCodeEncoding.qrAuto;
+ QRCode.QuietZone := 4;
+ pixelCount := GetPixelCount(imgQRCode.Width, imgQRCode.Height);
+
+ case imgQRCode.WrapMode of
+ TImageWrapMode.iwOriginal,
+ TImageWrapMode.iwTile,
+ TImageWrapMode.iwCenter:
+ begin
+ if pixelCount > 0 then
+ imgQRCode.Bitmap.SetSize(QRCode.Columns * pixelCount,
+ QRCode.Rows * pixelCount);
+ end;
+
+ TImageWrapMode.iwFit:
+ begin
+ if pixelCount > 0 then
+ begin
+ imgQRCode.Bitmap.SetSize(QRCode.Columns * pixelCount * downsizeQuality,
+ QRCode.Rows * pixelCount * downsizeQuality);
+ pixelCount := pixelCount * downsizeQuality;
+ end;
+ end;
+
+ //TImageWrapMode.iwStretch:
+ // raise Exception.Create('Not a good idea to stretch the QR Code');
+ end;
+ if imgQRCode.Bitmap.Canvas.BeginScene then
+ begin
+ try
+ imgQRCode.Bitmap.Canvas.Clear(TAlphaColors.White);
+ if pixelCount > 0 then
+ begin
+ if imgQRCode.Bitmap.Map(TMapAccess.maWrite, vBitMapData) then
+ begin
+ try
+ For Row := 0 to QRCode.Rows - 1 do
+ begin
+ for Column := 0 to QRCode.Columns - 1 do
+ begin
+ if (QRCode.IsBlack[Row, Column]) then
+ pixelColor := TAlphaColors.Black
+ else
+ pixelColor := TAlphaColors.White;
+
+ columnPixel := Column * pixelCount;
+ rowPixel := Row * pixelCount;
+
+ for x := 0 to pixelCount - 1 do
+ for y := 0 to pixelCount - 1 do
+ vBitMapData.SetPixel(columnPixel + x,
+ rowPixel + y, pixelColor);
+ end;
+ end;
+ finally
+ imgQRCode.Bitmap.Unmap(vBitMapData);
+ end;
+ end;
+ end;
+ finally
+ imgQRCode.Bitmap.Canvas.EndScene;
+ end;
+ end;
+ finally
+ QRCode.Free;
+ end;
+end;
+
+procedure TForm2.QRCodeWin(imgQRCode: TImage; texto: string);
+var
+ QRCode: TDelphiZXingQRCode;
+ Row, Column: Integer;
+ pixelColor : TAlphaColor;
+ vBitMapData : TBitmapData;
+begin
+ imgQRCode.DisableInterpolation := true;
+ imgQRCode.WrapMode := TImageWrapMode.iwStretch;
+
+ QRCode := TDelphiZXingQRCode.Create;
+ try
+ QRCode.Data := texto;
+ QRCode.Encoding := TQRCodeEncoding.qrAuto;
+ QRCode.QuietZone := 4;
+ imgQRCode.Bitmap.SetSize(QRCode.Rows, QRCode.Columns);
+
+ for Row := 0 to QRCode.Rows - 1 do
+ begin
+ for Column := 0 to QRCode.Columns - 1 do
+ begin
+ if (QRCode.IsBlack[Row, Column]) then
+ pixelColor := TAlphaColors.Black
+ else
+ pixelColor := TAlphaColors.White;
+
+ if imgQRCode.Bitmap.Map(TMapAccess.maWrite, vBitMapData) then
+ try
+ vBitMapData.SetPixel(Column, Row, pixelColor);
+ finally
+ imgQRCode.Bitmap.Unmap(vBitMapData);
+ end;
+ end;
+ end;
+
+ finally
+ QRCode.Free;
+ end;
+end;
+
+procedure TForm2.TabControl1Change(Sender: TObject);
+begin
+ Button2.Text := 'EMITIR '+EditPgto.Selected.Text;
+end;
+
+end.
diff --git a/Demo/main.vlb b/Demo/main.vlb
new file mode 100644
index 0000000..e1f4392
--- /dev/null
+++ b/Demo/main.vlb
@@ -0,0 +1,72 @@
+[Label1]
+Coordinates=326,78,53,58
+
+[Edit1]
+Coordinates=73,146,44,58
+
+[Label7]
+Coordinates=452,78,53,58
+
+[Label5]
+Coordinates=10,146,53,58
+
+[Label4]
+Coordinates=127,78,53,58
+
+[Edit3]
+Coordinates=10,78,44,58
+
+[Label8]
+Coordinates=64,78,53,58
+
+[Edit2]
+Coordinates=190,146,44,58
+
+[Layout8]
+Coordinates=290,214,60,36
+
+[Label3]
+Coordinates=148,10,53,58
+
+[Label10]
+Coordinates=211,10,60,58
+
+[Label9]
+Coordinates=389,78,53,58
+
+[Label6]
+Coordinates=395,10,53,58
+
+[Label2]
+Coordinates=127,146,53,58
+
+[QRCodeBitmap]
+Coordinates=281,10,104,58
+
+[Edit4]
+Coordinates=458,10,44,58
+
+[Layout9]
+Coordinates=391,146,60,36
+
+[Layout10]
+Coordinates=314,146,67,36
+
+[Layout7]
+Coordinates=244,146,60,36
+
+[]
+Coordinates=80,214,60,36
+
+[Layout01]
+Coordinates=360,214,60,36
+
+[Layout02]
+Coordinates=10,214,60,36
+
+[Layout03]
+Coordinates=461,146,60,36
+
+[Layout04]
+Coordinates=220,214,60,36
+
diff --git a/GerenciaPago.dcu b/GerenciaPago.dcu
new file mode 100644
index 0000000..3600088
Binary files /dev/null and b/GerenciaPago.dcu differ
diff --git a/GerenciaPago.pas b/GerenciaPago.pas
new file mode 100644
index 0000000..81f8eb6
--- /dev/null
+++ b/GerenciaPago.pas
@@ -0,0 +1,691 @@
+unit GerenciaPago;
+
+interface
+
+uses
+ DBXJSON, JSON, System.SysUtils, System.StrUtils, System.Classes,
+
+ FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
+ FMX.Platform,
+
+ RestClient_u, DateUtils, Character;
+
+type
+ TOnStatus = procedure(const Value: string) of object;
+ TOnSaldo = procedure(const Value: Double) of object;
+ TOnError = procedure(const Value: String) of object;
+ TOnBoletoLink = procedure(const Value: String) of object;
+
+ TOnPixBase64 = procedure(const Value: WideString) of object;
+ TOnPixCopiar = procedure(const Value: String) of object;
+ //TIPOS DE PAGAMENTO
+ TPgto = (Boleto = 0, Loterica = 1, Pix = 2);
+
+ TRetBusca = record
+ RetStatus, RetDataCredt: String;
+ end;
+
+ // INFORMAÇÕES DA CONTA DO USUÁRRIO
+ TConta = record
+ ID,
+ nickname,
+ first_name,
+ last_name,
+ email :String;
+ end;
+
+ // ENDEREÇO DA API
+ TMPRestClient = Class ( TRestClient )
+ private
+ protected
+ constructor Create ; override ;
+ end;
+
+ // LANÇAMENTO DE DADOS
+ TDados = class(tComponent)
+ private
+ // DADOS DO BOLETO
+ Vinstallments,
+ Vdate_of_expiration,
+ Vtransaction_amount,
+ Vexternal_reference,
+ Vdescription,
+ // DOADOS DO COMPRADOS
+ Vemail,
+ Vfirst_name,
+ Vlast_name,
+ Vtype, //TIPO DE DOCUMENTO, CPF OU CNPJ CASO BRASIL
+ Vnumber, //NUMERO DO CPF OU CNPJ
+ //ENDEREÇO DO COMPRADOR
+ Vzip_code,
+ Vstreet_name,
+ Vstreet_number,
+ Vneighborhood,
+ Vcity,
+ Vfederal_unit : String;
+ vError : String;
+ Vpayment_method_id: TPgto;
+
+ published
+ // LANÇAMENTO DO BOLETO
+ property Parcelas : String read Vinstallments write Vinstallments ; // Número de poarcelas
+ property Vencimento : String read Vdate_of_expiration write Vdate_of_expiration ; // Vencimento
+ property Valor : String read Vtransaction_amount write Vtransaction_amount ; // Valor
+ property PedidoNumero : String read Vexternal_reference write Vexternal_reference ; // Numero do Pedido
+ property Descricao : String read Vdescription write Vdescription ; // Descricao do produto ou serviço
+ // Dados do Pagador
+ property Email : String read Vemail write Vemail ;
+ property Nome : String read Vfirst_name write Vfirst_name ;
+ property SobreNome : String read Vlast_name write Vlast_name ;
+ property Doc : String read Vtype write Vtype ;
+ property DocNumero : String read Vnumber write Vnumber ;
+
+ // Enderço do Pagador
+ property Cep : String read Vzip_code write Vzip_code ;
+ property Endereco : String read Vstreet_name write Vstreet_name ;
+ property Numero : String read Vstreet_number write Vstreet_number ;
+ property Bairro : String read Vneighborhood write Vneighborhood ;
+ property Cidade : String read Vcity write Vcity ;
+ property Estado : String read Vfederal_unit write Vfederal_unit ;
+
+ property MeioPagar : TPgto read Vpayment_method_id write Vpayment_method_id; // Meio de pagamento [Boleto, Pix, Cartao, Loterica]
+ end;
+
+ // MENU DE CHAVES KEYS
+ TConfig = class(TComponent)
+ private
+ FSandBox : Boolean;
+ FAccessToken : String;
+ FPublicKey : String;
+ FCliente_id : String;
+ FCliente_Secret : String;
+ procedure SetAccessToken(const Value: String);
+ procedure SetCliente_id(const Value: String);
+ procedure SetCliente_Secret(const Value: String);
+ procedure SetPublicKey(const Value: String);
+ procedure SetSandBox(const Value: Boolean);
+ published
+ property PublicKey : String read FPublicKey write SetPublicKey;
+ property AccessToken : String read FAccessToken write SetAccessToken;
+ property Cliente_id : String read FCliente_id write SetCliente_id;
+ property Cliente_Secret : String read FCliente_Secret write SetCliente_Secret;
+ property SandBox: Boolean read FSandBox write FSandBox;
+ end;
+
+ TGerenciaPago = class(TComponent)
+ private
+ // Verifica se o componente está ativo
+ FAtivo : Boolean;
+
+ req : TRequest;
+ Json : TJSONObject;
+ // Pega o status
+ FStatus : TOnStatus;
+ // Pega o saldo da conta
+ FSaldo : TOnSaldo;
+ // Infomações da Conta
+ FUser : TConta;
+ // Informações de error
+ FError : TOnError;
+ // Link do Boleto
+ FBoletoLink : TOnBoletoLink;
+ // Imagem do pix
+ FPixBase64 : TOnPixBase64;
+ // Copiar e colar pix
+ FPixCopiar : TOnPixCopiar;
+ // Retorna o status do pedido de cobrança
+ FRetBusca : TRetBusca;
+
+ TimerApagaStatus : TTimer;
+ sResposta : String;
+ FMemoRetorno : WideString;
+
+ vError : String;
+ CopiaCola : String;
+ FRetornaID : String;
+
+ procedure SetError(const Value: String);
+ procedure SetStatus(const Value: String);
+ procedure SetSaldo(const Value: Double);
+ procedure SetBoletoLink(const Value: String);
+ procedure SetMemo(const Value: WideString);
+
+ procedure SetPixBase64(const Value: WideString);
+ procedure SetPixCopiar(const Value: String);
+
+ protected
+ { Protected declarations }
+ FSubConfig : TConfig;
+ FSubDados : TDados;
+ public
+ { Public declarations }
+ constructor Create (AOwner: TComponent); override;
+ destructor Destroy ;
+
+ // SandBoxURL
+ function SandBoxURL( s : String ) : String ;
+ // Informações da conta
+ procedure RetornaConta;
+ // Informações do saldo da conta
+ procedure SaldoConta;
+ // Retorna o status do pedido de cobrança
+ procedure BuscarPedido(s: String);
+ // Faz a emissão do boleto
+ procedure GerarBoleto();
+ // Retorna erro se ouver
+ procedure xError( s : String );
+ // Retorna a resposta
+ procedure m( s : WideString );
+ // Copia e Cola Pix
+ procedure CopiaColaPix;
+ // Verifica se esta ativo ou nao
+ function StatusAtivo:Boolean;
+ // Cancelar Pedido
+ function CancelarPedido(s: String): String;
+
+ published
+ { Published declarations }
+ // Informações da Conta
+ property Ativo : Boolean read FAtivo write FAtivo;
+ property ConfigKey : TConfig read FSubConfig;
+ property LancarDados : TDados read FSubDados;
+ property DadosConta : TConta read FUser write FUser;
+ property RetConsulta : TRetBusca read FRetBusca write FRetBusca;
+
+ property RetornaID : String read FRetornaID write FRetornaID;
+
+ property OnError : TOnError read FError write FError;
+ property OnStatus : TOnStatus read FStatus write FStatus;
+ property OnSaldo : TOnSaldo read FSaldo write FSaldo;
+ property OnBoletoLink : TOnBoletoLink read FBoletoLink write FBoletoLink;
+
+ property MemoRetono : WideString read FMemoRetorno write SetMemo ;
+ property OnPixBase64 : TOnPixBase64 read FPixBase64 write FPixBase64;
+ property OnPixCopiar : TOnPixCopiar read FPixCopiar write FPixCopiar;
+
+ end;
+
+procedure Register;
+
+implementation
+
+{$R ./SGerenciaPago.dcr}
+
+procedure Register;
+begin
+ RegisterComponents('pagOnline', [TGerenciaPago]);
+end;
+
+function getCamposJsonString(json,value:String): String;
+var
+ LJSONObject: TJSONObject;
+ function TrataObjeto(jObj:TJSONObject):string;
+ var i:integer;
+ jPar: TJSONPair;
+ begin
+ result := '';
+ for i := 0 to jObj.Size - 1 do
+ begin
+ jPar := jObj.Get(i);
+ if jPar.JsonValue Is TJSONObject then
+ result := TrataObjeto((jPar.JsonValue As TJSONObject)) else
+ if sametext(trim(jPar.JsonString.Value),value) then
+ begin
+ Result := jPar.JsonValue.Value;
+ break;
+ end;
+ if result <> '' then
+ break;
+ end;
+ end;
+begin
+ try
+ LJSONObject := nil;
+ LJSONObject := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(json),0) as TJSONObject;
+ result := TrataObjeto(LJSONObject);
+ finally
+ LJSONObject.Free;
+ end;
+end;
+
+function StripNonJson(s: string): string;
+var
+ ch: char;
+ inString: boolean;
+begin
+ Result := '';
+ inString := false;
+ for ch in s do
+ begin
+ if ch = '"' then
+ inString := not inString;
+ if TCharacter.IsWhiteSpace(ch) and not inString then
+ continue;
+ Result := Result + ch;
+ end;
+end;
+
+function JsonSinComillas(s: String): String;
+begin
+ result := StringReplace( s, '"','', [rfReplaceAll] );
+end;
+
+procedure SaveToFile( sFileName: String ; sTexto : String );
+var
+ f : textfile;
+begin
+ try
+ AssignFile( f, sFileName );
+ Rewrite( f );
+ Write(f, sTexto );
+ Flush(f);
+ CloseFile(f);
+ except
+ end;
+end;
+
+
+{ TGerenciaPago }
+
+procedure TConfig.SetAccessToken(const Value: String);
+begin
+ FAccessToken := Value;
+end;
+
+procedure TConfig.SetCliente_id(const Value: String);
+begin
+ FCliente_id := Value;
+end;
+
+procedure TConfig.SetCliente_Secret(const Value: String);
+begin
+ FCliente_Secret := Value;
+end;
+
+procedure TConfig.SetPublicKey(const Value: String);
+begin
+ FPublicKey := Value;
+end;
+
+procedure TConfig.SetSandBox(const Value: Boolean);
+begin
+ FSandBox := Value;
+end;
+
+{ TGerenciaPago }
+
+procedure TGerenciaPago.BuscarPedido(s: String);
+var
+ vStatus : String;
+ i : Integer;
+ JSObj,jsonObject : TJSONObject;
+ JSArray : TJSONArray;
+ JSValue : TJSONValue;
+begin
+ if not StatusAtivo then exit;
+
+ SetStatus( 'Buscando Pagamento' );
+
+ req.Clear;
+ if s = '' then
+ begin
+ req.uri := '/v1/payments/search/?status=approved';
+ req.params.Add('?access_token='+FSubConfig.FAccessToken);
+ end
+ else
+ begin
+ req.uri := '/v1/payments/search?id='+s; //external_reference
+ req.params.Add('&access_token='+FSubConfig.FAccessToken);
+ end;
+
+ try
+ sResposta := TMPRestClient.Get(req);
+ except
+ on E: Exception do
+ xError( 'Error: '+E.ClassName + ': ' +E.Message );
+ end;
+
+ m( 'Resposta: '+sResposta );
+
+ Json := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StripNonJson(sResposta)),0));
+ vError := getCamposJsonString(sResposta, 'error');
+ if vError <> '' then
+ begin
+ xError( 'Error: '+( TJSONObject(Json.Get('message').JsonValue).ToString ) );
+ exit;
+ end;
+
+ // Pega o status do pedido
+ JSObj := TJSONObject.ParseJSONValue(sResposta) as TJSONObject;
+ if(JSObj <> nil)then
+ begin
+ jsArray := JSObj.GetValue('results') as TJSONArray;
+ for i := 0 to jsArray .Count-1 do
+ begin
+ jsonObject := jsArray.Items[i] as TJSONObject;
+
+ case AnsiIndexStr(jsonObject.GetValue('status'),
+ ['pending', 'approved', 'in_process', 'rejected', 'cancelled', 'refunded', 'charged_back']) of
+ 0 : FRetBusca.RetStatus := 'Pendente';
+ 1 : FRetBusca.RetStatus := 'Aprovado';
+ 2 : FRetBusca.RetStatus := 'Em Processo';
+ 3 : FRetBusca.RetStatus := 'Rejeitado';
+ 4 : FRetBusca.RetStatus := 'Cancelado';
+ 5 : FRetBusca.RetStatus := 'Reembolso';
+ 6 : FRetBusca.RetStatus := 'Estorno Cartão';
+ end;
+
+ // DATA DA APROVAÇÃO
+ FRetBusca.RetDataCredt := DateToStr(ISO8601ToDate(jsonObject.GetValue('date_created')));
+ end;
+ end;
+
+ SetStatus( 'Buscando Pagamento '+FRetBusca.RetStatus+' '+FRetBusca.RetDataCredt );
+end;
+
+function TGerenciaPago.CancelarPedido(s: String): String;
+begin
+ req.Clear;
+ req.uri := '/v1/payments/'+s;
+ req.params.Add('?access_token='+FSubConfig.FAccessToken);
+
+ //Os cancelamentos podem ser realizados somente com status pending e in process
+ req.body.Add('{"status" : "cancelled"}');
+
+ try
+ sResposta := TMPRestClient.Put(req);
+ except
+ on E: Exception do
+ xError( 'Error: '+E.ClassName + ': ' +E.Message );
+ end;
+
+ m( 'Resposta: '+sResposta );
+
+ Json := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StripNonJson(sResposta)),0));
+ vError := getCamposJsonString(sResposta, 'error');
+ if vError <> '' then
+ begin
+ xError( 'Error: '+( TJSONObject(Json.Get('message').JsonValue).ToString ) );
+ exit;
+ end;
+end;
+
+procedure TGerenciaPago.CopiaColaPix;
+var
+ Svc: IFMXClipboardService;
+ Image: TBitmap;
+begin
+ if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, Svc) then
+ Svc.SetClipboard(CopiaCola);
+end;
+
+constructor TGerenciaPago.Create(AOwner: TComponent);
+begin
+ inherited;
+ req := TRequest.Create;
+
+ {TimerApagaStatus := TTimer.Create( Self );
+ TimerApagaStatus.Interval := 2*1000 ;
+ TimerApagaStatus.Enabled := False ;
+ TimerApagaStatus.OnTimer := TimerApagaStatusOnTimer;}
+
+ // CRIA OS MENUS NO OBJETO SPECTOR
+ FSubConfig := TConfig.Create(Self);
+ FSubConfig.Name := 'ConfigKey';
+ FSubConfig.SetSubComponent(True);
+
+ FSubDados := TDados.Create(Self);
+ FSubDados.Name := 'LancarDados';
+ FSubDados.SetSubComponent(True);
+end;
+
+destructor TGerenciaPago.Destroy;
+begin
+ //TimerApagaStatus.Free;
+ req.Free;
+end;
+
+procedure TGerenciaPago.GerarBoleto;
+var
+ Enviar : TStringList;
+ ano, mes, dia : word;
+ data : TDateTime;
+ vError, Link, Base64, Copiar : WideString;
+begin
+ try
+ if not StatusAtivo then exit;
+
+ with FSubDados do begin
+ Enviar := TStringList.Create;
+ Enviar.Add(
+ '{'+#10+
+ '"installments": 1,'+#10+ // NUMERO DE PACELAS
+ '"date_of_expiration": "'+ DateToISO8601(StrToDate(Vencimento), False)+'",'+#10+
+ '"transaction_amount": '+ StringReplace(Valor, ',', '.', [])+','+#10+ //
+ '"external_reference": "'+ PedidoNumero+'",'+#10+ //NUMERO DO PEDIDO DE SEU SITE PARA FUTURA CONCILIAÇÃO FINANCEIRA
+ '"description": "'+ Descricao+'",');
+
+ if Vpayment_method_id = Boleto then
+ Enviar.Add('"payment_method_id": "bolbradesco",'); // MEIO DE PAGAMENTO
+ if Vpayment_method_id = Loterica then
+ Enviar.Add('"payment_method_id": "pec",'); // MEIO DE PAGAMENTO
+ if Vpayment_method_id = Pix then
+ Enviar.Add('"payment_method_id": "pix",'); // MEIO DE PAGAMENTO
+
+ // DODOS DO COMPRADOS
+ Enviar.Add(
+ '"payer": {'+#10+
+ '"email": "'+ Email+'",'+#10+
+ '"first_name": "'+ Nome+'",'+#10+
+ '"last_name": "'+ SobreNome+'",'+#10+
+
+ '"identification": {'+#10+
+ '"type": "'+ Doc+'",'+#10+ //TIPO DE DOCUMENTO, CPF OU CNPJ CASO BRASIL
+ '"number": "'+ DocNumero+'"'+#10+
+ '},'+#10+
+
+ //ENDEREÇO DO COMPRADOR
+ '"address": {'+#10+
+ '"zip_code": "'+ Cep+'",'+#10+
+ '"street_name": "'+ Endereco+'",'+#10+
+ '"street_number": "'+ Numero+'",'+#10+
+ '"neighborhood": "'+ Bairro+'",'+#10+
+ '"city": "'+ Cidade+'",'+#10+
+ '"federal_unit": "'+ Estado+'"'+#10+
+ '}'+#10+
+ '}'+#10+
+ '}');
+
+
{if Vpayment_method_id in [Boleto, Loterica] then
+
begin
+ if Valor.tointeger > 5 then
+ xError( 'Error: O valor minimo para boleto e letrica não pode ser menor que 5.00' );
+ exit;
+ end;}
+
+
SetStatus( 'Adicionando Pagamento Por Boleto' );
+
+ req.Clear ;
+ req.uri := '/v1/payments'; //advanced_payments
+ req.params.Add('?access_token='+FSubConfig.FAccessToken);
+ req.body.Add( Enviar.Text );
+
+ try
+ sResposta := TMPRestClient.Post(req);
+ except
+ on E: Exception do
+ xError( 'Error: '+E.ClassName + ': ' +E.Message );
+ end;
+
+ m( 'Resposta: '+sResposta );
+
+ Json := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StripNonJson(sResposta)),0));
+
+ FRetornaID := ( TJSONObject(Json.Get('id').JsonValue).ToString );
+
+ if Vpayment_method_id in [Boleto, Loterica] then
+ begin
+ Link := ( TJSONObject(Json.Get('transaction_details').JsonValue).ToString );
+ Link := getCamposJsonString(Link, 'external_resource_url');
+ FBoletoLink( Link );
+ end;
+
+ if Vpayment_method_id = Pix then
+ begin
+ Copiar := ( TJSONObject(Json.Get('point_of_interaction').JsonValue).ToString );
+ Copiar := getCamposJsonString(Copiar, 'qr_code');
+ FPixCopiar( Copiar );
+ CopiaCola := Copiar;
+
+ Base64 := ( TJSONObject(Json.Get('point_of_interaction').JsonValue).ToString );
+ Base64 := getCamposJsonString(Base64, 'qr_code_base64');
+ FPixBase64( Base64 );
+ end;
+
+ SetStatus( 'Pagamento gerado e incluído com sucesso!' );
+ end;
+ Except
+ On E: Exception do
+ begin
+ xError( 'Error: '+E.ClassName + ': ' +E.Message );
+ end;
+ end;
+end;
+
+procedure TGerenciaPago.m(s: WideString);
+begin
+ FMemoRetorno := s;
+end;
+
+procedure TGerenciaPago.RetornaConta;
+var
+ vError : String;
+begin
+ if not StatusAtivo then exit;
+ SetStatus( 'Buscando dados da conta' );
+
+ req.Clear ;
+ req.uri := '/users/me';
+ req.params.Add('?access_token='+ FSubConfig.FAccessToken);
+ try
+ sResposta := TMPRestClient.Get(req);
+ except
+ on E: Exception do
+ xError( 'Error: '+E.ClassName + ': ' +E.Message );
+ end;
+
+ m( 'Resposta: '+sResposta );
+
+ Json := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StripNonJson(sResposta)),0));
+ FUser.ID := JsonSinComillas( TJSONObject(Json.Get('id').JsonValue).ToString );
+ FUser.nickname := JsonSinComillas( TJSONObject(Json.Get('nickname').JsonValue).ToString );
+ FUser.first_name := JsonSinComillas( TJSONObject(Json.Get('first_name').JsonValue).ToString );
+ FUser.last_name := JsonSinComillas( TJSONObject(Json.Get('last_name').JsonValue).ToString );
+ FUser.email := JsonSinComillas( TJSONObject(Json.Get('email').JsonValue).ToString );
+
+ SetStatus( 'Dados da conta retornados corretamente!' );
+end;
+
+procedure TGerenciaPago.SaldoConta;
+var
+ vError : String;
+ const
+ vID = '166957358';
+begin
+ if not StatusAtivo then exit;
+
+ SetStatus( 'Buscando saldo da conta!' );
+ req.Clear ;
+ req.uri := '/users/'+vID+'/mercadopago_account/balance';
+ req.params.Add('?access_token='+FSubConfig.FAccessToken);
+ try
+ sResposta := TMPRestClient.Get(req);
+ except
+ on E: Exception do
+ xError( 'Error: '+E.ClassName + ': ' +E.Message );
+ end;
+ m( 'Resposta: '+sResposta );
+
+ Json := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StripNonJson(sResposta)),0));
+
+ vError := getCamposJsonString(sResposta, 'error');
+ if vError <> '' then
+ begin
+ xError( 'Error: '+( TJSONObject(Json.Get('message').JsonValue).ToString ) );
+ exit;
+ end;
+
+ SetSaldo(StrToCurr(StringReplace(JsonSinComillas( TJSONObject(Json.Get('total_amount').JsonValue).ToString), '.', ',', [] )));
+ SetStatus( 'Buscando saldo da conta!' );
+end;
+
+function TGerenciaPago.SandBoxURL(s: String): String;
+begin
+ if FSubConfig.FSandBox then
+ result := result+'/sandbox';
+ result := result + s;
+end;
+
+procedure TGerenciaPago.SetBoletoLink(const Value: String);
+begin
+ FBoletoLink(Value);
+end;
+
+procedure TGerenciaPago.SetError(const Value: String);
+begin
+ FError(Value);
+end;
+
+procedure TGerenciaPago.SetMemo(const Value: WideString);
+begin
+ FMemoRetorno := Value;
+end;
+
+procedure TGerenciaPago.SetPixBase64(const Value: WideString);
+begin
+ FPixBase64(Value);
+end;
+
+procedure TGerenciaPago.SetPixCopiar(const Value: String);
+begin
+ FPixCopiar(Value);
+end;
+
+procedure TGerenciaPago.SetSaldo(const Value: Double);
+begin
+ FSaldo(Value);
+end;
+
+procedure TGerenciaPago.SetStatus(const Value: String);
+begin
+ FStatus(Value);
+end;
+
+function TGerenciaPago.StatusAtivo: Boolean;
+begin
+ if not FAtivo then
+ begin
+ xError( 'Error: Componente não ativo!' );
+ Result := False;
+ end
+ else
+ begin
+ xError( '' );
+ Result := True;
+ end;
+end;
+
+procedure TGerenciaPago.xError(s: String);
+begin
+ SetError(s);
+end;
+
+{ TMPRestClient }
+
+constructor TMPRestClient.Create;
+begin
+ inherited;
+ sURLDominio := 'https://api.mercadopago.com';
+end;
+
+end.
diff --git a/MercadoPago_u.pas b/MercadoPago_u.pas
new file mode 100644
index 0000000..fefe59b
--- /dev/null
+++ b/MercadoPago_u.pas
@@ -0,0 +1,679 @@
+unit MercadoPago_u;
+
+interface
+
+uses
+ DBXJSON, JSON, System.SysUtils, System.StrUtils, System.Classes,
+
+ FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
+
+ RestClient_u;
+
+type
+
+ TMPRestClient = Class ( TRestClient )
+ private
+ protected
+ constructor Create ; override ;
+ End;
+
+ TRetBusca = record
+ RetStatus, RetDataCredt: String;
+ end;
+
+ TBoleto = record
+ BoletoRetorno : Boolean;
+ BoletoLink, BoletoBarra, BoletoID, BoletoVencimento : String;
+ end;
+
+ // INFORMAÇÕES DA CONTA DO USUÁRRIO
+ TMPUser = record
+ ID,
+ nickname,
+ first_name,
+ last_name,
+ email :String;
+ end;
+
+ TMPCobro = record
+ ID : String;
+ date_created,
+ status,
+ external_reference,
+ merchant_order_id,
+ reason,
+ currency_id,
+ payment_type,
+ json :String;
+
+ transaction_amount,
+ total_paid_amount,
+ shipping_cost :Real;
+
+ end;
+
+ TProcedureMPCobro = procedure ( x : TMPCobro ) of object ;
+
+ TMercadoPago = Class( TComponent )
+ private
+ sResposta : String ;
+ FMemoRetorno : WideString;
+ FMemoError : String;
+
+ FClient_ID : String;
+ FClient_Secret : String;
+ FSandBox : Boolean;
+ FUser : TMPUser;
+ FStatus : String;
+ FBoleto : TBoleto;
+ FContaSaldo : Double;
+
+ req : TRequest ;
+ Json : TJSONObject;
+ TimerApagaStatus: TTimer ;
+
+ FPublicKey : String;
+ FAccessToken : String;
+
+ FCollector_ID : String;
+
+ FStatusCon : TRetBusca;
+
+ // DADOS DO BOLETO
+ Vdate_of_expiration,
+ Vtransaction_amount,
+ Vexternal_reference,
+ Vdescription,
+ Vpayment_method_id,
+ // DOADOS DO COMPRADOS
+ Vemail,
+ Vfirst_name,
+ Vlast_name,
+ Vtype, //TIPO DE DOCUMENTO, CPF OU CNPJ CASO BRASIL
+ Vnumber, //NUMERO DO CPF OU CNPJ
+ //ENDEREÇO DO COMPRADOR
+ Vzip_code,
+ Vstreet_name,
+ Vstreet_number,
+ Vneighborhood,
+ Vcity,
+ Vfederal_unit : String;
+
+ vError : String;
+
+ // ESTORNO
+ Rid,
+ Rpayments,
+ Rcurrency,
+ Ramount,
+ Rcoverage_applied,
+ Rcoverage_elegible,
+ Rdocumentation_required,
+ Rdocumentation_status,
+ Rdocumentation,
+ Rdate_documentation_deadline,
+ Rdate_created,
+ Rdate_last_updated,
+ Rlive_mode: String;
+
+ procedure TimerApagaStatusOnTimer(Sender: TObject);
+ procedure Status( s : String );
+ procedure m( s : WideString );
+ procedure xError( s : String );
+ procedure SetClient_ID(const Value: String);
+ procedure SetClient_Secret(const Value: String);
+ procedure SetMemo(const Value: WideString);
+
+ function sandboxurl( s : String ) : String ;
+ function JSONDateTimeToDelphiDateTime( s : String ) : TDateTime ;
+ procedure SetStatus(const Value: String);
+
+ procedure SetPublicKey(const Value: String);
+ procedure SetAccessToken(const Value: String);
+ function UriSaveName( s : String ) : String ;
+ public
+ constructor Create( sPublicKey, sAccessToken, sClientID, sClientSecret : String );
+ destructor Destroy ;
+ procedure get_user_me ;
+
+ function SaldoConta(s: String):String;
+ function CadBoleto(): String;
+ function GerarBoleto() : String;
+ function BuscarPedido(s: String): String;
+ function CancelarPedido(s: String): String;
+
+ function CadCliente(): String;
+ function GerarCliente(): String;
+ published
+ property lbStatus : String read FStatus write SetStatus ;
+
+ property MemoRetono : WideString read FMemoRetorno write SetMemo ;
+ property MemoError : String read FMemoError write FMemoError ;
+
+ property PublicKey : String read FPublicKey write SetPublicKey ;
+ property AccessToken : String read FAccessToken write SetAccessToken ;
+ property Client_ID : String read FClient_ID write SetClient_ID ;
+ property Collector_ID : String read FCollector_ID write FCollector_ID ;
+ property Client_Secret : String read FClient_Secret write SetClient_Secret ;
+
+ property User : TMPUser read FUser write FUser ;
+
+ property RetConsulta : TRetBusca read FStatusCon write FStatusCon ;
+ property Boleto : TBoleto read FBoleto write FBoleto ;
+ property ContaSaldo : Double read FContaSaldo write FContaSaldo ;
+ property SandBox : Boolean read FSandBox write FSandBox ;
+
+ // LANÇAMENTO DO BOLETO
+ property Bdate_of_expiration : String read Vdate_of_expiration write Vdate_of_expiration ;
+ property Btransaction_amount : String read Vtransaction_amount write Vtransaction_amount ;
+ property Bexternal_reference : String read Vexternal_reference write Vexternal_reference ;
+ property Bdescription : String read Vdescription write Vdescription ;
+ property Bpayment_method_id : String read Vpayment_method_id write Vpayment_method_id ;
+ property Bemail : String read Vemail write Vemail ;
+ property Bfirst_name : String read Vfirst_name write Vfirst_name ;
+ property Blast_name : String read Vlast_name write Vlast_name ;
+ property Btype : String read Vtype write Vtype ;
+ property Bnumber : String read Vnumber write Vnumber ;
+ property Bzip_code : String read Vzip_code write Vzip_code ;
+ property Bstreet_name : String read Vstreet_name write Vstreet_name ;
+ property Bstreet_number : String read Vstreet_number write Vstreet_number ;
+ property Bneighborhood : String read Vneighborhood write Vneighborhood ;
+ property Bcity : String read Vcity write Vcity ;
+ property Bfederal_unit : String read Vfederal_unit write Vfederal_unit ;
+
+ // ESTORNO
+ property id : String read Rid write Rid ;
+ property payments : String read Rpayments write Rpayments ;
+ property currency : String read Rcurrency write Rcurrency ;
+ property amount : String read Ramount write Ramount ;
+ property coverage_applied : String read Rcoverage_applied write Rcoverage_applied ;
+ property coverage_elegible : String read Rcoverage_elegible write Rcoverage_elegible ;
+ property documentation_required : String read Rdocumentation_required write Rdocumentation_required ;
+ property documentation_status : String read Rdocumentation_status write Rdocumentation_status ;
+ property documentation : String read Rdocumentation write Rdocumentation ;
+ property date_documentation_deadline : String read Rdate_documentation_deadline write Rdate_documentation_deadline ;
+ property date_created : String read Rdate_created write Rdate_created ;
+ property date_last_updated : String read Rdate_last_updated write Rdate_last_updated ;
+ property live_mode : String read Rlive_mode write Rlive_mode ;
+ end;
+
+implementation
+
+uses DateUtils, Character ;
+
+function getCamposJsonString(json,value:String): String;
+var
+ LJSONObject: TJSONObject;
+ function TrataObjeto(jObj:TJSONObject):string;
+ var i:integer;
+ jPar: TJSONPair;
+ begin
+ result := '';
+ for i := 0 to jObj.Size - 1 do
+ begin
+ jPar := jObj.Get(i);
+ if jPar.JsonValue Is TJSONObject then
+ result := TrataObjeto((jPar.JsonValue As TJSONObject)) else
+ if sametext(trim(jPar.JsonString.Value),value) then
+ begin
+ Result := jPar.JsonValue.Value;
+ break;
+ end;
+ if result <> '' then
+ break;
+ end;
+ end;
+begin
+ try
+ LJSONObject := nil;
+ LJSONObject := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(json),0) as TJSONObject;
+ result := TrataObjeto(LJSONObject);
+ finally
+ LJSONObject.Free;
+ end;
+end;
+
+function StripNonJson(s: string): string;
+var
+ ch: char;
+ inString: boolean;
+begin
+ Result := '';
+ inString := false;
+ for ch in s do
+ begin
+ if ch = '"' then
+ inString := not inString;
+ if TCharacter.IsWhiteSpace(ch) and not inString then
+ continue;
+ Result := Result + ch;
+ end;
+end;
+
+function JsonSinComillas(s: String): String;
+begin
+ result := StringReplace( s, '"','', [rfReplaceAll] );
+end;
+
+procedure SaveToFile( sFileName: String ; sTexto : String );
+var
+ f : textfile;
+begin
+ try
+ AssignFile( f, sFileName );
+ Rewrite( f );
+ Write(f, sTexto );
+ Flush(f);
+ CloseFile(f);
+ except
+ end;
+end;
+
+{ TMercadoPago }
+
+constructor TMercadoPago.Create(
+ sPublicKey,
+ sAccessToken,
+ sClientID,
+ sClientSecret : String );
+begin
+ req := TRequest.Create ;
+ TimerApagaStatus := TTimer.Create( Self );
+ TimerApagaStatus.Interval := 2*1000 ;
+ TimerApagaStatus.Enabled := False ;
+ TimerApagaStatus.OnTimer := TimerApagaStatusOnTimer ;
+ PublicKey := sPublicKey ;
+ AccessToken := sAccessToken ;
+ Client_ID := sClientID ;
+ Client_Secret := sClientSecret ;
+end;
+
+destructor TMercadoPago.Destroy;
+begin
+ TimerApagaStatus.Free ;
+ req.Free ;
+end;
+
+function TMercadoPago.CancelarPedido(s: String): String;
+begin
+ req.uri := '/v1/payments/'+s;
+ req.params.Add('?access_token='+FAccessToken);
+
+ //Os cancelamentos podem ser realizados somente com status pending e in process
+ req.body.Add('{"status" : "cancelled"}');
+
+ try
+ sResposta := TMPRestClient.Put(req);
+ except
+ on E: Exception do
+ xError( 'Error: '+E.ClassName + ': ' +E.Message );
+ end;
+
+ m( 'Resposta: '+sResposta );
+
+ Json := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StripNonJson(sResposta)),0));
+ vError := getCamposJsonString(sResposta, 'error');
+ if vError <> '' then
+ begin
+ xError( 'Error: '+( TJSONObject(Json.Get('message').JsonValue).ToString ) );
+ exit;
+ end;
+
end;
+
+function TMercadoPago.JSONDateTimeToDelphiDateTime(s: String): TDateTime;
+var ano, mes, dia, hora, min, seg : Word;
+begin
+ // 12345678901234567890
+ // 2018-08-02T14:02:33.000-04:00
+ s := JsonSinComillas( s );
+ ano := StrToInt( Copy( s, 1, 4 ));
+ mes := StrToInt( Copy( s, 6, 2 ));
+ dia := StrToInt( Copy( s, 9, 2 ));
+ hora := StrToInt( Copy( s,12, 2 ));
+ min := StrToInt( Copy( s,15, 2 ));
+ seg := StrToInt( Copy( s,18, 2 ));
+ Result := EncodeDateTime( ano, mes, dia, hora, min, seg, 0);
+end;
+
+procedure TMercadoPago.m(s: WideString);
+begin
+ FMemoRetorno := s;
+end;
+
+procedure TMercadoPago.xError(s: String);
+begin
+ FMemoError := s;
+end;
+
+function TMercadoPago.BuscarPedido(s: String): String;
+var
+ vStatus : String;
+begin
+ Status( 'Buscando Pagamento' );
+
+ req.Clear;
+ if s = '' then
+ begin
+ req.uri := '/v1/payments/search';
+ req.params.Add('?access_token='+FAccessToken);
+ end
+ else
+ begin
+ req.uri := '/v1/payments/search?id='+s; //external_reference
+ req.params.Add('&access_token='+FAccessToken);
+ end;
+
+ try
+ sResposta := TMPRestClient.Get(req);
+ except
+ on E: Exception do
+ xError( 'Error: '+E.ClassName + ': ' +E.Message );
+ end;
+
+ m( 'Resposta: '+sResposta );
+// raise Exception.Create(getCamposJsonString(sResposta, 'status'));
+
+ Json := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StripNonJson(sResposta)),0));
+ vError := getCamposJsonString(sResposta, 'error');
+ if vError <> '' then
+ begin
+ xError( 'Error: '+( TJSONObject(Json.Get('message').JsonValue).ToString ) );
+ exit;
+ end;
+
+ case AnsiIndexStr(getCamposJsonString(sResposta, 'status'),
+ ['pending', 'approved', 'in_process', 'rejected', 'cancelled', 'refunded', 'charged_back']) of
+ 0 : FStatusCon.RetStatus := 'Pendente';
+ 1 : FStatusCon.RetStatus := 'Aprovado';
+ 2 : FStatusCon.RetStatus := 'Em Processo';
+ 3 : FStatusCon.RetStatus := 'Rejeitado';
+ 4 : FStatusCon.RetStatus := 'Cancelado';
+ 5 : FStatusCon.RetStatus := 'Reembolso';
+ 6 : FStatusCon.RetStatus := 'Estorno Cartão';
+ end;
+
+ Status( 'Buscando Pagamento '+FStatusCon.RetStatus );
+end;
+
+function TMercadoPago.CadCliente(): String;
+var
+ Enviar : TStringList;
+begin
+ Enviar := TStringList.Create;
+ Enviar.Add(
+ '{'+#10+
+ ' "email": "bruno@gmail.com",'+#10+
+ ' "first_name": "Bruce",'+#10+
+ ' "last_name": "Wayne",'+#10+
+ ' "phone": {'+#10+
+ ' "area_code": "023",'+#10+
+ ' "number": "12345678"'+#10+
+ ' },'+#10+
+ ' "identification": {'+#10+
+ ' "type": "DNI",'+#10+
+ ' "number": "12345678"'+#10+
+ ' },'+#10+
+ ' "address": {'+#10+
+ ' "zip_code": "SG1 2AX",'+#10+
+ ' "street_name": "Old Knebworth Ln"'+#10+
+ ' },'+#10+
+ ' "description": "Lorem Ipsum"'+#10+
+ ' }');
+ Result := Enviar.Text;
+end;
+
+function TMercadoPago.GerarCliente(): String;
+var
+ vError : String;
+begin
+ Status( 'Adicionar Cliente' );
+
+ req.Clear ;
+ req.uri := '/v1/customers';
+ req.params.Add('?access_token='+FAccessToken);
+ req.body.Add( CadCliente );
+
+ try
+ sResposta := TMPRestClient.Post(req);
+ except
+ on E: Exception do
+ xError( 'Error: '+E.ClassName + ': ' +E.Message );
+ end;
+
+ m( 'Resposta: '+sResposta );
+
+ Json := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StripNonJson(sResposta)),0));
+
+ vError := getCamposJsonString(sResposta, 'error');
+ if vError <> '' then
+ begin
+ xError( 'Error: '+( TJSONObject(Json.Get('message').JsonValue).ToString ));
+ exit;
+ end;
+
+ //FBoleto.BoletoLink := ( TJSONObject(Json.Get('transaction_details').JsonValue).ToString );
+
+ Status( 'Cliente Adicionado com sucesso!' );
+end;
+
+function TMercadoPago.CadBoleto: String;
+var
+ Enviar : TStringList;
+begin
+ Enviar := TStringList.Create;
+ Enviar.Add(
+ '{'+#10+
+ '"installments": 1,'+#10+ // NUMERO DE PACELAS
+ '"date_of_expiration": "'+ DateToISO8601(StrToDate(Bdate_of_expiration), False)+'",'+#10+
+ '"transaction_amount": "'+ Btransaction_amount+'",'+#10+
+ '"external_reference": "'+ Bexternal_reference+'",'+#10+ //NUMERO DO PEDIDO DE SEU SITE PARA FUTURA CONCILIAÇÃO FINANCEIRA
+ '"description": "'+ Bdescription+'",'+#10+
+ '"payment_method_id": "'+ Bpayment_method_id+'",'+#10+ // MEIO DE PAGAMENTO
+
+ // DODOS DO COMPRADOS
+ '"payer": {'+#10+
+ '"email": "'+ Bemail+'",'+#10+
+ '"first_name": "'+ Bfirst_name+'",'+#10+
+ '"last_name": "'+ Blast_name+'",'+#10+
+
+ '"identification": {'+#10+
+ '"type": "'+ Btype+'",'+#10+ //TIPO DE DOCUMENTO, CPF OU CNPJ CASO BRASIL
+ '"number": "'+ Bnumber+'"'+#10+
+ '},'+#10+
+
+ //ENDEREÇO DO COMPRADOR
+ '"address": {'+#10+
+ '"zip_code": "'+ Bzip_code+'",'+#10+
+ '"street_name": "'+ Bstreet_name+'",'+#10+
+ '"street_number": "'+ Bstreet_number+'",'+#10+
+ '"neighborhood": "'+ Bneighborhood+'",'+#10+
+ '"city": "'+ Bcity+'",'+#10+
+ '"federal_unit": "'+ Bfederal_unit+'"'+#10+
+ '}'+#10+
+ '}'+#10+
+ '}');
+
+ Result := Enviar.Text;
+end;
+
+function TMercadoPago.GerarBoleto: String;
+var
+ ano, mes, dia : word;
+ data : TDateTime;
+ vError : String;
+begin
+ Status( 'Adicionando Pagamento Por Boleto' );
+
+ req.Clear ;
+ req.uri := '/v1/payments'; //advanced_payments
+ req.params.Add('?access_token='+FAccessToken);
+ req.body.Add( CadBoleto );
+
+ try
+ sResposta := TMPRestClient.Post(req);
+ except
+ on E: Exception do
+ xError( 'Error: '+E.ClassName + ': ' +E.Message );
+ end;
+
+ m( 'Resposta: '+sResposta );
+
+ Json := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StripNonJson(sResposta)),0));
+
+ vError := getCamposJsonString(sResposta, 'error');
+ if vError <> '' then
+ begin
+ xError( 'Error: '+( TJSONObject(Json.Get('message').JsonValue).ToString ) );
+ exit;
+ end;
+
+ FBoleto.BoletoLink := ( TJSONObject(Json.Get('transaction_details').JsonValue).ToString );
+ FBoleto.BoletoLink := getCamposJsonString(Boleto.BoletoLink, 'external_resource_url');
+
+ FBoleto.BoletoBarra := ( TJSONObject(Json.Get('barcode').JsonValue).ToString );
+ FBoleto.BoletoBarra := getCamposJsonString(Boleto.BoletoBarra, 'content');
+
+ FBoleto.BoletoRetorno := StrToBool( TJSONObject(Json.Get('captured').JsonValue).ToString );
+ FBoleto.BoletoID := ( TJSONObject(Json.Get('id').JsonValue).ToString );
+
+ ano := StrToInt(Copy(TJSONObject(Json.Get('date_of_expiration').JsonValue).ToString,2,4));
+ mes := StrToInt(Copy(TJSONObject(Json.Get('date_of_expiration').JsonValue).ToString,7,2));
+ dia := StrToInt(Copy(TJSONObject(Json.Get('date_of_expiration').JsonValue).ToString,10,2));
+ data := EncodeDate(ano, mes, dia);
+ FBoleto.BoletoVencimento := ( FormatdateTime('yyyy/mm/dd', data));
+
+ Status( 'Pagamento gerado e incluído com sucesso!' );
+end;
+
+procedure TMercadoPago.get_user_me;
+var
+ vError : String;
+begin
+ Status( 'Buscando dados da conta' );
+ req.Clear ;
+ req.uri := '/users/me';
+ req.params.Add('?access_token='+FAccessToken);
+ try
+ sResposta := TMPRestClient.Get(req);
+ except
+ on E: Exception do
+ xError( 'Error: '+E.ClassName + ': ' +E.Message );
+ end;
+
+ m( 'Resposta: '+sResposta );
+
+ Json := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StripNonJson(sResposta)),0));
+ FUser.ID := JsonSinComillas( TJSONObject(Json.Get('id').JsonValue).ToString );
+ FUser.nickname := JsonSinComillas( TJSONObject(Json.Get('nickname').JsonValue).ToString );
+ FUser.first_name := JsonSinComillas( TJSONObject(Json.Get('first_name').JsonValue).ToString );
+ FUser.last_name := JsonSinComillas( TJSONObject(Json.Get('last_name').JsonValue).ToString );
+ FUser.email := JsonSinComillas( TJSONObject(Json.Get('email').JsonValue).ToString );
+ Status( 'Datos da conta retornados corretamente!' );
+end;
+
+function TMercadoPago.SaldoConta(s: String): String;
+var
+ vError : String;
+ const
+ vID = '166957358';
+ vToken = 'APP_USR-3067742096444572-042712-95042da85e0714597f6b707e6234d23c-166957358';
+begin
+ Status( 'Buscando saldo da conta!' );
+ req.Clear ;
+ req.uri := '/users/'+vID+'/mercadopago_account/balance';
+ req.params.Add('?access_token='+vToken);
+ //req.params.Add('&access_token='+FAccessToken);
+ try
+ sResposta := TMPRestClient.Get(req);
+ except
+ on E: Exception do
+ xError( 'Error: '+E.ClassName + ': ' +E.Message );
+ end;
+ m( 'Resposta: '+sResposta );
+
+ Json := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StripNonJson(sResposta)),0));
+
+ vError := getCamposJsonString(sResposta, 'error');
+ if vError <> '' then
+ begin
+ xError( 'Error: '+( TJSONObject(Json.Get('message').JsonValue).ToString ) );
+ exit;
+ end;
+
+ ContaSaldo := StrToCurr(StringReplace(JsonSinComillas( TJSONObject(Json.Get('total_amount').JsonValue).ToString), '.', ',', [] ));
+ Status( 'Buscando saldo da conta!' );
+end;
+
+function TMercadoPago.sandboxurl(s: String): String;
+begin
+ if FSandBox then
+ result := result+'/sandbox';
+ result := result + s;
+end;
+
+procedure TMercadoPago.SetAccessToken(const Value: String);
+begin
+ FAccessToken := Value;
+ m( 'Access Token: '+Value );
+end;
+
+procedure TMercadoPago.SetClient_ID(const Value: String);
+begin
+ FClient_ID := Value;
+ m( 'ClientID: '+Value );
+end;
+
+procedure TMercadoPago.SetMemo(const Value: WideString);
+begin
+ FMemoRetorno := Value;
+ PublicKey := FPublicKey ;
+ AccessToken := FAccessToken ;
+ Client_ID := FClient_ID ; // Para ser visto no memorando
+ Client_Secret := FClient_Secret ;
+end;
+
+procedure TMercadoPago.SetPublicKey(const Value: String);
+begin
+ FPublicKey := Value;
+ m( 'PublicKey: '+Value);
+end;
+
+procedure TMercadoPago.SetStatus(const Value: String);
+begin
+ FStatus := Value;
+ //FStatus.Visible := False ;
+end;
+
+procedure TMercadoPago.Status(s: String);
+begin
+ FStatus := s ;
+end;
+
+procedure TMercadoPago.TimerApagaStatusOnTimer(Sender: TObject);
+begin
+ {if Assigned( FStatus ) then
+ FStatus.Visible := False ;}
+end;
+
+function TMercadoPago.UriSaveName(s: String): String;
+begin
+ s := RightStr( s, Length(s)-1 );
+ result := StringReplace( s, '\','',[rfReplaceAll]);
+end;
+
+procedure TMercadoPago.SetClient_Secret(const Value: String);
+begin
+ FClient_Secret := Value;
+ m( 'ClientSecret: '+Value );
+end;
+
+{ TMPRestClient }
+
+constructor TMPRestClient.Create;
+begin
+ inherited;
+ sURLDominio := 'https://api.mercadopago.com';
+end;
+
+end.
+
diff --git a/RestClient_u.dcu b/RestClient_u.dcu
new file mode 100644
index 0000000..7027ccb
Binary files /dev/null and b/RestClient_u.dcu differ
diff --git a/RestClient_u.pas b/RestClient_u.pas
new file mode 100644
index 0000000..5dbb76f
--- /dev/null
+++ b/RestClient_u.pas
@@ -0,0 +1,171 @@
+unit RestClient_u;
+
+interface
+
+uses
+ DBXJSON, JSON, System.Classes, System.SysUtils,
+
+ FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
+
+ System.Net.URLClient, System.Net.HttpClient,
+ System.Net.HttpClientComponent;
+
+type
+
+ TRequest = class
+ uri : String;
+ vToken : String;
+ body : TStringList;
+ headers : TStringList;
+ params : TStringList;
+
+ public
+ procedure Clear ;
+ constructor Create ;
+ destructor Destroy ;
+ end;
+
+ TRestClient = Class ( TComponent )
+ private
+ NetHTTP : TNetHTTPClient;
+ function armarParametros( sl : TStringList ) : String ;
+ protected
+ constructor Create ; virtual ;
+ destructor Destroy ;
+ public
+ sURLDominio : String ;
+ class function Get( req : TRequest ) : String ;
+ class function Post( req : TRequest ) : String ;
+ class function Put( req : TRequest ) : String ;
+ End;
+
+implementation
+
+uses StrUtils ;
+
+{ TRestClient }
+
+function TRestClient.armarParametros(sl: TStringList): String;
+var i : integer ;
+begin
+ result := '';
+ for I := 0 to sl.Count - 1 do begin
+ result := result+sl[i];
+ if i
+
+ {1BF34D6E-C398-4AE8-A8EA-F85DF4CA8A52}
+ SGerenciaPago.dpk
+ 19.0
+ FMX
+ True
+ Debug
+ Win32
+ 32787
+ Package
+
+
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Cfg_1
+ true
+ true
+
+
+ true
+ Base
+ true
+
+
+ .\$(Platform)\$(Config)
+ .\$(Platform)\$(Config)
+ false
+ false
+ false
+ false
+ false
+ true
+ true
+ System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)
+ All
+ GerenciaPago
+ SGerenciaPago
+
+
+ None
+ android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar
+ rtl;fmx;dbrtl;DbxCommonDriver;$(DCC_UsePackage)
+ package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=
+ Debug
+
+
+ None
+ android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar
+ rtl;fmx;dbrtl;DbxCommonDriver;$(DCC_UsePackage)
+ package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=
+ Debug
+
+
+ None
+ rtl;fmx;dbrtl;DbxCommonDriver;$(DCC_UsePackage)
+
+
+ None
+ rtl;fmx;dbrtl;DbxCommonDriver;$(DCC_UsePackage)
+
+
+ rtl;fmx;dbrtl;DbxCommonDriver;$(DCC_UsePackage)
+
+
+ rtl;fmx;dbrtl;DbxCommonDriver;$(DCC_UsePackage)
+
+
+ Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)
+ Debug
+ true
+ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
+ 1033
+ rtl;fmx;dbrtl;DbxCommonDriver;$(DCC_UsePackage)
+
+
+ rtl;fmx;dbrtl;DbxCommonDriver;$(DCC_UsePackage)
+ Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)
+ Debug
+ true
+ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
+ 1033
+
+
+ DEBUG;$(DCC_Define)
+ true
+ false
+ true
+ true
+ true
+
+
+ false
+
+
+ false
+ RELEASE;$(DCC_Define)
+ 0
+ 0
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+ Cfg_2
+ Base
+
+
+ Base
+
+
+ Cfg_1
+ Base
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ SGerenciaPago.dpk
+
+
+
+ True
+ True
+ False
+ False
+ False
+ False
+ True
+ True
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ SGerenciaPago.bpl
+ true
+
+
+
+
+ 1
+
+
+ 0
+
+
+
+
+ classes
+ 1
+
+
+ classes
+ 1
+
+
+
+
+ res\xml
+ 1
+
+
+ res\xml
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ library\lib\armeabi
+ 1
+
+
+ library\lib\armeabi
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ library\lib\mips
+ 1
+
+
+ library\lib\mips
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+ library\lib\arm64-v8a
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ res\drawable
+ 1
+
+
+ res\drawable
+ 1
+
+
+
+
+ res\values
+ 1
+
+
+ res\values
+ 1
+
+
+
+
+ res\values-v21
+ 1
+
+
+ res\values-v21
+ 1
+
+
+
+
+ res\values
+ 1
+
+
+ res\values
+ 1
+
+
+
+
+ res\drawable
+ 1
+
+
+ res\drawable
+ 1
+
+
+
+
+ res\drawable-xxhdpi
+ 1
+
+
+ res\drawable-xxhdpi
+ 1
+
+
+
+
+ res\drawable-ldpi
+ 1
+
+
+ res\drawable-ldpi
+ 1
+
+
+
+
+ res\drawable-mdpi
+ 1
+
+
+ res\drawable-mdpi
+ 1
+
+
+
+
+ res\drawable-hdpi
+ 1
+
+
+ res\drawable-hdpi
+ 1
+
+
+
+
+ res\drawable-xhdpi
+ 1
+
+
+ res\drawable-xhdpi
+ 1
+
+
+
+
+ res\drawable-mdpi
+ 1
+
+
+ res\drawable-mdpi
+ 1
+
+
+
+
+ res\drawable-hdpi
+ 1
+
+
+ res\drawable-hdpi
+ 1
+
+
+
+
+ res\drawable-xhdpi
+ 1
+
+
+ res\drawable-xhdpi
+ 1
+
+
+
+
+ res\drawable-xxhdpi
+ 1
+
+
+ res\drawable-xxhdpi
+ 1
+
+
+
+
+ res\drawable-xxxhdpi
+ 1
+
+
+ res\drawable-xxxhdpi
+ 1
+
+
+
+
+ res\drawable-small
+ 1
+
+
+ res\drawable-small
+ 1
+
+
+
+
+ res\drawable-normal
+ 1
+
+
+ res\drawable-normal
+ 1
+
+
+
+
+ res\drawable-large
+ 1
+
+
+ res\drawable-large
+ 1
+
+
+
+
+ res\drawable-xlarge
+ 1
+
+
+ res\drawable-xlarge
+ 1
+
+
+
+
+ res\values
+ 1
+
+
+ res\values
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 0
+
+
+
+
+ 1
+ .framework
+
+
+ 1
+ .framework
+
+
+ 0
+
+
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 0
+ .dll;.bpl
+
+
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 0
+ .bpl
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+ Contents\Resources
+ 1
+
+
+ Contents\Resources
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+ library\lib\arm64-v8a
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 0
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
+
diff --git a/SGerenciaPago.dproj.local b/SGerenciaPago.dproj.local
new file mode 100644
index 0000000..b0e7c5b
--- /dev/null
+++ b/SGerenciaPago.dproj.local
@@ -0,0 +1,15 @@
+
+
+
+ 2021/02/07 11:14:55.000.131,=rtl.dcp
+ 2021/02/07 11:15:00.000.462,=I:\PagOnLine\GerenciaPago\GerenciaPago.pas
+ 2021/05/11 07:23:51.000.022,=I:\PagOnLine\GerenciaPago\RestClient_u.pas
+ 2021/05/11 07:24:21.000.973,=I:\PagOnLine\GerenciaPago\MercadoPago_u.pas
+ 2021/05/11 07:27:51.000.378,=fmx.dcp
+ 2021/05/11 07:27:51.000.432,=dbrtl.dcp
+ 2021/05/11 07:27:51.000.537,=DbxCommonDriver.dcp
+
+
+
+
+
diff --git a/SGerenciaPago.identcache b/SGerenciaPago.identcache
new file mode 100644
index 0000000..7c80ac6
Binary files /dev/null and b/SGerenciaPago.identcache differ
diff --git a/SGerenciaPago.res b/SGerenciaPago.res
new file mode 100644
index 0000000..75d49ab
Binary files /dev/null and b/SGerenciaPago.res differ
diff --git a/TGERENCIAPAGO.bmp b/TGERENCIAPAGO.bmp
new file mode 100644
index 0000000..f562648
Binary files /dev/null and b/TGERENCIAPAGO.bmp differ