我正在生成支付二维码。
public GenerateQrResponse createQr(CreateQrRequest request) {
var bnplEntity = bnplRepository.findByOrderId(request.getOrderNumber());
if (bnplEntity.isEmpty()) {
messengerUtils.sendTelegramBotMessage(telegramChatId, "bnpl not found by orderId. createQr method, orderNumber = " + request.getOrderNumber());
throw new RuntimeException("bnpl entity not found while requesting qr code for bnpl with order number = " + request.getOrderNumber());
}
var bnplDto = bnplService.prepareBnplResponse(bnplEntity.get());
bnplDto.setBnplId(bnplEntity.get().getId());
bnplDto.setDate(bnplEntity.get().getCreatedAt());
String linkUrl = bnplUrlService.getBnplUrl(bnplDto);
BufferedImage logoImage = createRedCircleImage(50, 50);
String logoBase64 = convertImageToBase64(logoImage);
try {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(linkUrl, BarcodeFormat.QR_CODE, 250, 250, getQrCodeHintMap());
BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
byte[] logoBytes = Base64.getDecoder().decode(logoBase64);
ByteArrayInputStream logoStream = new ByteArrayInputStream(logoBytes);
logoImage = ImageIO.read(logoStream);
BufferedImage combined = new BufferedImage(250, 250, BufferedImage.TYPE_INT_RGB);
Graphics2D g = combined.createGraphics();
g.drawImage(qrImage, 0, 0, null);
int x = (combined.getWidth() - logoImage.getWidth()) / 2;
int y = (combined.getHeight() - logoImage.getHeight()) / 2;
g.drawImage(logoImage, x, y, null);
g.dispose();
ByteArrayOutputStream combinedOutputStream = new ByteArrayOutputStream();
ImageIO.write(combined, "PNG", combinedOutputStream);
byte[] imageBytes = combinedOutputStream.toByteArray();
return new GenerateQrResponse(Base64.getEncoder().encodeToString(imageBytes), request.getOrderNumber(), request.getAmount(), linkUrl);
} catch (IOException | WriterException e) {
throw new RuntimeException(e.getMessage());
}
}
问题是:当我为 qr 构建 DTO 时,我需要输入地址。如果地址是英文的话,没有任何问题。 但如果地址是西里尔文,则在 qr 链接中所有西里尔文文本都会变成 ??????
主要问题是我的所有地址都是西里尔字母,我们的系统是这样工作的。 这里是DTO
return BnplDTO.builder()
.bnplId(bnpl.getId())
.amount(bnpl.getAmount())
.bin("111111111111")
.address("ул. Астана 58А")
.legalName("Example")
.build();
我正在使用 qrgen 库
<dependency>
<groupId>net.glxn</groupId>
<artifactId>qrgen</artifactId>
<version>1.4</version>
</dependency>
有想法更改库,但可能有人知道如何解决这个问题? 预先感谢
据我所知,QR 码用于指向 URL。它们通常编码为 UTF-8。可以肯定的是,请使用 URL 编码。请参阅https://stackoverflow.com/a/10786112/4222206
另一种选择是不将全部数据放入二维码中,而是生成带有(交易)代码的 URL,该代码可返回您的网站,然后生成完整信息。