Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.216.251.37] |
|
Сообщ.
#1
,
|
|
|
Прошу помочь в вопросе реализации взаимодействия с сервисом UPS.
Облазил весь гугл, но конкретных примеров реализации раз два и обчёлся( И то, только на банальную регистрацию посылки. Может кто-то делал подобные взаимодействия и не жалко было бы поделиться реализацией? Был бы очень признателен. Вообще интересуют всего 2 функции: получение UPS Label по трек-номеру и регистрация pickup сервиса (тут вообще глухо как в танке, я даже не могу понять это отдельная функция или дополнительная к регистрации посылки). |
Сообщ.
#2
,
|
|
|
В общем решилось (3 дня плотных e-mail переписок с UPS не прошли даром)
Вот какая реализация вышла, может кому и пригодиться в итоге. Писал на симфони, поэтому просто кидаю как есть код сервиса: <?php namespace AppBundle\Services; use AppBundle\Entity\ShipmentGroup; use SoapHeader; use Symfony\Component\Security\Core\SecurityContext; use AppBundle\Entity\Shipment; use UserBundle\Entity\User; /** * Class APIService * @package AppBundle\Services */ class APIService { // UPS ACCESS Configuration const UPS_ACCESS = xxx; const UPS_USERID = yyy; const UPS_PASSWD = zzz; const UPS_SHIPPER_NUM = ololo; const UPS_WSDL_PICKUP = __DIR__.'/../../../src/AppBundle/Resources/public/Pickup.wsdl'; const UPS_OPERATION_CREATE_PICKUP = "ProcessPickupCreation"; const UPS_TEST_PICKUP_ENDPOINT_URL = 'https://wwwcie.ups.com/webservices/Pickup'; const UPS_PROD_PICKUP_ENDPOINT_URL = 'https://onlinetools.ups.com/webservices/Pickup'; /** @var User $user */ private $user; public function __construct(SecurityContext $sc) { $this->user = $sc->getToken()->getUser(); } public function upsCreatePickup(Shipment $shipment){ //create soap request $requestoption['RequestOption'] = '1'; // not used $request['Request'] = $requestoption; $request['RatePickupIndicator'] = 'N'; // calculate rate cost - Y / N $account['AccountNumber']= self::UPS_SHIPPER_NUM; // from UPS account control panel $account['AccountCountryCode'] = 'CA'; // from UPS account control panel $shipper['Account'] = $account; $request['Shipper'] = $shipper; $pickupdateinfo['CloseTime'] = $shipment->getWaitingDate()->getEndtime()->format('hi'); // HHMM $pickupdateinfo['ReadyTime'] = $shipment->getWaitingDate()->getStarttime()->format('hi'); // HHMM $pickupdateinfo['PickupDate'] = $shipment->getWaitingDate()->getDate()->format('Ymd'); // YYYYMMDD $request['PickupDateInfo'] = $pickupdateinfo; $pickupaddress['CompanyName'] = ''; $pickupaddress['ContactName'] = $shipment->getOwner()->getName() ; $pickupaddress['AddressLine'] = $shipment->getOwner()->getAddress()->getFullAddress(); $pickupaddress['Room'] = ''; $pickupaddress['Floor'] = ''; $pickupaddress['City'] = $shipment->getOwner()->getAddress()->getCity(); //'Allendale'; $pickupaddress['StateProvince'] = 'NJ'; $pickupaddress['Urbanization'] = ''; $pickupaddress['PostalCode'] = $shipment->getOwner()->getAddress()->getZipCode(); $pickupaddress['CountryCode'] = $shipment->getOwner()->getAddress()->getCountry()->getCountry()->getCountryCode(); $pickupaddress['ResidentialIndicator'] = 'Y'; // Pickup address is not in the forest $pickupaddress['PickupPoint'] = ''; //'Lobby'; // ? $phone['Number'] = $shipment->getOwner()->getPhone()->getCountryCode().$shipment->getOwner()->getPhone()->getNationalNumber(); $phone['Extension'] = ''; // ? $pickupaddress['Phone'] = $phone; $request['PickupAddress'] = $pickupaddress; $request['AlternateAddressIndicator'] = 'N'; // N $pickuppiece['ServiceCode'] = '011'; // Delivery Service Code $pickuppiece['Quantity'] = '1'; $pickuppiece['DestinationCountryCode'] = $shipment->getRecipientCountry()->getCountry()->getCountryCode(); $pickuppiece['ContainerCode'] = '01'; // 01 = PACKAGE, 02 = UPS LETTER, 03 = PALLET $request['PickupPiece'] = $pickuppiece; $totalweight['Weight'] = $shipment->getWeight(); $totalweight['UnitOfMeasurement'] = 'KGS'; // LBS = Pounds / KGS = Kilograms $request['TotalWeight'] = $totalweight; $request['OverweightIndicator'] = 'N'; // is package weight > 32 kgs $request['PaymentMethod'] = '01'; $request['SpecialInstruction'] = ''; // additional information to UPS $request['ReferenceNumber'] = ''; $cnfrmemailaddr = array ( 'jdoe@ups.com', 'edoe@ups.com' ); $notification['ConfirmationEmailAddress'] = $cnfrmemailaddr; $notification['UndeliverableEmailAddress'] = ''; $request['Notification'] = $notification; try { $mode = array ( 'soap_version' => 'SOAP_1_1', // use soap 1.1 client 'trace' => 1 ); // initialize soap client $client = new \SoapClient(self::UPS_WSDL_PICKUP , $mode); //set endpoint url if ($this->user->isTestAccount()){ $client->__setLocation(self::UPS_TEST_PICKUP_ENDPOINT_URL); }else{ $client->__setLocation(self::UPS_PROD_PICKUP_ENDPOINT_URL); } //create soap header $usernameToken['Username'] = self::UPS_USERID; $usernameToken['Password'] = self::UPS_PASSWD; $serviceAccessLicense['AccessLicenseNumber'] = self::UPS_ACCESS; $upss['UsernameToken'] = $usernameToken; $upss['ServiceAccessToken'] = $serviceAccessLicense; $header = new SoapHeader('http://www.ups.com/XMLSchema/XOLTWS/UPSS/v1.0','UPSSecurity',$upss); $client->__setSoapHeaders($header); $resp = $client->__soapCall('ProcessPickupCreation',array($request)); return true; } catch(\SoapFault $fault) { $error = [ 'code'=>$fault->faultcode, 'description'=>$fault->faultstring, 'details' => $fault->detail, ]; return false; } } } Осталось для LabelRecovery еще... |