一、简介
通过后台接口可以获取小程序任意页面的二维码,扫描该二维码可以直接进入小程序对应的页面。目前微信支持两种二维码,小程序码(左),小程序二维码(右),如下所示:
二、获取小程序码
目前有两个接口可以生成小程序码,开发者可以根据自己的需要选择合适的接口。
1.不带参数有限个数小程序码接口
适用于需要的码数量较少的业务场景
接口地址:
https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN
注:获取accesstoken的方法跟微信公众获取accesstoken方法一致,不过小程序获取accesstoken需要小程序的appid和appsercet。登录 https://mp.weixin.qq.com ,就可以在网站的“设置”-“开发者设置”中,查看到微信小程序的 AppID 了,注意不可直接使用服务号或订阅号的 AppID 。
(1)POST 参数说明
注意:通过该接口生成的小程序码,永久有效,但数量有效,请谨慎使用。用户扫描该码进入小程序后,将直接进入 path 对应的页面。
2.带参数无限个数小程序码接口(文章推荐带示例)
接口地址:
https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
获取accessToken的方法跟接口1一致。
(1)POST 参数说明
注意:通过该接口生成的小程序码,永久有效,数量暂无限制。用户扫描该码进入小程序后,开发者需在对应页面获取的码中 scene 字段的值,再做处理逻辑。使用如下代码可以获取到二维码中的 scene 字段的值。调试阶段可以使用开发工具的条件编译自定义参数 scene=xxxx 进行模拟,开发工具模拟时的 scene 的参数值需要进行 urlencode。同时需要注意,此接口的page参数中不能带任何参数,参数都在scene 参数中处理,切记!!!
3.获取普通小程序二维码(不推荐)
适用于需要的码数量较少的业务场景
接口地址:
https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=ACCESS_TOKEN
(1)POST 参数说明
注意:通过该接口生成的小程序二维码,永久有效,数量限制见文末说明,请谨慎使用。用户扫描该码进入小程序后,将直接进入 path 对应的页面。
三、通过调用接口获取二维码并通过io流直接打印至页面
1.模拟请求
package com.controller;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;
import org.apache.*;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.ConnectionPoolTimeoutException;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import com.alibaba.fastjson.JSONObject;
public class HttpRequest{
public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
try {
URL url = new URL(requestUrl);
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
httpUrlConn.setDoInput(true);
httpUrlConn.setDoOutput(true);
httpUrlConn.setUseCaches(false);
// 设置请求方式(GET/POST)
httpUrlConn.setRequestMethod(requestMethod);
// 设置连接主机服务器的超时时间:15000毫秒
httpUrlConn.setConnectTimeout(15000);
// 设置读取远程返回的数据时间:60000毫秒
httpUrlConn.setReadTimeout(60000);
if ("GET".equalsIgnoreCase(requestMethod)) {
httpUrlConn.connect();
}
// 当有数据需要提交时
if (outputStr != null) {
OutputStream outputStream = httpUrlConn.getOutputStream();
// 注意编码格式,防止中文乱码
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 将返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
jsonObject = JSONObject.parseObject(buffer.toString());
} catch (Exception e) {
e.printStackTrace();
}
return jsonObject;
}
/**
* 获取数据流
*
* @param url
* @param paraMap
* @return
*/
public static byte[] doImgPost(String url, Map<String, Object> paraMap) {
byte[] result = null;
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", "application/json");
try{
// 设置请求的参数
JSONObject postData = new JSONObject();
for (Map.Entry<String, Object> entry : paraMap.entrySet()) {
postData.put(entry.getKey(), entry.getValue());
}
httpPost.setEntity(new StringEntity(postData.toString(), "UTF-8"));
System.out.println("1"+postData.toString());
HttpClient httpClient = HttpClientBuilder.create().build();
HttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
// System.out.println("2"+EntityUtils.toString(entity));
result = EntityUtils.toByteArray(entity);
}catch (ConnectionPoolTimeoutException e){
e.printStackTrace();
}catch (ConnectTimeoutException e){
e.printStackTrace();
}catch (SocketTimeoutException e){
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}finally {
httpPost.releaseConnection();
}
return result;
}
}
2. io流打印至页面
package com.controller;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
@Controller
public class GetPhoUnlimited {
// 小程序二维码生成主程序 (获取无限制二维码)
@RequestMapping("getphUnlimited")
public static String listpayoff(HttpServletRequest request, HttpServletResponse response, String id)
throws Exception {
GetWxToken getAccessToken = new GetWxToken(); // 获取Token类 微信官方获取
String action = getAccessToken.getTokenCurl(false);
JSONObject jsonObject = JSONObject.parseObject(action);
//System.out.println(id.substring(id.length() - 4, id.length()));
try {
// 调用微信接口生成二维码
URL url = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="
+ jsonObject.getString("access_token"));
System.out.println(action);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");// 提交模式
httpURLConnection.setConnectTimeout(1000000);// 连接超时 单位毫秒
httpURLConnection.setReadTimeout(2000000);// 读取超时 单位毫秒
// 发送POST请求必须设置如下两行
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
// 获取URLConnection对象对应的输出流
PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
// 发送请求参数
JSONObject paramJson = new JSONObject();
// 二维码里携带的参数 String型 名称不可变
paramJson.put("scene", id.substring(id.length() - 4, id.length()));
// 注意该接口传入的是page而不是path
paramJson.put("page", "pages/article/article");
// 这是设置扫描二维码后跳转的页面
paramJson.put("width", 200);
paramJson.put("is_hyaline", true);
// paramJson.put("auto_color", true);
printWriter.write(paramJson.toString());
// flush输出流的缓冲
printWriter.flush();
// 开始获取数据
PrintWriter out = response.getWriter();
BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
int a = bis.read();
while (a != -1) {
out.print((char) a);
a = bis.read();
}
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
四、说明
1:通过该接口,仅能生成已发布的小程序的二维码。
2:可以在开发者工具预览时生成开发版的带参二维码。
3:接口1加上接口2,总共生成的码数量限制为100,000,请谨慎调用。
4 : POST 参数需要转成 json 字符串,不支持 form 表单提交。
5 : auto_color line_color 参数仅对小程序码生效。
参考文章
java微信小程序参数二维码生成带背景图加字体(无限生成)
java调用微信小程序API createwxaqrcode 产生二维码
RestTemplate下载文件
1 条评论
要发表评论,您必须先 登录