2012-05-30 7 views
0

Le module paypal essaie de mapper les informations de facturation qui sont retournées (généralement rien) à partir de Paypal sur les informations de facturation entrées par l'utilisateur au cours du processus de commande. J'ai aimé le code qui le fait dans le modèle NVP.php. Quelqu'un a-t-il réussi à modifier ce processus pour récupérer des informations de facturation plus complètes?Obtenir l'adresse de facturation complète pour Paypal Express [Magento]

/** 
    * Create billing and shipping addresses basing on response data 
    * @param array $data 
    */ 
    protected function _exportAddressses($data) 
    { 
     $address = new Varien_Object(); 
     Varien_Object_Mapper::accumulateByMap($data, $address, $this->_billingAddressMap); 
     $address->setExportedKeys(array_values($this->_billingAddressMap)); 
     $this->_applyStreetAndRegionWorkarounds($address); 
     $this->setExportedBillingAddress($address); 

     // assume there is shipping address if there is at least one field specific to shipping 
     if (isset($data['SHIPTONAME'])) { 
      $shippingAddress = clone $address; 
      Varien_Object_Mapper::accumulateByMap($data, $shippingAddress, $this->_shippingAddressMap); 
      $this->_applyStreetAndRegionWorkarounds($shippingAddress); 
      // PayPal doesn't provide detailed shipping name fields, so the name will be overwritten 
      $shippingAddress->addData(array(
       'prefix'  => null, 
       'firstname' => $data['SHIPTONAME'], 
       'middlename' => null, 
       'lastname' => null, 
       'suffix'  => null, 
      )); 
      $this->setExportedShippingAddress($shippingAddress); 
     } 
    } 

    /** 
    * Adopt specified address object to be compatible with Magento 
    * 
    * @param Varien_Object $address 
    */ 
    protected function _applyStreetAndRegionWorkarounds(Varien_Object $address) 
    { 
     // merge street addresses into 1 
     if ($address->hasStreet2()) { 
      $address->setStreet(implode("\n", array($address->getStreet(), $address->getStreet2()))); 
      $address->unsStreet2(); 
     } 
     // attempt to fetch region_id from directory 
     if ($address->getCountryId() && $address->getRegion()) { 
      $regions = Mage::getModel('directory/country')->loadByCode($address->getCountryId())->getRegionCollection() 
       ->addRegionCodeFilter($address->getRegion()) 
       ->setPageSize(1) 
      ; 
      foreach ($regions as $region) { 
       $address->setRegionId($region->getId()); 
       $address->setExportedKeys(array_merge($address->getExportedKeys(), array('region_id'))); 
       break; 
      } 
     } 
    } 

Nous devons être en mesure d'envoyer des factures "payantes" aux clients qui payent avec Paypal, nous devons donc saisir cette information.

Répondre

1

J'ai piraté une solution de contournement pour ce problème. Ce n'est pas le moyen le plus propre mais je peux enregistrer les données d'adresse de facturation dans la commande après avoir payé avec PayPal. J'ai passé 2 jours à travailler dessus et à la fin j'ai codé seulement quelques lignes. J'ai marqué ma solution de contournement avec le commentaire # 103.

méthode Override de classe Mage_Paypal_Model_Api_Nvp:

protected function _importAddresses(array $to) 
{ 
    // Original Code 
    //$billingAddress = ($this->getBillingAddress()) ? $this->getBillingAddress() : $this->getAddress(); 
    // Workaround #103 
    if ($this->getBillingAddress()) 
    { 
     $billingAddress = $this->getBillingAddress(); 
    } 
    else 
    { 
     $chkout = Mage::getSingleton('checkout/session'); 
     $quote = $chkout->getQuote(); 
     $billingAddress = $quote->getBillingAddress(); 
     $billingAddress->setData($billingAddress->getOrigData()); 
     $session = Mage::getSingleton("core/session", array("name"=>"frontend")); 
     $session->setData("syn_paypal_original_billing_address", serialize($billingAddress->getOrigData())); 
    } 

    $shippingAddress = $this->getAddress(); 

    $to = Varien_Object_Mapper::accumulateByMap($billingAddress, $to, array_flip($this->_billingAddressMap)); 
    if ($regionCode = $this->_lookupRegionCodeFromAddress($billingAddress)) { 
     $to['STATE'] = $regionCode; 
    } 
    if (!$this->getSuppressShipping()) { 
     $to = Varien_Object_Mapper::accumulateByMap($shippingAddress, $to, array_flip($this->_shippingAddressMap)); 
     if ($regionCode = $this->_lookupRegionCodeFromAddress($shippingAddress)) { 
      $to['SHIPTOSTATE'] = $regionCode; 
     } 
     $this->_importStreetFromAddress($shippingAddress, $to, 'SHIPTOSTREET', 'SHIPTOSTREET2'); 
     $this->_importStreetFromAddress($billingAddress, $to, 'STREET', 'STREET2'); 
     $to['SHIPTONAME'] = $shippingAddress->getName(); 
    } 
    $this->_applyCountryWorkarounds($to); 

    return $to; 
} 

et méthode de remplacement dans Mage_Paypal_Model_Express_Checkout:

public function returnFromPaypal($token) 
{ 
    $this->_getApi(); 
    $this->_api->setToken($token) 
     ->callGetExpressCheckoutDetails(); 

    // import billing address 
    $billingAddress = $this->_quote->getBillingAddress(); 
    $exportedBillingAddress = $this->_api->getExportedBillingAddress(); 

    // Workaround #103 
    $session = Mage::getSingleton("core/session", array("name"=>"frontend")); 
    $dataOrg = unserialize($session->getData("syn_paypal_original_billing_address")); 
    if (true === is_object($billingAddress)) 
    { 
     foreach ($exportedBillingAddress->getExportedKeys() as $key) { 
      if (array_key_exists($key, $dataOrg)) 
      { 
       $billingAddress->setData($key, $dataOrg[$key]); 
      } 
     } 
     $this->_quote->setBillingAddress($billingAddress); 
    } 

    // import shipping address 
    $exportedShippingAddress = $this->_api->getExportedShippingAddress(); 
    if (!$this->_quote->getIsVirtual()) { 
     $shippingAddress = $this->_quote->getShippingAddress(); 
     if ($shippingAddress) { 
      if ($exportedShippingAddress) { 
       foreach ($exportedShippingAddress->getExportedKeys() as $key) { 
        $shippingAddress->setDataUsingMethod($key, $exportedShippingAddress->getData($key)); 
       } 
       $shippingAddress->setCollectShippingRates(true); 
      } 

      // import shipping method 
      $code = ''; 
      if ($this->_api->getShippingRateCode()) { 
       if ($code = $this->_matchShippingMethodCode($shippingAddress, $this->_api->getShippingRateCode())) { 
        // possible bug of double collecting rates :-/ 
        $shippingAddress->setShippingMethod($code)->setCollectShippingRates(true); 
       } 
      } 
      $this->_quote->getPayment()->setAdditionalInformation(self::PAYMENT_INFO_TRANSPORT_SHIPPING_METHOD, $code); 
     } 
    } 
    $this->_ignoreAddressValidation(); 

    // import payment info 
    $payment = $this->_quote->getPayment(); 
    $payment->setMethod($this->_methodType); 
    Mage::getSingleton('paypal/info')->importToPayment($this->_api, $payment); 
    $payment->setAdditionalInformation(self::PAYMENT_INFO_TRANSPORT_PAYER_ID, $this->_api->getPayerId()) 
     ->setAdditionalInformation(self::PAYMENT_INFO_TRANSPORT_TOKEN, $token) 
    ; 
    $this->_quote->collectTotals()->save(); 
} 
+0

David, quelle version de magento vous utilisez. Mon code est un peu différent et j'essaie de déterminer si le vôtre est plus récent ou plus ancien. – Chris

Questions connexes