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.

97 lines
3.4 KiB
PHP

<?php
require_once __DIR__ . "/required.php";
$shipmentinfo = [];
try {
$shipment = \EasyPost\Shipment::retrieve($_REQUEST["shipmentid"]);
$price = 0;
foreach ($shipment->rates as $rate) {
if ($rate->id == $_REQUEST["rateid"]) {
$retail_rate = $rate->retail_rate ?? ($rate->list_rate ?? $rate->rate);
$price = $retail_rate + 1.00;
}
}
if ($price == 0) {
throw new Exception("Invalid rate selection. Refresh the page and try again. Your card was not charged.");
}
if ($price != $_REQUEST["price"]) {
throw new Exception("Price mismatch detected. Refresh the page and try again. Your card was not charged.");
}
// make the payment intent but don't capture it yet, in case something goes wrong.
$intent = \Stripe\PaymentIntent::create([
'amount' => $price * 100,
'currency' => 'usd',
'payment_method' => $_REQUEST["stripeid"],
'description' => "CertifiedFromHome.com",
'statement_descriptor' => "CrtfdFrmHome",
'payment_method_types' => ['card'],
'capture_method' => 'manual',
'confirm' => true
]);
if ($intent->status == 'requires_capture') {
// Payment will go through, proceed to spend money on postage
if (empty($shipment->postage_label)) {
// Do this conditionally in case label got purchased but payment somehow failed,
// allowing a retry of the payment.
$shipment->buy(['rate' => ['id' => $_REQUEST["rateid"]]]);
}
$labelurl = $shipment->postage_label->label_url;
// load postage image
$labelimage = imagecreatefrompng($labelurl);
if (!empty($shipment->options->certified_mail)) {
// load page template
$paperimage = imagecreatefrompng(__DIR__ . "/papertemplate.png");
// copy postage label image into page template
imagecopyresampled($paperimage, $labelimage, 225, 750, 0, 0, 2100, 900, 2100, 900);
} else {
// load page template
$paperimage = imagecreatefrompng(__DIR__ . "/papertemplate_notracking.png");
// copy postage label image into page template
imagecopyresampled($paperimage, $labelimage, 225, 600, 0, 0, 2100, 900, 2100, 900);
}
// save generated image to temp file
$tmpfile = tempnam(sys_get_temp_dir(), "certifiedlabel");
imagepng($paperimage, $tmpfile);
// Generate PDF from image
$pdf = new FPDF('P', 'in', 'Letter');
$pdf->AddPage();
$pdf->Image($tmpfile, 0, 0, -300, -300, "PNG");
$pdffile = date("Ymd") . "_" . hash("sha256", $_REQUEST["shipmentid"]) . ".pdf";
$pdf->Output("F", __DIR__ . "/pdf/" . $pdffile);
// cleanup temp file
unlink($tmpfile);
// get paid
$intent->capture();
header("Content-Type: application/json");
exit(json_encode([
"status" => "OK",
"pdf" => "https://certifiedfromhome.com/pdf/" . $pdffile,
"trackingcode" => $shipment->tracking_code
]));
} else {
throw new Exception("Payment didn't go through. Please try again or try a different card.");
}
} catch (Exception $ex) {
header("Content-Type: application/json");
exit(json_encode(["status" => "ERROR", "message" => $ex->getMessage()]));
}