搜索 | 会员  
java开发获取小程序码和二维码
来源: CSDN   作者:收一伞烟雨  日期:2018/10/23  类别:编程语言  主题:JAVA  编辑:Carol
通过查看api,小程序可以获取三种二维码,三种二维码有不同的适用场景,大家可以依据自己的业务场景选择,现在只针对一种进行代码演示

ava开发获取批量小程序二维码

微信小程序API文档:链接


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


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


接口地址:


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


参数 类型 默认值 说明

access_token String 微信的权限token,详细见下面的代码

scene String 最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&’()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)

page String 必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面

width number 430 二维码的宽度,默认为 430px,最小 280px,最大 1280px

auto_color boolean false 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调,默认 false

line_color Object 0 auto_color 为 false 时生效,使用 rgb 设置颜色 例如 {“r”:“xxx”,“g”:“xxx”,“b”:“xxx”} 十进制表示,默认全 0

is_hyaline boolean false 是否需要透明底色,为 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 block

e1.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 block

e1.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);

}


}



德仔网尊重行业规范,每篇文章都注明有明确的作者和来源;德仔网的原创文章,请转载时务必注明文章作者和来源:德仔网;
头条那些事
大家在关注
广告那些事
我们的推荐
也许感兴趣的
干货