anchor.diff:  	Iterable<PluginProperty> properties, CallContext context) throws PaymentPluginApiException {
   	logger.info("buildFormDescriptor, kbAccountId=" + kbAccountId);
   	// retrieve properties
  -	String successRedirectUrl = PluginProperties.findPluginPropertyValue("success_redirect_url", properties); // "https://developer.gocardless.com/example-redirect-uri/"; - this is the URL to which GoCardless will redirect after users set up the  mandate
  +	String successRedirectUrl = PluginProperties.findPluginPropertyValue("success_redirect_url", properties); // "https://developer.gocardless.com/example-redirect-uri/"; - this is the URL to which GoCardless will redirect after users set up the mandate
   	String redirectFlowDescription = PluginProperties.findPluginPropertyValue("redirect_flow_description",properties); 
   	String sessionToken = PluginProperties.findPluginPropertyValue("session_token", properties); PrefilledCustomer customer = buildCustomer(customFields);// build a PrefilledCuctomer object from custom fields if present
   	RedirectFlow redirectFlow = client.redirectFlows().create().withDescription(redirectFlowDescription)
  
positive.code: 
  * Almost all the methods accept parameters like `kbAccountId`, `kbPaymentId`, `kbTransactionId`, etc., which are self-explanatory. These may or may not be used by your plugin code. But you may need some of these values to populate the `PaymentTransactionInfoPlugin` object that is returned by most of the methods (refer to the <<PaymentTransactionInfoPlugin, PaymentTransactionInfoPlugin>> section).
  
  * All the methods accept `Iterable<PluginProperty> properties` as a parameter. These can be used to pass arbitrary data to the plugin method as explained in the <<plugin_property_notes, Plugin Property Notes>> section.  
  
  * All the methods listed in the `PaymentPluginApi` also accept as parameter either a `TenantContext` or a `CallContext`.  Read only operations (operations which retrieve some data from Kill Bill) like the `getPaymentInfo` accept a `TenantContext`. Read/write operations like `authorizePayment` accept a `CallContext`. Both these values can be used for auditing purposes. 
  
  * It is quite possible that your plugin might not support some of the operations listed above. In such a case, the plugin can do one of the following:
  
  
negative.code: ==== Step 8 - Creating GoCardlessCheckoutServlet
  
  In the case of GoCardless, we need to create an additional servlet that invokes the `GoCardlessPluginApi#buildFormDescriptor` method. Normally, a client API invokes `buildFormDescriptor` via the 
  https://github.com/killbill/killbill-api/blob/4ae1c343a593de937415e21feecb9f5405037fa3/src/main/java/org/killbill/billing/payment/api/PaymentGatewayApi.java[`PaymentGatewayApi`] interface. If you take a look at the https://github.com/killbill/killbill-api/blob/4ae1c343a593de937415e21feecb9f5405037fa3/src/main/java/org/killbill/billing/payment/api/PaymentGatewayApi.java#L43[`PaymentGatewayApi#buildFormDescriptor`] method, you will notice that it accepts a `UUID paymentMethodId` as a parameter. Thus, this method assumes that a https://docs.killbill.io/latest/userguide_payment.html#_payment_methods[payment method] already exists. 
  
  However, in the case of GoCardless, we are using the `GoCardlessPluginApi#buildFormDescriptor` to create a form where a user sets up a mandate. Thus, the *payment method* will not exist in Kill Bill at the time of invoking the `PaymentGatewayApi#buildFormDescriptor` method. So, this method cannot directly invoke the `GoCardlessPlugin#buildFormDescriptor` method. 
  
  To work around this, we need to create a servlet and invoke the `GoCardlessPlugin#buildFormDescriptor` method from this servlet. The client application needs to invoke this servlet and not the `PaymentGatewayApi#buildFormDescriptor` method.
  
  This servlet is implemented as follows (see https://github.com/killbill/killbill-gocardless-example-plugin/blob/9522498ecde5849c940574c598ceb5ce088d32a7/src/main/java/org/killbill/billing/plugin/gocardless/GoCardlessCheckoutServlet.java[`GoCardlessCheckoutServlet`]):
  
  [source,java,linenums]
  ----
  