java 生成小程序带参数二维码

package com.cn.common;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;

import org.apache.log4j.Logger;

import com.alibaba.fastjson.JSON;
import com.cn.common.weChat.WeChatSendMessageUtil;

import net.sf.json.JSONObject;
import sun.util.logging.resources.logging;

/**
 * 小程序二维码带参数生成
 *
 */
public class AppletsQrCodeUtil {
	
	private static Logger log = Logger.getLogger(AppletsQrCodeUtil.class);
	
	/**
	 * 用于获取access_token
	 * @param params
	 * @param APIKEY 小程序id
	 * @param SECRETKEY	小程序密钥
	 * @return  access_token
	 * @throws Exception
	 */
	public static String postToken() throws Exception {
		String APIKEY = "";//小程序id
		String SECRETKEY = "";//小程序密钥
		String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+APIKEY+"&secret="+SECRETKEY;
		URL url = new URL(requestUrl);
		// 打开和URL之间的连接
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		connection.setRequestMethod("POST");
		// 设置通用的请求属性
		connection.setRequestProperty("Content-Type", "application/json");
		connection.setRequestProperty("Connection", "Keep-Alive");
		connection.setUseCaches(false);
		connection.setDoOutput(true);
		connection.setDoInput(true);

		// 得到请求的输出流对象
		DataOutputStream out = new DataOutputStream(connection.getOutputStream());
		out.writeBytes("");
		out.flush();
		out.close();

		// 建立实际的连接
		connection.connect();
		// 定义 BufferedReader输入流来读取URL的响应
		BufferedReader in = null;
		if (requestUrl.contains("nlp"))
			in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));
		else
			in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
		String result = "";
		String getLine;
		while ((getLine = in.readLine()) != null) {
			result += getLine;
		}
		in.close();
		com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(result);
		String accesstoken=jsonObject.getString("access_token");
		return accesstoken;
	}

	/**
	 * 生成带参小程序二维码
	 * @param sceneStr 参数
	 * @param accessToken token
	 * @param fileDir 存放目录
	 * @param fileName 文件名称(不含后缀)
	 * @param format  二维码图片格式,jpg/png
	 */
	private static void getminiqrQr(String sceneStr, String accessToken, String fileDir, String fileName, String format) {
		try
		{
			String url = ("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken);

			// 发送请求参数
			JSONObject paramJson = new JSONObject();
			paramJson.put("scene", sceneStr);
			paramJson.put("page", "pages/index/index"); // 这里特别注意前面不要加 '/'
			paramJson.put("width", 430);
			paramJson.put("auto_color", true); // 自动配置线条颜色
			paramJson.put("is_hyaline", true); // 背景色透明
			/**
			 * line_color生效
			 * paramJson.put("auto_color", false);
			 * JSONObject lineColor = new JSONObject();
			 * lineColor.put("r", 0);
			 * lineColor.put("g", 0);
			 * lineColor.put("b", 0);
			 * paramJson.put("line_color", lineColor);
			 * */

		    InputStream is = getQRCodeInputStream(url, paramJson.toString());
		    
		    File file = getFileByInputStream(is, fileDir, fileName + "." + format);
		    file.createNewFile();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	
	private static InputStream getQRCodeInputStream(String strURL, String params) {
	    try {
	        URL url = new URL(strURL);// 创建连接
	        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
	        connection.setDoOutput(true);
	        connection.setDoInput(true);
	        connection.setUseCaches(false);
	        connection.setInstanceFollowRedirects(true);
	        connection.setRequestMethod("POST"); // 设置请求方式
	        connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式
	        connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式
			connection.setRequestProperty("Connection", "Keep-Alive");
	        connection.connect();
	        OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); // utf-8编码
	        out.append(params);
	        out.flush();
	        out.close();
	        InputStream is = connection.getInputStream();
	        return is;

	    } catch (IOException e) {
		    return null;
	    }
	}
	
	private static File getFileByInputStream(InputStream is, String filePath, String fileName) {

		// 构造文件目录,若目录不存在,则创建目录
		if (!new File(filePath).exists()) {
			new File(filePath).mkdirs();
		}
		
		System.out.println(filePath);
		System.out.println(fileName);
		
	    File file=null;
	    if(is!= null&& !org.apache.commons.lang.StringUtils.isEmpty(filePath)&&!org.apache.commons.lang.StringUtils.isEmpty(fileName)){
	        try {
	            file=new File(filePath,fileName);//可以是任何图片格式.jpg,.png等
	            FileOutputStream fos=new FileOutputStream(file);
	            byte[] b = new byte[1024];
	            int nRead = 0;
	            while ((nRead = is.read(b)) != -1) {
	                fos.write(b, 0, nRead);
	            }
	            fos.flush();
	            fos.close();
	        } catch (IOException e) {
	        }
	    }
	    return file;
	}

	
	public static void main(String[] args) throws Exception {
		String accesstoken = postToken();
		System.out.println("accesstoken="+accesstoken);
		getminiqrQr("1", accesstoken, "D:\\", "小程序二维码", "jpg");
		
		// 注意:小程序必须正式发布且页面路径存在才可以生成
		// 如果保存文件为 1kb 时说明失败了,使用编码工具打开看里面的json错误信息对应去微信文档查看解决
	}
}

 

你可能感兴趣的:(Java)