Giter Club home page Giter Club logo

killbill-adyen-plugin's Introduction

Kill Bill - Open-Source Subscription Billing & Payments Platform

Kill Bill, the Open-Source Subscription Billing & Payments Platform, duck logo

Kill Bill has been the leading Open-Source Subscription Billing & Payments Platform over the past 10 years. The platform exists to help you scale your billing and payment infrastructure and to grow your business. Out of the box, you have access to real-time analytics and financial reports. And because you are in control of your business and client data, you avoid any vendor lock-in.

Kill Bill can fulfill the billing and payment needs of nearly any online business. Reliable and robust, it has proven itself over time with even the largest SaaS and e-commerce organizations.

Open-Source + SaaS billing = OpenSaaS billing

Kill Bill offers a lot out of the box:

  • You can test various subscription billing models to see which is most profitable for your business.
  • It is easy to run trials and accommodate even the briefest promotional discounts.
  • Your business doesn't need to rely on the uptime or processing speed of a third-party SaaS provider.
  • Kill Bill is not an all-in-one solution. Instead, it is highly modularized, enabling you to disable functionality you don't need or replace functionality with one of your existing systems.
  • On premises or in the cloud, Kill Bill will scale as your subscription business grows. You can also start with Kill Bill in one business area and slowly migrate it to other areas.
  • Kill Bill provides an unmatched framework for extensibility.

With Kill Bill, you get a SaaS-like subscription management and billing solution out of the box, but with the flexibility and peace of mind of running an open-source stack.

Get your own subscription billing platform

Open-Source and governance

Kill Bill is free to use and completely open-source under the Apache Licence 2.0 license. 🎉

However, we do require financial backing to sustain the effort to maintain and enhance the project. Companies, individual users, and contributors can join their peers in supporting the work through GitHub Sponsors. 🍻

Get stats on Kill Bill contributors

Looking for statistics? This project does not use a monolithic repository, but is instead split across many components. To gather accurate counts on contributors, stars, and forks, take a look across our entire GitHub organization. 📈

About Kill Bill

Martin Westhead, Pierre-Alexandre Meyer, and Stéphane Brossier founded the project independently in 2010. The Billing Project, LLC owns the Kill Bill codebase and trademarks. Professional services, sponsorships, and commercial support packages are available upon request.

killbill-adyen-plugin's People

Contributors

alenad avatar andrenpaes avatar arnelandwehr avatar daliwei avatar ecsiral avatar fkrauss avatar holkra avatar killbillio avatar meden avatar pierre avatar reshmabidikar avatar sbrossie avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

killbill-adyen-plugin's Issues

Excpetion org.killbill.automaton.OperationException: java.lang.ArithmeticException: Scale of amount 10.000000000 is greater than the scale of the currency EUR being thrown when running 3dSecure

Exception:

5-12-21 22:47:51,370 [catalina-exec-1] WARN  o.k.b.p.c.sm.OperationCallbackBase - Payment plugin call threw an exception for account 40164394-c2eb-4459-894d-e61ef1640e85
org.killbill.automaton.OperationException: java.lang.ArithmeticException: Scale of amount 10.000000000 is greater than the scale of the currency EUR
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.doSimpleOperationCallback(PaymentOperation.java:171)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.access$000(PaymentOperation.java:55)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation$2.doOperation(PaymentOperation.java:159)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation$2.doOperation(PaymentOperation.java:156)
    at org.killbill.billing.payment.core.ProcessorBase$WithAccountLock.processAccountWithLock(ProcessorBase.java:199)
    at org.killbill.billing.payment.core.ProcessorBase$CallableWithAccountLock.call(ProcessorBase.java:182)
    at org.killbill.billing.payment.core.ProcessorBase$CallableWithAccountLock.call(ProcessorBase.java:163)
    at org.killbill.billing.payment.dispatcher.CallableWithRequestData.call(CallableWithRequestData.java:48)
    at org.killbill.commons.concurrent.WrappedCallable.call(WrappedCallable.java:42)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at org.killbill.commons.concurrent.WrappedRunnable.run(WrappedRunnable.java:40)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ArithmeticException: Scale of amount 10.000000000 is greater than the scale of the currency EUR
    at org.joda.money.Money.of(Money.java:75)
    at org.killbill.billing.plugin.adyen.client.payment.service.BaseAdyenPaymentServiceProviderPort.toMinorUnits(BaseAdyenPaymentServiceProviderPort.java:53)
    at org.killbill.billing.plugin.adyen.client.payment.service.BaseAdyenPaymentServiceProviderPort.toMinorUnits(BaseAdyenPaymentServiceProviderPort.java:47)
    at org.killbill.billing.plugin.adyen.client.payment.service.BaseAdyenPaymentServiceProviderPort.toMinorUnits(BaseAdyenPaymentServiceProviderPort.java:40)
    at org.killbill.billing.plugin.adyen.client.payment.service.BaseAdyenPaymentServiceProviderPort.toMinorUnits(BaseAdyenPaymentServiceProviderPort.java:33)
    at org.killbill.billing.plugin.adyen.client.payment.service.AdyenPaymentServiceProviderPort.authorize3DSecure(AdyenPaymentServiceProviderPort.java:156)
    at org.killbill.billing.plugin.adyen.api.AdyenPaymentPluginApi$1.execute(AdyenPaymentPluginApi.java:342)
    at org.killbill.billing.plugin.adyen.api.AdyenPaymentPluginApi$1.execute(AdyenPaymentPluginApi.java:336)
    at org.killbill.billing.plugin.adyen.api.AdyenPaymentPluginApi.executeInitialTransaction(AdyenPaymentPluginApi.java:555)
    at org.killbill.billing.plugin.adyen.api.AdyenPaymentPluginApi.authorizePayment(AdyenPaymentPluginApi.java:335)
    at sun.reflect.GeneratedMethodAccessor690.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.killbill.billing.osgi.ContextClassLoaderHelper$ClassLoaderInvocationHandler$1.execute(ContextClassLoaderHelper.java:142)
    at org.killbill.commons.profiling.Profiling.executeWithProfiling(Profiling.java:37)
    at org.killbill.billing.osgi.ContextClassLoaderHelper$ClassLoaderInvocationHandler.invoke(ContextClassLoaderHelper.java:139)
    at com.sun.proxy.$Proxy149.authorizePayment(Unknown Source)
    at org.killbill.billing.payment.core.sm.payments.AuthorizeOperation.doCallSpecificOperationCallback(AuthorizeOperation.java:47)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.doOperation(PaymentOperation.java:182)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.doSimpleOperationCallback(PaymentOperation.java:167)
    ... 13 common frames omitted
2015-12-21 22:47:51,402 [catalina-exec-1] WARN  o.k.b.j.mappers.ExceptionMapperBase - Internal error
org.killbill.billing.payment.api.PaymentApiException: Internal payment error : org.killbill.automaton.OperationException: org.killbill.automaton.OperationException: java.lang.ArithmeticException: Scale of amount 10.000000000 is greater than the scale of the currency EUR
    at org.killbill.billing.payment.core.sm.PaymentAutomatonRunner.runStateMachineOperation(PaymentAutomatonRunner.java:228)
    at org.killbill.billing.payment.core.sm.PaymentAutomatonRunner.run(PaymentAutomatonRunner.java:193)
    at org.killbill.billing.payment.core.PaymentProcessor.performOperation(PaymentProcessor.java:321)
    at org.killbill.billing.payment.core.PaymentProcessor.createAuthorization(PaymentProcessor.java:109)
    at org.killbill.billing.payment.api.DefaultPaymentApi.createAuthorization(DefaultPaymentApi.java:84)
    at org.killbill.billing.util.glue.KillbillApiAopModule$ProfilingMethodInterceptor$1.execute(KillbillApiAopModule.java:52)
    at org.killbill.commons.profiling.Profiling.executeWithProfiling(Profiling.java:33)
    at org.killbill.billing.util.glue.KillbillApiAopModule$ProfilingMethodInterceptor.invoke(KillbillApiAopModule.java:49)
    at org.killbill.billing.util.security.AopAllianceMethodInvocationAdapter.proceed(AopAllianceMethodInvocationAdapter.java:45)
    at org.apache.shiro.authz.aop.AuthorizingAnnotationMethodInterceptor.invoke(AuthorizingAnnotationMethodInterceptor.java:68)
    at org.killbill.billing.util.security.AopAllianceMethodInterceptorAdapter.invoke(AopAllianceMethodInterceptorAdapter.java:32)
    at org.killbill.billing.payment.api.DefaultPaymentApi.createAuthorizationWithPaymentControl(DefaultPaymentApi.java:94)
    at org.killbill.billing.util.glue.KillbillApiAopModule$ProfilingMethodInterceptor$1.execute(KillbillApiAopModule.java:52)
    at org.killbill.commons.profiling.Profiling.executeWithProfiling(Profiling.java:33)
    at org.killbill.billing.util.glue.KillbillApiAopModule$ProfilingMethodInterceptor.invoke(KillbillApiAopModule.java:49)
    at org.killbill.billing.util.security.AopAllianceMethodInvocationAdapter.proceed(AopAllianceMethodInvocationAdapter.java:45)
    at org.apache.shiro.authz.aop.AuthorizingAnnotationMethodInterceptor.invoke(AuthorizingAnnotationMethodInterceptor.java:68)
    at org.killbill.billing.util.security.AopAllianceMethodInterceptorAdapter.invoke(AopAllianceMethodInterceptorAdapter.java:32)
    at org.killbill.billing.jaxrs.resources.PaymentResource.completeTransactionInternal(PaymentResource.java:352)
    at org.killbill.billing.jaxrs.resources.PaymentResource.completeTransaction(PaymentResource.java:249)
    at org.killbill.commons.skeleton.metrics.TimedResourceInterceptor.invoke(TimedResourceInterceptor.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:540)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:715)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263)
    at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:178)
    at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:62)
    at org.killbill.billing.server.security.TenantFilter.doFilter(TenantFilter.java:104)
    at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
    at org.killbill.billing.server.filters.ResponseCorsFilter.doFilter(ResponseCorsFilter.java:66)
    at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
    at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
    at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.shiro.guice.web.SimpleFilterChain.doFilter(SimpleFilterChain.java:44)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    at org.apache.shiro.guice.web.SimpleFilterChain.doFilter(SimpleFilterChain.java:41)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.codahale.metrics.servlet.AbstractInstrumentedFilter.doFilter(AbstractInstrumentedFilter.java:104)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.killbill.automaton.OperationException: org.killbill.automaton.OperationException: java.lang.ArithmeticException: Scale of amount 10.000000000 is greater than the scale of the currency EUR
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.convertToUnknownTransactionStatusAndErroredPaymentState(PaymentOperation.java:127)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.unwrapExceptionFromDispatchedTask(PaymentOperation.java:104)
    at org.killbill.billing.payment.core.sm.OperationCallbackBase.dispatchWithAccountLockAndTimeout(OperationCallbackBase.java:75)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.doOperationCallbackWithDispatchAndAccountLock(PaymentOperation.java:156)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.doOperationCallback(PaymentOperation.java:76)
    at org.killbill.automaton.DefaultOperation.run(DefaultOperation.java:51)
    at org.killbill.automaton.DefaultState.runOperation(DefaultState.java:80)
    at org.killbill.billing.payment.core.sm.PaymentAutomatonRunner.runStateMachineOperation(PaymentAutomatonRunner.java:217)
    ... 87 common frames omitted
Caused by: org.killbill.automaton.OperationException: java.lang.ArithmeticException: Scale of amount 10.000000000 is greater than the scale of the currency EUR
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.doSimpleOperationCallback(PaymentOperation.java:171)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.access$000(PaymentOperation.java:55)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation$2.doOperation(PaymentOperation.java:159)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation$2.doOperation(PaymentOperation.java:156)
    at org.killbill.billing.payment.core.ProcessorBase$WithAccountLock.processAccountWithLock(ProcessorBase.java:199)
    at org.killbill.billing.payment.core.ProcessorBase$CallableWithAccountLock.call(ProcessorBase.java:182)
    at org.killbill.billing.payment.core.ProcessorBase$CallableWithAccountLock.call(ProcessorBase.java:163)
    at org.killbill.billing.payment.dispatcher.CallableWithRequestData.call(CallableWithRequestData.java:48)
    at org.killbill.commons.concurrent.WrappedCallable.call(WrappedCallable.java:42)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at org.killbill.commons.concurrent.WrappedRunnable.run(WrappedRunnable.java:40)
    ... 3 common frames omitted
Caused by: java.lang.ArithmeticException: Scale of amount 10.000000000 is greater than the scale of the currency EUR
    at org.joda.money.Money.of(Money.java:75)
    at org.killbill.billing.plugin.adyen.client.payment.service.BaseAdyenPaymentServiceProviderPort.toMinorUnits(BaseAdyenPaymentServiceProviderPort.java:53)
    at org.killbill.billing.plugin.adyen.client.payment.service.BaseAdyenPaymentServiceProviderPort.toMinorUnits(BaseAdyenPaymentServiceProviderPort.java:47)
    at org.killbill.billing.plugin.adyen.client.payment.service.BaseAdyenPaymentServiceProviderPort.toMinorUnits(BaseAdyenPaymentServiceProviderPort.java:40)
    at org.killbill.billing.plugin.adyen.client.payment.service.BaseAdyenPaymentServiceProviderPort.toMinorUnits(BaseAdyenPaymentServiceProviderPort.java:33)
    at org.killbill.billing.plugin.adyen.client.payment.service.AdyenPaymentServiceProviderPort.authorize3DSecure(AdyenPaymentServiceProviderPort.java:156)
    at org.killbill.billing.plugin.adyen.api.AdyenPaymentPluginApi$1.execute(AdyenPaymentPluginApi.java:342)
    at org.killbill.billing.plugin.adyen.api.AdyenPaymentPluginApi$1.execute(AdyenPaymentPluginApi.java:336)
    at org.killbill.billing.plugin.adyen.api.AdyenPaymentPluginApi.executeInitialTransaction(AdyenPaymentPluginApi.java:555)
    at org.killbill.billing.plugin.adyen.api.AdyenPaymentPluginApi.authorizePayment(AdyenPaymentPluginApi.java:335)
    at sun.reflect.GeneratedMethodAccessor690.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.killbill.billing.osgi.ContextClassLoaderHelper$ClassLoaderInvocationHandler$1.execute(ContextClassLoaderHelper.java:142)
    at org.killbill.commons.profiling.Profiling.executeWithProfiling(Profiling.java:37)
    at org.killbill.billing.osgi.ContextClassLoaderHelper$ClassLoaderInvocationHandler.invoke(ContextClassLoaderHelper.java:139)
    at com.sun.proxy.$Proxy149.authorizePayment(Unknown Source)
    at org.killbill.billing.payment.core.sm.payments.AuthorizeOperation.doCallSpecificOperationCallback(AuthorizeOperation.java:47)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.doOperation(PaymentOperation.java:182)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.doSimpleOperationCallback(PaymentOperation.java:167)
    ... 13 common frames omitted
2015-12-21 22:47:51,405 [catalina-exec-1] WARN  o.k.b.j.mappers.ExceptionMapperBase - Internal error
org.killbill.billing.payment.api.PaymentApiException: Internal payment error : org.killbill.automaton.OperationException: org.killbill.automaton.OperationException: java.lang.ArithmeticException: Scale of amount 10.000000000 is greater than the scale of the currency EUR
    at org.killbill.billing.payment.core.sm.PaymentAutomatonRunner.runStateMachineOperation(PaymentAutomatonRunner.java:228)
    at org.killbill.billing.payment.core.sm.PaymentAutomatonRunner.run(PaymentAutomatonRunner.java:193)
    at org.killbill.billing.payment.core.PaymentProcessor.performOperation(PaymentProcessor.java:321)
    at org.killbill.billing.payment.core.PaymentProcessor.createAuthorization(PaymentProcessor.java:109)
    at org.killbill.billing.payment.api.DefaultPaymentApi.createAuthorization(DefaultPaymentApi.java:84)
    at org.killbill.billing.util.glue.KillbillApiAopModule$ProfilingMethodInterceptor$1.execute(KillbillApiAopModule.java:52)
    at org.killbill.commons.profiling.Profiling.executeWithProfiling(Profiling.java:33)
    at org.killbill.billing.util.glue.KillbillApiAopModule$ProfilingMethodInterceptor.invoke(KillbillApiAopModule.java:49)
    at org.killbill.billing.util.security.AopAllianceMethodInvocationAdapter.proceed(AopAllianceMethodInvocationAdapter.java:45)
    at org.apache.shiro.authz.aop.AuthorizingAnnotationMethodInterceptor.invoke(AuthorizingAnnotationMethodInterceptor.java:68)
    at org.killbill.billing.util.security.AopAllianceMethodInterceptorAdapter.invoke(AopAllianceMethodInterceptorAdapter.java:32)
    at org.killbill.billing.payment.api.DefaultPaymentApi.createAuthorizationWithPaymentControl(DefaultPaymentApi.java:94)
    at org.killbill.billing.util.glue.KillbillApiAopModule$ProfilingMethodInterceptor$1.execute(KillbillApiAopModule.java:52)
    at org.killbill.commons.profiling.Profiling.executeWithProfiling(Profiling.java:33)
    at org.killbill.billing.util.glue.KillbillApiAopModule$ProfilingMethodInterceptor.invoke(KillbillApiAopModule.java:49)
    at org.killbill.billing.util.security.AopAllianceMethodInvocationAdapter.proceed(AopAllianceMethodInvocationAdapter.java:45)
    at org.apache.shiro.authz.aop.AuthorizingAnnotationMethodInterceptor.invoke(AuthorizingAnnotationMethodInterceptor.java:68)
    at org.killbill.billing.util.security.AopAllianceMethodInterceptorAdapter.invoke(AopAllianceMethodInterceptorAdapter.java:32)
    at org.killbill.billing.jaxrs.resources.PaymentResource.completeTransactionInternal(PaymentResource.java:352)
    at org.killbill.billing.jaxrs.resources.PaymentResource.completeTransaction(PaymentResource.java:249)
    at org.killbill.commons.skeleton.metrics.TimedResourceInterceptor.invoke(TimedResourceInterceptor.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:540)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:715)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263)
    at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:178)
    at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:62)
    at org.killbill.billing.server.security.TenantFilter.doFilter(TenantFilter.java:104)
    at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
    at org.killbill.billing.server.filters.ResponseCorsFilter.doFilter(ResponseCorsFilter.java:66)
    at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
    at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
    at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.shiro.guice.web.SimpleFilterChain.doFilter(SimpleFilterChain.java:44)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    at org.apache.shiro.guice.web.SimpleFilterChain.doFilter(SimpleFilterChain.java:41)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.codahale.metrics.servlet.AbstractInstrumentedFilter.doFilter(AbstractInstrumentedFilter.java:104)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.killbill.automaton.OperationException: org.killbill.automaton.OperationException: java.lang.ArithmeticException: Scale of amount 10.000000000 is greater than the scale of the currency EUR
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.convertToUnknownTransactionStatusAndErroredPaymentState(PaymentOperation.java:127)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.unwrapExceptionFromDispatchedTask(PaymentOperation.java:104)
    at org.killbill.billing.payment.core.sm.OperationCallbackBase.dispatchWithAccountLockAndTimeout(OperationCallbackBase.java:75)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.doOperationCallbackWithDispatchAndAccountLock(PaymentOperation.java:156)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.doOperationCallback(PaymentOperation.java:76)
    at org.killbill.automaton.DefaultOperation.run(DefaultOperation.java:51)
    at org.killbill.automaton.DefaultState.runOperation(DefaultState.java:80)
    at org.killbill.billing.payment.core.sm.PaymentAutomatonRunner.runStateMachineOperation(PaymentAutomatonRunner.java:217)
    ... 87 common frames omitted
Caused by: org.killbill.automaton.OperationException: java.lang.ArithmeticException: Scale of amount 10.000000000 is greater than the scale of the currency EUR
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.doSimpleOperationCallback(PaymentOperation.java:171)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.access$000(PaymentOperation.java:55)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation$2.doOperation(PaymentOperation.java:159)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation$2.doOperation(PaymentOperation.java:156)
    at org.killbill.billing.payment.core.ProcessorBase$WithAccountLock.processAccountWithLock(ProcessorBase.java:199)
    at org.killbill.billing.payment.core.ProcessorBase$CallableWithAccountLock.call(ProcessorBase.java:182)
    at org.killbill.billing.payment.core.ProcessorBase$CallableWithAccountLock.call(ProcessorBase.java:163)
    at org.killbill.billing.payment.dispatcher.CallableWithRequestData.call(CallableWithRequestData.java:48)
    at org.killbill.commons.concurrent.WrappedCallable.call(WrappedCallable.java:42)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at org.killbill.commons.concurrent.WrappedRunnable.run(WrappedRunnable.java:40)
    ... 3 common frames omitted
Caused by: java.lang.ArithmeticException: Scale of amount 10.000000000 is greater than the scale of the currency EUR
    at org.joda.money.Money.of(Money.java:75)
    at org.killbill.billing.plugin.adyen.client.payment.service.BaseAdyenPaymentServiceProviderPort.toMinorUnits(BaseAdyenPaymentServiceProviderPort.java:53)
    at org.killbill.billing.plugin.adyen.client.payment.service.BaseAdyenPaymentServiceProviderPort.toMinorUnits(BaseAdyenPaymentServiceProviderPort.java:47)
    at org.killbill.billing.plugin.adyen.client.payment.service.BaseAdyenPaymentServiceProviderPort.toMinorUnits(BaseAdyenPaymentServiceProviderPort.java:40)
    at org.killbill.billing.plugin.adyen.client.payment.service.BaseAdyenPaymentServiceProviderPort.toMinorUnits(BaseAdyenPaymentServiceProviderPort.java:33)
    at org.killbill.billing.plugin.adyen.client.payment.service.AdyenPaymentServiceProviderPort.authorize3DSecure(AdyenPaymentServiceProviderPort.java:156)
    at org.killbill.billing.plugin.adyen.api.AdyenPaymentPluginApi$1.execute(AdyenPaymentPluginApi.java:342)
    at org.killbill.billing.plugin.adyen.api.AdyenPaymentPluginApi$1.execute(AdyenPaymentPluginApi.java:336)
    at org.killbill.billing.plugin.adyen.api.AdyenPaymentPluginApi.executeInitialTransaction(AdyenPaymentPluginApi.java:555)
    at org.killbill.billing.plugin.adyen.api.AdyenPaymentPluginApi.authorizePayment(AdyenPaymentPluginApi.java:335)
    at sun.reflect.GeneratedMethodAccessor690.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.killbill.billing.osgi.ContextClassLoaderHelper$ClassLoaderInvocationHandler$1.execute(ContextClassLoaderHelper.java:142)
    at org.killbill.commons.profiling.Profiling.executeWithProfiling(Profiling.java:37)
    at org.killbill.billing.osgi.ContextClassLoaderHelper$ClassLoaderInvocationHandler.invoke(ContextClassLoaderHelper.java:139)
    at com.sun.proxy.$Proxy149.authorizePayment(Unknown Source)
    at org.killbill.billing.payment.core.sm.payments.AuthorizeOperation.doCallSpecificOperationCallback(AuthorizeOperation.java:47)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.doOperation(PaymentOperation.java:182)
    at org.killbill.billing.payment.core.sm.payments.PaymentOperation.doSimpleOperationCallback(PaymentOperation.java:167)
    ... 13 common frames omitted
2015-12-21 22:47:51,406 [catalina-exec-1] INFO  c.s.j.a.c.filter.LoggingFilter - 9989 * Server out-bound response
9989 < 500
9989 < Content-Type: application/json
9989 < 

Why the plugin does not populate the related "additional_data" that comes from Adyen via webhook?

We're adapting the plugin to handle AAR (Adyen Auto Rescue) and would be good to store the related additional_data adyen send to us during AAR process.

So I have a question, why this piece of code was build like this in a way to not store the "additional_data" from adyen? Is there a reason or just because it would not be used anywhere.

Store additional data on errors

In case the CVV is missing for example, we store the following response:

MariaDB [killbill]> select * from adyen_responses where psp_reference = 'XXX'\G
*************************** 1. row ***************************
                record_id: 1
            kb_account_id: AAA
            kb_payment_id: BBB
kb_payment_transaction_id: CCC
         transaction_type: AUTHORIZE
                   amount: 10.000000000
                 currency: EUR
               psp_result: Refused
            psp_reference: XXX
                auth_code: NULL
              result_code: Refused
           refusal_reason: Refused
                reference: NULL
          psp_error_codes: NULL
     payment_internal_ref: DDD
                 form_url: NULL
               dcc_amount: NULL
             dcc_currency: NULL
            dcc_signature: NULL
               issuer_url: NULL
                       md: NULL
               pa_request: NULL
          additional_data: NULL
             created_date: 2015-10-02 16:08:28
             kb_tenant_id: EEE

The XML response has more information though:

        <additionalData xmlns="http://payment.services.adyen.com">
          <entry>
            <key xsi:type="xsd:string">cvcResult</key>
            <value xsi:type="xsd:string">4 No CVC/CVV provided, but was required</value>
          </entry>
          <entry>
            <key xsi:type="xsd:string">avsResult</key>
            <value xsi:type="xsd:string">4 AVS not supported for this card type</value>
          </entry>
          <entry>
            <key xsi:type="xsd:string">avsResultRaw</key>
            <value xsi:type="xsd:string">4</value>
          </entry>
          <entry>
            <key xsi:type="xsd:string">cvcResultRaw</key>
            <value xsi:type="xsd:string">4</value>
          </entry>
          <entry>
            <key xsi:type="xsd:string">refusalReasonRaw</key>
            <value xsi:type="xsd:string">DECLINED CVC Incorrect</value>
          </entry>
        </additionalData>

We should store the addition data so that refusalReasonRaw is returned as part of AdyenPaymentTransactionInfoPlugin#gatewayError.

Check for technical exclusive-or business error needs reworking

The xor check in AdyenPaymentTransactionInfoPlugin.java#L123

checkArgument(adyenCallErrorStatus.isPresent() ^ pspResult.isPresent());

… will always fail for the call at AdyenPaymentTransactionInfoPlugin.java#L95-L98

getPaymentPluginStatus(Optional.of(AdyenCallErrorStatus.UNKNOWN_FAILURE),
                       Optional.of(PaymentServiceProviderResult.getPaymentResultForId(record.getPspResult())))

… because Optional.of(...) never returns .absent() but rather throws a NullPointerException when called with null: Optional.java#L83-L88.

Very old Adyen API version

It seems that this is using Adyen v12 of the API, but they are on like v40 - is there any chance to update this to the latest API? Or have any suggestions working with it in Adyen Production as is?

Thanks

Add support for re-using tokenization authorization

Adyen doesn't have a standalone tokenization API: tokens (i.e. recurringDetailReference) can only be created when triggering a real payment.

The standard flow is to tokenize by triggering a $0 auth (voided right away), before triggering a real payment (auth+capture or auto-capture). This has potentially two drawbacks:

  • Cost: Adyen charges per API call
  • Auth rate: it has been seen in the field that the subsequent auth has a higher rate of refusal

In the case where tokenization is performed outside of Kill Bill (e.g. PCI vault), we would like the Adyen plugin to re-use that auth when triggering the first payment. The new flow would be:

  • External system tokenizes by triggering an auth for $N (full payment amount)
  • External system creates a payment method in Kill Bill, specifying the following plugin properties:
    • token: value of recurringDetailReference
    • authPspReference: value of the pspReference returned by Adyen for the auth
  • When Kill Bill invokes purchasePayment (either through direct payment APIs or via invoice payment APIs), if this authPspReference property is found in the payment method, it should:
    • Call executeInitialTransaction (TransactionType.AUTHORIZE, skipGw=true) to sync the authorization record. The shouldSkipAdyen code branch will need to be updated to make sure the pspReference is correctly stored.
    • Call capturePayment (normal capture call for $N)
    • Upon success, update the payment method to remove the authPspReference property (so that it is not re-used)

Notes:

  • one side effect would be that PaymentPluginStatus now returns PENDING instead of PROCESSED (effectively making the purchasePayment call asynchronous). Kill Bill should still be able to handle it though.
  • it is assumed that the original auth amount would match the purchase amount. If not, the payment may be under- or over- captured.

Checkout API

Does this work with the checkout apis of Adyen? Not using the CSE.

Can we get rid of mandatory ccType property for SEPA/ELV?

It seems that ccType isn't necessary for SEPA and ELV: if ddHolderName, ddNumber and ddBic are specified, we know the request is a SEPA one. Similarily, if ddHolderName, ddNumber and ddBlz are specified, it is an ELV one.

Could we get rid of it?

Store recurringDetailId

We should store the recurringDetailId in the column adyen_payment_methods.token and retrieve it in the payment flow.

To store it, we need to wait for the first payment (auth, purchase or credit). If the id is not part of the response (I'm unclear about that), we need to retrieve it. Additionally, we need introduce a new setRecurringDetailId DAO method.

We should also revoke the id when deletePaymentMethod is called.

Finally, getPaymentMethods should pull all the recurring ids from Adyen if refreshFromGateway is set.

AdyenPaymentExceptionParser not triggered

AdyenPaymentExceptionParser seems to be there to parse adyen error codes and map them to a more general representation.
This is triggered in 2 cases:

  • we receive a ServiceException => will never happen as Adyen is not throwing them anymore
  • a SOAPFault exception is thrown => this is also not the case for invalid params. At least not for too long CVCs.

Check if we need this feature and if yes make it work 😸 + add ITs

Revisit network errors handling

In case of java.net.UnknownHostException for instance, we return a PAYMENT_FAILURE. It should be a PLUGIN_FAILURE instead (we are guaranteed the payment didn't go through).

Recurring contract should be configurable

Adyen offers 3 different options to create recurring contracts on auth calls:

  1. RECURRING
  2. ONE-CLICK
  3. RECURRING, ONE-CLICK

(see adyens recurring manual for more information: manual)

Currently the plugin always uses option 3:

Which contract to create should be configurable (there is also already a plugin property for it)

JAR for 0.8 version

Please, provide the JAR for the 0.8 version that has compatibility with KB 0.22
There's no JAR 0.8 in Maven

PSP Result is not inserted to DB correct

Problem

The PSP Result is an Optional:

private final Optional<PaymentServiceProviderResult> result;

Currently it gets inserted using toString():

result.getResult() == null ? null : result.getResult().toString(),

That results in something like this as Text in the DB:

Optional.of(Authorised)

Solution

Replace == null check with a .isPresent() and toString() with get().toString()

Implement 3D Secure payment completion

Currently, authorizePayment always calls Adyen's authorise API. This handles the initial 3D-S flow, but doesn't support the 3D-S completion flow (Kill Bill will call authorize again, for the same kbPaymentId and kbPaymentTransactionId, to complete the 3D-S flow).

To handle the completion flow, we should call authorize3DSecure instead. This code-path should be triggered if we already have a record for that payment id, which can be checked using our responses table:

final AdyenResponsesRecord previousResponse = dao.getSuccessfulAuthorizationResponse(kbPaymentId, context.getTenantId());
if (previousResponse != null && previousResponse.getKbPaymentTransactionId().equals(kbPaymentTransactionId)) {
    // authorize3DSecure
} else {
    // authorize
}

Make timeouts configurable

org.killbill.billing.plugin.adyen.client.AdyenPaymentPortRegistry#createService needs to set a HTTPClientPolicy with configurable timeouts.

At the moment Apache CXF default timeouts are used:

  • Connection: 30s
  • Receive: 60s

Killbill proxy settings are not applied in healthcheck service

If the proxy settings(proxyServer,proxyPort and proxyType) are set properly, regular operations like register payment method or trigger payment are working.
However if you try to run /healthcheck you will still ends on the same 'Connection timed out: connect' whatever you set or don't set proxy settings.

Plugin info is not available in the payment transaction when CHARGEBACK is received

I order for us to do some business logic when a CHARGEBACK is received, we would like to access the information contained in the notification from Adyen. Similar information is provided in the AUTHORIZED notification for the original transaction of the payment, but no plugin information is available in the transaction for the CHARGEBACK.

I don't know if this is a bug or an enhancement.

sun.security.util.HostnameChecker ClassNotFoundException

java.lang.IllegalStateException: java.lang.ClassNotFoundException: sun.security.util.HostnameChecker not found by org.kill-bill.billing.plugin.java.adyen-plugin [20]
	at com.ning.http.util.ProxyHostnameChecker.getHostnameChecker(ProxyHostnameChecker.java:41)
	at com.ning.http.util.ProxyHostnameChecker.<init>(ProxyHostnameChecker.java:28)
	at com.ning.http.util.DefaultHostnameVerifier.<init>(DefaultHostnameVerifier.java:47)
	at com.ning.http.client.AsyncHttpClientConfig.getHostnameVerifier(AsyncHttpClientConfig.java:392)
	at com.ning.http.client.providers.jdk.JDKAsyncHttpProvider.createUrlConnection(JDKAsyncHttpProvider.java:192)
	at com.ning.http.client.providers.jdk.JDKAsyncHttpProvider.execute(JDKAsyncHttpProvider.java:147)
	at com.ning.http.client.providers.jdk.JDKAsyncHttpProvider.execute(JDKAsyncHttpProvider.java:118)
	at com.ning.http.client.AsyncHttpClient.executeRequest(AsyncHttpClient.java:506)
	at com.ning.http.client.AsyncHttpClient$BoundRequestBuilder.execute(AsyncHttpClient.java:225)
	at org.killbill.billing.plugin.util.http.HttpClient.executeAndWait(HttpClient.java:188)
	at org.killbill.billing.plugin.util.http.HttpClient.doCall(HttpClient.java:156)
	at org.killbill.billing.plugin.adyen.client.payment.service.DirectoryClient.getDirectory(DirectoryClient.java:44)
	at org.killbill.billing.plugin.adyen.client.payment.service.AdyenPaymentServiceProviderHostedPaymentPagePort.getDirectory(AdyenPaymentServiceProviderHostedPaymentPagePort.java:100)
	at org.killbill.billing.plugin.adyen.api.AdyenPaymentPluginApi.buildFormDescriptor(AdyenPaymentPluginApi.java:592)

handle adyen results more consistent

see discussion here: #12 (comment)

Both return types PurchaseResult and ModificationResult contains pspResults and errorStatusCodes.
But they are evaluated in different ways., preferable would be a more consistent flow in both cases.

Fail when trigger payment

First, i add a payment method and success.

curl -v \
     -u admin:password \
     -H "X-Killbill-ApiKey: bob" \
     -H "X-Killbill-ApiSecret: lazar" \
     -H "Content-Type: application/json" \
     -H "X-Killbill-CreatedBy: demo" \
     -X POST \
     --data-binary '{
       "pluginName": "killbill-adyen",
       "pluginInfo": {
         "properties": [
           {
             "key": "ccLastName",
             "value": "KillBill"
           },
           {
             "key": "ccExpirationMonth",
             "value": 8
           },
           {
             "key": "ccExpirationYear",
             "value": 2018
           },
           {
             "key": "ccNumber",
             "value": 4111111111111111
           },
           {
             "key": "ccVerificationValue",
             "value": 737
           }
         ]
       }
     }' \
     "http://127.0.0.1:8080/1.0/kb/accounts/<ACCOUNT_ID>/paymentMethods?isDefault=true"

Then, i trigger payment

curl -v \
     -u admin:password \
     -H "X-Killbill-ApiKey: bob" \
     -H "X-Killbill-ApiSecret: lazar" \
     -H "Content-Type: application/json" \
     -H "X-Killbill-CreatedBy: demo" \
     -X POST \
     --data-binary '{"transactionType":"AUTHORIZE","amount":"5","currency":"EUR","transactionExternalKey":"INV-'$(uuidgen)'-PURCHASE"}' \
    "http://127.0.0.1:8080/1.0/kb/accounts/<ACCOUNT_ID>/payments?pluginProperty=country=DE"

But payment fail and received message:

PLUGIN_FAILURE
   adyenCallErrorStatus : RESPONSE_ABOUT_INVALID_REQUEST
   exceptionClass : org.apache.cxf.binding.soap.SoapFault
   exceptionMessage : security 010 Not allowed

Can you explain for me, thanks you very much?

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.