微信公众号怎么生成带参数的二维码?

本文详细介绍如何在微信公众平台上生成带参数的二维码,包括注意事项、操作步骤及Java代码实现,适用于临时与永久二维码的创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每位运营过微信公众平台的野生小编都知道,微信提供给开发者的文档是很高深的,最近为了弄个带参数的二维码,同样技术小白的小编也死了不少脑细胞了,然而我终于知道官方生成带参数的二维码的方法了。

1、注意事项我知道你们是没有心情看注意事项的,但是很重要,所以我先摆上来。用户扫描带参数的二维码,可能推送以下两种事件:

1)如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。

2)如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者。是的,是把参数返回给开发者,也就是你自己,不是给用户推送特定信息或跳转到页面。(我也想要那种用户扫描关注后跳到指定页面的高级功能,也有一些微信号实现了,但是穷人家没有技术人员没有第三方平台的,我暂时不知道怎么做。憋问,让我研究了以后再分享给大家!)

2、找入口

好了现在正式来制作我们带参数的二维码吧。首先登录你的微信公众号,点击左下角【接口权限】,然后找到“生成带参数的二维码”,点击进入,这样我们就到了微信开发者文档的相关地方了。在这里插入图片描述在这里插入图片描述在这里插入图片描述
兑换二维码

如果上面的步骤都没有错误,这个时候以后就会返回一段ticket代码。复制“ticket”:后面双引号的那段代码,重新回到微信开发者文档,见下图红框内的链接点击进去,然后就会打开一个空白网页,然后把你复制的代码替代打开的网址链接后面的TICKET就可以了,见下图2的网址后面红色遮挡部分。这时就获得一个带参数的二维码图片啦,可以自行下载。
https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=
拿到token后根据官方文档选择所需要的二维码,是否是永久,来传入需要的参数
获取到ticket后直接在任意浏览器请求
在这里插入图片描述
在这里插入图片描述
附java代码实现获取ticket

package cn.xxs.wexingongzhonghao;

import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class CreateQRcode {

    private final static Logger log = LoggerFactory.getLogger(CreateQRcode.class);

    // 临时二维码
    private final static String QRSCENE = "QR_SCENE";
    // 临时二维码
    private final static String QRSCENESTR = "QR_STR_SCENE";
    // 永久二维码
    private final static String QR_LIMIT_SCENE = "QR_LIMIT_SCENE";
    // 永久二维码(字符串)
    private final static String QR_LIMIT_STR_SCENE = "QR_LIMIT_STR_SCENE";
    // 创建二维码
    private String create_ticket_path = "https://api.weixin.qq.com/cgi-bin/qrcode/create";
    // 通过ticket换取二维码
    private String showqrcode_path = "https://mp.weixin.qq.com/cgi-bin/showqrcode";

    /**
     * 创建临时带参数二维码 -- 数字
     * 获取临时带参二维码ticket
     *
     * @param accessToken
     * @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
     * @param sceneId 场景Id
     * @return
     */
    public String createTempTicket(String accessToken, String expireSeconds, int sceneId) {
        Map<String, Integer> intMap = new HashMap<>();
        intMap.put("scene_id", sceneId);
        Map<String, Map<String, Integer>> mapMap = new HashMap<>();
        mapMap.put("scene", intMap);
        Map<String, Object> paramsMap = new HashMap<>();
        paramsMap.put("expire_seconds", expireSeconds);
        paramsMap.put("action_name", QRSCENE);
        paramsMap.put("action_info", mapMap);
        String  jsonObject = JSONObject.toJSONString(paramsMap);
        String requestUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken;
        net.sf.json.JSONObject result = WeiXinUtil.doPostStr(requestUrl, jsonObject);
        log.info(result.get("ticket").toString());
        return result.get("ticket").toString();

    }
    /**
     * 创建临时带参数二维码 -- String
     * 获取临时带参二维码ticket
     *
     * @param accessToken
     * @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
     * @param str 场景string
     * @return
     */
    public String createTempStrTicket(String accessToken, String expireSeconds, String str) {
        Map<String, String> intMap = new HashMap<>();
        intMap.put("scene_str", str);
        Map<String, Map<String, String>> mapMap = new HashMap<>();
        mapMap.put("scene", intMap);
        Map<String, Object> paramsMap = new HashMap<>();
        paramsMap.put("expire_seconds", expireSeconds);
        paramsMap.put("action_name", QRSCENESTR);
        paramsMap.put("action_info", mapMap);
        String  jsonObject = JSONObject.toJSONString(paramsMap);
        String requestUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken;
        net.sf.json.JSONObject result = WeiXinUtil.doPostStr(requestUrl, jsonObject);
        log.info(result.get("ticket").toString());
        return result.get("ticket").toString();

    }
    @Test	//测试方法
    public void test(){
        createTempTicket("23_ASxxxxxxxxxxxxxxxxxxxxdmzSwAp2JHc59OIpYjuumDasBmTTAKQjxgtrouLTnTuoiryTmrXXxQLJt90cp5NoyfqjFQGYHEc_kmxATHM-wX4AYYgbz_0wHlFGt8JolC93ROZNeAJAITH","604800",100);
        createTempStrTicket("23_ASVQxxxxxxxxxxxxxxxxxxxxjgZveNdmzSwAp2JHc59OIpYjuumDasBmTTAKQjxgtrouLTnTuoiryTmrXXxQLJt90cp5NoyfqjFQGYHEc_kmxATHM-wX4AYYgbz_0wHlFGt8JolC93ROZNeAJAITH","604800","李四王五");
        createForeverTicket("23_ASVQdixxxxxxxxxxxxxxxxxxxxveNdmzSwAp2JHc59OIpYjuumDasBmTTAKQjxgtrouLTnTuoiryTmrXXxQLJt90cp5NoyfqjFQGYHEc_kmxATHM-wX4AYYgbz_0wHlFGt8JolC93ROZNeAJAITH",100);
         String ticket=  createForeverStrTicket("23_ASVQxxxxxxxxxxxxxxxxxxxxjgZveNdmzSwAp2JHc59OIpYjuumDasBmTTAKQjxgtrouLTnTuoiryTmrXXxQLJt90cp5NoyfqjFQGYHEc_kmxATHM-wX4AYYgbz_0wHlFGt8JolC93ROZNeAJAITH","张三");

		 getRQcode(ticket,"D:/QR_code");//将二维码生成在D:/QR_code目录下

    }

    /**
     * 创建永久二维码(数字)
     *
     * @param accessToken
     * @param sceneId
     *            场景Id
     * @return
     */
    public String createForeverTicket(String accessToken, int sceneId) {
        Map<String, Integer> intMap = new HashMap<>();
        intMap.put("scene_id", sceneId);
        Map<String, Map<String, Integer>> mapMap = new HashMap<>();
        mapMap.put("scene", intMap);
        Map<String, Object> paramsMap = new HashMap<>();
        paramsMap.put("action_name", QR_LIMIT_SCENE);
        paramsMap.put("action_info", mapMap);
        String  jsonObject = JSONObject.toJSONString(paramsMap);
        String requestUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken;
        net.sf.json.JSONObject result =  WeiXinUtil.doPostStr(requestUrl, jsonObject);
        log.info(result.get("ticket").toString());
        return result.get("ticket").toString();
    }

    /**
     * 创建永久二维码(字符串)
     *
     * @param accessToken
     * @param sceneStr
     *            场景str
     * @return
     */
    public String createForeverStrTicket(String accessToken, String sceneStr) {
        Map<String, String> intMap = new HashMap<>();
        intMap.put("scene_str", sceneStr);
        Map<String, Map<String, String>> mapMap = new HashMap<>();
        mapMap.put("scene", intMap);
        Map<String, Object> paramsMap = new HashMap<>();
        paramsMap.put("action_name", QR_LIMIT_STR_SCENE);
        paramsMap.put("action_info", mapMap);
        String  jsonObject = JSONObject.toJSONString(paramsMap);
        String requestUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken;
        net.sf.json.JSONObject result =  WeiXinUtil.doPostStr(requestUrl, jsonObject);
        log.info(result.get("ticket").toString());
        return result.get("ticket").toString();
    }
  /**
     * 二维码ticket,然后凭借ticket到指定URL换取二维码  -----创建带参数的二维码
     * @param ticket        二维码ticket
     * @param savepath      二维码保存路径
     * @return
     */
    public static String getRQcode(String ticket, String savepath)
    {
        String filepath = null;
        String requestUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET";
        try {
            requestUrl = requestUrl.replace("TICKET", URLDecoder.decode(ticket,"UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        try
        {
            URL url = new URL(requestUrl);
            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setDoInput(true);
            conn.setRequestMethod("GET");

            if (!savepath.endsWith("/"))
            {
                savepath += "/";
            }
            // 将ticket 作为文件名
            filepath = savepath + ticket + ".jpg";

            // 将微信服务器返回的输入流写入文件

            BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
            FileOutputStream fos = new FileOutputStream(new File(filepath));

            byte[] buf = new byte[8096];
            int size = 0;
            while ((size = bis.read(buf)) != -1)
                fos.write(buf, 0, size);
            fos.close();
            bis.close();

            System.out.println(conn);
            conn.disconnect();
            System.out.println("根据ticket换取二维码成功");
        } catch (Exception e)
        {
            filepath = null;
            System.out.println("根据ticket换取二维码失败" + e);
        }

        return filepath;

    }

}

WeiXinUtil消息请求发送工具类

import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class WeiXinUtil {
 /**
     * get请求
     * @param url
     * @return
     */
    public static JSONObject doGetStr(String url){
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        JSONObject jsonObject = null;
        try {
            HttpResponse response =httpClient.execute(httpGet);
            HttpEntity entity =response.getEntity();
            if(entity != null){
                String result = EntityUtils.toString(entity,"UTF-8");
                jsonObject = JSONObject.fromObject(result);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

         return jsonObject;
    }

    /**
     * post请求
     * @param url
     * @param outUrl
     * @return
     */
    public static JSONObject doPostStr(String url,String outUrl){
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        JSONObject jsonObject = null;

        try {
            httpPost.setEntity(new StringEntity(outUrl,"UTF-8"));
            HttpResponse response = httpClient.execute(httpPost);
            String result = EntityUtils.toString(response.getEntity(),"UTF-8");
            jsonObject = JSONObject.fromObject(result);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonObject;
    }

}
### Java 处理微信公众号带参数二维码URL并转换保存为图片 #### 创建二维码Ticket 为了从微信服务器获取带参数二维码,首先需要创建一个二维码ticket。这一步骤涉及到向微信公众平台发送HTTP POST请求来获得带有特定场景值的二维码ticket。 ```java import com.fasterxml.jackson.databind.ObjectMapper; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class WeChatQrCodeUtil { private static final String CREATE_QR_CODE_URL = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=ACCESS_TOKEN"; public static String createQRCodeTicket(String accessToken, int sceneId) throws Exception { OkHttpClient client = new OkHttpClient(); RequestBody body = new FormBody.Builder() .add("action_name", "QR_LIMIT_SCENE") // 或者 QR_SCENE 如果是临时二维码 .add("scene_id", String.valueOf(sceneId)) .build(); Request request = new Request.Builder() .url(CREATE_QR_CODE_URL.replace("ACCESS_TOKEN", accessToken)) .post(body) .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); ObjectMapper mapper = new ObjectMapper(); Map<String, Object> responseBodyMap = mapper.readValue(response.body().string(), HashMap.class); return (String) responseBodyMap.get("ticket"); } } } ``` 这段代码展示了如何构建POST请求以创建一个二维码ticket[^2]。 #### 使用Ticket换取二维码图像数据 一旦获得了有效的`ticket`,就可以利用它去交换实际的二维码图像。通常情况下,这个过程不需要额外的身份验证,因为ticket本身已经包含了必要的授权信息。 ```java import java.io.InputStream; import java.net.URL; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; public BufferedImage getQRCodeImageFromTicket(String ticket) throws Exception { URL qrImageUrl = new URL("https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + URLEncoder.encode(ticket)); InputStream inputStream = null; try { HttpURLConnection connection = (HttpURLConnection)qrImageUrl.openConnection(); connection.setRequestMethod("GET"); inputStream = connection.getInputStream(); return ImageIO.read(inputStream); // 返回BufferedImage对象以便后续操作 } finally { if (inputStream != null) { inputStream.close(); } } } ``` 上述函数接收一个`ticket`作为输入,并返回代表二维码图案的一个`BufferedImage`实例[^3]。 #### 将二维码图像保存至文件系统 最后一步就是把得到的二维码图像存储下来。可以使用标准库中的工具类完成这项工作: ```java import java.nio.file.Paths; import java.nio.file.Path; import java.io.File; public void saveQRCodeToFile(BufferedImage image, Path outputPath) throws IOException { File outputfile = new File(outputPath.toString()); ImageIO.write(image, "png", outputfile); } ``` 通过这种方式,能够有效地将来自微信API的带参二维码转化为本地磁盘上的PNG格式文件[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值