小工具知识网

当前位置: 首页 > 行业知识 > Spring Boot 如何生成微信小程序短连接,发送短信在短信中打开小程序?

行业知识

Spring Boot 如何生成微信小程序短连接,发送短信在短信中打开小程序?

2026-11-14 02:23:34 来源:互联网转载

  需���描述,需要发送短信,通过短信中的短连接打开小程序操作。

()

定义一个小程序配置类

@Configuration@ConfigurationProperties("wx")public class WeiXinProperties {    private String appid;    private String secret;    public String getAppid() {        return appid;    }    public void setAppid(String appid) {        this.appid = appid;    }    public String getSecret() {        return secret;    }    public void setSecret(String secret) {        this.secret = secret;    }}

定义小程序Token获取类

@Componentpublic class TokenManager {    private final static Logger log = LoggerFactory.getLogger(TokenManager.class);    @Autowired    private RedisTemplate redisTemplate;    @Autowired    private WeiXinProperties weiXinProperties;    public String getAccessToken() {        String accessToken = (String) redisTemplate.opsForValue().get(weiXinProperties.getAppid());        if(StringUtils.isNotEmpty(accessToken)){            return accessToken;        } else {            String grant_type = "client_credential";            String url = "https://api.weixin.qq.com/cgi-bin/stable_token";            String appId = weiXinProperties.getAppid();            String secret = weiXinProperties.getSecret();            Map paramMap = new HashMap();            paramMap.put("appid", appId);            paramMap.put("secret", secret);            paramMap.put("grant_type", grant_type);            String res = HttpUtils.sendPost(url, JSON.toJSONString(paramMap));            JSONObject jsonObject = JSONObject.parseObject(res);            accessToken = jsonObject.getString("access_token");            Integer expiresIn = jsonObject.getInteger("expires_in");            redisTemplate.opsForValue().set(weiXinProperties.getAppid(), accessToken, expiresIn, TimeUnit.SECONDS);            return accessToken;        }    }}

短连接访问控制类

@Componentpublic class ShortLinkUtils {    @Autowired    private TokenManager rcwTokenManager;    public String getShortLink(String dutyId){        String accessToken = rcwTokenManager.getAccessToken();        String url = "https://api.weixin.qq.com/wxa/generate_urllink?access_token="+accessToken;        JSONObject jsonObject = new JSONObject();        jsonObject.put("path","pages/index/index");        jsonObject.put("query","expire_type",1);        jsonObject.put("expire_interval",1);        jsonObject.put("env_version","release");        String s = HttpUtil.doPostSSL(url, jsonObject.toJSONString());        return s;    }}

HttpUtils工具类

package com.video.videocall.utils;import com.video.videocall.core.constant.Constants;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.net.ssl.*;import java.io.*;import java.net.ConnectException;import java.net.SocketTimeoutException;import java.net.URL;import java.net.URLConnection;import java.nio.charset.StandardCharsets;import java.security.cert.X509Certificate;/** * 通用http发送方法 *  * @author Nihui */public class HttpUtils{    private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);    /**     * 向指定 URL 发送GET方法的请求     *     * @param url 发送请求的 URL     * @return 所代表远程资源的响应结果     */    public static String sendGet(String url)    {        return sendGet(url, StringUtils.EMPTY);    }    /**     * 向指定 URL 发送GET方法的请求     *     * @param url 发送请求的 URL     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。     * @return 所代表远程资源的响应结果     */    public static String sendGet(String url, String param)    {        return sendGet(url, param, Constants.UTF8);    }    /**     * 向指定 URL 发送GET方法的请求     *     * @param url 发送请求的 URL     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。     * @param contentType 编码类型     * @return 所代表远程资源的响应结果     */    public static String sendGet(String url, String param, String contentType)    {        StringBuilder result = new StringBuilder();        BufferedReader in = null;        try        {            String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url;            log.info("sendGet - {}", urlNameString);            URL realUrl = new URL(urlNameString);            URLConnection connection = realUrl.openConnection();            connection.setRequestProperty("accept", "*/*");            connection.setRequestProperty("connection", "Keep-Alive");            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");            connection.connect();            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType));            String line;            while ((line = in.readLine()) != null)            {                result.append(line);            }            log.info("recv - {}", result);        }        catch (ConnectException e)        {            log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e);        }        catch (SocketTimeoutException e)        {            log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e);        }        catch (IOException e)        {            log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e);        }        catch (Exception e)        {            log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e);        }        finally        {            try            {                if (in != null)                {                    in.close();                }            }            catch (Exception ex)            {                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);            }        }        return result.toString();    }    /**     * 向指定 URL 发送POST方法的请求     *     * @param url 发送请求的 URL     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。     * @return 所代表远程资源的响应结果     */    public static String sendPost(String url, String param)    {        PrintWriter out = null;        BufferedReader in = null;        StringBuilder result = new StringBuilder();        try        {            log.info("sendPost - {}", url);            URL realUrl = new URL(url);            URLConnection conn = realUrl.openConnection();            conn.setRequestProperty("accept", "*/*");            conn.setRequestProperty("connection", "Keep-Alive");            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");            conn.setRequestProperty("Accept-Charset", "utf-8");            conn.setRequestProperty("contentType", "utf-8");            conn.setDoOutput(true);            conn.setDoInput(true);            out = new PrintWriter(conn.getOutputStream());            out.print(param);            out.flush();            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));            String line;            while ((line = in.readLine()) != null)            {                result.append(line);            }            log.info("recv - {}", result);        }        catch (ConnectException e)        {            log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);        }        catch (SocketTimeoutException e)        {            log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);        }        catch (IOException e)        {            log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);        }        catch (Exception e)        {            log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);        }        finally        {            try            {                if (out != null)                {                    out.close();                }                if (in != null)                {                    in.close();                }            }            catch (IOException ex)            {                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);            }        }        return result.toString();    }    public static String sendSSLPost(String url, String param)    {        StringBuilder result = new StringBuilder();        String urlNameString = url + "?" + param;        try        {            log.info("sendSSLPost - {}", urlNameString);            SSLContext sc = SSLContext.getInstance("SSL");            sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom());            URL console = new URL(urlNameString);            HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();            conn.setRequestProperty("accept", "*/*");            conn.setRequestProperty("connection", "Keep-Alive");            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");            conn.setRequestProperty("Accept-Charset", "utf-8");            conn.setRequestProperty("contentType", "utf-8");            conn.setDoOutput(true);            conn.setDoInput(true);            conn.setSSLSocketFactory(sc.getSocketFactory());            conn.setHostnameVerifier(new TrustAnyHostnameVerifier());            conn.connect();            InputStream is = conn.getInputStream();            BufferedReader br = new BufferedReader(new InputStreamReader(is));            String ret = "";            while ((ret = br.readLine()) != null)            {                if (ret != null && !"".equals(ret.trim()))                {                    result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));                }            }            log.info("recv - {}", result);            conn.disconnect();            br.close();        }        catch (ConnectException e)        {            log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e);        }        catch (SocketTimeoutException e)        {            log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e);        }        catch (IOException e)        {            log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e);        }        catch (Exception e)        {            log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e);        }        return result.toString();    }    private static class TrustAnyTrustManager implements X509TrustManager    {        @Override        public void checkClientTrusted(X509Certificate[] chain, String authType)        {        }        @Override        public void checkServerTrusted(X509Certificate[] chain, String authType)        {        }        @Override        public X509Certificate[] getAcceptedIssuers()        {            return new X509Certificate[] {};        }    }    private static class TrustAnyHostnameVerifier implements HostnameVerifier    {        @Override        public boolean verify(String hostname, SSLSession session)        {            return true;        }    }}

HttpUtil工具类

package com.video.videocall.utils;import org.apache.commons.io.IOUtils;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.conn.ssl.SSLContextBuilder;import org.apache.http.conn.ssl.TrustStrategy;import org.apache.http.conn.ssl.X509HostnameVerifier;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLException;import javax.net.ssl.SSLSession;import javax.net.ssl.SSLSocket;import java.io.IOException;import java.io.InputStream;import java.nio.charset.Charset;import java.security.GeneralSecurityException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * @Classname HttpUtil * @Description TODO 封装HTTPS请求类 * @Date 2020/8/14 2:29 PM * @Created by nihui * @Version 1.0 * @Description HttpUtil @see nihui */public class HttpUtil {    private static final Logger log = LoggerFactory.getLogger(HttpUtil.class);    private static PoolingHttpClientConnectionManager connMgr;    private static RequestConfig requestConfig;    private static final int MAX_TIMEOUT = 7000;    static {        // 设置连接池        connMgr = new PoolingHttpClientConnectionManager();        // 设置连接池大小        connMgr.setMaxTotal(100);        connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());        RequestConfig.Builder configBuilder = RequestConfig.custom();        // 设置连接超时        configBuilder.setConnectTimeout(MAX_TIMEOUT);        // 设置读取超时        configBuilder.setSocketTimeout(MAX_TIMEOUT);        // 设置从连接池获取连接实例的超时        configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);        // 在提交请求之前 测试连接是否可用        configBuilder.setStaleConnectionCheckEnabled(true);        requestConfig = configBuilder.build();    }    /**     * 发送 GET 请求(HTTP),不带输入数据     *     * @param url     * @return     */    public static String doGet(String url) {        return doGet(url, new HashMap());    }    /**     * 发送 GET 请求(HTTP),K-V形式     *     * @param url     * @param params     * @return     */    public static String doGet(String url, Map params) {        String apiUrl = url;        StringBuffer param = new StringBuffer();        int i = 0;        for (String key : params.keySet()) {            if (i == 0)                param.append("?");            else                param.append("&");            param.append(key).append("=").append(params.get(key));            i++;        }        apiUrl += param;        String result = null;        log.info("请求地址 {}",apiUrl);        HttpClient httpclient = new DefaultHttpClient();        try {            HttpGet httpPost = new HttpGet(apiUrl);            HttpResponse response = httpclient.execute(httpPost);            int statusCode = response.getStatusLine().getStatusCode();            log.info("执行状态码 : " + statusCode);            HttpEntity entity = response.getEntity();            if (entity != null) {                InputStream instream = entity.getContent();                result = IOUtils.toString(instream, "UTF-8");            }        } catch (IOException e) {            e.printStackTrace();        }        return result;    }    /**     * 发送 POST 请求(HTTP),不带输入数据     *     * @param apiUrl     * @return     */    public static String doPost(String apiUrl) {        return doPost(apiUrl, new HashMap());    }    /**     * 发送 POST 请求(HTTP),K-V形式     *     * @param apiUrl API接口URL     * @param params 参数map     * @return     */    public static String doPost(String apiUrl, Map params) {        CloseableHttpClient httpClient = HttpClients.createDefault();        String httpStr = null;        HttpPost httpPost = new HttpPost(apiUrl);        CloseableHttpResponse response = null;        try {            httpPost.setConfig(requestConfig);            List pairList = new ArrayList(params.size());            for (Map.Entry entry : params.entrySet()) {                NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry                        .getValue().toString());                pairList.add(pair);            }            httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));            response = httpClient.execute(httpPost);            log.info("请求响应 {}",response.toString());            HttpEntity entity = response.getEntity();            httpStr = EntityUtils.toString(entity, "UTF-8");        } catch (IOException e) {            e.printStackTrace();        } finally {            if (response != null) {                try {                    EntityUtils.consume(response.getEntity());                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return httpStr;    }    /**     * 发送 POST 请求(HTTP),JSON形式     *     * @param apiUrl     * @param json   json对象     * @return     */    public static String doPost(String apiUrl, Object json) {        CloseableHttpClient httpClient = HttpClients.createDefault();        String httpStr = null;        HttpPost httpPost = new HttpPost(apiUrl);        CloseableHttpResponse response = null;        try {            httpPost.setConfig(requestConfig);            StringEntity stringEntity = new StringEntity(json.toString(), "UTF-8");//解决中文乱码问题            stringEntity.setContentEncoding("UTF-8");            stringEntity.setContentType("application/json");            httpPost.setEntity(stringEntity);            response = httpClient.execute(httpPost);            HttpEntity entity = response.getEntity();            log.info("POST请求响应 {}",response.getStatusLine().getStatusCode());            httpStr = EntityUtils.toString(entity, "UTF-8");        } catch (IOException e) {            e.printStackTrace();        } finally {            if (response != null) {                try {                    EntityUtils.consume(response.getEntity());                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return httpStr;    }    /**     * 发送 SSL POST 请求(HTTPS),K-V形式     *     * @param apiUrl API接口URL     * @param params 参数map     * @return     */    public static String doPostSSL(String apiUrl, Map params) {        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();        HttpPost httpPost = new HttpPost(apiUrl);        CloseableHttpResponse response = null;        String httpStr = null;        try {            httpPost.setConfig(requestConfig);            List pairList = new ArrayList(params.size());            for (Map.Entry entry : params.entrySet()) {                NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue().toString());                pairList.add(pair);            }            httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("utf-8")));            response = httpClient.execute(httpPost);            int statusCode = response.getStatusLine().getStatusCode();            if (statusCode != HttpStatus.SC_OK) {                return null;            }            HttpEntity entity = response.getEntity();            if (entity == null) {                return null;            }            httpStr = EntityUtils.toString(entity, "utf-8");        } catch (Exception e) {            e.printStackTrace();        } finally {            if (response != null) {                try {                    EntityUtils.consume(response.getEntity());                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return httpStr;    }    /**     * 发送 SSL POST 请求(HTTPS),JSON形式     *     * @param apiUrl API接口URL     * @param json   JSON对象     * @return     */    public static String doPostSSL(String apiUrl, Object json) {        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();        HttpPost httpPost = new HttpPost(apiUrl);        CloseableHttpResponse response = null;        String httpStr = null;        try {            httpPost.setConfig(requestConfig);            StringEntity stringEntity = new StringEntity(json.toString(), "UTF-8");//解决中文乱码问题            stringEntity.setContentEncoding("UTF-8");            stringEntity.setContentType("application/json");            httpPost.setEntity(stringEntity);            response = httpClient.execute(httpPost);            int statusCode = response.getStatusLine().getStatusCode();            if (statusCode != HttpStatus.SC_OK) {                return null;            }            HttpEntity entity = response.getEntity();            if (entity == null) {                return null;            }            httpStr = EntityUtils.toString(entity, "utf-8");        } catch (Exception e) {            e.printStackTrace();        } finally {            if (response != null) {                try {                    EntityUtils.consume(response.getEntity());                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return httpStr;    }    /**     * 创建SSL安全连接     *     * @return     */    private static SSLConnectionSocketFactory createSSLConnSocketFactory() {        SSLConnectionSocketFactory sslsf = null;        try {            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {                    return true;                }            }).build();            sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() {                @Override                public boolean verify(String arg0, SSLSession arg1) {                    return true;                }                @Override                public void verify(String host, SSLSocket ssl) throws IOException {                }                @Override                public void verify(String host, X509Certificate cert) throws SSLException {                }                @Override                public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException {                }            });        } catch (GeneralSecurityException e) {            e.printStackTrace();        }        return sslsf;    }}
()

上一篇:王者服务器塌了怎么办?

下一篇:迷你世界地图下载教程