生成带参数二维码接口文档:生成带参数二维码
目前有2种类型的二维码:
临时二维码:临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量,主要用于帐号绑定等不要求二维码永久保存的业务场景
永久二维码:永久二维码,是无过期时间的,但数量较少(目前为最多10万个),主要用于适用于帐号绑定、用户来源统计等场景
获取带参数的二维码有两种方法:
先获取二维码ticket,然后凭借ticket通过接口换取二维码图片,但是得到ticket之前首先得获取微信全局唯一接口调用凭据
根据微信返回二维码中url参数自行生成二维码
二维码参数类型:
每次创建二维码ticket需要提供一个开发者自行设定的参数(scene_id),分别介绍临时二维码和永久二维码的创建二维码ticket过程。
参数可以是整型scene_id,也可以是字符串类型scene_str两种,区别如下:
scene_id | 场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000) |
scene_str | 场景值ID(字符串形式的ID),字符串类型,长度限制为1到64 |
渠道二维码的作用是方便公众号统计关注的来源,原理是用户扫描带参数的二维码,微信服务器会向开发者服务器推送一条带着EventKey参数消息:
EventKey :事件KEY值,qrscene_为前缀,后面为二维码的参数值
推送XML数据包示例:
注: 上面的"123123" 为二维码标识参数值,在用户扫码关注后,会推送上方XML数据包到我们的后台,然后可以从上面推送的XML数据包中获取该带参数二维码的标识符,当然,在代码里肯定是将XML转化成对应的实体类了,也就是从实体类里取出这个标识符,接下来可以进行业务判断了;当然如果是该用户已经关注了公众号,当他扫描带参数二维码时,将会直接推送key值,其实这种情况的不用统计,大家知道一下就好,本来做这个带参数二维码主要是为了统计通过不同渠道二维码扫码关注进来的粉丝数据;已关注的我们忽略不统计此情况;
com.github.binarywang
weixin-java-mp
3.0.0
1.已关注推送XML示例
//开发者微信号
//发送者账号(openid)
123456789 //消息创建时间
//消息类型event
//事件类型 event
//事件key值,是一个32位无符号整数,即创建二维码时的二维码scene_id
//二维码的ticke,可以用来换取二维码图片
EventKey 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id xml处理方式
2.未关注推送XML示例
//开发者微信号
//发送者账号(openid)
123456789 //消息创建时间(整型)
//消息类型 event
//事件类型(subscribe)
//事件KEY值,qrscene_为前缀,后面为二维码参数值
//二维码ticke值,可以用来换取二维码图片
EventKey 事件KEY值,qrscene_为前缀,后面为二维码的参数值
3. 演示对比,此处我设置带参数二维码的标识符为"123"
WeChatQrcodeUtils:
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
/**
*
* @Description: 生成带参数的二维码
* @Aouth: cao_wencao
* @Date: 2019-02-18 15:10
*
*/
@Slf4j
@Component
public class WeChatQrcodeUtils {
@Autowired
private WxMpService wxMpService;
/**
*
* 创建临时二维码ticket
* @param sceneId 场景值ID,临时二维码时为32位非0整型
* @param expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
* @auther: cao_wencao
* @date: 2019/2/18 16:58
*
*/
public WxMpQrCodeTicket qrCodeCreateTmpTicket(int sceneId, Integer expireSeconds) throws WxErrorException {
WxMpQrCodeTicket wxMpQrCodeTicket = wxMpService.getQrcodeService().qrCodeCreateTmpTicket(sceneId, expireSeconds);
return wxMpQrCodeTicket;
}
/**
*
* 创建临时二维码ticket
* @param sceneStr 场景值ID(字符串形式的ID),字符串类型,长度限制为1到64
* @param expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
* @auther: cao_wencao
* @date: 2019/2/18 17:01
*
*/
public WxMpQrCodeTicket qrCodeCreateTmpTicket(String sceneStr, Integer expireSeconds) throws WxErrorException {
WxMpQrCodeTicket wxMpQrCodeTicket = wxMpService.getQrcodeService().qrCodeCreateTmpTicket(sceneStr, expireSeconds);
return wxMpQrCodeTicket;
}
/**
*
* 创建永久二维码ticket
* @param sceneId 场景值ID,最大值为100000(目前参数只支持1--100000)
* @auther: cao_wencao
* @date: 2019/2/18 17:03
*
*/
public WxMpQrCodeTicket qrCodeCreateLastTicket(int sceneId) throws WxErrorException {
WxMpQrCodeTicket wxMpQrCodeTicket = wxMpService.getQrcodeService().qrCodeCreateLastTicket(sceneId);
return wxMpQrCodeTicket;
}
/**
*
* 创建永久字符串二维码ticket
* @param sceneStr 参数。字符串类型长度现在为1到64
* @auther: cao_wencao
* @date: 2019/2/18 17:05
*
*/
public WxMpQrCodeTicket qrCodeCreateLastTicket(String sceneStr) throws WxErrorException {
WxMpQrCodeTicket wxMpQrCodeTicket = wxMpService.getQrcodeService().qrCodeCreateLastTicket(sceneStr);
return wxMpQrCodeTicket;
}
/**
*
* 换取二维码图片文件,jpg格式
* @param ticket 二维码ticket
* @auther: cao_wencao
* @date: 2019/2/18 17:07
*
*/
public File qrCodePicture(WxMpQrCodeTicket ticket) throws WxErrorException {
File file = wxMpService.getQrcodeService().qrCodePicture(ticket);
return file;
}
/**
*
* 换取二维码图片url地址(可以选择是否生成压缩的网址)
* @param ticket 二维码ticket
* @param needShortUrl 是否需要压缩的二维码地址
* @auther: cao_wencao
* @date: 2019/2/18 17:10
*
*/
public String qrCodePictureUrl(String ticket, boolean needShortUrl) throws WxErrorException {
String qrCodeUrl = wxMpService.getQrcodeService().qrCodePictureUrl(ticket, needShortUrl);
return qrCodeUrl;
}
/**
*
* 换取二维码图片url地址
* @param ticket 二维码ticket
* @auther: cao_wencao
* @date: 2019/2/18 17:11
*
*/
public String qrCodePictureUrl(String ticket) throws WxErrorException {
String url = wxMpService.getQrcodeService().qrCodePictureUrl(ticket);
return url;
}
}
TestQrcodeController :
import com.thinkgem.jeesite.modules.wechat.commonUtil.WeChatQrcodeUtils;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
*
* @Desc: 测试生成带参数二维码, 2592000(有效期30天)
* @Package: com.thinkgem.jeesite.modules.wechat.controller
* @Author: cao_wencao
* @Date: 2019-04-08 10:30
*
*/
@Controller
@RequestMapping("/wechat/qrcode")
public class TestQrcodeController {
@Autowired
private WxMpService wxMpService;
@Autowired
private WeChatQrcodeUtils weChatQrcodeUtils;
/**
*
* @desc: 创建生成二维码
* @auth: cao_wencao
* @date: 2019/4/10 14:00
*
*/
@RequestMapping("/createQrcode")
@ResponseBody
public Object createQrcode(String expireSeconds, int sceneId) throws WxErrorException {
WxMpQrCodeTicket wxMpQrCodeTicket = weChatQrcodeUtils.qrCodeCreateTmpTicket(sceneId, Integer.valueOf(expireSeconds));
return wxMpQrCodeTicket;
}
/**
*
* @desc: 通过ticket获取二维码(长链接URL)
* @auth: cao_wencao
* @date: 2019/4/10 14:00
*
*/
@RequestMapping("/getQrcodeUrl")
@ResponseBody
public Object getQrcodeUrl(String ticket) throws WxErrorException {
String url = weChatQrcodeUtils.qrCodePictureUrl(ticket);
return url;
}
/**
*
* @desc: 通过ticket获取二维码(短链接URL)
* @auth: cao_wencao
* @date: 2019/4/10 14:01
*
*/
@RequestMapping("/qrCodePictureUrl")
@ResponseBody
public Object qrCodePictureUrl(String ticket) throws WxErrorException {
String urlPicture = weChatQrcodeUtils.qrCodePictureUrl(ticket,true);
// String url= urlPicture.replace("\\/", "/");
return urlPicture;
}
}
1. 通过有效期 expireSeconds=2592000和场景标识 sceneId=123创建带参数二维码
2.通过返回的ticket换取二维码图片url地址
3.效果展示