You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
6.1 KiB
PHP

<?php
require_once __DIR__ . "/required.php";
$shipmentinfo = [];
try {
if (empty($_REQUEST["to_street"])) {
throw new Exception("Please enter the delivery address.");
}
if (empty($_REQUEST["to_name"]) && empty($_REQUEST["to_company"])) {
throw new Exception("Please enter the recipient's name and/or a company name.");
}
if (empty($_REQUEST["to_zip"]) && (empty($_REQUEST["to_city"]) || empty($_REQUEST["to_state"]))) {
throw new Exception("Please enter the delivery ZIP code, or if you don't know, enter the city and state and we'll find the ZIP code for you.");
}
if (empty($_REQUEST["from_name"]) || empty($_REQUEST["from_street"])) {
throw new Exception("Please enter your return address.");
}
if (empty($_REQUEST["from_zip"]) && (empty($_REQUEST["from_city"]) || empty($_REQUEST["from_state"]))) {
throw new Exception("Please enter your ZIP code, or if you don't know, enter your city and state and we'll find the ZIP code for you.");
}
if (empty($_REQUEST["from_email"]) || !filter_var($_REQUEST["from_email"], FILTER_VALIDATE_EMAIL)) {
throw new Exception("Please enter your email address. We use it to send you a receipt with your tracking number and other info. You won't get any spam emails, we promise.");
}
$shipmentinfo["from_address"] = \EasyPost\Address::create([
"verify" => array("delivery"),
"name" => $_REQUEST["from_name"],
"street1" => $_REQUEST["from_street"],
"street2" => $_REQUEST["from_street2"],
"city" => $_REQUEST["from_city"],
"state" => $_REQUEST["from_state"],
"zip" => $_REQUEST["from_zip"],
"email" => $_REQUEST["from_email"],
"country" => "US"
]);
$shipmentinfo["to_address"] = \EasyPost\Address::create([
"verify" => array("delivery"),
"name" => $_REQUEST["to_name"],
"company" => $_REQUEST["to_company"],
"street1" => $_REQUEST["to_street"],
"street2" => $_REQUEST["to_street2"],
"city" => $_REQUEST["to_city"],
"state" => $_REQUEST["to_state"],
"zip" => $_REQUEST["to_zip"],
"country" => "US"
]);
$weight = 3.5;
if (!empty($_REQUEST["page_count"]) && is_numeric($_REQUEST["page_count"])) {
// about 5 pages per ounce
$weight = ($_REQUEST["page_count"] * 1 + 1) / 5;
}
if ($weight > 3.5) {
throw new Exception("Too many pages to send as a letter.");
}
$shipmentinfo["parcel"] = \EasyPost\Parcel::create([
"predefined_package" => "Letter",
"weight" => $weight
]);
if (empty($_SETTINGS["test"]) || $_SETTINGS["test"] != true) {
$shipmentinfo["carrier_accounts"] = [$_SETTINGS["easypost_usps_account"]]; // USPS
}
if ($_REQUEST["postagetype"] == "certified") {
$shipmentinfo["options"]["certified_mail"] = true;
} else if ($_REQUEST["postagetype"] == "certified_receipt") {
$shipmentinfo["options"]["certified_mail"] = true;
$shipmentinfo["options"]["return_receipt"] = true;
}
if ($_REQUEST["restricted_delivery"] == "restricted_delivery") {
if (!empty($shipmentinfo["options"]["certified_mail"]) && $shipmentinfo["options"]["certified_mail"] == true) {
$shipmentinfo["options"]["delivery_confirmation"] = "SIGNATURE_RESTRICTED";
} else {
throw new Exception("Restricted Delivery is only available with Certified Mail.");
}
}
$shipmentinfo["options"]["label_format"] = "PNG";
$shipmentinfo["options"]["label_size"] = "7x3";
$mailing_date = date("c", strtotime("tomorrow"));
if (!empty($_REQUEST["mailing_date"])) {
if (!preg_match("/^20(2[3-9]|[3-4][0-9])-(0[1-9]|1[0-2])-([0-2][0-9]|3[0-1])$/", $_REQUEST["mailing_date"])) {
throw new Exception("Invalid mailing date.");
}
if (strtotime($_REQUEST["mailing_date"]) < strtotime(date("Y-m-d"))) {
throw new Exception("Mailing date cannot be in the past.");
}
if (strtotime($_REQUEST["mailing_date"]) > strtotime("now + 14 days")) {
throw new Exception("Mailing date must be sooner than two weeks from now.");
}
$mailing_date = date("c", strtotime($_REQUEST["mailing_date"]));
}
$shipmentinfo["options"]["label_date"] = $mailing_date;
$shipment = \EasyPost\Shipment::create($shipmentinfo);
$selectedrate = [];
for ($i = 0; $i < count($shipment->rates); $i++) {
$rate = $shipment->rates[$i];
$retail_rate = $rate->retail_rate ?? ($rate->list_rate ?? $rate->rate);
if ($rate->service != "First") {
continue;
}
$selectedrate = [
"id" => $rate->id,
"cost" => $retail_rate,
"price" => $retail_rate + 1.00
];
}
if (empty($selectedrate)) {
throw new Exception("Unable to find price. Check your destination address and try again.");
}
$address = $shipment->to_address;
$fromaddress = $shipment->from_address;
header("Content-Type: application/json");
exit(json_encode([
"status" => "OK",
"rate" => $selectedrate,
"shipmentid" => $shipment->id,
"address" => [
"name" => $address->name ?? "",
"company" => $address->company ?? "",
"street1" => $address->street1 ?? "",
"street2" => $address->street2 ?? "",
"city" => $address->city ?? "",
"state" => $address->state ?? "",
"zip" => $address->zip ?? ""
],
"fromaddress" => [
"name" => $fromaddress->name ?? "",
"street1" => $fromaddress->street1 ?? "",
"street2" => $fromaddress->street2 ?? "",
"city" => $fromaddress->city ?? "",
"state" => $fromaddress->state ?? "",
"zip" => $fromaddress->zip ?? ""
]]
));
} catch (Exception $ex) {
header("Content-Type: application/json");
exit(json_encode(["status" => "ERROR", "message" => $ex->getMessage()]));
}