微信小程序菊花码 java生成微信小程序菊花码【黑手】全网最细,微信菊花二维码具体代码实现 小程序码 getUnlimited wxacode.getUnlimited 全网最粗

微信小程序菊花码 java生成微信小程序菊花码【黑手】全网最细,微信菊花二维码具体代码实现 小程序码 getUnlimited wxacode.getUnlimited 全网最粗,第1张

微信小程序菊花码 java生成微信小程序菊花码【黑手】全网最细,微信菊花二维码具体代码实现 小程序码 /getUnlimited wxacode.getUnlimited 全网最粗 1.实现微信小程序的菊花二维码接口首先第一步是需要去对接一个auth.getAccessToken接口
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
因为此接口就是正常返回json数据的接口,这里我们就不写原生的http代码,我用了hutool的工具包
        
            cn.hutool
            hutool-all
            5.3.7
        
接口实现的具体代码:

1.参数dto类

package com.sun.module.http.dto;

import io.swagger.annotations.ApiModel;
import lombok.Data;

@Data
@ApiModel(value = "WeiXinAccessTokenDTO", description = "微信小程序http对接参数(auth.getAccessToken)")
public class WeiXinAccessTokenDTO {
    private String grant_type;
    private String appid;
    private String secret;
}

2.控制层controller类 

public Map getWeiXinAccessToken(@RequestBody WeiXinAccessTokenDTO dto) {
        Map params = new HashMap<>();
        params.put("grant_type", dto.getGrant_type());
        params.put("appid", dto.getAppid());
        params.put("secret", dto.getSecret());
        String resultStr = HttpUtil.get("https://api.weixin.qq.com/cgi-bin/token", params);
        String[] strings = resultStr.split(",");
        String[] access_token = strings[0].split(":");
        Map map = new HashMap<>();
        map.put(access_token[0], access_token[1]);    
        //包含access_token的map
        return map;
    }
到这一步,就拿到了token,因为调用生成菊花二维码的接口必填参数就是token, 每个token有2个小时的有效时间,所以可以拿到后本地缓存起来一下  2.通过传入token,利用代码访问接口生成菊花二维码,并返回给前端
POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN

这里需要maven依赖 

        
            com.google.code.gson
            gson
        

        
            org.apache.httpcomponents
            httpclient
        

        
            com.alibaba
            fastjson
            1.2.67
        

1.参数dto类

@Data
@ApiModel(value = "WeiXinUnlimitedDTO", description = "微信小程序http对接参数(wxacode.getUnlimited)")
public class WeiXinUnlimitedDTO {
    private String access_token;
    //访问接口需要的选填的参数,直接map键值对转换json
    private Map params;
}

2.服务层service类 

这里可以选择是下载本地或者返回web选择性下载,具体参详注释内容
package com.sun.module.http;


import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;

@Service
@Slf4j
public class HttpService {
    
    public static ByteArrayInputStream sendPost(String URL, String json) {
        InputStream inputStream = null;
        ByteArrayInputStream byteArrayInputStream = null;
        // 创建默认的httpClient实例.
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 创建httppost
        HttpPost httppost = new HttpPost(URL);
        httppost.addHeader("Content-type", "application/json; charset=utf-8");
        httppost.setHeader("Accept", "application/json");
        try {
            StringEntity s = new StringEntity(json, Charset.forName("UTF-8"));
            s.setContentEncoding("UTF-8");
            httppost.setEntity(s);
            HttpResponse response = httpclient.execute(httppost);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                // 获取相应实体
                HttpEntity entity = response.getEntity();
                inputStream = entity.getContent();
                ByteArrayOutputStream outStream = new ByteArrayOutputStream();
                // 创建一个Buffer字符串
                byte[] buffer = new byte[1024];
                // 每次读取的字符串长度,如果为-1,代表全部读取完毕
                int len = 0;
                // 使用一个输入流从buffer里把数据读取出来
                while ((len = inputStream.read(buffer)) != -1) {
                    // 用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
                    outStream.write(buffer, 0, len);
                }
                // 关闭输入流
                inputStream.close();
                // 把outStream里的数据写入内存
                byteArrayInputStream = new ByteArrayInputStream(outStream.toByteArray());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭连接,释放资源
            try {
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return byteArrayInputStream;
    }

    
    public Map getWXCode(String access_token, String paramJson, HttpServletResponse response) {
        Map map = new HashMap<>();
        try {
            log.info("access_token:[{}]", access_token);
            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + access_token;
            ByteArrayInputStream inputStream = sendPost(url, paramJson);
            //这里判断的是返回的图片还是错误信息,一般错误信息不会大于200
            if (inputStream.available() <= 200) {
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                int i;
                byte[] buffer = new byte[200];
                while ((i = inputStream.read(buffer)) != -1) {
                    byteArrayOutputStream.write(buffer, 0, i);
                }
                String str = new String(byteArrayOutputStream.toByteArray());
                //错误信息的格式在官方文档里有
                JSonObject jsonObject = JSONObject.parseObject(str);
                if ("41030".equals(jsonObject.getString("errcode"))) {
                    map.put("aa", "所传page页面不存在,或者小程序没有发布");
                } else if ("45009".equals(jsonObject.getString("errcode"))) {
                    map.put("bb", "调用分钟频率受限");
                }
                byteArrayOutputStream.close();
                return map;
            }
            //返回web前端
            response.setContentType("image/png");
            BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
            byte[] buff = new byte[1024];
            int n;
            while ((n = inputStream.read(buff)) != -1) {
                outputStream.write(buff, 0, n);
            }
            outputStream.flush();
            outputStream.close();
            inputStream.close();
            //下载到本地的代码
//            FileOutputStream fileOutputStream = new FileOutputStream("D:/123.png");
//            int i;
//            byte[] buffer = new byte[200];
//            while ((i = inputStream.read(buffer)) != -1) {
//                fileOutputStream.write(buffer, 0, i);
//            }
//            fileOutputStream.flush();
//            fileOutputStream.close();
//            inputStream.close();
            map.put("trun", "菊花码生成成功");
        } catch (Exception e) {
            map.put("flase", "获取菊花码异常");
        }
        return map;
    }

}

3.控制层controller类

public Map getWeiXinUnlimited(@RequestBody WeiXinUnlimitedDTO dto, HttpServletResponse response) {
        Gson gson = new Gson();
        String paramJson = gson.toJson(dto.getParams());
        Map map = service.getWXCode(dto.getAccess_token(), paramJson, response);
        return map;
    }
最后在提一嘴,我所使用的jdk是1.8   ,spring parent如下:
    
        org.springframework.boot
        spring-boot-starter-parent
        2.3.3.RELEASE
         
    
 创作不易,给个赞,希望有帮助到各位

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5691086.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存