【Java】微信小程序二维码(后台,附获取accessToken)

目录

        调用方式

        主要的请求参数

        工具类

        二维码转图片

        获取accessToken

        HTTPS 调用:

        请求参数

        代码

        实现类


调用方式

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

主要的请求参数

属性

类型

必填

说明

access_token

string

接口调用凭证

scene

string

最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~

page

string

默认是主页,例如 pages/index/index,根路径前不要填加 /,不能携带参数

env_version

string

要打开的小程序版本。正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版。

is_hyaline

bool

默认是false,是否需要透明底色,为 true 时,生成透明底色的小程序

工具类

二维码转图片

import java.io.*;

public class WxaQrCodeUtil {
    /**
     * 二维码保存到本地
     * @param bytes
     * @param path 保存到本地的路径
     */
    public static void saveQrCodeToLocal(byte[] bytes, String path) {
        try {
            InputStream inputStream = new ByteArrayInputStream(bytes);
            //文件夹不存在则自动创建
            File tempFile = new File(path);
            if (!tempFile.getParentFile().exists()) {
                tempFile.getParentFile().mkdirs();
            }
            FileOutputStream out = new FileOutputStream(path);
            byte[] buffer = new byte[8192];
            int bytesRead = 0;
            while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
            out.flush();
            inputStream.close();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 

获取accessToken

HTTPS 调用:

GET https://api.weixin.qq.com/cgi-bin/token

请求参数

属性

类型

必填

说明

grant_type

string

填写 client_credential

appid

string

小程序唯一凭证,可在「微信公众平台 - 设置 - 开发设置」页中获得。

secret

string

小程序唯一凭证密钥,即 AppSecret,获取方式同 appid

代码

private static final Map<String, Object> objects = new HashMap<>();
 

public JSONObject getToken(){
    JSONObject accessTokenRes = new JSONObject();
    String accessToken = null;
    try {
        String token_url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", APPID, SECRET);
        HttpResponse execute = HttpRequest.get(token_url).execute();
        String responseBody = execute.body();
        if (responseBody == null) {
            logger.info(messageUtil.getMessage("msg.get.token.fail"));
            return null;
        }
        JSONObject token = JSON.parseObject(responseBody);
        accessToken = token.getString("access_token");
        if (StringUtils.isEmpty(accessToken)) {
            logger.info(messageUtil.getMessage("msg.get.token.fail"));
            return null;
        }
        accessTokenRes.put("access_token",accessToken);
        accessTokenRes.put("date_time",new Date().getTime());
    } catch (Exception e) {
        logger.error(messageUtil.getMessage("msg.get.token.fail"));
        logger.error(e.getMessage());
    }
   return accessTokenRes;
}

access_token 的有效期目前为 2 个小时,需定时刷新。

实现类

@ApiOperation(value = "生成二维码", httpMethod = "GET")
@RequestMapping(value = "/api/qrcode", method = RequestMethod.GET)
@Transactional
public WxaQrCodeUrlResponse getQrCode(HttpServletRequest request) throws Exception {
    WxaQrCodeUrlResponse res = new WxaQrCodeUrlResponse();
    
    Date now = new Date();
    // 获取accessToken
    String accessToken = null;
    if(null != objects.get("date_time")){
        accessToken = String.valueOf(objects.get("access_token"));
    }
    Long date = 0L;
    if(null != objects.get("date_time")) {
        date = Long.valueOf(String.valueOf(objects.get("date_time")));
    }
    if(null == accessToken || now.getTime()-date >= 2*60*60*1000){
        JSONObject accessTokenRes = getToken();
        objects.put("access_token",accessTokenRes.get("access_token"));
        objects.put("date_time",now.getTime());
        accessToken = String.valueOf(objects.get("access_token"));
    }

    if (StringUtils.isEmpty(accessToken)) {
        res.setMessage("获取token失败");
        res.setCode(Constants.SC_MSG);
        return res;
    }

    String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;

    // 请求参数
    Map<String,Object> body = new HashMap<>();
    body.put("scene", "自定义参数");
    body.put("env_version", "release");
    // 默认是false,是否需要透明底色,为 true 时,生成透明底色的小程序
    body.put("is_hyaline", false);

    byte[] bytes = HttpClientUtils.getWechatQrcodeByHttpClient(url, body);
    String fileName = "wxqrcode.png";
    String path = "文件夹路径" + File.separator + fileName;
    WxaCodeUtil.saveQrCodeToLocal(bytes, path);

    // TODO 图片处理,返回图片

    // 删除本地文件
    new File(path).delete();

    res.setCode(Constants.SC_OK);
    return res;
}

实际遇到的问题:采用透明底色生成的二维码,在微信中按压图片,不能识别小程序

### Java环境下微信小程序二维码生成教程 #### 准备工作 为了能够在Java环境中成功获取并生成微信小程序二维码,首先需要确保已经获得了小程序的`access_token`。这是因为在请求创建二维码之前,所有的API调用都需要携带有效的认证凭证[^1]。 #### 接口说明 存在多种方法来实现这一目标: - **方式一**:利用微信公众平台提供的标准接口,能够针对已上线的小程序生成正式环境下的二维码; - **方式二**:借助开发者工具,在未发布的版本上也能提前制作带有参数配置的测试用途二维码; - **方式三**:综合上述两种途径,不过需要注意的是两者合计的最大限额为十万次,因此建议合理规划使用次数[^3]。 对于POST请求而言,所传递的数据应当被序列化成为JSON字符串形式而非传统的表单编码格式。此外,当涉及到颜色定制选项时(比如自动配色或是线条色彩设定),这些设置只适用于小程序码而不影响传统意义上的二维码表现效果。 #### 示例代码 下面给出一段简单的Java代码片段用于演示如何向微信服务器发起HTTP POST请求从而获得所需的二维码链接或图像数据流: ```java import java.io.*; import javax.net.ssl.HttpsURLConnection; import org.json.JSONObject; public class WeChatQRCodeGenerator { private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"; private static final String QR_CODE_CREATE_URL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s"; public static void main(String[] args) throws Exception { // Replace with your app ID and secret key. String appId = "your_app_id_here"; String appSecret = "your_app_secret_key_here"; // Step 1: Get access token from WeChat API. HttpsURLConnection conn = (HttpsURLConnection)new URL(String.format(ACCESS_TOKEN_URL, appId, appSecret)).openConnection(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); JSONObject responseJson = new JSONObject(reader.readLine()); String accessToken = responseJson.getString("access_token"); // Step 2: Create a JSON object containing scene information for the QR code. JSONObject qrSceneInfo = new JSONObject().put("scene", "test_scene_value").put("page", "pages/index/index"); // Optional parameters like width, auto_color, etc., can be added here as needed. // Step 3: Send request to create QR code using obtained access token. conn = (HttpsURLConnection)new URL(String.format(QR_CODE_CREATE_URL, accessToken)).openConnection(); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); os.write(qrSceneInfo.toString().getBytes()); InputStream is = conn.getInputStream(); // Handle image stream or save it locally... } } ``` 此段代码实现了从申请`access_token`到发送包含场景描述信息在内的JSON对象直至最终接收到由微信服务端返回二维码图片字节流的过程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值