微信支付宝小程序二码合一
随着现在小程序的流行,许多软件也将web页面转入到小程序之中。官方也给出了小程序生成的接口,但是如果我们微信和支付宝小程序都做了,展示两个二维码让用户扫描总是不好的,我们这里就是记录一下如果将微信小程序与支付宝小程序的二维码合并成一个,用户使用微信扫码时跳转到微信小程序,用户使用支付宝扫码时跳转到支付的小程序,并且跳转页面、携带参数都可以我们自定义。
其实我用的都是官网给出的文档,只是有时候大家没有找到这个文档。先给出官网文档的地址,解释的还是很清楚的,如果还有没有看懂的或者不了解的地方可以再给我发邮件。[email protected]
微信:https://developers.weixin.qq.com/miniprogram/introduction/qrcode.html
支付宝:https://docs.alipay.com/mini/introduce/vzd5v0
原理解析:二维码实际上存放的是一串信息,我们将这一串信息设置成一串URL地址,微信或者支付宝扫描二维码之后解析出存放到二维码中的信息,由于我们在微信和支付宝中都进行了设置,扫描出这个规则的二维码后会跳转到我们设定的小程序内页面。所以就直接进入小程序了。
然后再记录一下使用java
生成二维码并且添加logo图片,二维码下方添加说明文字的代码。为了生成的二维码好看一些,我的logo图片使用了圆角,白色背景。
首先导入jar包
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.apache.commons.lang.StringUtils;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* @author LiuNaiJie
* on 2019-04-01
*/
public class QrCodeUtils {
/**
* 黑色
*/
private static final int QRCOLOR = 0xFF000000;
/**
* 白色
*/
private static final int BGWHITE = 0xFFFFFFFF;
/**
* 二维码宽
*/
private static final int WIDTH = 400;
/**
* 二维码高
*/
private static final int HEIGHT = 400;
/**
* 用于设置QR二维码参数
*/
private static Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>() {
private static final long serialVersionUID = 1L;
{
// 设置QR二维码的纠错级别(H为*别)具体级别信息
put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 设置编码方式
put(EncodeHintType.CHARACTER_SET, "utf-8");
put(EncodeHintType.MARGIN, 0);
}
};
/**
* @param logoFile logo图片
* @param codeFile 生成的二维码
* @param qrUrl 二维码内容
* @param note 二维码下方说明文字
*/
public static void drawLogoQRCode(File logoFile, File codeFile, String qrUrl, String note) {
try {
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
// 参数顺序分别为:二维码内容,编码类型,生成图片宽度,生成图片高度,设置参数
BitMatrix bm = multiFormatWriter.encode(qrUrl, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
// 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色
for (int x = 0; x < WIDTH; x++) {
for (int y = 0; y < HEIGHT; y++) {
image.setRGB(x, y, bm.get(x, y) ? QRCOLOR : BGWHITE);
}
}
int width = image.getWidth();
int height = image.getHeight();
//添加logo图片
if (Objects.nonNull(logoFile) && logoFile.exists()) {
// 构建绘图对象l
Graphics2D g = image.createGraphics();
// 读取logo图片
BufferedImage logo = ImageIO.read(logoFile);
// 开始绘制logo图片 logo大小为整体的 1/4 开始绘制的x,y为3/8处。
g.drawImage(logo, width * 3 / 8, height * 3 / 8, width / 4, height / 4, null);
g.dispose();
logo.flush();
}
// 添加下方说明文字
if (StringUtils.isNotEmpty(note)) {
// 新的图片,把带logo的二维码下面加上文字
BufferedImage outImage = new BufferedImage(400, 445, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D outg = outImage.createGraphics();
// 画二维码到新的面板
outg.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
// 画文字到新的面板
outg.setColor(Color.BLACK);
// 字体、字型、字号
outg.setFont(new Font("黑体", Font.PLAIN, 30));
int strWidth = outg.getFontMetrics().stringWidth(note);
// 画文字
outg.drawString(note, 200 - strWidth / 2, height + (outImage.getHeight() - height) / 2 + 12);
outg.dispose();
outImage.flush();
image = outImage;
}
image.flush();
ImageIO.write(image, "png", codeFile);
} catch (Exception e) {
e.printStackTrace();
}
}
}
最后使用main方法进行测试
public static void main(String[] args) {
File logoFile = new File("/xxx/logo.jpg");
File codeFile = new File("/xxx/content.png");
QrCodeUtils.drawLogoQRCode(logoFile,codeFile,"https://www.liunaijie.top","liunaijie.top");
}
最终生成如下的二维码: