预览小程序页面
需求
需要在后台配置小程序页面(装修页面),然后在后台预览小程序展示效果
官方文档
步骤如下
- 获取小程序得accessToken
- 根据accessToken获取小程序码
注意点
根据accessToken注意事项设置缓存,避免重复获取或失效导致获取小程序码失败
access_token 的存储与更新 access_token 的存储至少要保留 512 个字符空间; access_token
的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效; 建议开发者使用中控服务器统一获取和刷新
access_token,其他业务逻辑服务器所使用的 access_token
均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务; access_token
的有效期通过返回的 expires_in
来传达,目前是7200秒之内的值,中控服务器需要根据这个有效时间提前去刷新。在刷新过程中,中控服务器可对外继续输出的老
access_token,此时公众平台后台会保证在5分钟内,新老 access_token 都可用,这保证了第三方业务的平滑过渡;
access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新 access_token
的接口,这样便于业务服务器在 API 调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程
java代码实现
/**
* 小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)
*/
@Value("${wechat.appId}")
private String appId;
/**
* 小程序唯一凭证密钥,即 AppSecret,获取方式同 appid
*/
@Value("${wechat.secret}")
private String secret;
/**
* accessToken请求地址
*/
@Value("${wechat.url}")
private String url;
/**
* 获取微信access_token
* @return
*/
public String getAccessToken() {
String result;
result= redisCache.getCacheObject(RedisConstant.ACCESS_TOKEN_KEY);
if(StringUtils.isNotEmpty(result)){
return result;
}
try {
Map<String,Object> map=new HashMap<>(3);
map.put("grant_type","client_credential");
map.put("appid",appId);
map.put("secret",secret);
String response = HttpUtil.get(url, map);
if(StringUtils.isNotBlank(response)){
// 将数据转换成json
JSONObject responseJson = JSONObject.parseObject(response);
result = (String) responseJson.get("access_token");
Integer time = (Integer) responseJson.get("expires_in");
if(time != null){
//根据接口返回失效时间设置有效期
redisCache.setCacheObject(RedisConstant.ACCESS_TOKEN_KEY,result,time, TimeUnit.SECONDS);
}
}
} catch (Exception e) {
log.error("",e);
}
return result;
}
/**
* 获取预览二维码
* @param pageUrl
* @param scene
* @param weChatToken
* @return
*/
private String getQrCode(String pageUrl, String scene, String weChatToken){
String qrCode="";
String url= String.format("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s", weChatToken);
RestTemplate restTemplate = new RestTemplate();
JSONObject json = new JSONObject();
if(StringUtils.isNotBlank(scene)){
// 页面参数可能带有&等符号会被解析成&
scene= scene.replaceAll("&", "&");
}
// 页面路径不能以/开头 需要判断
json.put("page", StringUtils.isNotBlank(pageUrl) ? pageUrl.startsWith("/") ? pageUrl.replaceFirst("/", "") : pageUrl : null);
json.put("scene", StringUtils.isNotBlank(scene) ? scene : "pre=1");
byte[] resultBytes = restTemplate.postForObject(url, json, byte[].class);
if (resultBytes != null && resultBytes.length > 0) {
return "data:image/png;base64," + new String(Base64.encodeBase64(resultBytes));
}
return qrCode;
}