核心要点
您新的定制电子商务商店几乎完成了。剩下的唯一事情是弄清楚如何计算客户的运费。您不想对每个地址都使用标准的固定费率,因为您知道您会向某些客户收取过高的费用,更重要的是,会向其他客户收取过低的费用。如果运费可以根据商品的重量/尺寸和目的地来计算,那不是很棒吗?也许您甚至可以提供隔夜送货的准确价格报价!您有 UPS 帐户,并且您已经查看了他们的 API,但它看起来非常复杂。如果您将您的网站硬编码为使用 API,那么如果您需要更改发货人,您将需要做很多工作。您的表哥是 FedEx 的销售代表,他发誓他可以用 FedEx 为您获得更好的费率。您的一些客户只使用邮政信箱,因此这些物品必须通过邮局运送。您该怎么办?您可能听说过数据库抽象,这是一种允许您使用许多不同的数据库和一组通用命令的实践。这正是您在这里可以做的!为了解决所有这些问题,您可以将运输任务与代码的其余部分分离,并构建一个抽象层。完成后,无论您是通过 UPS、FedEx 还是 USPS 运送包裹,都无关紧要。您的核心应用程序将调用的函数将完全相同,这将使您的生活轻松得多!
UPS 入门
在本文中,我将重点介绍使用 UPS API,但是通过为不同的发货人(例如 FedEx 或 USPS)编写插件,您也可以访问他们的服务,而对核心应用程序代码的更改可以忽略不计。为了开始使用 UPS,您需要使用您现有的发货人编号在 www.ups.com 上注册在线帐户。确保选择一个您愿意使用一段时间的用户名和密码,因为 API 每次调用都需要两者。接下来,访问 https://www.php.cn/link/ebd74b9b3bfd11deb539e4242d95078b 并注册以访问 UPS API。您将在此处获得您的 API 密钥,并能够下载不同 API 包的文档。(注意:UPS 网站的这一部分存在已知问题,Chrome 有时会返回空白页。您可能需要使用其他浏览器。)请记住,当您使用 UPS API(或任何发货人的 API)时,您同意遵守他们的规则和程序。请务必查看并遵守它们,尤其是在将您的代码用于生产环境之前,请遵守他们的说明。接下来,从 GitHub 上的 github.com/alexfraundorf-com/ship 下载或克隆运输抽象层包,并将其上传到运行 PHP 5.3 或更高版本的服务器上。打开 includes/config.php 文件。您需要在此处输入您的 UPS 详细信息,字段名称应该都是不言自明的。请注意,UPS 发货人地址必须与 UPS 帐户中记录的地址相符,否则会发生错误。
定义货物和包裹
现在定义一个 Shipment 对象。在实例化时,它将接受一个包含接收者信息的数组,如果与我们配置文件中的发货人信息不同,则可以选择一个发货地址。
// 创建一个 Shipment 对象 $shipment = new ShipShipment($shipmentData);
接下来,我们需要一些关于我们正在运输什么的详细信息。让我们创建一个 Package 对象,它接受重量、包裹尺寸和一些基本选项的可选数组,例如说明、是否需要签名以及保险金额。然后将新实例化的 Package(s) 添加到 Shipment 对象中。模拟生活的软件很有意义:每个包裹都属于一个货物,每个货物都必须至少包含一个包裹。
// 创建一个 Package 对象并将其添加到 Shipment(一个货物可以有多个包裹) // 此包裹重 24 磅,尺寸为 10 x 6 x 12 英寸,保险价值为 274.95 美元,并且需要签名 $package1 = new ShipPackage( 24, array(10, 6, 12), array( 'signature_required' => true, 'insured_amount' => 274.95 ) ); $shipment->addPackage($package1); // 重量和尺寸可以是整数或浮点数, // 尽管 UPS 总是向上舍入到下一个整数。 // 此包裹重 11.34 磅,尺寸为 // 14.2 x 16.8 x 26.34 英寸 $package2 = new ShipPackage( 11.34, array(14.2, 16.8, 26.34) ); $shipment->addPackage($package2);
(以下内容是对原文中“Behind the Curtain”章节的精简和改写,避免重复冗余信息,并保持关键信息的完整性)
Shipment 对象详解: Awsp/Ship/Shipment.php
中的 Shipment
对象存储接收方信息(以及可选的发货方信息),包含 addPackage()
和 getPackages()
方法管理包裹。
Package 对象详解: Awsp/Ship/Package.php
中的 Package
对象存储包裹重量、尺寸和可选参数,自动将尺寸按长宽高排序,并计算包裹尺寸(长 周长)。
发货人插件: 插件(例如 ShipUps
)实现 ShipperInterface
接口,提供统一的 getRate()
(获取运费)和 createLabel()
(创建标签)方法。
获取运费: 通过调用 $ups->getRate()
获取运费,并使用 try/catch
块处理错误。结果以 RateResponse
对象返回,包含状态和各个运输选项的详细信息。
创建运输标签: 调用 $ups->createLabel()
创建运输标签,结果以 LabelResponse
对象返回,包含状态、总成本、跟踪号码和 base-64 编码的标签图像。
RateResponse 对象详解: Awsp/Ship/RateResponse.php
中的 RateResponse
对象以标准化格式存储运费数据,包含状态、服务选项数组等。
LabelResponse 对象详解: Awsp/Ship/LabelResponse.php
中的 LabelResponse
对象以标准化格式存储标签数据,包含状态、总成本、标签数组等。
UPS 发货人插件详解: Awsp/Ship/Ups.php
将标准化的 Package
和 Shipment
对象转换为 UPS API 可理解的格式,使用 SOAP API 进行通信,并将响应转换为标准化的 RateResponse
或 LabelResponse
对象。
总结: 通过抽象层,您可以轻松地使用 UPS API 或其他发货人的 API,简化了与不同 API 的交互,并降低了维护成本。 如果需要集成 USPS,建议使用 stamps.com 等经 USPS 批准的供应商,而不是直接使用 USPS 官方 API。
(原文FAQs部分已精简,保留核心信息,避免重复)
常见问题 (FAQs)
以上是PHP主|抽象运输API的详细内容。更多信息请关注PHP中文网其他相关文章!