【问题标题】:Magento USPS Not Properly Making API Request For International CountryMagento USPS 未正确向国际国家/地区发出 API 请求
【发布时间】:2015-11-30 22:22:10
【问题描述】:

我有一家 magento 商店,需要能够将订单运送到库拉索岛。默认情况下,这在 Magento 中被分组为荷属安的列斯群岛,但是,我发现即使将订单设置为此,即使启用了国际运输,我也无法从 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); 

根据我的数据库设置,这会在我的日志“CW”中输出,这是交易的正确国家代码。那么给了什么?为什么不将国家代码传递给 API,以便我获得一些定价?

我认为这不是一个新问题,而且我可能正在研究一些非常明显的问题,所以我希望有人能指出我正确的方向,因为我目前“被难住”了。

提前致谢!

【问题讨论】:

    标签: php magento


    【解决方案1】:

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

    在这种情况下,您的国家/地区代码 CW 映射到“库拉索”。这些国家/地区名称必须准确。

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

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

    有关国家名称的官方列表(无代码映射),请参阅:

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

    【讨论】:

    • 谢谢你 - 但是 - 它并没有解决问题。然而,这些数据很有用。
    【解决方案2】:

    因此,经过一些相当详尽的代码跟踪和研究,我已经弄清楚了如何让这一切正常工作。这是一个多步骤的过程,但它让我让库拉索、博内尔和黑山与 USPS 合作。我确信这个相同的修复将适用于其他国家 - 我还没有发现任何其他反映相同问题的其他国家。

    步骤 1

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

    第二步

    编辑您的商店语言文件在我的例子中我只有一个,即 en.xml,(位于“/lib/Zend/Locale/Data/en.xml”)。查找区域 xml 块:

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

    并添加您的领土(如果它们不存在 - 在我的例子中,黑山已经存在于此)。

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

    保存此文件。

    第三步

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

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

    第四步

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

    在文件“app/code/local/Mage/Usa/Model/Shipping/Carrier/Usps.php”中找到调用的函数:

    protected function _getCountryName($countryId)
    

    像这样将新国家添加到数组中:

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

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

    保存此文件。

    第 5 步

    登录您的商店管理员。禁用编译模式,刷新缓存和索引。转到配置 > Web > 常规并启用您的新国家/地区。保存此更改。

    第 6 步

    转到配置 > 销售 > 运输方式。单击 USPS,然后启用新国家/地区。如果您已经选择了所有国家,请将下拉菜单设置为选定的国家,然后返回所有国家。这将强制选择新添加的国家。保存此更改。

    第 7 步

    重新启用并强制重新编译编译模式(如果您正在使用它),并尝试新的国家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多