Magento USPS未正确地为国际国家提出API请求

时间:2015-11-30 22:22:10

标签: php magento

我有一家magento商店,需要能够将订单运送到库拉索岛。默认情况下,这被归类为Magento的Netherland Antilles,但是,我发现即使设置了这个订单,也不会从USPS获得正确的运费,即使启用了国际运费。

我已经通过en.xml文件和管理员将国家/地区添加到了magento。我已将其作为我们可以根据USPS送货方式运送到的国家/地区以及magento的directory_country表中启用。

调用USPS API时,我将其视为请求和结果:

2015-11-30T22:08:15+00:00 DEBUG (7): Array
(
[request] => <?xml version="1.0" encoding="UTF-8"?>
<IntlRateV2Request USERID="725CIGAR7315"><Revision>2</Revision><Package ID="0"><Pounds>0</Pounds><Ounces>0.8</Ounces><MailType>All</MailType><ValueOfContents>1</ValueOfContents><Country/><Container>VARIABLE</Container><Size>REGULAR</Size><Width/><Length/><Height/><Girth/></Package></IntlRateV2Request>

[result] => <?xml version="1.0" encoding="UTF-8"?>
<IntlRateV2Response><Package ID="0"><Error><Number>-2147219080</Number><Source>;IntlRateV2.UnpackIntlRateV2Node</Source><Description>Missing value for Country.</Description><HelpFile/><HelpContext/></Error></Package></IntlRateV2Response>
[__pid] => 2786
 )

请注意请求中的空Country标记。我已经挖掘了代码,并通过app / code / core / Mage / Usa / Model / Shipping / Carrier / Usps.php文件查看该国家应该设置的位置。

当然,我必须覆盖我已经完成的这个文件(不直接编辑核心magento),但我仍然无法在发送时填充Country标记。我将此添加到setRequest函数:

    Mage::log("Destination Country: ");
    Mage::log($request->getDestCountryId());

    if ($request->getDestCountryId()) {
        $destCountry = $request->getDestCountryId();
    } else {
        $destCountry = self::USA_COUNTRY_ID;
    }

    $r->setDestCountryId($destCountry); 

这在我的日志中输出&#34; CW&#34;根据我的数据库设置,这是交易的正确国家/地区代码。什么给出了什么?为什么国家代码没有传递给API,所以我可以得到一些定价?

我认为这不是一个新问题,而且我可能正在寻找一些非常明显的东西,所以我希望有人可以指出我正确的方向,因为我目前正在&#34;难倒&#34;。

提前致谢!

2 个答案:

答案 0 :(得分:1)

问题是USPS API采用完整的国家/地区名称而不是ISO标准的双字母国家/地区代码。

在这种情况下,您的国家/地区代码CW会映射到&#34; Curacao&#34;。这些国家/地区名称必须准确无误。

有关USPS名称映射的国家/地区代码列表,请参阅:

https://docs.rocketship.it/php/1-0/usps-country-codes.html

有关国家/地区名称的正式列表(无代码映射),请参阅:

http://pe.usps.com/text/Imm/immctry.htm

答案 1 :(得分:0)

所以经过一些相当详尽的代码追踪和研究后,我已经想出如何让它全部运转起来。这是一个多步骤的过程,但它让我让Curacao,Bonaire和黑山与USPS合作。我相信这个修复同样适用于其他国家 - 我还没有发现其他任何反映同样问题的其他国家。

第1步

查找要添加或启用USPS的国家/地区的ISO2和ISO3国家/地区代码。我在维基百科上找到了我需要的东西。

第2步

在我的情况下编辑您的商店语言文件我只有一个,即en.xml,(位于&#34; /lib/Zend/Locale/Data/en.xml")。找到地区xml块:

<territories>

     <territory type="xxxx">Country</territory>

并添加您的地区(如果它们不存在 - 在我的情况下,黑山已经确实存在)。

  <territory type="CW">Curacao</territory>
  <territory type="BQ">Bonaire</territory>

保存此文件。

第3步

登录您的mysql数据库并将以下行插入directory_country表。

 insert into directory_country values('CW','CW','CUW');
 insert into directory_country values('BQ','BQ','BES');

第4步

编辑位于核心Mage库中的Usps Shipping Carrier类。不要修改实际核心 - 安装程序在app / code / local中创建一个本地修改版本。我会假设你已经知道如何做到这一点。

在文件&#34; app / code / local / Mage / Usa / Model / Shipping / Carrier / Usps.php&#34;找到名为的函数:

protected function _getCountryName($countryId)

将新国家/地区添加到数组中:

'BQ' => 'Bonaire',
'CW' => 'Curacao',

将您的ISO2代码映射到USPS官方国家/地区名称。

保存此文件。

第5步

登录您的商店管理员。禁用编译模式,刷新缓存和索引。转到配置&gt;网络&gt;一般并启用您的新国家/地区。保存此更改。

第6步

转到配置&gt;销售&gt;送货方式。单击USPS,然后启用新国家/地区。如果已选择所有国家/地区,请将下拉菜单设置为所选国家/地区,然后再返回“所有国家/地区”。这将迫使选择新增国家。保存此更改。

第7步

重新启用并强制重新编译编译模式(如果你使用它),并采取新的国家进行旋转!

相关问题