开会的时候突然说了一句需求更变。。要求把普通二维码改成小程序带参二维码。。当时听完一脸懵逼的我。。。无奈。。第一次写小程序生成二维码。。一点头绪没有。。然后就。。去看官方文档。。额。。看得似懂非懂。。尴尬!!。。不说了。。直接看代码吧。。唉。。过程很曲折。。结局很美好。。还有注意。。我下文中踩过的坑!!一定要注意!!( 代码可直接复制粘贴使用 )
因为我接到的需求是,写一个代参的小程序码,这里我们就只贴出来了用到的 API 文档,详情请查看文档:
获取小程序码 API 文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html
这里需要注意的是:
至于啥是接口A..算了。。贴出来吧。。
接口 A :
适用于需要的码数量较少的业务场景。通过该接口生成的小程序码,永久有效,有数量限制,数量限制就上图..额..上上图
接口 B :
适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制
!!!这里我们用的是接口 B !!!直接进入正题!!!
首先获取 access_token :
咋获取。。额。。就是。。个人理解。。appid 和 secret 一拼就是 access_token 。。仅限个人理解哈!!
获取 access_token API 文档 :https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
这里我们用到这两个。。我也就只认识这两个。。咳咳
这个地方的请求方式 是 GET 方式 ,千万注意它的请求方式。。额。。GET 也是默认请求方式,官方文档有!
代码段:
/**
* @param 用于获取access_token
* @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.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();
JSONObject jsonObject = JSON.parseObject(result);
String accesstoken=jsonObject.getString("access_token");
return accesstoken;
}
这个时候如果你 ID 和 ** 没错的话应该就能获取到 access_token 了
然后就是拿着我们的 access_token 去获取。。正主了!!!
注意这个地方的请求方式是 post !!!如果不转换提交方式会报错 43002
请求成功返回的是二进制数据,失败则返回 JSON 。。注意解析 JSON 查看错误码
详细请查看 API 文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/getWXACodeUnlimit.html
参数啥的我就不说了。。看文档。。我是来记录踩得坑的!!
代码段:
/**
* 生成带参小程序二维码
* @param scene 要输入的内容
* @param accessToken token
*/
public static void postMiniqrQr(String scene, String accessToken) {
try{
URL url = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+accessToken);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
// conn.setConnectTimeout(10000);//连接超时 单位毫秒
// conn.setReadTimeout(2000);//读取超时 单位毫秒
// 发送POST请求必须设置如下两行
httpURLConnection.setDoOutput(true); // 打开写入属性
httpURLConnection.setDoInput(true); // 打开读取属性
httpURLConnection.setRequestMethod("POST");// 提交方式
// 不得不说一下这个提交方式转换!!真的坑。。改了好长时间!!一定要记得加响应头
httpURLConnection.setRequestProperty("Content-Type", "application/x-javascript; charset=UTF-8");// 设置响应头
// 获取URLConnection对象对应的输出流
PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
// 发送请求参数
JSONObject paramJson = new JSONObject();
paramJson.put("scene", scene); // 你要放的内容
paramJson.put("path", "pages/index/index");
paramJson.put("width", 430); // 宽度
paramJson.put("auto_color", true);
printWriter.write(paramJson.toString());
// flush输出流的缓冲
printWriter.flush();
BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
//创建一个空文件
OutputStream os = new FileOutputStream(new File("C:/test/test.jpg"));
//ByteArrayOutputStream os = new ByteArrayOutputStream();
int len;
byte[] arr = new byte[1024];
while ((len = bis.read(arr)) != -1)
{
os.write(arr, 0, len);
os.flush();
}
os.close();
// 上传云储存
//InputStream is = new ByteArrayInputStream(os.toByteArray());
//retMap = UploadUtils.upload(is);
}
catch (Exception e)
{
e.printStackTrace();
}
}
重点标记一下!!!!加响应头!!!响应头!!!响应头!!!坑死我了。。百度了很久才找到一个正确的。。东拼西凑。。唉。。闹心。。对了。。关于小程序的错误码:https://www.cnblogs.com/lonhon/p/9660726.html 。。。至于为什么贴这个你们懂得。。哈哈
测试方法:
public static void main(String[] args) throws Exception {
String accessToken = postToken();
System.out.println("获取的accessToken:"+accessToken);
postMiniqrQr("要放进去的东西",accessToken);
}
想想还缺啥。。好像不缺了吧。。应该不缺了。。本文仅限于记录个人经历!!!欢迎各位大佬指教!!
|
请发表评论