Actually, I think I figured it out. First I changed <SERVICE> to ONLINE from ALL. Then I output the xml that the usps api response, and saw that most types had something called rate and something called commercialrate. I added an exclusion for standard post, which doesn't have a commercial rate, and changed the getElementsByTagName('Rate') to getElementsByTagName('CommercialRate'). New code of my usps.php starts at line your line 315 in the products/catalog/model/shipping.
Code: Select all
if ($status) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'production.shippingapis.com/ShippingAPI.dll?' . $request);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
// strip reg, trade and ** out 01-02-2011
$result = str_replace('<sup>&reg;</sup>', '', $result);
$result = str_replace('<sup>&trade;</sup>', '', $result);
$result = str_replace('**', '', $result);
$result = str_replace("\r\n", '', $result);
$result = str_replace('\"', '"', $result);
if ($result) {
if ($this->config->get('usps_debug')) {
$this->log->write("USPS DATA SENT: " . urldecode($request));
$this->log->write("USPS DATA RECV: " . $result);
//echo "$result";
}
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadXml($result);
$rate_response = $dom->getElementsByTagName('RateV4Response')->item(0);
$intl_rate_response = $dom->getElementsByTagName('IntlRateV2Response')->item(0);
$error = $dom->getElementsByTagName('Error')->item(0);
$firstclasses = array (
'First-Class Mail Package',
'First-Class Mail Large Envelope',
'First-Class Mail Letter',
'First-Class Mail Postcards'
);
if ($rate_response || $intl_rate_response) {
if ($address['iso_code_2'] == 'US') {
$allowed = array(0, 1, 2, 3, 4, 5, 6, 7, 12, 13, 16, 17, 18, 19, 22, 23, 25, 27, 28);
$package = $rate_response->getElementsByTagName('Package')->item(0);
$postages = $package->getElementsByTagName('Postage');
if ($postages->length) {
foreach ($postages as $postage) {
$classid = $postage->getAttribute('CLASSID');
if (in_array($classid, $allowed)) {
if ($classid == "0") {
$mailservice = $postage->getElementsByTagName('MailService')->item(0)->nodeValue;
foreach ($firstclasses as $k => $firstclass) {
if ($firstclass == $mailservice) {
$classid = $classid . $k;
break;
}
}
if (($this->config->get('usps_domestic_' . $classid))) {
$cost = $postage->getElementsByTagName('CommercialRate')->item(0)->nodeValue;
$quote_data[$classid] = array(
'code' => 'usps.' . $classid,
'title' => $postage->getElementsByTagName('MailService')->item(0)->nodeValue,
'cost' => $this->currency->convert($cost, 'USD', $this->config->get('config_currency')),
'tax_class_id' => $this->config->get('usps_tax_class_id'),
'text' => $this->currency->format($this->tax->calculate($this->currency->convert($cost, 'USD', $this->currency->getCode()), $this->config->get('usps_tax_class_id'), $this->config->get('config_tax')))
);
}
} elseif ($classid == "4") {
$cost = $postage->getElementsByTagName('Rate')->item(0)->nodeValue;
$quote_data[$classid] = array(
'code' => 'usps.' . $classid,
'title' => $postage->getElementsByTagName('MailService')->item(0)->nodeValue,
'cost' => $this->currency->convert($cost, 'USD', $this->config->get('config_currency')),
'tax_class_id' => $this->config->get('usps_tax_class_id'),
'text' => $this->currency->format($this->tax->calculate($this->currency->convert($cost, 'USD', $this->currency->getCode()), $this->config->get('usps_tax_class_id'), $this->config->get('config_tax')))
);
} elseif ($this->config->get('usps_domestic_' . $classid)) {
$cost = $postage->getElementsByTagName('CommercialRate')->item(0)->nodeValue;
$quote_data[$classid] = array(
'code' => 'usps.' . $classid,
'title' => $postage->getElementsByTagName('MailService')->item(0)->nodeValue,
'cost' => $this->currency->convert($cost, 'USD', $this->config->get('config_currency')),
'tax_class_id' => $this->config->get('usps_tax_class_id'),
'text' => $this->currency->format($this->tax->calculate($this->currency->convert($cost, 'USD', $this->currency->getCode()), $this->config->get('usps_tax_class_id'), $this->config->get('config_tax')))
);
}
}
}
} else {
$error = $package->getElementsByTagName('Error')->item(0);
$method_data = array(
'id' => 'usps',
'title' => $this->language->get('text_title'),
'quote' => $quote_data,
'sort_order' => $this->config->get('usps_sort_order'),
'error' => $error->getElementsByTagName('Description')->item(0)->nodeValue
);
}
} else {
$allowed = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 21);
$package = $intl_rate_response->getElementsByTagName('Package')->item(0);
$services = $package->getElementsByTagName('Service');
foreach ($services as $service) {
$id = $service->getAttribute('ID');
if (in_array($id, $allowed) && $this->config->get('usps_international_' . $id)) {
$title = $service->getElementsByTagName('SvcDescription')->item(0)->nodeValue;
if ($this->config->get('usps_display_time')) {
$title .= ' (' . $this->language->get('text_eta') . ' ' . $service->getElementsByTagName('SvcCommitments')->item(0)->nodeValue . ')';
}
$cost = $service->getElementsByTagName('Postage')->item(0)->nodeValue;
$quote_data[$id] = array(
'code' => 'usps.' . $id,
'title' => $title,
'cost' => $this->currency->convert($cost, 'USD', $this->config->get('config_currency')),
'tax_class_id' => $this->config->get('usps_tax_class_id'),
'text' => $this->currency->format($this->tax->calculate($this->currency->convert($cost, 'USD', $this->currency->getCode()), $this->config->get('usps_tax_class_id'), $this->config->get('config_tax')))
);
}
}
}
} elseif ($error) {
$method_data = array(
'code' => 'usps',
'title' => $this->language->get('text_title'),
'quote' => $quote_data,
'sort_order' => $this->config->get('usps_sort_order'),
'error' => $error->getElementsByTagName('Description')->item(0)->nodeValue
);
}
}
}
if ($quote_data) {
$title = $this->language->get('text_title');
if ($this->config->get('usps_display_weight')) {
$title .= ' (' . $this->language->get('text_weight') . ' ' . $this->weight->format($weight, $this->config->get('usps_weight_class_id')) . ')';
}
function comparecost ($a, $b) {
return $a['cost'] > $b['cost'];
}
uasort($quote_data, 'comparecost');
$method_data = array(
'code' => 'usps',
'title' => $title,
'quote' => $quote_data,
'sort_order' => $this->config->get('usps_sort_order'),
'error' => false
);
}
}
return $method_data;
}
}
?>