diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/GatewayNotificationJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/GatewayNotificationJson.java
index 04dfd7c..923258c 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/GatewayNotificationJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/GatewayNotificationJson.java
@@ -51,7 +51,7 @@ public class GatewayNotificationJson extends JsonBase {
}
public GatewayNotificationJson(final GatewayNotification notification) {
- this.kbPaymentId = notification.getKbPaymentId().toString();
+ this.kbPaymentId = notification.getKbPaymentId() == null ? null : notification.getKbPaymentId().toString();
this.status = notification.getStatus();
this.entity = notification.getEntity();
this.headers = notification.getHeaders();
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
index 3360b9d..7784e99 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
@@ -199,4 +199,5 @@ public interface JaxrsResource {
public static final String HOSTED = "hosted";
public static final String FORM = "form";
+ public static final String NOTIFICATION = "notification";
}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentGatewayResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentGatewayResource.java
index e7c6aea..1e0d6df 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentGatewayResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentGatewayResource.java
@@ -53,6 +53,8 @@ import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.clock.Clock;
import com.google.common.base.Function;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
@@ -77,13 +79,12 @@ public class PaymentGatewayResource extends JaxRsResourceBase {
}
@POST
- @Path("/" + HOSTED + "/" + FORM + "/{" + QUERY_PAYMENT_PLUGIN_NAME + ":" + ANYTHING_PATTERN + "}/" + "/{" + QUERY_ACCOUNT_ID + ":" + UUID_PATTERN + "}")
+ @Path("/" + HOSTED + "/" + FORM + "/{" + QUERY_ACCOUNT_ID + ":" + UUID_PATTERN + "}")
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
// Generate form data to redirect the customer to the gateway
public Response buildFormDescriptor(final HostedPaymentPageFieldsJson json,
@PathParam(QUERY_ACCOUNT_ID) final String accountIdString,
- @PathParam(QUERY_PAYMENT_PLUGIN_NAME) final String pluginName,
@QueryParam(QUERY_PLUGIN_PROPERTY) final List<String> pluginPropertiesString,
@HeaderParam(HDR_CREATED_BY) final String createdBy,
@HeaderParam(HDR_REASON) final String reason,
@@ -95,14 +96,19 @@ public class PaymentGatewayResource extends JaxRsResourceBase {
final UUID accountId = UUID.fromString(accountIdString);
final Account account = accountUserApi.getAccountById(accountId, callContext);
- final Iterable<PluginProperty> customFields = Iterables.<PluginPropertyJson, PluginProperty>transform(json.getCustomFields(),
- new Function<PluginPropertyJson, PluginProperty>() {
- @Override
- public PluginProperty apply(final PluginPropertyJson pluginPropertyJson) {
- return pluginPropertyJson.toPluginProperty();
- }
- }
- );
+ final Iterable<PluginProperty> customFields;
+ if (json == null) {
+ customFields = ImmutableList.<PluginProperty>of();
+ } else {
+ customFields = Iterables.<PluginPropertyJson, PluginProperty>transform(json.getCustomFields(),
+ new Function<PluginPropertyJson, PluginProperty>() {
+ @Override
+ public PluginProperty apply(final PluginPropertyJson pluginPropertyJson) {
+ return pluginPropertyJson.toPluginProperty();
+ }
+ }
+ );
+ }
final HostedPaymentPageFormDescriptor descriptor = paymentGatewayApi.buildFormDescriptor(account, customFields, pluginProperties, callContext);
final HostedPaymentPageFormDescriptorJson result = new HostedPaymentPageFormDescriptorJson(descriptor);
@@ -110,7 +116,7 @@ public class PaymentGatewayResource extends JaxRsResourceBase {
}
@POST
- @Path("/{" + QUERY_PAYMENT_PLUGIN_NAME + ":" + ANYTHING_PATTERN + "}")
+ @Path("/" + NOTIFICATION + "/{" + QUERY_PAYMENT_PLUGIN_NAME + ":" + ANYTHING_PATTERN + "}")
@Consumes(WILDCARD)
@Produces(APPLICATION_JSON)
public Response processNotification(final String body,
@@ -124,8 +130,15 @@ public class PaymentGatewayResource extends JaxRsResourceBase {
final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
final CallContext callContext = context.createContext(createdBy, reason, comment, request);
+ final String notificationPayload;
+ if (Strings.emptyToNull(body) == null && uriInfo.getRequestUri() != null) {
+ notificationPayload = uriInfo.getRequestUri().getRawQuery();
+ } else {
+ notificationPayload = body;
+ }
+
// Note: the body is opaque here, as it comes from the gateway. The associated payment plugin will know how to deserialize it though
- final GatewayNotification notification = paymentGatewayApi.processNotification(body, pluginName, pluginProperties, callContext);
+ final GatewayNotification notification = paymentGatewayApi.processNotification(notificationPayload, pluginName, pluginProperties, callContext);
final GatewayNotificationJson result = new GatewayNotificationJson(notification);
// The plugin told us how to build the response