Java微信公众号开发之创建带参数二维码

【24】微信开发 同时被 2 个专栏收录
18 篇文章 3 订阅
24 篇文章 208 订阅

生成带参数二维码接口文档:生成带参数二维码

一、介绍

1.1、目前有2种类型的二维码:

1. 临时二维码:临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量,主要用于帐号绑定等不要求二维码永久保存的业务场景
2. 永久二维码:永久二维码,是无过期时间的,但数量较少(目前为最多10万个),主要用于适用于帐号绑定、用户来源统计等场景

1.2、获取带参数的二维码有两种方式:

 1. 如何获取:先获取二维码ticket,然后凭借ticket通过接口换取二维码图片,但是得到ticket之前首先得获取微信全局唯一接口调用凭据,根据微信返回二维码中url参数自行生成二维码

 2. 二维码参数类型:

每次创建二维码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数据包示例:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
<EventKey><![CDATA[qrscene_123123]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>

注: 上面的"123123" 为二维码标识参数值,在用户扫码关注后,会推送上方XML数据包到我们的后台,然后可以从上面推送的XML数据包中获取该带参数二维码的标识符,当然,在代码里肯定是将XML转化成对应的实体类了,也就是从实体类里取出这个标识符,接下来可以进行业务判断了;当然如果是该用户已经关注了公众号,当他扫描带参数二维码时,将会直接推送key值,其实这种情况的不用统计,大家知道一下就好,本来做这个带参数二维码主要是为了统计通过不同渠道二维码扫码关注进来的粉丝数据;已关注的我们忽略不统计此情况;

三、微信公众号开发框架   

<!-- 微信框架 参考:https://github.com/Wechat-Group/weixin-java-tools -->
      <dependency>
         <groupId>com.github.binarywang</groupId>
         <artifactId>weixin-java-mp</artifactId>
         <version>3.0.0</version>
      </dependency>

四、扫描带参数二维码事件推送

 这个推送的XML信息通过之前开发者中心处设置的服务器地址获得,因此需要现在微信开发者中心接入我们的服务器地址

开发者中心处设置的服务器地址如下图:

1.已关注推送XML示例

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>       //开发者微信号
<FromUserName><![CDATA[FromUser]]></FromUserName>   //发送者账号(openid)
<CreateTime>123456789</CreateTime>            //消息创建时间
<MsgType><![CDATA[event]]></MsgType>                   //消息类型event
<Event><![CDATA[SCAN]]></Event>              //事件类型 event
<EventKey><![CDATA[SCENE_VALUE]]></EventKey> //事件key值,是一个32位无符号整数,即创建二维码时的二维码scene_id 
<Ticket><![CDATA[TICKET]]></Ticket>                    //二维码的ticke,可以用来换取二维码图片
</xml>

 EventKey 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id xml处理方式

2.未关注推送XML示例

<xml><ToUserName><![CDATA[toUser]]></ToUserName>        //开发者微信号
<FromUserName><![CDATA[FromUser]]></FromUserName>       //发送者账号(openid)
<CreateTime>123456789</CreateTime>                //消息创建时间(整型)
<MsgType><![CDATA[event]]></MsgType>              //消息类型 event
<Event><![CDATA[subscribe]]></Event>              //事件类型(subscribe)
<EventKey><![CDATA[qrscene_123123]]></EventKey>//事件KEY值,qrscene_为前缀,后面为二维码参数值
<Ticket><![CDATA[TICKET]]></Ticket>           //二维码ticke值,可以用来换取二维码图片
</xml>

 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;

/**
 * <pre>
 * @Description: 生成带参数的二维码
 * @Aouth: cao_wencao
 * @Date: 2019-02-18 15:10
 * </pre>
 */
@Slf4j
@Component
public class WeChatQrcodeUtils {
    @Autowired
    private WxMpService wxMpService;

    /**
     * <pre>
     * 创建临时二维码ticket
     * @param sceneId       场景值ID,临时二维码时为32位非0整型
     * @param expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
     * @auther: cao_wencao
     * @date: 2019/2/18 16:58
     * </pre>
     */
    public WxMpQrCodeTicket qrCodeCreateTmpTicket(int sceneId, Integer expireSeconds) throws WxErrorException {
        WxMpQrCodeTicket wxMpQrCodeTicket = wxMpService.getQrcodeService().qrCodeCreateTmpTicket(sceneId, expireSeconds);
        return wxMpQrCodeTicket;
    }

    /**
     * <pre>
     * 创建临时二维码ticket
     * @param sceneStr      场景值ID(字符串形式的ID),字符串类型,长度限制为1到64
     * @param expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
     * @auther: cao_wencao
     * @date: 2019/2/18 17:01
     * </pre>
     */
    public WxMpQrCodeTicket qrCodeCreateTmpTicket(String sceneStr, Integer expireSeconds) throws WxErrorException {
        WxMpQrCodeTicket wxMpQrCodeTicket = wxMpService.getQrcodeService().qrCodeCreateTmpTicket(sceneStr, expireSeconds);
        return wxMpQrCodeTicket;
    }

    /**
     * <pre>
     * 创建永久二维码ticket
     * @param sceneId 场景值ID,最大值为100000(目前参数只支持1--100000)
     * @auther: cao_wencao
     * @date: 2019/2/18 17:03
     * </pre>
     */
    public WxMpQrCodeTicket qrCodeCreateLastTicket(int sceneId) throws WxErrorException {
        WxMpQrCodeTicket wxMpQrCodeTicket = wxMpService.getQrcodeService().qrCodeCreateLastTicket(sceneId);
        return wxMpQrCodeTicket;
    }

    /**
     * <pre>
     * 创建永久字符串二维码ticket
     * @param sceneStr 参数。字符串类型长度现在为1到64
     * @auther: cao_wencao
     * @date: 2019/2/18 17:05
     * </pre>
     */
    public WxMpQrCodeTicket qrCodeCreateLastTicket(String sceneStr) throws WxErrorException {
        WxMpQrCodeTicket wxMpQrCodeTicket = wxMpService.getQrcodeService().qrCodeCreateLastTicket(sceneStr);
        return wxMpQrCodeTicket;
    }

    /**
     * <pre>
     * 换取二维码图片文件,jpg格式
     * @param ticket 二维码ticket
     * @auther: cao_wencao
     * @date: 2019/2/18 17:07
     * </pre>
     */
    public File qrCodePicture(WxMpQrCodeTicket ticket) throws WxErrorException {
        File file = wxMpService.getQrcodeService().qrCodePicture(ticket);
        return file;

    }

    /**
     * <pre>
     * 换取二维码图片url地址(可以选择是否生成压缩的网址)
     * @param ticket       二维码ticket
     * @param needShortUrl 是否需要压缩的二维码地址
     * @auther: cao_wencao
     * @date: 2019/2/18 17:10
     * </pre>
     */
    public String qrCodePictureUrl(String ticket, boolean needShortUrl) throws WxErrorException {
        String qrCodeUrl = wxMpService.getQrcodeService().qrCodePictureUrl(ticket, needShortUrl);
        return qrCodeUrl;
    }

    /**
     * <pre>
     * 换取二维码图片url地址
     * @param ticket 二维码ticket
     * @auther: cao_wencao
     * @date: 2019/2/18 17:11
     * </pre>
     */
    public String qrCodePictureUrl(String ticket) throws WxErrorException {
        String url = wxMpService.getQrcodeService().qrCodePictureUrl(ticket);
        return url;
    }

}

六、测试生成带参数二维码Controller

  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;

/**
 * <pre>
 * @Desc: 测试生成带参数二维码,   2592000(有效期30天)
 * @Package: com.thinkgem.jeesite.modules.wechat.controller
 * @Author: cao_wencao
 * @Date: 2019-04-08 10:30
 * </pre>
 */
@Controller
@RequestMapping("/wechat/qrcode")
public class TestQrcodeController {
    @Autowired
    private WxMpService wxMpService;
    @Autowired
    private WeChatQrcodeUtils weChatQrcodeUtils;

    /**
     * <pre>
     * @desc: 创建生成二维码
     * @auth: cao_wencao
     * @date: 2019/4/10 14:00
     * </pre>
     */
    @RequestMapping("/createQrcode")
    @ResponseBody
    public Object createQrcode(String expireSeconds, int sceneId) throws WxErrorException {
        WxMpQrCodeTicket wxMpQrCodeTicket = weChatQrcodeUtils.qrCodeCreateTmpTicket(sceneId, Integer.valueOf(expireSeconds));
        return wxMpQrCodeTicket;
    }

    /**
     * <pre>
     * @desc: 通过ticket获取二维码(长链接URL)
     * @auth: cao_wencao
     * @date: 2019/4/10 14:00
     * </pre>
     */
    @RequestMapping("/getQrcodeUrl")
    @ResponseBody
    public Object getQrcodeUrl(String ticket) throws WxErrorException {
        String url = weChatQrcodeUtils.qrCodePictureUrl(ticket);
        return url;
    }

    /**
     * <pre>
     * @desc: 通过ticket获取二维码(短链接URL)
     * @auth: cao_wencao
     * @date: 2019/4/10 14:01
     * </pre>
     */
    @RequestMapping("/qrCodePictureUrl")
    @ResponseBody
    public Object qrCodePictureUrl(String ticket) throws WxErrorException {
        String urlPicture = weChatQrcodeUtils.qrCodePictureUrl(ticket,true);
       // String url= urlPicture.replace("\\/", "/");
        return urlPicture;
    }
}

 

七、通过postman创建、换取带参数二维码图片

  1. 通过有效期 expireSeconds=2592000和场景标识 sceneId=123创建带参数二维码

2.通过返回的ticket换取二维码图片url地址

3.效果展示

 
  • 3
    点赞
  • 2
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值