Java微信公众平台开发之生成带参二维码(Spring Boot 2.X)

微信官方提供的生成二维码接口得到的是当前公众号的二维码官方文档(一定要先看)
目前有2种类型的二维码:
临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量,主要用于帐号绑定等不要求二维码永久保存的业务场景
永久二维码,是无过期时间的,但数量较少(目前为最多10万个),主要用于适用于帐号绑定、用户来源统计等场景
获取带参数的二维码有两种方法
先获取二维码ticket,然后凭借ticket通过接口换取二维码图片,但是得到ticket之前首先得获取微信全局唯一接口调用凭据
根据微信返回二维码中url参数自行生成二维码

一、获取微信全局接口调用凭证

调用接口时,请登录“微信公开发-基本配置”提前将服务器IP地址添加到IP白名单中,否则将无法调用成功!!!

二、获取二维码的Ticket

 /**
     * 创建临时带参数二维码
     *
     * @param accessToken
     * @param sceneId     场景Id
     * @return
     * @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
     */
    @Override
    public String createTempTicket(String accessToken, int sceneId, int expireSeconds) {
        TreeMap<String, String> params = new TreeMap<>();
        params.put("access_token", accessToken);
        // output data
        JsonObject data = new JsonObject();
        data.addProperty("action_name", QRCodeConstant.QR_SCENE);
        data.addProperty("expire_seconds", expireSeconds);
        JsonObject scene = new JsonObject();
        scene.addProperty("scene_id", sceneId);
        JsonObject actionInfo = new JsonObject();
        actionInfo.add("scene", scene);
        data.add("action_info", actionInfo);
        String result = HttpUtil.doPost(WechatQRCodeConfig.getCreateTicketUrl(), params, data.toString());
        WechatQRCode qrcode = JsonUtil.fromJson(result, WechatQRCode.class);
        return qrcode == null ? null : qrcode.getTicket();
    }

    /**
     * 创建临时带参数二维码(字符串)
     *
     * @param accessToken
     * @param sceneStr    场景Id
     * @return
     * @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
     */
    @Override
    public String createTempTicket(String accessToken, String sceneStr, int expireSeconds) {
        TreeMap<String, String> params = new TreeMap<>();
        params.put("access_token", accessToken);
        // output data
        JsonObject data = new JsonObject();
        data.addProperty("action_name", QRCodeConstant.QR_STR_SCENE);
        data.addProperty("expire_seconds", expireSeconds);
        JsonObject scene = new JsonObject();
        scene.addProperty("scene_str", sceneStr);
        JsonObject actionInfo = new JsonObject();
        actionInfo.add("scene", scene);
        data.add("action_info", actionInfo);
        String result = HttpUtil.doPost(WechatQRCodeConfig.getCreateTicketUrl(), params, data.toString());
        WechatQRCode qrcode = JsonUtil.fromJson(result, WechatQRCode.class);
        return qrcode == null ? null : qrcode.getTicket();
    }

    /**
     * 创建永久二维码(数字)
     *
     * @param accessToken
     * @param sceneId     场景Id
     * @return
     */
    @Override
    public String createForeverTicket(String accessToken, int sceneId) {
        TreeMap<String, String> params = new TreeMap<>();
        params.put("access_token", accessToken);
        // output data
        JsonObject data = new JsonObject();
        data.addProperty("action_name", QRCodeConstant.QR_LIMIT_SCENE);
        JsonObject scene = new JsonObject();
        scene.addProperty("scene_id", sceneId);
        JsonObject actionInfo = new JsonObject();
        actionInfo.add("scene", scene);
        data.add("action_info", actionInfo);
        String result = HttpUtil.doPost(WechatQRCodeConfig.getCreateTicketUrl(), params, data.toString());
        WechatQRCode qrcode = JsonUtil.fromJson(result, WechatQRCode.class);
        return qrcode == null ? null : qrcode.getTicket();
    }

    /**
     * 创建永久二维码(字符串)
     *
     * @param accessToken
     * @param sceneStr    场景str
     * @return
     */
    @Override
    public String createForeverTicket(String accessToken, String sceneStr) {
        TreeMap<String, String> params = new TreeMap<>();
        params.put("access_token", accessToken);
        // output data
        JsonObject data = new JsonObject();
        data.addProperty("action_name", "QR_LIMIT_STR_SCENE");
        JsonObject actionInfo = new JsonObject();
        JsonObject scene = new JsonObject();
        scene.addProperty("scene_str", sceneStr);
        actionInfo.add("scene", scene);
        data.add("action_info", actionInfo);
        String result = HttpUtil.doPost(WechatQRCodeConfig.getCreateTicketUrl(), params, data.toString());
        WechatQRCode qrcode = JsonUtil.fromJson(result, WechatQRCode.class);
        return qrcode == null ? null : qrcode.getTicket();
    }

三、二维码长链接转成短链接

微信返回正确的二维码的结果,参数有个url,即二维码图片解析后的地址,也可以根据此URL生成需要的二维码图片,而不需要通过ticket去换取图片了

  /**
     * 长链接转短链接
     *
     * @param accessToken
     * @param longUrl     长链接
     * @return
     */
    private String toShortQRCodeurl(String accessToken, String longUrl) {
        TreeMap<String, String> params = new TreeMap<>();
        params.put("access_token", accessToken);
        JsonObject data = new JsonObject();
        data.addProperty("action", QRCodeConstant.LONG_TO_SHORT);
        data.addProperty("long_url", longUrl);
        String result = HttpUtil.doPost(WechatQRCodeConfig.getShortQrcodeUrl(),
                params, data.toString());
        WechatQRCodeShortUrl wechatQRCodeShortUrl = JsonUtil.fromJson(result, WechatQRCodeShortUrl.class);
        return wechatQRCodeShortUrl == null ? null : wechatQRCodeShortUrl.getShortUrl();
    }

四、通过ticket凭证直接获取二维码

   /**
     * 获取二维码ticket后,通过ticket换取二维码图片展示
     *
     * @param accessToken
     * @param ticket
     * @param isShortUrl  是否需要展示
     * @return
     */
    @Override
    public String showQrCode(String accessToken, String ticket, boolean isShortUrl) {
        String url = String.format(WechatQRCodeConfig.getShowQrcodeUrl(), EncodeUtils.urlEncode(ticket));
        if (isShortUrl) {
            return toShortQRCodeurl(accessToken, url);
        }
        return url;
    }

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

推送的XML信息通过之前开发者中心处设置的服务器地址获得,故得先接入

已关注推送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>

EventKey 事件KEY值,qrscene_为前缀,后面为二维码的参数值

未关注推送XML示例

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

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

具体源码:https://github.com/philjing/my_wechat

原文地址:https://www.cnblogs.com/phil_jing/p/12077931.html

时间: 2024-11-08 17:41:34

Java微信公众平台开发之生成带参二维码(Spring Boot 2.X)的相关文章

微信公众平台开发(83) 生成带参数二维码

本文介绍在微信公众平台上如何使用高级接口开发生成带参数二维码的功能. 一.场景二维码 为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送. 目前有2种类型的二维码,分别是临时二维码和永久二维码,前者有过期时间,最大为1800秒,但能够生成较多数量,后者无过期时间,数量较少(目前参数只支持1--100000).两种二维码分别适用于帐号绑定.用户来源统计等场景. 用户扫描带场景值二维码时,可能推送以下

微信公众平台开发(83) 生成带参数二维码(转)

本文介绍在微信公众平台上如何使用高级接口开发生成带参数二维码的功能. 一.场景二维码 为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送. 目前有2种类型的二维码,分别是临时二维码和永久二维码,前者有过期时间,最大为1800秒,但能够生成较多数量,后者无过期时间,数量较少(目前参数只支持1--100000).两种二维码分别适用于帐号绑定.用户来源统计等场景. 用户扫描带场景值二维码时,可能推送以下

0033 微信公众平台开发 (08 带参二维码)

带参二维码是微信公众号用来管理用户的重要手段. 如果根据客户ID生成带参二维码,那么,当另一个客户扫描这个二维码时,公众号就能够接收到这个参数,并把这个参数设置为客户的上线.以此类推,可以把客户来源全部理清楚,有很大的商业价值. 如果根据组织ID生成带参二维码,就可以自动知道客户来源于什么组织. 总之,参带二维码的关键在于场景值,我们可以设置业务需要的任何场景值,通过用户扫码,来获取这个场景值. 1 生成带参二维码 在Applications/WeChat/views下创建文件,名为:Wecha

微信公众平台开发(2)扫描二维码添加公众账号

作者做过微信二维码和地理信息的程序,本章介绍一下获取二维码和处理用户扫描二维码的过程. 要想开通生成二维码api必须是认证的服务号,如果没有可以采用公众平台测试账号,地址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 登陆后台的界面如图: 终于看到了传说中的appID,appsecret. 当微信用户扫描二维码时,实现两个功能: 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者.

Java微信公众平台开发_02_启用服务器配置

一.准备阶段 需要准备事项: 1.一个能在公网上访问的项目: 见:[  Java微信公众平台开发_01_本地服务器映射外网  ] 2.一个微信公众平台账号: 去注册:(https://mp.weixin.qq.com/) 3.策略文件 见:[ Java企业微信开发_Exception_02_java.security.InvalidKeyException: Illegal key size ] 4.微信官方消息加解密工具包 需要下载微信官方的消息加解密的工具包,主要是AES加密工具 下载地址:

Java微信公众平台开发模式+自定义按钮源码

首先,想用开放模式需要先成为开发者.成为开发者有两种写法. 一是:通过jsp页面,用out.print("echostr")//SHA1加密的字符串: 二是:通过Servlet.doGet返回exhostr,给微信平台. 这里我只写第二种方式的请求(这里的请求是以get方式请求),代码如下: import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.ut

Java微信公众平台开发--番外篇,对GlobalConstants文件的补充

转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是很完全所以导致部分同学在有些地方做开发的时候遇到了一些阻力,收到这些朋友同学们的咨询反馈之后我也做了一些反思和总结,其中一部分同学说少了GlobalConstants这个文件(这个真心占的不少),还有一部分就是说源码的问题,所以今天特意抽了时间补充下这两点! (一)关于GlobalConstants

ajax加一般处理程序或ASP.NET 后台生成带着二维码的图片

ajax加一般处理程序生成带着二维码的图片 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head

python生成带参数二维码

#coding:utf8 import urllib2 import urllib import json import string import random class WebChat(object): def __init__(self, appid=None, secret=None, code=None): self.appid = appid self.secret = secret self.code = code def token_url(self): return "htt