【微信公众号开发】【9】生成带参数的二维码

前言:

1,目前有2种类型的二维码:

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

2,二维码参数是分类型的,场景值ID(scene_id:数字,scene_str:字符串),且限制了大小

3,扫描二维码后,对事件的处理(见第四章)

4,公众号迁移到新公众号,带参数二维码会失效,普通二维码会跳转到新公众号(解决方案:重新生成数据,已打印或截图的就没办法了)

正文:

accessToken 见第二章;最终获取的是一个链接,要转为图片见第七章
public static String QRCODE_URL = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s";
//生成带参数的永久二维码
public static String createQrcode(String param, String appName)
{
    logger.info("createQrcode begin");
    String access_token = getAccessToken(appName);    
    String ticket = QrcodeUtil.foreverStrQrcodeTicket(access_token, param);
    
    if (StringUtils.isEmpty(ticket)) { //生成ticket为null时,可能是access_token失效或为空,也可以重新获取一次
        logger.info(String.format("createQrcode ticket is null. appName:%s, param1:%s", appName, param));
        return "";
    }        
    
    String qrcodePath = String.format(WxConfig.QRCODE_URL, ticket);
    
    return qrcodePath;
}
 
 
QrcodeUtil  
public class QrcodeUtil {    
    
    public static Logger logger = LoggerFactory.getLogger(QrcodeUtil.class.getName());
    
    //获取永久数字参数二维码的ticket
    public static String foreverIntQrcodeTicket(String accessToken, int sceneId) 
    {
        String requestUrl = String.format(WxConfig.QRCODE_TICKET_URL, accessToken);
        String outputStr = "{\"action_name\": \"QR_LIMIT_SCENE\", \"action_info\":{\"scene\": {\"scene_id\":\"%s\"}}}";
        
        JSONObject jsonObject = HttpRequest.httpRequest(requestUrl, "POST", String.format(outputStr, sceneId));        
        String ticket = dealQrcodeTicketJson(accessToken, jsonObject);
        
        return ticket;
    }
    
    //获取永久字符参数二维码的ticket
    public static String foreverStrQrcodeTicket(String accessToken, String sceneStr) 
    {
        String requestUrl = String.format(WxConfig.QRCODE_TICKET_URL, accessToken);
        String outputStr = "{\"action_name\": \"QR_LIMIT_STR_SCENE\", \"action_info\":{\"scene\": {\"scene_str\":\"%s\"}}}";
        
        JSONObject jsonObject = HttpRequest.httpRequest(requestUrl, "POST", String.format(outputStr, sceneStr));        
        String ticket = dealQrcodeTicketJson(accessToken, jsonObject);
        
        return ticket;
    }
    
    //获取临时数字参数二维码的ticket
    public static String tempIntQrcodeTicket(String accessToken, int sceneId) 
    {
        String requestUrl = String.format(WxConfig.QRCODE_TICKET_URL, accessToken);
        String outputStr = "{\"expire_seconds\": 300, \"action_name\": \"QR_SCENE\", \"action_info\":{\"scene\": {\"scene_id\":\"%s\"}}}";
        
        JSONObject jsonObject = HttpRequest.httpRequest(requestUrl, "POST", String.format(outputStr, sceneId));        
        String ticket = dealQrcodeTicketJson(accessToken, jsonObject);
        
        return ticket;
    }
    
    //获取临时字符参数二维码的ticket
    public static String tempStrQrcodeTicket(String accessToken, String sceneStr) 
    {
        String requestUrl = String.format(WxConfig.QRCODE_TICKET_URL, accessToken);
        String outputStr = "{\"expire_seconds\": 300, \"action_name\": \"QR_STR_SCENE\", \"action_info\":{\"scene\": {\"scene_str\":\"%s\"}}}";
        
        JSONObject jsonObject = HttpRequest.httpRequest(requestUrl, "POST", String.format(outputStr, sceneStr));        
        String ticket = dealQrcodeTicketJson(accessToken, jsonObject);
        
        return ticket;
    }
    
    //共用方法
    public static String dealQrcodeTicketJson(String accessToken, JSONObject jsonObject) 
    {
        String ticket = null;
        
        if (null != jsonObject) {
            try {
                ticket = jsonObject.getString("ticket");
            }catch (Exception e) {
                logger.info(String.format("errorCode:%s;errmsg:%s", jsonObject.getString("errcode"), jsonObject.getString("errmsg")));
            }
        }
        
        return ticket;
    }
}
 
 
 

 

转载于:https://www.cnblogs.com/huashengweilong/p/7755777.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值