微信小程序> 微信小程序:java开发获取小程序码和二维码

微信小程序:java开发获取小程序码和二维码

浏览量:602 时间: 来源:收一伞烟雨_

java开发获取批量小程序二维码
微信小程序API文档:链接

通过查看api,小程序可以获取三种二维码,三种二维码有不同的适用场景,大家可以依据自己的业务场景选择,现在只针对一种进行代码演示:

注意:我编写的是第二种二维码:适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制。

接口地址:

https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN

参数类型默认值说明
access_tokenString微信的权限token,详细见下面的代码
sceneString最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&’()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)
pageString必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面
widthnumber430二维码的宽度,默认为 430px,最小 280px,最大 1280px
auto_colorbooleanfalse自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调,默认 false
line_colorObject0auto_color 为 false 时生效,使用 rgb 设置颜色 例如 {“r”:“xxx”,“g”:“xxx”,“b”:“xxx”} 十进制表示,默认全 0
is_hyalinebooleanfalse是否需要透明底色,为 true 时,生成透明底色的小程序码,默认 false

**第一步:**获取accesstoken

   final static org.slf4j.Logger LOGGER = LoggerFactory.getLogger(UserController.class);    @Value("${my.appid}")    private String appid;    @Value("${my.secret}")    private String secret;        /**     * 获取二维码     *     * @param     * @returnurl      */    @RequestMapping("/getPic/{id}")    @ResponseBody public String getaccess_tokenurl(HttpServletRequest request) {    HttpSession session=request.getSession();//因为access_token过期时间为7200秒,暂时放在session中,如果过期了重新去取        String access_token="";        if (session.getAttribute("userInfo")!=null){            access_token= JsonTools.getJsonValue((String) session.getAttribute("userInfo"), "access_token");        }else {            String getaccess_tokenurl = "https://api.weixin.qq.com/cgi-bin/token?" +                    "grant_type=client_credential" +                    "&appid=" + appid +                    "&secret=" + secret;            RestTemplate restTemplate1 = new RestTemplate();            String response1 = restTemplate1.getForObject(getaccess_tokenurl, String.class);            session.setAttribute("userInfo",response1);            access_token = JsonTools.getJsonValue(response1, "access_token");//文章最下面会贴出工具类        }    }

**第二步:**获取小程序二维码

注意:未发布的小程序也可以生成二维码,只是二维码扫码后显示未发布

我的业务需求是生成的二维码图片需要下载:

 public  ResponseEntity<byte[]> getminiqrQr(String accessToken) {        RestTemplate rest = new RestTemplate();        InputStream inputStream = null;        OutputStream outputStream = null;        try {            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+accessToken;            Map<String,Object> param = new HashMap<>();            param.put("path", "pages/index/index");            param.put("width", 430);            param.put("auto_color", true);            LOGGER.info("调用生成微信URL接口传参:" + param);            MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();            HttpEntity requestEntity = new HttpEntity(param, headers);            ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);            LOGGER.info("调用小程序生成微信永久二维码URL接口返回结果:" + entity.getBody());            byte[] result = entity.getBody();            inputStream = new ByteArrayInputStream(result);            File file = new File("../test.png");            outputStream = new FileOutputStream(file);            int len = 0;            byte[] buf = new byte[1024];            while ((len = inputStream.read(buf, 0, 1024)) != -1) {                outputStream.write(buf, 0, len);            }            outputStream.flush();            HttpHeaders headers_1 = new HttpHeaders();                    //通知浏览器以attachment方式打开图片            headers_1.setContentDispositionFormData("attachment","下载.png");            //application/octet-stream:二进制流数据(最常见的文件下载方式)            headers_1.setContentType(MediaType.APPLICATION_OCTET_STREAM);            return new ResponseEntity<byte[]>(org.apache.commons.io.FileUtils.readFileToByteArray(file),                    headers_1, HttpStatus.CREATED);        } catch (Exception e) {            LOGGER.error("调用小程序生成微信永久二维码URL接口异常",e);        } finally {            if(inputStream != null){                try {                    inputStream.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            if(outputStream != null){                try {                    outputStream.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return null;    }

这样子就会成功生成二维码并可以下载。

**注意!!!:**如果生成的图片不能打开,请改掉图片后缀,用txt打开,可以看到错误码,因为只有错误信息时才打不开,然而我们把它保存png的形式,导致看不到错误码,有了错误码后就可以快速定位错误的地方。

完整代码:(如果哪里不对,可以留言)

@Controller@RequestMapping("/m")public class WxController {    final static org.slf4j.Logger LOGGER = LoggerFactory.getLogger(UserController.class);    @Value("${my.appid}")    private String appid;    @Value("${my.secret}")    private String secret;    @Autowired    private ShopMapper shopMapper;    /**     * 获取二维码     *     * @param     * @returnurl     */    @RequestMapping("/getPic/{id}")    @ResponseBody    public ResponseEntity<byte[]> getaccess_tokenurl(@PathVariable("id")String shopId, HttpServletRequest request) {        if (ChkTools.isNull(shopId)){            return null;        }        HttpSession session=request.getSession();        String access_token="";        if (session.getAttribute("userInfo")!=null){            access_token= JsonTools.getJsonValue((String) session.getAttribute("userInfo"), "access_token");        }else {            String getaccess_tokenurl = "https://api.weixin.qq.com/cgi-bin/token?" +                    "grant_type=client_credential" +                    "&appid=" + appid +                    "&secret=" + secret;            RestTemplate restTemplate1 = new RestTemplate();            String response1 = restTemplate1.getForObject(getaccess_tokenurl, String.class);            session.setAttribute("userInfo",response1);            access_token = JsonTools.getJsonValue(response1, "access_token");        }        return getminiqrQr(access_token,shopId);    }    public static void main(String[] args) throws IOException {        String access_token = "13_nOfh7Bdr5Z6kS2PtiVd5PIYIZSxbx1uQtSD4Uu1o_4YDIGzrvZBEd_T9C3EprG3OE_BsXNfsVeNmlTsmGut05QECC_yA9kWyl26g5886eQXYFT225d-jtZ3A36lZOatzTYxDiNcY2UeQMJhPZCCfAAALOO";//        String url2 = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+access_token;//        ResponseEntity<byte[]> aa = getminiqrQr(access_token, "1");//        System.out.println(aa);    }    public  ResponseEntity<byte[]> getminiqrQr(String accessToken,String shopId) {        RestTemplate rest = new RestTemplate();        InputStream inputStream = null;        OutputStream outputStream = null;        try {            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+accessToken;            Map<String,Object> param = new HashMap<>();            param.put("path", "pages/index/index");            param.put("width", 430);            param.put("scene", shopId);            param.put("auto_color", true);            LOGGER.info("调用生成微信URL接口传参:" + param);            MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();            HttpEntity requestEntity = new HttpEntity(param, headers);            ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);            LOGGER.info("调用小程序生成微信永久二维码URL接口返回结果:" + entity.getBody());            byte[] result = entity.getBody();            inputStream = new ByteArrayInputStream(result);            File file = new File("../test.png");            outputStream = new FileOutputStream(file);            int len = 0;            byte[] buf = new byte[1024];            while ((len = inputStream.read(buf, 0, 1024)) != -1) {                outputStream.write(buf, 0, len);            }            outputStream.flush();            HttpHeaders headers_1 = new HttpHeaders();            //下载显示的文件名,解决中文名称乱码            Shop shop = shopMapper.selectByPrimaryKey(Integer.valueOf(shopId));            String downLoadFileName = new String (shop.getShopName().getBytes("UTF-8"),"iso-8859-1");            //通知浏览器以attachment方式打开图片            headers_1.setContentDispositionFormData("attachment",downLoadFileName+".png");            //application/octet-stream:二进制流数据(最常见的文件下载方式)            headers_1.setContentType(MediaType.APPLICATION_OCTET_STREAM);            return new ResponseEntity<byte[]>(org.apache.commons.io.FileUtils.readFileToByteArray(file),                    headers_1, HttpStatus.CREATED);        } catch (Exception e) {            LOGGER.error("调用小程序生成微信永久二维码URL接口异常",e);        } finally {            if(inputStream != null){                try {                    inputStream.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            if(outputStream != null){                try {                    outputStream.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return null;    }}

贴出JsonTools工具类:

public class JsonTools {/** *  该方法是传入string 并转化为json,再根据传入的key获取相关值 * @param rescontent 字符串 * @param key 字符串中的json关键字 * @return */public static String getJsonValue(String rescontent, String key) {org.json.JSONObject jsonObject;String v = null;try {jsonObject = new org.json.JSONObject(rescontent);v = jsonObject.getString(key);} catch (Exception e1) {// TODO Auto-generated catch blocke1.printStackTrace();}return v;}//public static JSONObject MapStrString(Map<String,Object> map) {JSONObject a;return a = new JSONObject(map);}/** * 该方法是传入string 并转化为json * @param rescontent * @return */public static org.json.JSONObject StringStrJson(String rescontent) {org.json.JSONObject jsonObject = null;String v = null;try {jsonObject = new org.json.JSONObject(rescontent);} catch (Exception e1) {// TODO Auto-generated catch blocke1.printStackTrace();}return jsonObject;}/** * json 字符串 转 Map *  * @param json * @return */public static Map<String, Object> jsonStrToMap(String json) {Map<String, Object> map = new HashMap<String, Object>();if (ChkTools.isNull(json)) {return map;}JSONObject jsonObject = JSON.parseObject(json);Set<String> keys = jsonObject.keySet();for (String key : keys) {map.put(key, jsonObject.get(key));}return map;}/** * json 字符串 转 java Object *  * @param json * @return */public static Object jsonStrToJsonObject(String json, Class<?> clazz) {if (clazz == String.class) {if (json.length() > 2) {// 去掉首尾的引号json = json.substring(1, json.length() - 1);}return json;} else {JSONObject parse = JSON.parseObject(json);return JSON.toJavaObject(parse, clazz);}}/** * 对象-->json *  * @param obj * @return */public static String toJson(Object obj) {return JSON.toJSONString(obj);}public static Map<String, Object> objToMap(Object obj) {String json = toJson(obj);Map<String, Object> map = jsonStrToMap(json);return map;}public static void main(String[] args) {String json = "{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }";Map<String, Object> map = jsonStrToMap(json);//String js = "{"+"}";System.err.println(map);}}
小程序

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎