java接入微信服务号模板消息并跳转小程序
已经接入完毕了,但点击模板消息跳转到小程序指定页面时,一直提示加载中,然后有报错
接口肯定是没问题的,线上跑几年了
配置那些应该也没问题,小程序也没有配置预加载,网上相关的例子基本上搜不到,没头绪了
然后不配置路由,默认跳首页是没问题,路由找前端确认过了,是有这个路由的,page.json里面也有这个路由

java接入微信服务号模板消息并跳转小程序
已经接入完毕了,但点击模板消息跳转到小程序指定页面时,一直提示加载中,然后有报错
接口肯定是没问题的,线上跑几年了
配置那些应该也没问题,小程序也没有配置预加载,网上相关的例子基本上搜不到,没头绪了
然后不配置路由,默认跳首页是没问题,路由找前端确认过了,是有这个路由的,page.json里面也有这个路由

阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程
解决方案
根据你的描述,问题可能出在小程序的配置上。以下是几点需要注意的:
核心代码
以下是核心代码,用于预加密小程序的URL:
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.security.AnyTypePermission;
import java.net.URLEncoder;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class WXUtil {
public static String getPreEncryptUrl(String url, String appId, String secret) throws Exception {
// 1. 构造请求参数
Map<String, String> params = new HashMap<>();
params.put("url", url);
params.put("appid", appId);
params.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
params.put("noncestr", UUID.randomUUID().toString());
// 2. 对请求参数进行排序和签名
String sign = getSign(params, secret);
// 3. 构造预加密的URL
String preEncryptUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&appid=APPID&url=URL×tamp=TIMESTAMP&noncestr=NONCESTR&sign=SIGN";
// 4. 替换占位符
preEncryptUrl = preEncryptUrl.replace("ACCESS_TOKEN", getAccessToken(appId, secret));
preEncryptUrl = preEncryptUrl.replace("APPID", appId);
preEncryptUrl = preEncryptUrl.replace("URL", url);
preEncryptUrl = preEncryptUrl.replace("TIMESTAMP", String.valueOf(System.currentTimeMillis() / 1000));
preEncryptUrl = preEncryptUrl.replace("NONCESTR", UUID.randomUUID().toString());
preEncryptUrl = preEncryptUrl.replace("SIGN", sign);
return preEncryptUrl;
}
private static String getSign(Map<String, String> params, String secret) throws Exception {
// 1. 对请求参数进行排序
List<String> sortedParams = new ArrayList<>(params.keySet());
Collections.sort(sortedParams);
// 2. 构造签名字符串
StringBuilder signStr = new StringBuilder();
for (String key : sortedParams) {
signStr.append(key).append("=").append(params.get(key)).append("&");
}
// 3. 对签名字符串进行签名
String sign = Base64.getEncoder().encodeToString(HmacSHA256(signStr.toString(), secret));
return sign;
}
private static String getAccessToken(String appId, String secret) throws Exception {
// 1. 构造请求参数
Map<String, String> params = new HashMap<>();
params.put("grant_type", "client_credential");
params.put("appid", appId);
params.put("secret", secret);
// 2. 发送请求获取access_token
String accessToken = sendRequest("https://api.weixin.qq.com/cgi-bin/token", params);
return accessToken;
}
private static String sendRequest(String url, Map<String, String> params) throws Exception {
// 1. 构造请求参数
String queryString = getQueryString(params);
// 2. 发送请求
String response = sendPostRequest(url, queryString);
return response;
}
private static String getQueryString(Map<String, String> params) {
StringBuilder queryString = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
queryString.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
return queryString.toString();
}
private static String sendPostRequest(String url, String queryString) throws Exception {
// 1. 构造请求
URL requestUrl = new URL(url + "?" + queryString);
HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection();
connection.setRequestMethod("POST");
// 2. 发送请求
connection.connect();
// 3. 获取响应
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
return connection.getInputStream().readAllBytes().toString();
} else {
throw new Exception("请求失败");
}
}
private static String HmacSHA256(String data, String key) throws Exception {
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "HmacSHA256");
mac.init(secretKeySpec);
byte[] digest = mac.doFinal(data.getBytes());
return bytesToHex(digest);
}
private static String bytesToHex(byte[] bytes) {
StringBuilder hexString = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append("0").append(hex);
} else {
hexString.append(hex);
}
}
return hexString.toString();
}
}
注意
以上代码仅供参考,需要根据实际情况进行调整和完善。