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()])); }