2021-04-22 21:41:39 -06:00
< ? 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. " );
}
2023-08-06 17:19:13 -06:00
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. " );
}
2021-04-22 21:41:39 -06:00
$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 " ],
2021-10-03 22:49:40 -06:00
" email " => $_REQUEST [ " from_email " ],
2021-04-22 21:41:39 -06:00
" 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 "
]);
2023-08-06 17:19:13 -06:00
$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. " );
}
2021-04-22 21:41:39 -06:00
$shipmentinfo [ " parcel " ] = \EasyPost\Parcel :: create ([
" predefined_package " => " Letter " ,
2023-08-06 17:19:13 -06:00
" weight " => $weight
2021-04-22 21:41:39 -06:00
]);
2023-08-06 17:19:13 -06:00
if ( empty ( $_SETTINGS [ " test " ]) || $_SETTINGS [ " test " ] != true ) {
$shipmentinfo [ " carrier_accounts " ] = [ $_SETTINGS [ " easypost_usps_account " ]]; // USPS
}
2021-10-03 22:49:40 -06:00
2021-04-22 21:41:39 -06:00
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 ;
}
2023-08-06 17:19:13 -06:00
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. " );
}
}
2021-04-22 21:41:39 -06:00
$shipmentinfo [ " options " ][ " label_format " ] = " PNG " ;
$shipmentinfo [ " options " ][ " label_size " ] = " 7x3 " ;
2023-08-06 17:19:13 -06:00
$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 ;
2021-04-22 21:41:39 -06:00
$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 ? ? " " ,
2023-09-02 17:58:03 -06:00
" zip " => $fromaddress -> zip ? ? " " ,
" email " => $fromaddress -> email ? ? " "
2021-04-22 21:41:39 -06:00
]]
));
} catch ( Exception $ex ) {
header ( " Content-Type: application/json " );
exit ( json_encode ([ " status " => " ERROR " , " message " => $ex -> getMessage ()]));
}