Generating UPI Payment QR Code in Java and Spring

Carvia Tech | December 16, 2019 | 3 min read | 512 views


Generating UPI Payment QR Code in Java and Spring
We will generate UPI Payments compliant (BHIM, GPay, PayTM) QR Code in PNG/JPG/Base64 format using zxing library in Java & Spring based application.

Gradle setup

You can use https://start.spring.io/ to create a new project template for Spring Boot based project and then add the below dependencies for using zxing library (QR Code generation)

build.gradle
dependencies {
    implementation('com.google.zxing:core:3.4.0')
    implementation('com.google.zxing:javase:3.4.0')
}
Latest version of zxing library can be found at:

https://mvnrepository.com/artifact/com.google.zxing/javase

Generate QR Code URL

We will develop a service component that will take the payload and generate the QR code that is compliant with UPI specifications.

You can refer to the version 1.6 of UPI specifications published on npci website.

upi specs parameters url
UPI Specs Parameters

We can use Spring’s UriComponentsBuilder class to generate the encoded URL for UPI payments:

Generating the URL for UPI Payments
class Scratch {
    private static final Logger logger = LoggerFactory.getLogger(QRCodeService.class);

    public void createUpiQrCode(String payeeAddress, String payeeName, String trxNo, String amount, String purpose, String trxRef) throws IOException, WriterException {
        final String qrCode = UriComponentsBuilder.fromUriString("upi://pay")
                .queryParam("pa", payeeAddress) (1)
                .queryParam("pn", payeeName)
                .queryParam("tn", trxNo)
                .queryParam("tr", trxRef)
                .queryParam("am", amount)
                .queryParam("cu", "INR")
                .queryParam("purpose", purpose)
                .build().encode().toUriString();
        logger.info("UPI QR Code = " + qrCode);
        createQRCode(qrCode, "qrcode-3.png");
    }
}
1 UPI address in the form of mobile@upi or any other format as per bank.

The final QR Code shall look like the following:

UPI Payment URL for QR Code
upi://pay?pa=<upi address>&pn=<Name>&tn=<trxNo>&tr=<trxRef>&am=<trxAmount>&cu=INR&purpose=<purpose>

Generate QR Code Image (png/jpg/base64)

We have got the URL that we need to embed inside QR Code, in this step we will create the QR code image in png format using zxing library.

Generating QR Code in PNG over JPEG has many benefits, as the size of output is greatly reduced and its better for network requests.

Generate QR Code image in PNG
class Scratch {
    private static final Logger logger = LoggerFactory.getLogger(QRCodeService.class);

    private final Map hintMap = new HashMap<>();
    private final String charset = StandardCharsets.UTF_8.name(); // or "ISO-8859-1"
    private final int size = 350;

    public QRCodeService() {
        hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        hintMap.put(EncodeHintType.CHARACTER_SET, StandardCharsets.UTF_8);
        hintMap.put(EncodeHintType.MARGIN, 1);

        hintMap.put(DecodeHintType.CHARACTER_SET, StandardCharsets.UTF_8);
        hintMap.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
        hintMap.put(DecodeHintType.POSSIBLE_FORMATS, EnumSet.allOf(BarcodeFormat.class));
    }

    public void createQRCode(String qrCodeData, String filePath) throws WriterException, IOException {
        BitMatrix matrix = new MultiFormatWriter().encode(qrCodeData, BarcodeFormat.QR_CODE, size, size, hintMap);
        MatrixToImageWriter.writeToPath(matrix, "png", Paths.get(filePath));
    }
}
upi qr code
UPI Payment QR Code sample image

Generate Base64 format for QR Code

Many a times, we need to embed this QR Code image inside html content, base64 may be a good option for this as everything will happen inline.

Generate Base64 version of image
class Scratch {
       public String createQRCode(String qrCodeData) throws WriterException, IOException {
        BitMatrix matrix = new MultiFormatWriter().encode(qrCodeData, BarcodeFormat.QR_CODE, size, size, hintMap);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(matrix, "png", baos);
        return Base64.getEncoder().encodeToString(baos.toByteArray());
    }
}

Embedding this Base64 QR Code inside HTML

We can create an image element in HTML using embedded base64 version of QR Code as shown in below code snippet:

Embedded base64 in IMG tag in HTML
<img src="data:image/png;base64, <base64 QR Code String>" alt="UPI QR Code" />

Top articles in this category:
  1. SendGrid emails with Spring Boot and Java
  2. Custom banner in spring boot
  3. Java AWS Lambda using Spring Cloud Function
  4. Setting a Random Port in Spring Boot Application at startup
  5. Run method on application startup in Spring Boot
  6. Sendgrid Dynamic Templates with Spring Boot
  7. Feign exception handling in Spring Cloud


Find more on this topic:
Spring Framework image
Spring Framework

Spring Framework - MVC, Dependency Injection, Spring Hibernate, Spring Data JPA, Spring Boot and Spring Cloud for Microservices Architecture.

Last updated 1 week ago


Recommended books for interview preparation:

This website uses cookies to ensure you get the best experience on our website. more info