public String toXMLString(String prefix, String name) {
   StringBuilder sb = new StringBuilder();
   if (name != null) {
     if (prefix != null) {
       sb.append("<").append(prefix).append(":").append(name).append(">");
     } else {
       sb.append("<").append(preferredPrefix).append(":").append(name).append(">");
     }
   }
   if (owner != null) {
     sb.append(owner.toXMLString(preferredPrefix, "Owner"));
   }
   if (homePhone != null) {
     sb.append("<")
         .append(preferredPrefix)
         .append(":HomePhone>")
         .append(SDKUtil.escapeInvalidXmlCharsRegex(this.homePhone));
     sb.append("</").append(preferredPrefix).append(":HomePhone>");
   }
   if (mobilePhone != null) {
     sb.append("<")
         .append(preferredPrefix)
         .append(":MobilePhone>")
         .append(SDKUtil.escapeInvalidXmlCharsRegex(this.mobilePhone));
     sb.append("</").append(preferredPrefix).append(":MobilePhone>");
   }
   if (sSN != null) {
     sb.append("<")
         .append(preferredPrefix)
         .append(":SSN>")
         .append(SDKUtil.escapeInvalidXmlCharsRegex(this.sSN));
     sb.append("</").append(preferredPrefix).append(":SSN>");
   }
   if (name != null) {
     if (prefix != null) {
       sb.append("</").append(prefix).append(":").append(name).append(">");
     } else {
       sb.append("</").append(preferredPrefix).append(":").append(name).append(">");
     }
   }
   return sb.toString();
 }
  @Override
  public ConfirmCheckoutResponse confirmCheckout(
      final Payment payment, final String notifyUrl, final String token, final String payerId)
      throws FrameworkException {

    try {

      final GetExpressCheckoutDetailsResponseType response =
          PayPalHelper.getExpressCheckoutResponse(token);

      if (AckCodeType.SUCCESS.equals(response.getAck())) {

        // TODO: change currency code
        final GetExpressCheckoutDetailsResponseDetailsType details =
            response.getGetExpressCheckoutDetailsResponseDetails();
        final CurrencyCodeType currencyCode = CurrencyCodeType.fromValue(payment.getCurrencyCode());

        final DoExpressCheckoutPaymentResponseType confirmationResponse =
            PayPalHelper.commitExpressCheckout(
                notifyUrl, currencyCode, payment.getTotal(), token, payerId);

        if (AckCodeType.SUCCESS.equals(confirmationResponse.getAck())) {

          final PayPalConfirmCheckoutResponse checkoutResponse =
              new PayPalConfirmCheckoutResponse(confirmationResponse);
          final DoExpressCheckoutPaymentResponseDetailsType confirmation =
              confirmationResponse.getDoExpressCheckoutPaymentResponseDetails();
          final String billingAgreementId = confirmation.getBillingAgreementID();
          final String note = confirmation.getNote();

          // billing address
          final AddressType billingAddress = details.getBillingAddress();
          if (billingAddress != null) {

            final String billingAddressName = billingAddress.getName();
            final String billingAddressStreet1 = billingAddress.getStreet1();
            final String billingAddressStreet2 = billingAddress.getStreet2();
            final String billingAddressZip = billingAddress.getPostalCode();
            final String billingAddressCity = billingAddress.getCityName();
            final String billingAddressCountry = billingAddress.getCountryName();

            payment.setBillingAddressName(billingAddressName);
            payment.setBillingAddressStreet1(billingAddressStreet1);
            payment.setBillingAddressStreet2(billingAddressStreet2);
            payment.setBillingAddressZip(billingAddressZip);
            payment.setBillingAddressCity(billingAddressCity);
            payment.setBillingAddressCountry(billingAddressCountry);
          }

          // payer info
          final PayerInfoType payerInfo = details.getPayerInfo();
          if (payerInfo != null) {

            payment.setPayer(payerInfo.getPayer());
            payment.setPayerBusiness(payerInfo.getPayerBusiness());

            final AddressType payerAddress = payerInfo.getAddress();
            if (payerAddress != null) {

              payment.setPayerAddressName(payerAddress.getName());
              payment.setPayerAddressStreet1(payerAddress.getStreet1());
              payment.setPayerAddressStreet2(payerAddress.getStreet1());
              payment.setPayerAddressZip(payerAddress.getPostalCode());
              payment.setPayerAddressCity(payerAddress.getCityName());
              payment.setPayerAddressCountry(payerAddress.getCountryName());
            }
          }

          payment.setBillingAgreementId(billingAgreementId);
          payment.setNote(note);
          payment.setInvoiceId(details.getInvoiceID());
          payment.setPaymentState(PaymentState.completed);
          payment.setToken(null);

          // success
          return checkoutResponse;
        }
      }

    } catch (Throwable t) {
      throw new FrameworkException(422, t.getMessage());
    }

    throw new FrameworkException(422, "Unknown error.");
  }