本人也是初学者有不对的地方欢迎指出.所有自己总结一下希望能帮到大家!
我尝试了两种方式后去小程序二维码,
第一种 前台请求获取的方式 用的都是B接口 注意:这个接口只有项目上线了才能扫出来
调用这个接口前你需要获取access_token 凭证
这几个必要条件
一般都是放在后台去请求我用的是Java , 我工具类和调用 我是在别人的基础上加了自己的方法,工具类需要根据自己的要求做修改.
工具类 调用getminiqrQr的时候需要根据自己的情况修改下 其他的不用
package com.esmall.utils;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import com.esmall.core.common.CommonConstants;
import com.esmall.core.common.Constants;
import com.qq.connect.utils.json.JSONObject;
public class HttpRequest {
public static void main(String[] args) {
// 发送 GET 请求
String s = HttpRequest.sendGet("http://v.qq.com/x/cover/kvehb7okfxqstmc.html?vid=e01957zem6o", "");
System.out.println(s);
// //发送 POST 请求
// String
// sr=HttpRequest.sendPost("http://www.toutiao.com/stream/widget/local_weather/data/?city=%E4%B8%8A%E6%B5%B7",
// "");
// JSONObject json = JSONObject.fromObject(sr);
// System.out.println(json.get("data"));
}
/**
* 向指定URL发送GET方法的请求
*
* @param url
* 发送请求的URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和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.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
/**
* 向指定 URL 发送POST方法的请求
*
* @param url
* 发送请求的 URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public static String sendPost(String url, String param) {
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.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
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;
}
/**
* 生成带参小程序二维码
*
* @param sceneStr
* 参数
* @param accessToken
* token
*/
public static String getminiqrQr(String sceneStr, String accessToken,) {
String result = "";
try {
URL url = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");// 提交模式
// 设置通用的请求属性
// httpURLConnection.setRequestProperty("content-type",
// "application/json");
httpURLConnection.setRequestProperty("accept", "*/*");
httpURLConnection.setRequestProperty("connection", "Keep-Alive");
httpURLConnection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// conn.setConnectTimeout(10000);//连接超时 单位毫秒
// conn.setReadTimeout(2000);//读取超时 单位毫秒
// 发送POST请求必须设置如下两行
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
// 获取URLConnection对象对应的输出流
PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
// 发送请求参数 这里根据自己的需要
JSONObject paramJson = new JSONObject();
paramJson.put("scene", sceneStr);
// paramJson.put("page", "pages/index/index");
paramJson.put("width", 430);
// paramJson.put("auto_color", 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);
*/
printWriter.write(paramJson.toString());
// flush输出流的缓冲
printWriter.flush();
BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
String originalFilename = null;
// 二维码的地址
String url = ""; // 需要存放的文件路径
File file = new File("");//这里的是路径写到你要放的文件夹那层就可以了 没有就会创建
if(!file.exists()){
file.mkdirs();
}
OutputStream os = new FileOutputStream(new File(url));
// FileUtils.copyInputStreamToFile(myfile.getInputStream(), new
// File(realPath, originalFilename));
int len;
byte[] arr = new byte[1024];
while ((len = bis.read(arr)) != -1) {
os.write(arr, 0, len);
os.flush();
}
os.close();
result = 返回二维码路径地址;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
这个是调用的方法
@RequestMapping(value = “/thinkChange”)
@ResponseBody
public Map<String, Object> thinkChange(
@RequestParam(required = false, value = “wechatId”, defaultValue = “”) String wechatId,
@RequestParam(required = false, value = “memberId”, defaultValue = “”) String memberId)
throws JSONException {
Map<String, Object> map = Maps.newHashMap();
// 小程序唯一标识 填写自己的
String wxspAppid = “”;
// app secret 填写自己的
String wxspSecret = “”;
// 二维码参数值
String paramss = “grant_type=client_credential&appid=” + wxspAppid + “&secret=” + wxspSecret;
// 生成二维吗的 access_token 值
String srs = HttpRequest.sendGet(“https://api.weixin.qq.com/cgi-bin/token”, paramss);
// 解析相应内容(转换成json对象)
JSONObject json = new JSONObject(srs);
// 获取accessToken的凭证
String accessToken = json.get(“access_token”).toString();
String scene = “”;
// 二维码接口
String getminiqrQr = HttpRequest.getminiqrQr(scene, accessToken);
map.put("qrQr", getminiqrQr);
System.out.print(map);
return map;
}
还有一种js直接调用 我是看了下面这个人的博客 是可以实现的 传送门
https://blog.csdn.net/qq_41473887/article/details/81335977
我用上面的方法实现了 我碰到了个问题是 就是需要请求两次才能把生成二维码.我也不知道什么原因.
对了 因为我用的是Java后台下载本地了 要给用户一个点击下载到相册
//将图片保存到相册
wx.downloadFile({
url: scanLife,
success: function(res) {
//图片保存到本地
wx.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: function(data) {
wx.hideLoading()
wx.showModal({
title: ‘提示’,
content: ‘您的推广海报已存入手机相册,赶快分享给好友吧’,
showCancel: false,
})
},
fail: function(err) {
if (err.errMsg === “saveImageToPhotosAlbum:fail:auth denied” || err.errMsg === “saveImageToPhotosAlbum:fail auth deny”) {
// 这边微信做过调整,必须要在按钮中触发,因此需要在弹框回调中进行调用
wx.showModal({
title: ‘提示’,
content: ‘需要您授权保存相册’,
showCancel: false,
success: modalSuccess => {
wx.openSetting({
success(settingdata) {
console.log(“settingdata”, settingdata)
if (settingdata.authSetting[‘scope.writePhotosAlbum’]) {
wx.showModal({
title: ‘提示’,
content: ‘获取权限成功,再次点击图片即可保存’,
showCancel: false,
})
} else {
wx.showModal({
title: ‘提示’,
content: ‘获取权限失败,将无法保存到相册哦~’,
showCancel: false,
})
}
},
fail(failData) {
console.log(“failData”, failData)
},
complete(finishData) {
console.log(“finishData”, finishData)
}
})
}
})
}
},
complete(res) {
wx.hideLoading()
}
})
},
fail: function (err){
}
})
这个是接口调试 可以知道你的接口是不是有用
https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=基础支持&form=获取access_token接口 /token
写的比较乱 见谅 有意见可以提出 我会改修改 应为上面的只是一个大概按自己的情况修改,
借鉴了很多别人的博客 谢谢大神!