private Object sendMessage(
      CreditCard creditCard, Money amount, Money tax, InetAddress userIp, boolean verify)
      throws IOException, CommerceException {
    URL url = new URL(configuration.getString("jcatapult.commerce.aim.url"));
    String username = configuration.getString("jcatapult.commerce.aim.username");
    String password = configuration.getString("jcatapult.commerce.aim.password");
    if (logger.isLoggable(Level.FINEST)) {
      logger.finest("Contacting AIM with this info");
      logger.finest("URL: " + url.toExternalForm());
      logger.finest("Username: "******"Password: "******"x_version=3.1&");
    build.append("x_delim_data=TRUE&");
    build.append("x_relay_response=FALSE&");
    build.append("x_login="******"&");
    build.append("x_tran_key=").append(password).append("&");
    build.append("x_method=CC&");
    build.append("x_delim_char=|&");

    if (verify) {
      build.append("x_type=AUTH_ONLY&");
    } else {
      build.append("x_type=AUTH_CAPTURE&");
    }

    if (configuration.getBoolean("jcatapult.commerce.aim.test")) {
      build.append("x_test_request=TRUE&");
    }

    if (!creditCard.isVerified()) {
      build.append("x_card_code=").append(creditCard.getSvn()).append("&");
      build.append("x_first_name=").append(creditCard.getFirstName()).append("&");
      build.append("x_last_name=").append(creditCard.getLastName()).append("&");
      build.append("x_address=").append(creditCard.getAddress().getStreet1()).append("&");
      build.append("x_city=").append(creditCard.getAddress().getCity()).append("&");
      build.append("x_state=").append(creditCard.getAddress().getState()).append("&");
      build.append("x_zip=").append(creditCard.getAddress().getPostalCode()).append("&");
      build.append("x_country=").append(creditCard.getAddress().getCountry()).append("&");
      build.append("x_customer_ip=").append(userIp.toString()).append("&");
    }

    if (tax != null) {
      build.append("x_tax=").append(tax.toString()).append("&");
    }

    build.append("x_amount=").append(amount.toString()).append("&");
    build.append("x_currency_code=").append(amount.getCurrency().getCurrencyCode()).append("&");
    build.append("x_card_num=").append(creditCard.getNumber()).append("&");
    build.append("x_exp_date=").append(creditCard.getExpirationDate());

    huc.setConnectTimeout(
        configuration.getInt("jcatapult.commerce.aim.connectTimeoutSeconds", 60) * 1000);
    huc.setReadTimeout(
        configuration.getInt("jcatapult.commerce.aim.readTimeoutSeconds", 180) * 1000);
    huc.setUseCaches(false);
    huc.setDoInput(true);
    huc.setDoOutput(true);
    huc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    huc.connect();

    OutputStream os = huc.getOutputStream();
    os.write(build.toString().getBytes());
    os.flush();
    os.close();

    BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream()));
    String response = br.readLine();
    br.close();

    // logger.finest("Response from AIM is [" + response + "]");

    String[] parts = split(response);
    if (parts.length < 39) {
      throw new CommerceException("Invalid response from the Gateway.");
    }

    int responseCode = Integer.valueOf(parts[0]);
    String transactionID = null;
    CommerceError error = null;
    if (responseCode == 1) {
      transactionID = parts[6];
    } else {
      error = getError(parts[0], parts[2], parts[3], parts[4], parts[5]);
    }

    if (verify) {
      return new VerifyResult(error);
    }

    return new ChargeResult(transactionID, error, parts[0], parts[2], parts[3], parts[4], parts[5]);
  }