java微信公众号之带参二维码

公司因业务需求需要每个人都有自己的专属二维码,扫描此二维码可以直接关注公众号,并且要统计扫描每个人的二维码的次数。

先着手第一步吧,首先我们要获取appid和secret,接着就是通过这两个参数拿到access_token,因为token两个小时刷新一次,所以要定时的去获取获取将其存入数据库,用的时候取出来查询对比。闲话不说,上代码。

一、创建util工具类,此工具类包含了get/post请求

 //post请求
    public static String sendPost(String param, String url) {
         PrintWriter out = null;
         BufferedReader in = null;
         String result = "";
         try {
             URL realUrl = new URL(url);
             // 打开和URL之间的连接
             URLConnection conn = realUrl.openConnection();
             // 设置通用的请求属性
             conn.setRequestProperty("accept", "*/*");
             conn.setRequestProperty("connection", "Keep-Alive");
             conn.setRequestProperty("user-agent",
                       "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
             // 发送POST请求必须设置如下两行
             conn.setDoOutput(true);
             conn.setDoInput(true);
             // 获取URLConnection对象对应的输出流
             // out = new PrintWriter(conn.getOutputStream());
             out = new PrintWriter(new OutputStreamWriter(
                       conn.getOutputStream(), "utf-8"));
             // 发送请求参数
             out.print(param);
             // flush输出流的缓冲
             out.flush();
             // 定义BufferedReader输入流来读取URL的响应
             in = new BufferedReader(new InputStreamReader(
                       conn.getInputStream(), "UTF-8"));
             String line;
             while ((line = in.readLine()) != null) {
                  result += line;
             }
         } catch (Exception e) {
             System.out.println("发送 POST 请求出现异常!" + e);
             e.printStackTrace();
         }
         // 使用finally块来关闭输出流、输入流
         finally {
             try {
                  if (out != null) {
                       out.close();
                  }
                  if (in != null) {
                       in.close();
                  }
             } catch (IOException ex) {
                  ex.printStackTrace();
             }
         }
         return result;
    }
    
    /** 
     * 向指定URL发送GET方法的请求 
     *  
     */  
    public static String get(String url) {  
        BufferedReader in = null;  
        try {  
            URL realUrl = new URL(url);  
            // 打开和URL之间的连接  
            URLConnection connection = realUrl.openConnection();  
            // 设置通用的请求属性  
            connection.setRequestProperty("accept", "*/*");  
            connection.setRequestProperty("connection", "Keep-Alive");  
            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");  
            connection.setConnectTimeout(5000);  
            connection.setReadTimeout(5000);  
            // 建立实际的连接  
            connection.connect();  
            // 定义 BufferedReader输入流来读取URL的响应  
            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));  
            StringBuffer sb = new StringBuffer();  
            String line;  
            while ((line = in.readLine()) != null) {  
                sb.append(line);  
            }  
            return sb.toString();  
        } catch (Exception e) {  
        	
        }  
        // 使用finally块来关闭输入流  
        finally {  
            try {  
                if (in != null) {  
                    in.close();  
                }  
            } catch (Exception e2) {  
                e2.printStackTrace();  
            }  
        }  
        return null;  
    }  
    
二、再写一个用于创建二维码的方法(此处的scene_id自定义,用于辨别)
 /*生成临时二维码*/
    public static String getTemporaryQR(String access_token,String scene_id){
    	//String access_token="7_JekEGh-c4Op13Z-mDkFs07C6dquttZu4maa6ntxz6kYS0mD5x6rNyv-brIVJ1a5xCjrnkPNs26H1I49inCcbeMwn-KvH1mouOJT_G_dURAgozHRLwOP9xSVCtKoM30lB1zbFlKFk9tKjnqilJWMaADAZMC";
         //获取数据的地址(微信提供)
         String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+access_token+"";

         //发送给微信服务器的数据
         String jsonStr = "{\"expire_seconds\": 2592000,\"action_name\": \"QR_SCENE\", \"action_info\": {\"scene\": {\"						\": "+scene_id+"}}}";

         //将得到的字符串转化成json对象
         String response = sendPost(jsonStr, url);
         return response.toString();
    }

三、直接就是controller层,没有创建service层(此处代码还未优化,并且我是将access_token放在了数据库,所以我每次拿的时候需要去对比时间,大家可以写一个定时器)

	@RequestMapping("/getImg")
	@ResponseBody
	public void getImg(String account,HttpServletRequest request,HttpServletResponse resp) throws Exception{
		
		Wechattoken byId = imgService.getById(1);
		String access_token = null;
		if (byId==null) {
			String string = wechatImg.get(wechatImg.GET_TOKEN_URL+wechatImg.grant_type+"&"+wechatImg.APP_ID+"&"+wechatImg.SECRET);
			System.out.println(string);
			JSONObject fromObject = JSONObject.fromObject(string);
			access_token=fromObject.get("access_token").toString();
			Wechattoken tok = new Wechattoken();
			tok.setAccessToken(access_token);
			tok.setTime(DateTool.getTime());
			imgService.insert(tok);
		}else{
			String time1 = byId.getTime();
			String time2=DateTool.getTime();
			long minus = DateTool.getMinus(time1, time2);
			if (minus>115) {
				String string = wechatImg.get(wechatImg.GET_TOKEN_URL+wechatImg.grant_type+wechatImg.APP_ID+wechatImg.SECRET);
				JSONObject fromObject = JSONObject.fromObject(string);
				access_token=fromObject.get("access_token").toString();
				byId.setAccessToken(access_token);
				byId.setTime(DateTool.getTime());
				imgService.update(byId);
			}else{
				access_token=byId.getAccessToken();
			}
		}
		
		String scene_id=account;
		String temporaryQR = wechatImg.getTemporaryQR(access_token,scene_id);
		System.out.println(temporaryQR);
		JSONObject fromObject = JSONObject.fromObject(temporaryQR);
		String ticket = fromObject.get("ticket").toString();
		System.out.println(ticket);
		//wechatImg.downloadFile(wechatImg.DOWNLOADIMG+ticket, "F://image//"+account+"//"+account+".jpg");
		//DownLoadUtii.downloadAmachment(wechatImg.DOWNLOADIMG+ticket, account+".jpg", request, resp);
		json.put("account", account);
		json.put("ticket", ticket);
		json.put("errorMessage", errorMessage);
		json.put("resultCode", resultCode);
		ResponseTool.write(resp, json);
	}



### 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、付费专栏及课程。

余额充值