📄 usps.php
字号:
/**
* Build array of keys used for installing/managing this module
*
* @return array
*/
function keys() {
return array('MODULE_SHIPPING_USPS_STATUS', 'MODULE_SHIPPING_USPS_USERID', 'MODULE_SHIPPING_USPS_PASSWORD', 'MODULE_SHIPPING_USPS_SERVER', 'MODULE_SHIPPING_USPS_HANDLING', 'MODULE_SHIPPING_USPS_TAX_CLASS', 'MODULE_SHIPPING_USPS_TAX_BASIS', 'MODULE_SHIPPING_USPS_ZONE', 'MODULE_SHIPPING_USPS_SORT_ORDER', 'MODULE_SHIPPING_USPS_MACHINABLE', 'MODULE_SHIPPING_USPS_OPTIONS', 'MODULE_SHIPPING_USPS_TYPES', 'MODULE_SHIPPING_USPS_TYPES_INTL');
// return array('MODULE_SHIPPING_USPS_STATUS', 'MODULE_SHIPPING_USPS_USERID', 'MODULE_SHIPPING_USPS_PASSWORD', 'MODULE_SHIPPING_USPS_SERVER', 'MODULE_SHIPPING_USPS_HANDLING', 'MODULE_SHIPPING_USPS_TAX_CLASS', 'MODULE_SHIPPING_USPS_ZONE', 'MODULE_SHIPPING_USPS_SORT_ORDER', 'MODULE_SHIPPING_USPS_OPTIONS', 'MODULE_SHIPPING_USPS_TYPES', 'MODULE_SHIPPING_USPS_TYPES_INTL');
}
/**
* Set USPS service mode
*
* @param string $service
*/
function _setService($service) {
$this->service = $service;
}
/**
* Set USPS weight for quotation collection
*
* @param integer $pounds
* @param integer $ounces
*/
function _setWeight($pounds, $ounces=0) {
$this->pounds = $pounds;
$this->ounces = $ounces;
}
/**
* Set USPS container type
*
* @param string $container
*/
function _setContainer($container) {
$this->container = $container;
}
/**
* Set USPS package size
*
* @param integer $size
*/
function _setSize($size) {
$this->size = $size;
}
/**
* Set USPS machinable flag
*
* @param boolean $machinable
*/
function _setMachinable($machinable) {
$this->machinable = $machinable;
}
/**
* Get actual quote from USPS
*
* @return array of results or boolean false if no results
*/
function _getQuote() {
// BOF: UPS USPS
global $order, $transittime;
if(in_array('Display transit time', explode(', ', MODULE_SHIPPING_USPS_OPTIONS))) $transit = TRUE;
// EOF: UPS USPS
if ($order->delivery['country']['id'] == SHIPPING_ORIGIN_COUNTRY) {
$request = '<RateRequest USERID="' . MODULE_SHIPPING_USPS_USERID . '" PASSWORD="' . MODULE_SHIPPING_USPS_PASSWORD . '">';
$services_count = 0;
if (isset($this->service)) {
$this->types = array($this->service => $this->types[$this->service]);
}
$dest_zip = str_replace(' ', '', $order->delivery['postcode']);
if ($order->delivery['country']['iso_code_2'] == 'US') $dest_zip = substr($dest_zip, 0, 5);
reset($this->types);
// BOF: UPS USPS
$allowed_types = explode(", ", MODULE_SHIPPING_USPS_TYPES);
while (list($key, $value) = each($this->types)) {
// BOF: UPS USPS
if ( !in_array($key, $allowed_types) ) continue;
$request .= '<Package ID="' . $services_count . '">' .
'<Service>' . $key . '</Service>' .
'<ZipOrigination>' . SHIPPING_ORIGIN_ZIP . '</ZipOrigination>' .
'<ZipDestination>' . $dest_zip . '</ZipDestination>' .
'<Pounds>' . $this->pounds . '</Pounds>' .
'<Ounces>' . $this->ounces . '</Ounces>' .
'<Container>' . $this->container . '</Container>' .
'<Size>' . $this->size . '</Size>' .
'<Machinable>' . $this->machinable . '</Machinable>' .
'</Package>';
// BOF: UPS USPS
if($transit){
$transitreq = 'USERID="' . MODULE_SHIPPING_USPS_USERID .
'" PASSWORD="' . MODULE_SHIPPING_USPS_PASSWORD . '">' .
'<OriginZip>' . STORE_ORIGIN_ZIP . '</OriginZip>' .
'<DestinationZip>' . $dest_zip . '</DestinationZip>';
switch ($key) {
case 'Express': $transreq[$key] = 'API=ExpressMail&XML=' .
urlencode( '<ExpressMailRequest ' . $transitreq . '</ExpressMailRequest>');
break;
case 'Priority': $transreq[$key] = 'API=PriorityMail&XML=' .
urlencode( '<PriorityMailRequest ' . $transitreq . '</PriorityMailRequest>');
break;
case 'Parcel': $transreq[$key] = 'API=StandardB&XML=' .
urlencode( '<StandardBRequest ' . $transitreq . '</StandardBRequest>');
break;
default: $transreq[$key] = '';
break;
}
}
// EOF: UPS USPS
$services_count++;
}
$request .= '</RateRequest>';
$request = 'API=Rate&XML=' . urlencode($request);
} else {
$request = '<IntlRateRequest USERID="' . MODULE_SHIPPING_USPS_USERID . '" PASSWORD="' . MODULE_SHIPPING_USPS_PASSWORD . '">' .
'<Package ID="0">' .
'<Pounds>' . $this->pounds . '</Pounds>' .
'<Ounces>' . $this->ounces . '</Ounces>' .
'<MailType>Package</MailType>' .
'<Country>' . $this->countries[$order->delivery['country']['iso_code_2']] . '</Country>' .
'</Package>' .
'</IntlRateRequest>';
$request = 'API=IntlRate&XML=' . urlencode($request);
}
switch (MODULE_SHIPPING_USPS_SERVER) {
case 'production':
$usps_server = 'production.shippingapis.com';
$api_dll = 'shippingapi.dll';
break;
case 'test':
default:
$usps_server = 'testing.shippingapis.com';
$api_dll = 'ShippingAPITest.dll';
break;
}
$body = '';
$http = new httpClient();
if ($http->Connect($usps_server, 80)) {
$http->addHeader('Host', $usps_server);
$http->addHeader('User-Agent', 'Zen Cart');
$http->addHeader('Connection', 'Close');
if ($http->Get('/' . $api_dll . '?' . $request)) $body = $http->getBody();
// BOF: UPS USPS
// mail('you@yourdomain.com','USPS rate quote response',$body,'From: <you@yourdomain.com>');
if ($transit && is_array($transreq) && ($order->delivery['country']['id'] == STORE_COUNTRY)) {
while (list($key, $value) = each($transreq)) {
if ($http->Get('/' . $api_dll . '?' . $value)) $transresp[$key] = $http->getBody();
}
}
// EOF: UPS USPS
$http->Disconnect();
} else {
return -1;
}
$response = array();
while (true) {
if ($start = strpos($body, '<Package ID=')) {
$body = substr($body, $start);
$end = strpos($body, '</Package>');
$response[] = substr($body, 0, $end+10);
$body = substr($body, $end+9);
} else {
break;
}
}
$rates = array();
if ($order->delivery['country']['id'] == SHIPPING_ORIGIN_COUNTRY) {
if (sizeof($response) == '1') {
if (ereg('<Error>', $response[0])) {
$number = ereg('<Number>(.*)</Number>', $response[0], $regs);
$number = $regs[1];
$description = ereg('<Description>(.*)</Description>', $response[0], $regs);
$description = $regs[1];
return array('error' => $number . ' - ' . $description);
}
}
$n = sizeof($response);
for ($i=0; $i<$n; $i++) {
if (strpos($response[$i], '<Postage>')) {
$service = ereg('<Service>(.*)</Service>', $response[$i], $regs);
$service = $regs[1];
$postage = ereg('<Postage>(.*)</Postage>', $response[$i], $regs);
$postage = $regs[1];
$rates[] = array($service => $postage);
// BOF: UPS USPS
if ($transit) {
switch ($service) {
case 'Express': $time = ereg('<MonFriCommitment>(.*)</MonFriCommitment>', $transresp[$service], $tregs);
$time = $tregs[1];
if ($time == '' || $time == 'No Data') {
$time = '1 - 2 ' . MODULE_SHIPPING_USPS_TEXT_DAYS;
} else {
$time = 'Tomorrow by ' . $time;
}
break;
case 'Priority': $time = ereg('<Days>(.*)</Days>', $transresp[$service], $tregs);
$time = $tregs[1];
if ($time == '' || $time == 'No Data') {
$time = '2 - 3 ' . MODULE_SHIPPING_USPS_TEXT_DAYS;
} elseif ($time == '1') {
$time .= ' ' . MODULE_SHIPPING_USPS_TEXT_DAY;
} else {
$time .= ' ' . MODULE_SHIPPING_USPS_TEXT_DAYS;
}
break;
case 'Parcel': $time = ereg('<Days>(.*)</Days>', $transresp[$service], $tregs);
$time = $tregs[1];
if ($time == '' || $time == 'No Data') {
$time = '4 - 7 ' . MODULE_SHIPPING_USPS_TEXT_DAYS;
} elseif ($time == '1') {
$time .= ' ' . MODULE_SHIPPING_USPS_TEXT_DAY;
} else {
$time .= ' ' . MODULE_SHIPPING_USPS_TEXT_DAYS;
}
break;
case 'First Class': $time = '2 - 5 ' . MODULE_SHIPPING_USPS_TEXT_DAYS;
break;
default: $time = '';
break;
}
if ($time != '') $transittime[$service] = ' (' . $time . ')';
}
// EOF: UPS USPS
}
}
} else {
if (ereg('<Error>', $response[0])) {
$number = ereg('<Number>(.*)</Number>', $response[0], $regs);
$number = $regs[1];
$description = ereg('<Description>(.*)</Description>', $response[0], $regs);
$description = $regs[1];
return array('error' => $number . ' - ' . $description);
} else {
$body = $response[0];
$services = array();
while (true) {
if ($start = strpos($body, '<Service ID=')) {
$body = substr($body, $start);
$end = strpos($body, '</Service>');
$services[] = substr($body, 0, $end+10);
$body = substr($body, $end+9);
} else {
break;
}
}
// BOF: UPS USPS
$allowed_types = array();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -