package com.softwaremill.common.paypal.button;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* The class takes cart items and generates paypal button/form that is used on the webpage
*/
public class PaypalButtonGenerator {
private String sellerPaypalEmail;
private boolean isSandbox;
private String currency;
private String defaultShipping = "0.0";
private String defaultTax = "0.0";
private String paypalButtonLabel = "Pay with PayPal";
private String paypalButtonImage = null;
private String invoiceNumber = null;
private String notifyUrl = null;
private String goBackLink;
private String goBackCancelLink;
private List<PaypalCartItem> cartItems = new ArrayList<PaypalCartItem>();
public PaypalButtonGenerator(String sellerPaypalEmail, String goBackLink, String goBackCancelLink) {
this(sellerPaypalEmail, goBackLink, goBackCancelLink, false, "USD");
}
public PaypalButtonGenerator(String sellerPaypalEmail, String goBackLink, String goBackCancelLink,
boolean sandbox, String currency) {
this.sellerPaypalEmail = sellerPaypalEmail;
isSandbox = sandbox;
this.currency = currency;
this.goBackLink = goBackLink;
this.goBackCancelLink = goBackCancelLink;
}
public PaypalButtonGenerator withDefaultShipping(String defaultShipping) {
this.defaultShipping = defaultShipping;
return this;
}
public PaypalButtonGenerator withDefaultTax(String defaultTax) {
this.defaultTax = defaultTax;
return this;
}
public PaypalButtonGenerator withPaypalButtonLabel(String paypalButtonLabel) {
this.paypalButtonLabel = paypalButtonLabel;
return this;
}
public PaypalButtonGenerator withCurrency(String currency) {
this.currency = currency;
return this;
}
public PaypalButtonGenerator withSubmitImage(String imageSrc) {
paypalButtonImage = imageSrc;
return this;
}
public PaypalButtonGenerator withInvoiceNumber(String invoiceNumber) {
this.invoiceNumber = invoiceNumber;
return this;
}
public PaypalButtonGenerator withNotifyUrl(String notifyUrl) {
this.notifyUrl = notifyUrl;
return this;
}
public PaypalButtonGenerator addItem(String name, String amount, String shipping, String tax) {
cartItems.add(new PaypalCartItem(name, amount, shipping, tax));
return this;
}
public PaypalButtonGenerator addItemWithTax(String name, String amount, String tax) {
cartItems.add(new PaypalCartItem(name, amount, defaultShipping, tax));
return this;
}
public PaypalButtonGenerator addItemWithShipping(String name, String amount, String shipping) {
cartItems.add(new PaypalCartItem(name, amount, shipping, defaultTax));
return this;
}
public PaypalButtonGenerator addItem(String name, String amount) {
cartItems.add(new PaypalCartItem(name, amount, defaultShipping, defaultTax));
return this;
}
public PaypalButtonGenerator addItems(PaypalCartItem... items) {
cartItems.addAll(Arrays.asList(items));
return this;
}
public String build() {
StringBuffer sb = new StringBuffer();
if (cartItems.isEmpty()) {
// there's nothing to pay for, return disabled button
sb.append("<form><input type='submit' value='")
.append(paypalButtonLabel)
.append("' disabled='true'/></form>\n");
}
// start with the form header
sb.append("<form action=\"https://www.");
if (isSandbox) {
sb.append("sandbox.");
}
sb.append("paypal.com/cgi-bin/webscr\" method=\"post\">\n");
// cart command so paypal knows what is it
sb.append("\t<input type=\"hidden\" name=\"cmd\" value=\"_cart\"/>\n");
sb.append("\t<input type=\"hidden\" name=\"upload\" value=\"1\"/>\n");
// where should the user be taken after clicking continue shopping
sb.append("\t<input type=\"hidden\" name=\"return\" value=\"").append(goBackLink).append("\"/>\n");
sb.append("\t<input type=\"hidden\" name=\"cancel_return\" value=\"").append(goBackCancelLink).append("\"/>\n");
// this will access cancel/return links via get
sb.append("\t<input type=\"hidden\" name=\"rm\" value=\"1\"/>\n");
// our seller email
sb.append("\t<input type=\"hidden\" name=\"business\" value=\"").append(sellerPaypalEmail).append("\"/>\n");
// the currency
sb.append("\t<input type=\"hidden\" name=\"currency_code\" value=\"").append(currency).append("\"/>\n");
// the cart items
for (int i = 1; i <= cartItems.size(); i++) {
PaypalCartItem cartItem = cartItems.get(i - 1);
sb.append("\t<input type=\"hidden\" name=\"item_name_").append(i).append("\" value=\"")
.append(cartItem.getItemName()).append("\"/>\n");
sb.append("\t<input type=\"hidden\" name=\"amount_").append(i).append("\" value=\"")
.append(cartItem.getItemAmount()).append("\"/>\n");
sb.append("\t<input type=\"hidden\" name=\"shipping_").append(i).append("\" value=\"")
.append(cartItem.getItemShippingAmount()).append("\"/>\n");
sb.append("\t<input type=\"hidden\" name=\"tax_").append(i).append("\" value=\"")
.append(cartItem.getItemTaxAmount()).append("\"/>\n");
}
// optional invoice number
if (invoiceNumber != null) {
sb.append("\t<input type=\"hidden\" name=\"invoice\" value=\"")
.append(invoiceNumber).append("\"/>\n");
}
// optional notify url
if (notifyUrl != null) {
sb.append("\t<input type=\"hidden\" name=\"notify_url\" value=\"")
.append(notifyUrl).append("\"/>\n");
}
// add submit button
if (paypalButtonImage != null) {
// use image
sb.append("\t<input type=\"image\" alt=\"").append(paypalButtonLabel)
.append("\" src=\"").append(paypalButtonImage).append("\"/>\n");
}
else {
sb.append("\t<input type=\"submit\" value=\"").append(paypalButtonLabel).append("\"/>\n");
}
// and close the form
sb.append("</form>\n");
return sb.toString();
}
}