package cn.iocoder.yudao.module.wxcp.framework.qrcode; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import java.io.ByteArrayOutputStream; import java.util.HashMap; import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.wxcp.enums.ErrorCodeConstants.QRCODE_GENERATE_FAILED; /** * 企业微信模块 - 二维码生成工具 * * 用于把活动报名页地址生成二维码图片,供企业微信推送或后台下载 * * @author 超级管理员 */ public class WxCpQrCodeUtil { /** * 默认二维码边长(像素) */ public static final int DEFAULT_SIZE = 400; private WxCpQrCodeUtil() { } /** * 生成二维码 PNG 字节流 * * @param content 二维码内容(一般是一个 URL) * @param size 边长像素,传 0 或负数则使用默认值 * @return PNG 图片字节 */ public static byte[] generatePng(String content, int size) { int actualSize = size > 0 ? size : DEFAULT_SIZE; try { Map hints = new HashMap<>(4); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 容错级别 M:约 15%,兼顾扫码成功率与码点密度,适合印在物料上 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); hints.put(EncodeHintType.MARGIN, 1); BitMatrix matrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, actualSize, actualSize, hints); ByteArrayOutputStream out = new ByteArrayOutputStream(); MatrixToImageWriter.writeToStream(matrix, "PNG", out); return out.toByteArray(); } catch (Exception e) { throw exception(QRCODE_GENERATE_FAILED); } } }