Как получить прогресс доставки UPS через их API?
Я нашел в Интернете пару классов PHP, использующих API отслеживания UPS, но проблема в том, что я не получаю весь маршрут... Я получаю только статус (говоря, был ли он уже доставлен или нет - вместе с много больше информации, которая мне не нужна для того, что я делаю).
Я знаю, что это возможно, потому что я вижу много сайтов, делающих это все время, таких как этот:
http://www.packagetrackr.com/track/1Z0766Y54242241130
(Не говоря уже о eBay, Amazon и т. Д.).
Я снова использую API отслеживания UPS со следующим URL: https://www.ups.com/ups.app/xml/Track (вместе с полезными данными XML и т. Д.)
Спасибо.
3 ответа
Там нет стандартного способа получения статуй, вам придется проанализировать сайт UPS
<?php
class upstraking
{
function upstrack($trackingno,$account_data)
{
$trackingno='1Z12345E1512345676';
$data ="<?xml version=\"1.0\"?>
<AccessRequest xml:lang='en-US'>
<AccessLicenseNumber>".$account_data['access_lic_no']."</AccessLicenseNumber>
<UserId>".$account_data['username']."</UserId>
<Password>".$account_data['password']."</Password>
</AccessRequest>
<?xml version=\"1.0\"?>
<TrackRequest>
<Request>
<TransactionReference>
<CustomerContext>
<InternalKey>blah</InternalKey>
</CustomerContext>
<XpciVersion>1.0</XpciVersion>
</TransactionReference>
<RequestAction>Track</RequestAction>
</Request>
<TrackingNumber>$trackingno</TrackingNumber>
</TrackRequest>";
$ch = curl_init("https://www.ups.com/ups.app/xml/Track");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_TIMEOUT, 60);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$result=curl_exec ($ch);
// echo '<!-- '. $result. ' -->';
$data = strstr($result, '<?');
$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $data, $vals, $index);
xml_parser_free($xml_parser);
$params = array();
$level = array();
#print_r($vals);#die();
foreach ($vals as $xml_elem) {
if ($xml_elem['type'] == 'open') {
if (array_key_exists('attributes',$xml_elem)) {
list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
} else {
$level[$xml_elem['level']] = $xml_elem['tag'];
}
}
if ($xml_elem['type'] == 'complete') {
if(isset($xml_elem['value']) && $xml_elem['value'] != '') {
$start_level = 1;
$php_stmt = '$params';
while($start_level < $xml_elem['level']) {
$php_stmt .= '[$level['.$start_level.']]';
$start_level++;
}
$php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
eval($php_stmt);
}
}
}
curl_close($ch);
//return $params;
print_r($params); // this array will return full information of tracking
//die();
$table = "";
$table .= "<table class='pure-table pure-table-horizontal' border='1'>";
$table .= "<th>PIN</th>";
$table .= "<th>Date</th>";
$table .= "<th>Description</th>";
$table .= "<th>Address</th>";
//$table .= "<th>Signatory Name</th>";
//$table .= "<th>Event Type</th>";
$table .= "</tr>";
if($params['TRACKRESPONSE']['RESPONSE']['RESPONSESTATUSDESCRIPTION']=='Success')
{
$shipment=$params['TRACKRESPONSE']['SHIPMENT'];
$address_arr=$shipment['PACKAGE']['ACTIVITY']['ACTIVITYLOCATION']['ADDRESS'];
$address=$address_arr['CITY'].', '.$address_arr['STATEPROVINCECODE'].', '.$address_arr['COUNTRYCODE'];
$table .= "<tr>";
$table .= "<td>".$shipment['PACKAGE']['TRACKINGNUMBER']."</td>";
$table .= "<td>".$shipment['PACKAGE']['ACTIVITY']['DATE'] . "</td>";
$table .= "<td>".$shipment['PACKAGE']['ACTIVITY']['STATUS']['STATUSTYPE']['DESCRIPTION'] . "</td>";
$table .= "<td>".$address."</td>";
$table .= "</tr>";
}
$table .= "</table>";
echo $table;
}
}
$obj_upstraking = new upstraking();
$account_data = array();
$account_data['access_lic_no']='accesskey';
$account_data['username']='upsusername';
$account_data['password']='password';
$obj_upstraking->upstrack($trackingno='1Z12345E1512345676',$account_data);
Я написал следующее, чтобы построчно отображать статус UPS для наших клиентов на нашем сайте.
$tracking_url = 'http://wwwapps.ups.com/WebTracking/track?track=yes&trackNums='.$insert_tracking_number_here;
include('simple_html_dom.php');
$html = file_get_html($tracking_url);
foreach($html->find('th') as $e)
$e->outertext = '';
$html->save();
$method = $html->find('a.service', 0)->innertext;
echo 'Your Order #: '.$ordernumber.' was shipped on '.$shipdate.' via '.$method.'.<P></P>';
$delivery_check = $html->find('dt', 0)->innertext;
$is_delivered = strpos($delivery_check, 'Delivered On');
$delivery = $html->find('dd', 8)->innertext;
if ($is_delivered===false) {
echo '<b>Scheduled delivery: '.$delivery.'.</b><P></P>';
} else {
echo '<b>Delivered on: '.$delivery.'</b><P></P>';
}
echo 'Below is the current information for tracking number '.$tracking.'.<P></P><br>'; ?>
<table border="0"><tr><td colspan="6"><hr></td></tr>
<tr>
<td class="text10b" width="230">LOCATION</td>
<td class="text10b" width="80">DATE</td>
<td class="text10b" width="100">LOCAL TIME</td>
<td class="text10b" width="230">ACTIVITY</td>
</tr>
<tr><td colspan="6"><hr></td></tr>
<?php foreach($html->find('table.dataTable') as $service) echo $service->innertext;?>
<tr><td colspan="6"><hr></td></tr></table>