McAPI - Barcode API PHP

PHP sample code to create barcodes with the McAPI Barcode REST API service. The sample uses PHP 7 but the code will also work with older versions. The samples use the modules curl and json which should all be available with a standard PHP installation. All samples will also work in Laravel.

Requirements: A free RapidAPI account. Replace YOUR_API_KEY in the code snippets below with your own api key.

All samples below work with the free tier of the API, see RapidAPI McAPI Barcode Listing for available plans.

See the overview page for a reference that lists all available parameters and error codes.

Create a Barcode using PHP

Shown is the creation of a Code 128 (code type: 7) with PHP. All relevant parameters are in the POSTFIELDS of the request. The barcode will encode the text "123456". The module width is set to 0.5mm, the height is set to 20mm, the size of the human readable text under the barcode is set to 10 points. The code will be created and returned as a base64 encoded PDF.

The source code:

// PHP
  
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://mcapi-barcode.p.rapidapi.com/",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{
    \"data\": \"123456\",
    \"type\": 7,
    \"moduleWidth\": 0.5,
    \"moduleHeight\": 20,
    \"hrSize\": 10,
    \"format\": \"pdf\"     
}",
  CURLOPT_HTTPHEADER => [
    "content-type: application/json",
    "x-rapidapi-host: mcapi-barcode.p.rapidapi.com",
    "x-rapidapi-key: YOUR_API_KEY"
  ],
]);

$response = curl_exec($curl);
curl_close($curl);

The data will be delivered as JSON in $response e.g.:

{
  "service":"McAPI Barcode Generator, https://mcapi.io",
  "version":"V1",
  "format":"pdf",
  "code":"data:application/pdf;base64,JVBE ... Cg=="
}

See further below for a snippet that shows how to parse the response.

McAPI Barcode API - Sample barcode with PHP

The returned code from the PHP request:

Image of McAPI Barcode API Sample Barcode PHP

Creating retail barcodes EAN, ISBN, UPC with PHP

The introductory sample above created a Code 128 barcode. Code 128 has many applications, mostly in warehousing and logistics. In the following PHP snippet we show how to create EAN and UPC barcodes which are used in retail.

Let's create an EAN 13 code. First step is to set the code type. The reference section lists all available code types; for EAN 13, we have to set the type-parameter to "1". With Code 128, we set the size of the code by specifing values for moduleWidth and moduleHeight. Retail codes are standardized, with the standard specifying the permitted sizes (so called SC sizes). With the Barcode API, the size of retail barcodes is determined through the size-parameter, with "2" being the 100% size.

Here's the respective POSTFIELDS block for creating an EAN 13 encoding "401234567890", again returning a PDF:

// PHP

...

CURLOPT_POSTFIELDS => "{
  \"data\": \"401234567890\",
  \"type\": 1,
  \"size\": 2,
  \"format\": \"pdf\" 
}"

...

Here's the resulting EAN 13:

Image of McAPI Barcode API EAN 13 Barcode PHP

As an aside, the reference section also specifies the expected data for each barcode symbology. EAN 13 encodes twelve digits plus check digit (hence the name). As such you'll have to specify twelve or thirteen digits, less than twelve or more than thirteen will result in an error, likewise if the submitted data contains letters. The API will always recalculate the check digit for retail codes to make sure that a valid symbol is created; for the given data the EAN 13 check digit is "1" which will be appended automatically to the data.

Incidentally, the greater sign (">") right of the barcode is the so called light margin indicator. The indicator tells the graphics designer not to put other graphical elements too close to the code. The indicator can be switched off by setting the lmi-parameter to "false".

Truncated EAN 13 with reduced height (PHP)

EAN barcodes can get quite large; with smaller wrappers or packages the code might not fit into the available space. The standard permits reducing the height of the code to some degree as long as it doesn't get lower than 10mm. The Barcode API supports a special truncate-parameter for retail codes. The parameter is percentage based, e.g. "50" will create a code with half height.

Sample POSTFIELDS block:

// PHP

...

CURLOPT_POSTFIELDS => "{
  \"data\": \"401234567890\",
  \"type\": 1,
  \"size\": 2,
  \"truncate\": 50,
  \"format\": \"pdf\"
}"

...

Here's the resulting EAN 13 with half height:

Image of McAPI Barcode API EAN 13 Truncated Barcode PHP

EAN 13 with additional text (PHP)

A very useful feature of the Barcode API is the support for supplemental text that can be put above and below the barcode. This can be used for item descriptions, package size, pricing, best before dates, weight etc.

The parameters over, under and suppSize control any additional text. The following POSTFIELDS block will put the text "Paperclips" above the code, the text "$2.99" below the code and set the size of the supplemental text to 8pt.:

// PHP

...

CURLOPT_POSTFIELDS => "{
  \"data\": \"401234567890\",
  \"type\": 1,
  \"size\": 2,
  \"truncate\": 50,
  \"over\": \"Paperclips\",
  \"under\": \"$2.99\",
  \"suppSize\": 8,    
  \"format\": \"pdf\"
}"

...

The resulting EAN 13 with additional text:

Image of McAPI Barcode API EAN 13 Price Best before Barcode PHP

Note: Additional text must be from the ASCII character set, Unicode is not supported.

Creating an EAN barcode without text (PHP)

Sometimes you will only want the actual barcode without any text at all; that's possible too: Simply specify the hrText-parameter as "false", like so:

// PHP
  
...

CURLOPT_POSTFIELDS => "{
  \"data\": \"401234567890\",
  \"type\": 1,
  \"size\": 2,
  \"truncate\": 50,
  \"hrText\" : \"false\",
  \"format\": \"pdf\"
}"

...

The resulting EAN 13 barcode without text:

Image of McAPI Barcode API EAN 13 No text Barcode PHP

Creating 2D matrix barcodes with PHP

The Barcode API supports the most common 2D barcode symbologies: Datamatrix, Datamatrix GS1, PDF417, QR and Aztec. Creating those codes in PHP is no different from ordinary, linear barcodes we saw above; the only aspect to consider is using the moduleWidth-parameter to control the size of the code. With the exception of PDF417, dots are square, i.e. moduleWidth equals moduleHeight. With PDF417, the dots are created with a 3:1 ratio, i.e. moduleHeight equals 3 * moduleWidth.

The following POSTFIELDS block will create a Datamatrix code (type = "16") with a dot size of 1x1mm²:

// PHP

...

CURLOPT_POSTFIELDS => "{
  \"data\": \"1234567890\",
  \"type\": 16,
  \"moduleWidth\": 1,
  \"format\": \"pdf\"
}"

...

The Datamatrix code from the snippet above:

Image of McAPI Barcode API Datamatrix 2D Barcode PHP

2D barcodes are always created without text as the encoded data is typically too much to be displayed. Use the over and under parameters to put small amounts of text (no more than 30 characters, ASCII only) next to the code.

Create QR codes with PHP

The Barcode API supports the creation of QR codes that can contain plain text, URLs, email addresses, phone numbers and SMS numbers. Our QR implementation is fully Unicode-compatible. PHP can natively handle UTF-8 characters or strings (like german "umlauts", e.g. "ÄÖÜ", or non-latin script, e.g. "日本語"). Curl will automatically encode your data as utf-8; special treatment for that kind of data is not required.

Specify content as follows:

  • Plain text (max. 2,000 chars): "123456abcdefÄÖÜ日本語"
  • URL: Specify data param like so: "https://example.com"
  • Email: Specify data param like so: "mailto:info@example.com"
  • Phone no: Specify data param like so: "tel:+18005551234"
  • SMS: Specify data param like so: "smsto:44044"

Sample POSTFIELDS block to create a QR code with the URL "https://mcapi.io":

// PHP

...

CURLOPT_POSTFIELDS => "{
  \"data\": \"https://mcapi.io\",
  \"type\": 19,
  \"moduleWidth\": 1,
  \"format\": \"pdf\"
}"

...

The resulting QR code:

Image of McAPI Barcode API QR URL Barcode PHP

The header-parameter - writing barcodes to a file (PHP)

With all supported formats, the barcode is returned as a base64 encoded string. Per default, this string is preceded by a header that describes the media type (or MIME) of the string.

Sample POSTFIELDS block for a QR code, to be returned as a PNG:

// PHP
  
...

CURLOPT_POSTFIELDS => "{
  \"data\": \"https://mcapi.io\",
  \"type\": 19,
  \"moduleWidth\": 1,
  \"format\": \"png\"
}"

...

The response will look like this, note the image/png MIME type:

{
  "service":"McAPI Barcode Generator, https://mcapi.io",
  "version":"V1",
  "format":"png",
  "code":"data:image/png;base64,iVBOR ... QmCC"
}

After parsing the result with a JSON parser you can directly set the "code"-string as the src property of an img tag, like so:

// PHP

...

if(curl_getinfo($curl, CURLINFO_HTTP_CODE) == 200){
    // In production code you would test the result of json_decode against null
    $barcode = json_decode($response, true)["code"];
    echo "<img src=\"" . $barcode . "\"/>"; 
  }
  else{
    echo "Error";
  }

...

Note: Setting the second argument of json_decode to "true" causes the call to return an associative array.

The MIME header will make sure that the image data is interpreted correctly by the browser. However, when writing the image data to a file, including the header would result in an invalid image file. To create a code without the header, set the header-parameter to "false", like so:

// PHP
  
...

CURLOPT_POSTFIELDS => "{
  \"data\": \"https://mcapi.io\",
  \"type\": 19,
  \"moduleWidth\": 1,
  \"header\": \"false\",
  \"format\": \"png\"
}"

...

The returned code without header:

{
  "service":"McAPI Barcode Generator, https://mcapi.io",
  "version":"V1",
  "format":"png",
  "code":"iVBOR ... QmCC"
}

Now, all we have to do is decode the base64 string to get the image data. Shown here as a complete PHP example that creates a QR code as a PNG and then writes the barcode to a file:

// PHP

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://mcapi-barcode.p.rapidapi.com/",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{
    \"data\": \"https://mcapi.io\",
    \"type\": 19,
    \"moduleWidth\": 1,
    \"header\": \"false\",
    \"format\": \"png\"
}",
  CURLOPT_HTTPHEADER => [
    "content-type: application/json",
    "x-rapidapi-host: mcapi-barcode.p.rapidapi.com",
    "x-rapidapi-key: YOUR_API_KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

if ($err) {
  echo "Error: " . $err;
} else {
  if(curl_getinfo($curl, CURLINFO_HTTP_CODE) == 200){
    // In production code you would test the result of json_decode against null
    $barcode = json_decode($response, true)["code"];
    $png = base64_decode($barcode);
    $f = fopen("barcode.png", "wb");
    fwrite($f, $png);
    fclose($f);
  }
  else{
    echo "Error";
  }
}
curl_close($curl);

Back to McAPI Barcode API main page.