【微信小程序生成二维码】两种请求方式:解析返回Buffer二进制信息、转换json格式等信息

摘要

获取微信小程序二维码,根据返回内容类型获取buffer 图片信息、失败解析:json格式等信息。主要根据返回内容类型contentType 区分

微信开发平台:

获取不限制的小程序码(getUnlimitedQRCode)

返回参数

属性类型说明
bufferBuffer成功时返回的图片 Buffer
errcodenumber失败时返回错误码
errmsgstring失败时返回错误信息
contentTypecontentType返回内容类型(重点根据返回内容类型就可以知道小程序码生成成功失败等信息,做一下洽其他处理)

返回成功参数

{
 "errcode": 0,
 "errmsg": "ok",
 "contentType": "image/jpeg",
 "buffer": Buffer
} 

获取微信小程序方法

    /**
     * 获取不限制的小程序码
     *
     * @param appId 小程序APPID
     * @param query 小程序path携带的参数
     */
    public String getMiniProgramUnlimitedQrCode(String appId, String query) throws Exception {
        String secret = PrivateAppSecretEnum.getAppSecret(appId);
        String accessToken = getAccessToken(appId, secret);
        String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;

        //构建head body 请求参数
        String requestBodyJson = buildHeadersBodyString(query);

        //获取生成微信小程序二维码。图片地址(二进制转换、图片上传)
        return getRestTemplateQrCode(url, requestBodyJson);
    }

    /**
     * 构建head body 请求参数
     *
     * @param query 携带参数
     * @return head body参数
     */
    @NotNull
    private String buildHeadersBodyString(String query) {
        String envVersion = "release";
        Map<String, Object> paramMap = new HashMap<>();
        //path携带的参数,最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)
        //eg: env=pre&placeId=14721&channelType=1003
        paramMap.put("scene", query);
        //默认是主页,页面 page,例如 pages/index/index,根路径前不要填加 /,不能携带参数(参数请放在 scene 字段里),如果不填写这个字段,默认跳主页面
        paramMap.put("page", "index/index1");
        //默认是true,检查page 是否存在,为 true 时 page 必须是已经发布的小程序存在的页面(否则报错);为 false 时允许小程序未发布或者 page 不存在, 但page 有数量上限(60000个)请勿滥用
        paramMap.put("check_path", Boolean.TRUE);
        //要打开的小程序版本。正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版。
        paramMap.put("env_version", envVersion);
        //默认430,二维码的宽度,单位 px,最小 280px,最大 1280px
        paramMap.put("width", 720);
        return JSON.toJSONString(paramMap);
    }

1、RestTemplate 请求方式

	/**
	 * 获取生成微信小程序二维码。图片地址(
	 * 1、二进制转换
	 * 2、图片上传
	 * @param url url
	 * @param requestBodyJson 请求body json
	 * @return 图片地址
	 * @throws IOException IO 异常
	 * @throws SaasException 自定义返回异常
	 */
	private String getRestTemplateQrCode(String url,String requestBodyJson) throws IOException, SaasException {
	        HttpHeaders headers = new HttpHeaders();
	        headers.setContentType(MediaType.IMAGE_JPEG);
	        HttpEntity requestBody = new HttpEntity(requestBodyJson, headers);
	
	        ResponseEntity<byte[]> result = restTemplate.exchange(url, HttpMethod.POST, requestBody, byte[].class);
	
	        //判断返回内容类型是否 image/jpeg 图片类型
	        if (MediaType.IMAGE_JPEG ==  result.getHeaders().getContentType()){
	            InputStream inputStream = new ByteArrayInputStream(result.getBody());
	            return UploadTool.uploadOss(inputStream, result.getBody().length);
	        }
	
	        //判断返回内容类型是否 application/json;charset=UTF-8 json格式
	        if (MediaType.APPLICATION_JSON_UTF8 ==  result.getHeaders().getContentType()){
	            JSONObject jsonObject = JSONObject.parseObject(new String(result.getBody()));
	            logger.error("【微信小程序生成携带参数二维码】生成结果:{},失败信息:","失败",jsonObject.toJSONString());
	        }
	        return "http://moren.jpeg";
	 	   }

2、OkHttpClient 请求方式

    /**
     * OkHttpClient 方式 获取生成微信小程序二维码。图片地址
     * 1、二进制转换
     * 2、图片上传
     * @param url url
     * @param requestBodyJson 请求body json
     * @return 图片地址
     * @throws IOException IO 异常
     * @throws SaasException 自定义返回异常
     */
    private String getOkHttpClientQrCode(String url,String requestBodyJson) throws IOException, SaasException {
        OkHttpClient client = new OkHttpClient().newBuilder().build();
        
        okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json");
        RequestBody body = RequestBody.create(mediaType, requestBodyJson);
        Request request = new Request.Builder().url(url).method("POST", body)
                .addHeader("User-Agent", "apifox/1.0.0 (https://www.apifox.cn)")
                .addHeader("Content-Type", "application/json")
                .build();
        Response response = client.newCall(request).execute();
        //返回结构类型是否image/jpeg
        if ("image/jpeg".equals(response.body().contentType().toString())) {
            InputStream inputStream = new ByteArrayInputStream(response.body().source().readByteArray());
            return UploadTool.uploadOss(inputStream, response.body().contentLength());
        } else if ("application/json; charset=UTF-8".equals(response.body().contentType().toString())) {
            JSONObject jsonObject = JSONObject.parseObject(response.body().string());
            logger.error("【微信小程序生成携带参数二维码】生成结果:{},失败信息:","失败",jsonObject.toJSONString());
        }
        return "http://moren.jpeg";
    }

关注博主动态

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乔-治

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

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

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

打赏作者

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

抵扣说明:

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

余额充值