我是个老六 2025-10-29 11:10 采纳率: 58.9%
浏览 38

java接入微信服务号模板消息并跳转小程序

java接入微信服务号模板消息并跳转小程序

已经接入完毕了,但点击模板消息跳转到小程序指定页面时,一直提示加载中,然后有报错

接口肯定是没问题的,线上跑几年了
配置那些应该也没问题,小程序也没有配置预加载,网上相关的例子基本上搜不到,没头绪了
然后不配置路由,默认跳首页是没问题,路由找前端确认过了,是有这个路由的,page.json里面也有这个路由

img

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-10-29 11:35
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解决方案

    根据你的描述,问题可能出在小程序的配置上。以下是几点需要注意的:

    1. 预加密:虽然你说没有配置预加密,但还是需要确认一下。微信服务号模板消息跳转小程序时,需要预加密小程序的URL。可以在微信小程序后台设置中找到预加密的配置。
    2. 小程序的域名:检查小程序的域名是否正确。微信服务号模板消息跳转小程序时,需要使用小程序的域名。
    3. 小程序的页面路径:检查小程序的页面路径是否正确。微信服务号模板消息跳转小程序时,需要使用小程序的页面路径。
    4. 小程序的配置:检查小程序的配置是否正确。微信服务号模板消息跳转小程序时,需要在小程序的配置中开启模板消息跳转功能。

    核心代码

    以下是核心代码,用于预加密小程序的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&timestamp=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();
        }
    }
    

    注意

    以上代码仅供参考,需要根据实际情况进行调整和完善。

    评论

报告相同问题?

问题事件

  • 修改了问题 10月29日
  • 创建了问题 10月29日