Giter Club home page Giter Club logo

khalti-sdk-android's Introduction

Khalti Android SDK

Maven Central

Welcome to Khalti's checkout documentation

Installation

Requirements

  • Android 5.0 and above
  • AndroidX (as of v2.00.00)
  • Android Studio 3 and above

Quick Note

  • We've dropped support of Android 4 since version 2.01.00

Configuration

Add khalti-android to your build.gradle dependencies

implementation ('com.khalti:khalti-android:$latest_version') {
        transitive = true
    }

Also add the following lines inside the android block of your build.gradle file

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
   }

Disable R8 by adding the following lines inside your gradle.properties

android.enableR8 = false

Setup

Add KhaltiButton in your xml layout as follows

<com.khalti.widget.KhaltiButton
            android:id="@+id/khalti_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:khalti_button_style="khalti"/>

Add the following line in your root layout in your xml file if you're going to use khalti attribute.

xmlns:app="http://schemas.android.com/apk/res-auto"

Then, Locate your xml Khalti Button in your Java

KhaltiButton khaltiButton = (KhaltiButton) findViewById(R.id.khalti_button);
XML Attribute
Attribute Description
app:text Text to display
app:khalti_button_style Set the style of KhaltiButton from the available options

Use the khalti_button_style attribute in your xml file to select a button style for your Khalti button. Or you can use the setButtonStyle() function in khalti button to set the style programmatically.

Available button styles
Button style Image
basic
khalti
e_banking
m_banking
sct
connect_ips

Alternatively you can also inflate KhaltiButton in your java class as follows

KhaltiButton khaltiButton = new KhaltiButton();

In order for Khalti button to be functional you'll need to pass an instance of Config.

Building Config

Create an instance of Builder class. Pass public key, product id, product name, amount (in paisa) and an implementation of OnCheckOutListener to the builder constructor.

Map<String, Object> map = new HashMap<>();
        map.put("merchant_extra", "This is extra data");
        
Builder builder = new Config.Builder(Constant.pub, "Product ID", "Main", 1100L, new OnCheckOutListener() {
            @Override
            public void onError(@NonNull String action, @NonNull Map<String, String> errorMap) {
                Log.i(action, errorMap.toString());
            }

            @Override
            public void onSuccess(@NonNull Map<String, Object> data) {
                Log.i("success", data.toString());
            }
        })
                .paymentPreferences(new ArrayList<PaymentPreference>() {{
                    add(PaymentPreference.KHALTI);
                    add(PaymentPreference.EBANKING);
                    add(PaymentPreference.MOBILE_BANKING);
                    add(PaymentPreference.CONNECT_IPS);
                    add(PaymentPreference.SCT);
                }})
                .additionalData(map)
                .productUrl("http://example.com/product")
                .mobile("9800000000");

Here, the functions paymentPreferences(),additionalData(),productUrl() and mobile() are optional and are not required to build the config. When passing additionalData through additionalData() functions make sure you add a merchant_ prefix in your map key.

Finally, call the build() function in builder to build the config.

Config config = builder.build();
Available Config Builder Methods
Constraint Method Description
Optional paymentPreference() Set which payment option tabs are to be shown
Optional additionalData() Set additional data
Optional productUrl() Add url of product
Optional mobile() Preset mobile number in mobile field
Required build() Build config
Available payment preferences
Preferences Description
PaymentPreference.KHALTI Show Khalti payment tab
PaymentPreference.EBANKING Show E-banking payment tab
PaymentPreference.MOBILE_BANKING Show Mobile banking payment tab
PaymentPreference.CONNECT_IPS Show Connect IPS payment tab
PaymentPreference.SCT Show SCT card payment tab
Set Config

Set your config in your KhaltiButton.

khaltiButton.setCheckOutConfig(config);

Public Methods in KhaltiButton

Constraint Method Description
Required setCheckOutConfig(Config config) Set configuration required by Khalti checkout
Optional setText(String text) Set text to display in KhaltiButton
Optional setCustomView(View view) Replace KhaltiButton's default view with your custom view
Optional setButtonStyle(ButtonStyle buttonStyle) Select between the available options to set KhaltiButton's style

Callback Methods

Method Description
onSuccess(Map data) This method is called when a transaction has been completed and confirmed by the user. A map containing an access token, required to verify the transaction and data passed to the Config through the Config bulder is returned. Once this method is called, use the access token to verify the transaction. Please follow the verification process for further instructions.
onError(String action, Map errorMap) This method is called when an error occurs during payment initiation or confirmation. Action and errorMap value is passed where action defines the current action being performed and errorMap has the necessary information on the error.
onCancel() This method is called when the user dismisses or cancels the checkout process. (When the user presses back button).

Response Sample

Success Message
Key Value Type
mobile 98XXXXXXXX String
product_name Product Name String
product_identity Product Id String
product_url(if passed) Product Url String
amount 100 Long
token token String
idx Unique identifier String

The success message also contains all the key and value provided as extra data while building the Config.

Error Message
Variable Description Type
action Action performed - (initiate, confirm) String
errorMap Detail Error map Map

More Implementations

Method 1: With Custom Click Listener

Initialize the KhaltiCheckout Object

KhaltiCheckOut khaltiCheckOut = new KhaltiCheckOut(this, config);

Use khaltiCheckout.show() to display Khalti widget

khaltiButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                khaltiCheckOut.show();
            }
        });
Method 2: With Custom View

Get your custom view

View view = LayoutInflater.from(this).inflate(R.layout.custom_khalti_button, container, false);

Set custom view to your khalti button

khaltiButton.setCustomView(view);
khaltiButton.setCheckOutConfig(config);

Check out the Verification process.

Screenshots

           

khalti-sdk-android's People

Contributors

abnormalbbk avatar ishwor-shrestha avatar manishmodi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

khalti-sdk-android's Issues

Error while integrating in old projects with build updates

FATAL

FATAL EXCEPTION: RxNewThreadScheduler-7
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java)
at java.util.concurrent.FutureTask.run(FutureTask.java)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java)
at java.lang.Thread.run(Thread.java)
Caused by: java.lang.NoSuchMethodError: No virtual method log(Ljava/lang/String;)V in class Lokhttp3/internal/Platform; or its super classes (declaration of 'okhttp3.internal.Platform' appears in /data/app/com.frantic.kicksal-2/base.apk:classes5.dex)
at okhttp3.logging.HttpLoggingInterceptor$Logger$1.log(HttpLoggingInterceptor.java:108)
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:157)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:190)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163)
at okhttp3.RealCall.execute(RealCall.java:57)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:171)
at rx.internal.operators.OperatorSubscribeOn$1$1$1.request(OperatorSubscribeOn.java:80)
at rx.Subscriber.setProducer(Subscriber.java:211)
at rx.internal.operators.OperatorSubscribeOn$1$1.setProducer(OperatorSubscribeOn.java:76)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
at rx.Observable.unsafeSubscribe(Observable.java:8666)
at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java) 
at java.util.concurrent.FutureTask.run(FutureTask.java) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java) 
at java.lang.Thread.run(Thread.java) 

App Crashes. Whats going on i hve no idea.

i am getting following error while run my Project

Process: com.impactit.demokhaltiintegration, PID: 16796
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:114)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5653)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
Caused by: java.lang.NoSuchMethodError: No virtual method addOnTabSelectedListener(Landroid/support/design/widget/TabLayout$OnTabSelectedListener;)V in class Landroid/support/design/widget/TabLayout; or its super classes (declaration of 'android.support.design.widget.TabLayout' appears in /data/app/com.impactit.demokhaltiintegration-2/split_lib_dependencies_apk.apk)
at khalti.checkOut.CheckOutActivity.c(Unknown Source)
at khalti.checkOut.d$1.a(Unknown Source)
at khalti.checkOut.d$1.onNext(Unknown Source)
at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:134)
at rx.subjects.PublishSubject$PublishSubjectProducer.onNext(PublishSubject.java:304)
at rx.subjects.PublishSubject$PublishSubjectState.onNext(PublishSubject.java:219)
at rx.subjects.PublishSubject.onNext(PublishSubject.java:72)
at khalti.checkOut.b$1.a(Unknown Source)
at khalti.checkOut.b$1.onNext(Unknown Source)
at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:134)
at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:77)
at rx.subjects.PublishSubject$PublishSubjectProducer.onNext(PublishSubject.java:304)
at rx.subjects.PublishSubject$PublishSubjectState.onNext(PublishSubject.java:219)
at rx.subjects.PublishSubject.onNext(PublishSubject.java:72)
at khalti.checkOut.api.a$1.a(Unknown Source)
at khalti.checkOut.api.a$1.onNext(Unknown Source)
at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:134)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:224)
at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:107)
at android.os.Handler.handleCallback(Handler.java:742) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:157) 
at android.app.ActivityThread.main(ActivityThread.java:5653) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
11-27 14:18:22.487 2924-2924/? E/Icon: Unable to load resource 0x00000000 from pkg=com.android.systemui
android.content.res.Resources$NotFoundException: Resource ID #0x0
at android.content.res.Resources.getValue(Resources.java:1369)
at android.content.res.MiuiResources.getValue(MiuiResources.java:146)
at android.content.res.Resources.getDrawable(Resources.java:822)
at android.graphics.drawable.Icon.loadDrawableInner(Icon.java:313)
at android.graphics.drawable.Icon.loadDrawable(Icon.java:269)
at android.graphics.drawable.Icon.loadDrawableAsUser(Icon.java:377)
at com.android.systemui.statusbar.ExpandedIcon.getDrawable(ExpandedIcon.java:59)
at com.android.systemui.statusbar.StatusBarIconView.getIcon(StatusBarIconView.java:179)
at com.android.systemui.statusbar.StatusBarIconView.setIcon(StatusBarIconView.java:136)
at com.android.systemui.statusbar.StatusBarIconView.updateDarkMode(StatusBarIconView.java:271)
at com.android.systemui.statusbar.phone.SimpleStatusBar.updateDarkMode(SimpleStatusBar.java:275)
at com.android.systemui.statusbar.phone.PhoneStatusBar$42.run(PhoneStatusBar.java:3872)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5653)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746)

for more detail please check my code if possible
https://github.com/stharzun/KhaltiDemo

Build Issue applying khalti sdk

java.lang.IncompatibleClassChangeError: Superclass rx.Observable of rx.subjects.Subject is declared final (declaration of 'rx.subjects.Subject' appears in /data/app/com.koklass.order-LGXhpHNLtt9lt3Q3J7CUQw==/base.apk:classes7.dex)
at khalti.checkOut.d.(Unknown Source:14)
at khalti.checkOut.CheckOutActivity.onCreate(Unknown Source:110)
at android.app.Activity.performCreate(Activity.java:7003)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1230)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2899)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3046)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1688)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6798)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

No callback on successful cIPS payment

The onSuccess call never fires if we pay from cIPS. At the end of the wizard process once the payment is successful we receive Go To App button but that never redirects. Even worst is that, the transaction made through cIPS is automatically marked as completed without our verification call from the server. This is causing a mess to maintain the transaction records.

Huge Library size

Hey Developer,

You should decrease the library size at first. And You should use latest version of Picasso.

Regards

Crash after loading eBanking list

After successful response from :
https://khalti.com/api/bank/?has_ebanking=true&page=1&page_size=100
app is crashing with following error log:

java.lang.NoSuchMethodError: No static method with(Landroid/content/Context;)Lcom/squareup/picasso/Picasso; in class Lcom/squareup/picasso/Picasso; or its super classes (declaration of 'com.squareup.picasso.Picasso' appears in /data/app/com.rakezb.ecommerce-NmD1WUkxgDTpNe-lz0hGfg==/base.apk!classes3.dex) at khalti.checkOut.EBanking.helper.a.a(Unknown Source:122) at khalti.checkOut.EBanking.helper.a.onBindViewHolder(Unknown Source:2) at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781) at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823) at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752) at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854) at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230) at androidx.recyclerview.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:557) at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517) at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612) at androidx.recyclerview.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:171) at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924) at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641) at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4194) at android.view.View.layout(View.java:20865) at android.view.ViewGroup.layout(ViewGroup.java:6215) at com.google.android.material.appbar.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:142) at com.google.android.material.appbar.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:41) at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1556) at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:888) at android.view.View.layout(View.java:20865)

I am using andoridX 1.0.2

Class 'khalti.checkOut.CheckOutActivity$1' does not implement interface 'com.google.android.material.tabs.TabLayout$BaseOnTabSelectedListener

compileSdkVersion 29 buildToolsVersion "29.0.1" defaultConfig { applicationId "com.thesunbi.nepmeds" minSdkVersion 21 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true }

Gradle Dependencies
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.core:core-ktx:1.1.0' implementation 'com.google.android.material:material:1.1.0-alpha10' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.vectordrawable:vectordrawable:1.1.0' implementation 'androidx.navigation:navigation-fragment:2.2.0-alpha02' implementation 'androidx.navigation:navigation-ui:2.2.0-alpha02' implementation 'androidx.navigation:navigation-fragment-ktx:2.2.0-alpha02' implementation 'androidx.navigation:navigation-ui-ktx:2.2.0-alpha02' implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-alpha04' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-alpha04' implementation ('com.khalti:khalti-android:1.2.8')

Gradle.properties
kotlin.code.style=official android.enableJetifier=true org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M" android.useAndroidX=true android.enableR8 = false

Crash Log
2019-09-16 16:52:57.256 23024-23024/com.thesunbi.nepmeds E/InputEventReceiver: Exception dispatching input event. 2019-09-16 16:52:57.257 23024-23024/com.thesunbi.nepmeds E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback 2019-09-16 16:52:57.260 23024-23024/com.thesunbi.nepmeds E/MessageQueue-JNI: java.lang.IncompatibleClassChangeError: Class 'khalti.checkOut.CheckOutActivity$1' does not implement interface 'com.google.android.material.tabs.TabLayout$BaseOnTabSelectedListener' in call to 'void com.google.android.material.tabs.TabLayout$BaseOnTabSelectedListener.onTabUnselected(com.google.android.material.tabs.TabLayout$Tab)' (declaration of 'com.google.android.material.tabs.TabLayout$1' appears in /data/app/com.thesunbi.nepmeds-Qdq0rC66qqCNuKcVsJ0AOg==/base.apk) at com.google.android.material.tabs.TabLayout$1.onTabUnselected(TabLayout.java:826) at com.google.android.material.tabs.TabLayout.dispatchTabUnselected(TabLayout.java:1799) at com.google.android.material.tabs.TabLayout.selectTab(TabLayout.java:1783) at com.google.android.material.tabs.TabLayout$TabLayoutOnPageChangeListener.onPageSelected(TabLayout.java:3256) at androidx.viewpager.widget.ViewPager.dispatchOnPageSelected(ViewPager.java:1947) at androidx.viewpager.widget.ViewPager.scrollToItem(ViewPager.java:686) at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:670) at androidx.viewpager.widget.ViewPager.onTouchEvent(ViewPager.java:2263) at android.view.View.dispatchTouchEvent(View.java:12593) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3028) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2705) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:441) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1850) at android.app.Activity.dispatchTouchEvent(Activity.java:3413) at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:399) at android.view.View.dispatchPointerEvent(View.java:12832) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5667) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5193) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4726) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4692) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4832) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4700) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4889) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4726) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4692) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4700) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7697) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7666) at android.view.ViewRootImpl.enqueueInputE 2019-09-16 16:52:57.260 23024-23024/com.thesunbi.nepmeds D/AndroidRuntime: Shutting down VM 2019-09-16 14:56:56.586 20947-20947/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.thesunbi.nepmeds, PID: 20947 java.lang.IncompatibleClassChangeError: Class 'khalti.checkOut.CheckOutActivity$1' does not implement interface 'com.google.android.material.tabs.TabLayout$BaseOnTabSelectedListener' in call to 'void com.google.android.material.tabs.TabLayout$BaseOnTabSelectedListener.onTabUnselected(com.google.android.material.tabs.TabLayout$Tab)' (declaration of 'com.google.android.material.tabs.TabLayout$1' appears in /data/app/com.thesunbi.nepmeds-0cPfwgSeIU9sRJVd4k6kBA==/base.apk) at com.google.android.material.tabs.TabLayout$1.onTabUnselected(TabLayout.java:826) at com.google.android.material.tabs.TabLayout.dispatchTabUnselected(TabLayout.java:1799) at com.google.android.material.tabs.TabLayout.selectTab(TabLayout.java:1783) at com.google.android.material.tabs.TabLayout.selectTab(TabLayout.java:1746) at com.google.android.material.tabs.TabLayout$Tab.select(TabLayout.java:2139) at com.google.android.material.tabs.TabLayout$TabView.performClick(TabLayout.java:2327) at android.view.View.performClickInternal(View.java:6638) at android.view.View.access$3100(View.java:789) at android.view.View$PerformClick.run(View.java:26145) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6898) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 2019-09-16 16:52:57.263 23024-23024/com.thesunbi.nepmeds E/AndroidRuntime: FATAL EXCEPTION: main Process: com.thesunbi.nepmeds, PID: 23024 java.lang.IncompatibleClassChangeError: Class 'khalti.checkOut.CheckOutActivity$1' does not implement interface 'com.google.android.material.tabs.TabLayout$BaseOnTabSelectedListener' in call to 'void com.google.android.material.tabs.TabLayout$BaseOnTabSelectedListener.onTabUnselected(com.google.android.material.tabs.TabLayout$Tab)' (declaration of 'com.google.android.material.tabs.TabLayout$1' appears in /data/app/com.thesunbi.nepmeds-Qdq0rC66qqCNuKcVsJ0AOg==/base.apk) at com.google.android.material.tabs.TabLayout$1.onTabUnselected(TabLayout.java:826) at com.google.android.material.tabs.TabLayout.dispatchTabUnselected(TabLayout.java:1799) at com.google.android.material.tabs.TabLayout.selectTab(TabLayout.java:1783) at com.google.android.material.tabs.TabLayout$TabLayoutOnPageChangeListener.onPageSelected(TabLayout.java:3256) at androidx.viewpager.widget.ViewPager.dispatchOnPageSelected(ViewPager.java:1947) at androidx.viewpager.widget.ViewPager.scrollToItem(ViewPager.java:686) at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:670) at androidx.viewpager.widget.ViewPager.onTouchEvent(ViewPager.java:2263) at android.view.View.dispatchTouchEvent(View.java:12593) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3028) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2705) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:441) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1850) at android.app.Activity.dispatchTouchEvent(Activity.java:3413) at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:399) at android.view.View.dispatchPointerEvent(View.java:12832) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5667) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5193) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4726) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4692) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4832) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4700) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4889) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4726) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4692) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4700) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7697) 2019-09-16 16:52:57.263 23024-23024/com.thesunbi.nepmeds E/AndroidRuntime: at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7666) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7599) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7800) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:187) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:326) at android.os.Looper.loop(Looper.java:160) at android.app.ActivityThread.main(ActivityThread.java:6898) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 2019-09-16 16:52:57.265 23024-23024/com.thesunbi.nepmeds E/AndroidRuntime: FATAL EXCEPTION: main Process: com.thesunbi.nepmeds, PID: 23024 java.lang.IncompatibleClassChangeError: Class 'khalti.checkOut.CheckOutActivity$1' does not implement interface 'com.google.android.material.tabs.TabLayout$BaseOnTabSelectedListener' in call to 'void com.google.android.material.tabs.TabLayout$BaseOnTabSelectedListener.onTabUnselected(com.google.android.material.tabs.TabLayout$Tab)' (declaration of 'com.google.android.material.tabs.TabLayout$1' appears in /data/app/com.thesunbi.nepmeds-Qdq0rC66qqCNuKcVsJ0AOg==/base.apk) at com.google.android.material.tabs.TabLayout$1.onTabUnselected(TabLayout.java:826) at com.google.android.material.tabs.TabLayout.dispatchTabUnselected(TabLayout.java:1799) at com.google.android.material.tabs.TabLayout.selectTab(TabLayout.java:1783) at com.google.android.material.tabs.TabLayout$TabLayoutOnPageChangeListener.onPageSelected(TabLayout.java:3256) at androidx.viewpager.widget.ViewPager.dispatchOnPageSelected(ViewPager.java:1947) at androidx.viewpager.widget.ViewPager.scrollToItem(ViewPager.java:686) at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:670) at androidx.viewpager.widget.ViewPager.onTouchEvent(ViewPager.java:2263) at android.view.View.dispatchTouchEvent(View.java:12593) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3028) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2705) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3034) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:441) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1850) at android.app.Activity.dispatchTouchEvent(Activity.java:3413) at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:399) at android.view.View.dispatchPointerEvent(View.java:12832) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5667) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5193) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4726) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4692) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4832) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4700) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4889) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4726) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4692) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4700) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7697) 2019-09-16 16:52:57.266 23024-23024/com.thesunbi.nepmeds E/AndroidRuntime: at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7666) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7599) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7800) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:187) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:326) at android.os.Looper.loop(Looper.java:160) at android.app.ActivityThread.main(ActivityThread.java:6898) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

AAPT: error: duplicate value for resource 'attr/button_style' with config ''.

After integrating sdk in the project build fails with following error

/Users/amar/.gradle/caches/transforms-2/files-2.1/5b02e9fabdc6d3f8a2b35986c0906017/jetified-khalti-android/res/values/values.xml:144:5-154:25: AAPT: error: duplicate value for resource 'attr/button_style' with config ''.

it points to this resource










Migrate to androidx

Is there any plans to migrate the SDK to android x? As the world is moving fast towards androidx.

[Feature Request] onCancelled callback

The industry-standard approach to add a 3rd party system which need some redirect is to have 3 callbacks, success, failed, cancelled. But this SDK lacks cancelled, without the ability to know whethere the sdk tried to make the payment, we are not able to optimize out sales accordingly.

Will it be a possibility from the team to add such a feature?

Could not resolve com.khalti:khalti-android:1.02.18.

I was using version 1.02.18 khalti sdk version. Now when I tried rebuild my android project I am getting this error. Has this version been removed from khalti repo or is it some issue in my side? Please explain.

RROR: Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve com.khalti:khalti-android:1.02.18.

There is no "mobile" on success's hashmap.

According to the documentation I should be able to get mobile on success json but it's not there. It's showing on the Http Response but not on the success hashmap. Is it for security purpose or did you forget to add it on hashmap??

Khalti Android SDK

I have followed all the steps.
Including Khalti SDK show the problem of carbonX and Shadow problem!

why we need to disbale R8

I am using jetpack compose for UI in new app disabling R8 will performance in jetpack ui. Are we still need to disable that R8

Caused by: java.lang.RuntimeException: Duplicate class

Caused by: java.lang.RuntimeException: Duplicate class android.support.v4.app.INotificationSideChannel found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-compat-25.3.1-runtime (com.android.support:support-compat:25.3.1)

ignored khalti-android/src/main/java/khalti/utils/Constant.java

Whats the meaning of making the project open source when I can't even test your testClasses.

khalti-android/src/main/java/khalti/checkOut/EBanking/EBankingPresenter.java
khalti-android/src/main/java/khalti/checkOut/Wallet/WalletPresenter.java
khalti-android/src/main/java/khalti/checkOut/api/ApiHelper.java

Constants.url is missing and which is for sure "https://khalti.com/" as I assume..

Looking for better sdk ahead
Congratulation as well !!

Not compatiable with andriod studio 3.4

Khalti SDK is not working with build version 28 or more. This is bad practice to downgrade build tool version so that will you please update your build tool to 28 or more.

Cannot find symbol Khalti.init when called from Java.

When trying to call the init method of Khalti, I get cannot find symbol error.

         KhaltiPayConfig config = new KhaltiPayConfig(
                "public_key",
                "pidx_from_epayment_initiate",
                true,
                Environment.TEST
        );
        Khalti.init(ctx, config,
                // on payment result
                (paymentResult, khalti) -> {
                    Log.d("khalti", "On payment result");
                },
                // on message
                (payload, khalti) -> {
                    Log.d("khalti", "On message");
                },
                // on return
                (khalti) -> {
                    Log.d("khalti", "On return");
                }
        );

Reading the Kotlin doc for calling Kotlin static methods from java, @JvmStatic is required.
Link to the doc.

java.lang.NoSuchFieldError

java.lang.NoSuchFieldError: No static field flProgress of type I in class Lcom/khalti/R$id; or its superclasses (declaration of 'com.khalti.R$id' appears in /data/app/com.app.vianet-25MVUnyLsz_YpBijZYnvQA==/base.apk!classes2.dex)

Can't disable R8 in newer gradle version

We can't disable R8 in gradle version newer than 7.0. So, it is causing conflict with other dependencies because some of them also have obfuscated a.a(a.b / whatever) class which this library also has. The build logs is as ### follows:

Duplicate class a.a found in modules jetified-eSewaSdk-runtime (eSewaSdk.aar) and jetified-khalti-android-2.01.02-runtime (com.khalti:khalti-android:2.01.02)
Duplicate class b.a found in modules jetified-eSewaSdk-runtime (eSewaSdk.aar) and jetified-khalti-android-2.01.02-runtime (com.khalti:khalti-android:2.01.02)
Duplicate class b.b found in modules jetified-eSewaSdk-runtime (eSewaSdk.aar) and jetified-khalti-android-2.01.02-runtime (com.khalti:khalti-android:2.01.02)
Duplicate class b.c found in modules jetified-eSewaSdk-runtime (eSewaSdk.aar) and jetified-khalti-android-2.01.02-runtime (com.khalti:khalti-android:2.01.02)
Duplicate class c.a found in modules jetified-eSewaSdk-runtime (eSewaSdk.aar) and jetified-khalti-android-2.01.02-runtime (com.khalti:khalti-android:2.01.02)

Solution: as discussed here, please use flattenpackagehierarchy in your ProGuard rules to move obfuscated classes in some unique package to prevent aforementioned conflicts with other libraries.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.