小程序开发:Java 小程序生成带参二维码

        开会的时候突然说了一句需求更变。。要求把普通二维码改成小程序带参二维码。。当时听完一脸懵逼的我。。。无奈。。第一次写小程序生成二维码。。一点头绪没有。。然后就。。去看官方文档。。额。。看得似懂非懂。。尴尬!!。。不说了。。直接看代码吧。。唉。。过程很曲折。。结局很美好。。还有注意。。我下文中踩过的坑!!一定要注意!!( 代码可直接复制粘贴使用 )

因为我接到的需求是,写一个代参的小程序码,这里我们就只贴出来了用到的 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);
}

想想还缺啥。。好像不缺了吧。。应该不缺了。。本文仅限于记录个人经历!!!欢迎各位大佬指教!!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平凡的人类

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值