java后端获取带参数小程序码接口

硅谷探秘者 Md 前端,java基础 1882 0 0

  有些场景需要生成带参数的小程序二维码,比如商城为每个商品生成小程序二维码,通过微信扫码直接跳转到该商品所在的展示页面。微信为开发者们提供了相应接口。

  请求参数以及返回参数等请参考官方文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html

一、pom 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>

二、后端接口示例

package club.jiajiajia.nwsp.controller;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class TestController {

    static final String grant_type="grant_type";
    static final String appid="appid";
    static final String secret="secret";

    /**
     * 获取 acessToken
     * @return
     */
    private static String getAcessToken(){
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type="+grant_type+"&appid="+appid+"&secret="+secret;
        RestTemplate restTemplate  = new RestTemplate();

        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
        HttpEntity requestEntity = new HttpEntity(null, headers);
        ResponseEntity<String> entity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class, new Object[0]);
        String result = entity.getBody();
        log.info("获取token:"+result);
        Map<String, Object> resultObj = JSONObject.parseObject(result);
        String accessToken = (String) resultObj.get("access_token");
        return accessToken;
    }

    public static void main(String[] args) {
        getminiqrQr("123");
    }

    /**
     * @param sceneStr 微信二维码参数
     */
    private static void getminiqrQr(String sceneStr) {
        String acessToken = getAcessToken();
        RestTemplate restTemplate  = new RestTemplate();
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+acessToken;
            Map<String,Object> param = new HashMap<>();
            // scene:参数
            param.put("scene", sceneStr);
            // page:微信小程序页面
            param.put("page", "pages/productDetails");
            param.put("width", 430);
            param.put("auto_color", false);
            Map<String,Object> line_color = new HashMap<>();
            line_color.put("r", 0);
            line_color.put("g", 0);
            line_color.put("b", 0);
            param.put("line_color", line_color);
            MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
            HttpEntity requestEntity = new HttpEntity(param, headers);
            // 请求数据
            ResponseEntity<byte[]> entity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
            byte[] result = entity.getBody();
            // 如果生成失败,可以打印返回的错误信息
            // System.out.println(new String(result,"utf-8"));
            inputStream = new ByteArrayInputStream(result);

            // 二维码存放路径
            File file = new File("d:/data/1.png");
            if (!file.exists()){
                file.createNewFile();
            }
            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();
        } catch (Exception e) {
            log.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();
                }
            }
        }
    }
}

在springboot项目中测试,用到了RestTemplate等类。

  通过该接口生成的小程序码,永久有效,数量暂无限制。用户扫描该码进入小程序后,开发者需在对应页面获取的码中 scene 字段的值,再做处理逻辑。使用如下代码可以获取到二维码中的 scene 字段的值。调试阶段可以使用开发工具的条件编译自定义参数 scene=xxxx 进行模拟,开发工具模拟时的 scene 的参数值需要进行 urlencode。同时需要注意,此接口的page参数中不能带任何参数,参数都在scene 参数中处理。

三、前端页面

Page({
  onLoad: function(options) {
    // options 中的 scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene
    var scene = decodeURIComponent(options.scene)
  }
})

评论区
请写下您的评论...
暂无评论...
猜你喜欢
weblog 2502 java使用原生jdbc连据库据或执行sql语句(mysql) publicvoidtest2(){ try{ //加载MySql的驱动类 Class.forName
工具 2685 1.修改配置信息url填外网可以访问的(必须是80),如果是本地测试的话可以用外网穿透。例:http://aaaa.com/call/backToken可以任意填写,但要和中的配置一致例
算法基础 2138 如果一个类实现了一个,如何中泛型的实际类型importjava.lang.reflect.ParameterizedType; importjava.lang.reflect.Type
框架 1963 springboot项目中所有对外提供的信息@ComponentpublicclassTestimplementsApplicationRunner
工具 2645 /versionclassifierjdk15/classifier/dependencydependency groupIdcom.aliyun/groupId artifactIdaliyun-java-sdk-core/
weblog 2048 在ngxin代理的配置文件的location块中添加如下配置proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerREMOTE-HOST$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;整体如下l
工具 1731 packagecom.yunzhi.exam.util;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpSession;importorg.springframework.web.context.request.RequestContextHolder;importorg.springframewor
前端(h5) 2575 functiongetQueryValue(key,href){ href=href||window.location.href; varmatch=href.match(newRegExp('[?&]'+key+'=([^&]*)')); returnmatch&&match[1]&&decodeURIComponent(match[1])||''
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1 2024-08  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript 加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。