微信小程序二维码
前些天在做微信小程序二维码的生成,前面生成token就不说了,主要是生成二维码的接口,腾讯服务器返回的图片的二进制数据,用的另一个工具IOUtils,超轻松的,byte[] data = IOUtils.toByteArray(inputStream);就这样直接把输入流转换成字节组,写到本地文件里,格式为.png,就可以了,IOUtils这个工具在commons-io-2.5.jar这个包里面
代码如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
@WebServlet(name="GetWXCode", urlPatterns={"/getwxcode"})
public class GetWXCode extends HttpServlet
{
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
PrintWriter out = response.getWriter();
String Token = "";
String appid = "小程序APPID";
String secrect = "小程序秘钥";
JSONObject json = null;
String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid +
"&secret=" + secrect;
String getWxCodeUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=";
String mac = request.getParameter("mac") == null ? null : request.getParameter("mac").toString();
if (mac == null) {
out.println("<rep><code>1</code><msg>Missing parameters</msg></rep>");
return;
}
String path = " 缓存图片路径/img/" + mac + ".png";
File imgFile = new File(path);
if (imgFile.exists()) {
out.println("<!DOCTYPE html><html><head></head><body><img src=\"/img/" + mac +
".png" + "\" ></img>" + "</body>" + "</html>");
return;
}
ServletContext servletContext = getServletContext();
Token = servletContext.getAttribute("Token") == null ? null : servletContext.getAttribute("Token").toString();
long time = servletContext.getAttribute("token_time") == null ? 0L : ((Long)servletContext.getAttribute("token_time")).longValue();
long curTime = System.currentTimeMillis();
if ((Token == null) || (time == 0L) || (curTime - time > 6800000L))
{
json = HttpsUtils.httpsRequest(tokenUrl, "GET", null);
Token = json.get("access_token").toString();
servletContext.setAttribute("Token", Token);
servletContext.setAttribute("token_time", Long.valueOf(curTime));
}
try
{
if (Token != null)
{
getWxCodeUrl = getWxCodeUrl + Token;
JSONObject dataJson = new JSONObject();
dataJson.put("scene", mac);
dataJson.put("page", "pages/main2/main2");
byte[] rep = HttpXmlUtils.httpsRequestStream(getWxCodeUrl, "POST", dataJson.toString());
imgFile.createNewFile();
FileOutputStream outputStream = new FileOutputStream(imgFile);
outputStream.write(rep);
outputStream.flush();
outputStream.close();
out.println("<!DOCTYPE html><html><head></head><body><img src=\"/img/" +
mac + ".png" + "\" ></img>" + "</body>" + "</html>");
}
}
catch (Exception e) {
response.getWriter().append(e.toString());
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doGet(request, response);
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import org.apache.commons.io.IOUtils;
/**
* post提交xml格式的参数
*
*/
public class HttpXmlUtils {
/**
* post请求并得到返回结果
* @param requestUrl
* @param requestMethod
* @param output
* @return
*/
public static byte[] httpsRequestStream(String requestUrl, String requestMethod, String output) {
try{
URL url = new URL(requestUrl);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setRequestMethod(requestMethod);
if (null != output) {
OutputStream outputStream = connection.getOutputStream();
outputStream.write(output.getBytes("UTF-8"));
outputStream.close();
}
// 从输入流读取返回内容
InputStream inputStream = connection.getInputStream();
byte[] data = IOUtils.toByteArray(inputStream);
inputStream.close();
inputStream = null;
connection.disconnect();
return data;
}catch(Exception ex){
ex.printStackTrace();
}
return null;
}
}