Question

I'm trying to decode the PDF data returned by the MWS Fulfilment Inbound API - GetPackageLabels request. The documentation is here: http://docs.developer.amazonservices.com/en_UK/fba_inbound/FBAInbound_GetPackageLabels.html

I have successfully made the call and got a response, but a using straight base64_decode in php the resulting pdf is corrupted. As I also can't get the check sum to match it would suggest that I'm missing a step in the decoding process. I've tried downloading from multiple test shipments, so it isn't a case of a single request getting corrupted in transit. I've outlined the steps I'm using below, any help would be appreciated.

XML response:

<GetPackageLabelsResponse xmlns="http://mws.amazonaws.com/FulfillmentInboundShipment/2010-10-01/">
    <GetPackageLabelsResult>
        <TransportDocument>
            <PdfDocument>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</PdfDocument>
            <Checksum>n0Cdtwupz9V68HnMp0Go7Q==</Checksum>
        </TransportDocument>
    </GetPackageLabelsResult>
    <ResponseMetadata>
        <RequestId>87a9d81a-6ec4-4d45-b2fc-8d0e6dfbe0a8</RequestId>
    </ResponseMetadata>
</GetPackageLabelsResponse>

In PHP I've successfully extracted the PdfDocument string into $data, which matches the above. I then output the data using the following:

$pdf_document = base64_decode($data);
header("Content-type: application/pdf");
header("Content-Length: " . strlen($pdf_document));
header("Content-Disposition: inline; filename=PackageLabels.pdf");
echo $pdf_document;
exit();

I have checked that the script isn't outputting any data before the pdf data is echoed out. I've also used file_put_contents($filename, $pdf_document) to save the data to a file and that file is also corrupted.

I also can't get the md5 checksum to match:

echo base64_encode(md5($pdf_document, true)); // outputs:       Pn0C06ZOgzDBfYwWXBvvow==
                                              // from response: n0Cdtwupz9V68HnMp0Go7Q==
Was it helpful?

Solution

The contents of that PdfDocument is a ZIP file - the first three letters ("UEs") decode to "PK" which is the magic identifier for ZIP files. For testing purposes, you can use this website to download a copy of that ZIP. PHP has functions that let you do the same, you'll have to check what's compiled into your PHP version.

The contents of said ZIP archive is a single file labeled PackageLabels.pdf which is the PDF you're looking for.

The Checksum is also base64-encoded and the one in your example decodes to 9f409db70ba9cfd57af079cca741a8ed. This is supposed to be the MD5 hash of the document data. However, I have yet to find out how exactly it is calculated. It did NOT match the MD5 of any of the following:

  • The raw Base64 encoded string
  • The zip file
  • The contained pdf file
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top