java后端获取带参数小程序码接口
有些场景需要生成带参数的小程序二维码,比如商城为每个商品生成小程序二维码,通过微信扫码直接跳转到该商品所在的展示页面。微信为开发者们提供了相应接口。
请求参数以及返回参数等请参考官方文档: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
blog
js获取url路径中的参数
前端(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
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。