На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Serafim, fatalist
  
    > United Parcel Service (UPS) API , кто нибудь сталкивался
      Прошу помочь в вопросе реализации взаимодействия с сервисом UPS.
      Облазил весь гугл, но конкретных примеров реализации раз два и обчёлся( И то, только на банальную регистрацию посылки.
      Может кто-то делал подобные взаимодействия и не жалко было бы поделиться реализацией? Был бы очень признателен.
      Вообще интересуют всего 2 функции: получение UPS Label по трек-номеру и регистрация pickup сервиса (тут вообще глухо как в танке, я даже не могу понять это отдельная функция или дополнительная к регистрации посылки).
        В общем решилось (3 дня плотных e-mail переписок с UPS не прошли даром)

        Вот какая реализация вышла, может кому и пригодиться в итоге. Писал на симфони, поэтому просто кидаю как есть код сервиса:

        ExpandedWrap disabled
          <?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 еще...
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0235 ]   [ 15 queries used ]   [ Generated: 2.05.24, 17:43 GMT ]