微信公众测试号使用:


1、首先创建微信测试号,通过二维码来添加测试号。添加完后可以通过二维码进入测试号。

然后设置域名才能重定向(没有设置域名的话会controller调用重定向接口的时候会失败):

2、获取accessToken:

请求方式: GET

请求接口: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

3、创建自定义菜单:

请求方式:POST

请求接口: https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

json模板:

 {"button":[{  "type":"click","name":"今日歌曲","key":"V1001_TODAY_MUSIC"},{"name":"菜单","sub_button":[{  "type":"view","name":"重定向接口","url":"http://你的域名/redirect"},//可以省略这块、这个是跳转微信小程序的一个菜单,需要关联小程序。{"type":"miniprogram","name":"wxa","url":"http://mp.weixin.qq.com","appid":"wx286b93c14bbf93aa","pagepath":"pages/lunar/index"},{"type":"click","name":"赞一下我们","key":"V1001_GOOD"}]}]}

4、服务器接口(通过这个接口来实现重定向):

@GetMapping("/redirect")public void redirect(HttpServletResponse response) throws IOException {String url = WeiXinUtils.REDIRECT_URL;String appid = WeiXinUtils.APPID;//你的回调页String redirectUri = "http://你的域名/openId";url = url.replace("APPID", appid);url = url.replace("REDIRECT_URI", redirectUri);response.sendRedirect(url);
}

5、获取code以及openId:

GetMapping("/openId")public void openId(HttpServletRequest request) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException, IOException {//首先获得code,通过code来获得openidString code = request.getParameter("code");System.out.println(code);if (code != null) {//获取openid和access_token的连接WechatEntity openid = WeiXinUtils.getOpenid(code);String templateUrl = WeiXinUtils.TemplateMessage_Url.replace("ACCESS_TOKEN", WeiXinUtils.getAccessToken());System.out.println("openId=" + openid);System.out.println("accessToken=" + WeiXinUtils.getAccessToken());JSONObject jsonObject = new JSONObject();jsonObject.put("touser", "接收者的openId");  jsonObject.put("template_id", "模板id");jsonObject.put("url", "http://www.baidu.com");JSONObject data = new JSONObject();JSONObject first = new JSONObject();first.put("value", "hello");first.put("color", "#173177");JSONObject keyword1 = new JSONObject();keyword1.put("value", "hello");keyword1.put("color", "#173177");JSONObject keyword2 = new JSONObject();remark.put("value", "hello");remark.put("color", "#173177");data.put("first", first);data.put("keyword1", keyword1);data.put("remark", remark);jsonObject.put("data", data);String string = WeiXinUtils.sendPostJsonStr(templateUrl, jsonObject.toJSONString());JSONObject result = JSON.parseObject(string);int errcode = result.getIntValue("errcode");if (errcode == 0) {// 发送成功System.out.println("发送成功");} else {// 发送失败System.out.println("发送失败");}}}

6、获取模板id:


{{first.DATA}}
信息:{{keyword1.DATA}}
{{remark.DATA}}

复制以上模板消息到第5步里面的template_id

7、测试成功

8、微信工具类(只需改下appId和appSecret)

@Slf4j
public class WeiXinUtils {/*** 微信公众号的APPID和Appsecret,这个是每个微信公众号都唯一的,以后配置不同的公众号配置这里即可*/public static final String APPID = "appId";private static final String APPSECRET = "appSecret";/*** 获取access_token的URL*/private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";private static final String OPENID_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code";/*** 模板消息请求路径*/public static String TemplateMessage_Url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";public static String REDIRECT_URL =  "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";/*** 获取Openid** @return 获取Openid*/public static WechatEntity getOpenid(String code) {//首先获得code,通过code来获得openidString url = OPENID_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET).replace("CODE", code);String openIdRequest = getRequest(url);JSONObject jsonObject = JSONObject.parseObject(openIdRequest);return JSON.toJavaObject(jsonObject, WechatEntity.class);}public static String getAccessToken() {String accessTokenUrl = ACCESS_TOKEN_URL;accessTokenUrl = accessTokenUrl.replace("APPID", APPID);accessTokenUrl = accessTokenUrl.replace("APPSECRET", APPSECRET);String accessTokenRequest = getRequest(accessTokenUrl);JSONObject jsonObject = JSONObject.parseObject(accessTokenRequest);return jsonObject.getString("access_token");}public static String defaultEncoding = "utf-8";/*** 以jsonString形式发送HttpPost的Json请求,String形式返回响应结果** @param url* @param jsonString* @return*/public static String sendPostJsonStr(String url, String jsonString) throws IOException {if (jsonString == null || jsonString.isEmpty()) {return sendPost(url);}String resp = "";StringEntity entityStr = new StringEntity(jsonString,ContentType.create("text/plain", "UTF-8"));CloseableHttpClient httpClient = HttpClients.createDefault();HttpPost httpPost = new HttpPost(url);httpPost.setEntity(entityStr);CloseableHttpResponse response = null;try {response = httpClient.execute(httpPost);HttpEntity entity = response.getEntity();resp = EntityUtils.toString(entity, "UTF-8");EntityUtils.consume(entity);} catch (ClientProtocolException e) {log.error(e.getMessage());} catch (IOException e) {log.error(e.getMessage());} finally {if (response != null) {try {response.close();} catch (IOException e) {log.error(e.getMessage());}}}if (resp == null || resp.equals("")) {return "";}return resp;}/*** 发送不带参数的HttpPost请求** @param url* @return*/public static String sendPost(String url) throws IOException {// 1.获得一个httpclient对象CloseableHttpClient httpclient = HttpClients.createDefault();// 2.生成一个post请求HttpPost httppost = new HttpPost(url);CloseableHttpResponse response = null;try {// 3.执行get请求并返回结果response = httpclient.execute(httppost);} catch (IOException e) {log.error(e.getMessage());}// 4.处理结果,这里将结果返回为字符串HttpEntity entity = response.getEntity();String result = null;try {result = EntityUtils.toString(entity);} catch (ParseException | IOException e) {log.error(e.getMessage());}return result;}/*** 发送http get请求** @param url 请求url* @return url返回内容*/public static String getRequest(String url) {return getRequest(url, null);}/*** 发送http get请求** @param url    请求的url* @param params 请求的参数* @return*/public static String getRequest(String url, Map<String, Object> params) {return getRequest(url, null, params);}/*** 发送http get请求** @param url        请求的url* @param headersMap 请求头* @param params     请求的参数* @return*/public static String getRequest(String url, Map<String, String> headersMap, Map<String, Object> params) {String result = null;CloseableHttpClient httpClient = buildHttpClient();try {String apiUrl = url;if (null != params && params.size() > 0) {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;}HttpGet httpGet = new HttpGet(apiUrl);if (null != headersMap && headersMap.size() > 0) {for (Map.Entry<String, String> entry : headersMap.entrySet()) {String key = entry.getKey();String value = entry.getValue();httpGet.addHeader(new BasicHeader(key, value));}}CloseableHttpResponse response = httpClient.execute(httpGet);try {HttpEntity entity = response.getEntity();if (null != entity) {result = EntityUtils.toString(entity, defaultEncoding);}} finally {response.close();}} catch (ClientProtocolException e) {e.printStackTrace();} catch (ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return result;}/*** 创建httpclient** @return*/public static CloseableHttpClient buildHttpClient() {try {RegistryBuilder<ConnectionSocketFactory> builder = RegistryBuilder.create();ConnectionSocketFactory factory = new PlainConnectionSocketFactory();builder.register("http", factory);KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());SSLContext context = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, new TrustStrategy() {@Overridepublic boolean isTrusted(X509Certificate[] chain,String authType) throws CertificateException {return true;}}).build();LayeredConnectionSocketFactory sslFactory = new SSLConnectionSocketFactory(context,SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);builder.register("https", sslFactory);Registry<ConnectionSocketFactory> registry = builder.build();PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(registry);ConnectionConfig connConfig = ConnectionConfig.custom().setCharset(Charset.forName(defaultEncoding)).build();SocketConfig socketConfig = SocketConfig.custom().setSoTimeout(100000).build();manager.setDefaultConnectionConfig(connConfig);manager.setDefaultSocketConfig(socketConfig);return HttpClientBuilder.create().setConnectionManager(manager).build();} catch (KeyStoreException e) {e.printStackTrace();} catch (KeyManagementException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}
}

微信公众号从入门到入坑相关推荐

  1. 微信公众号开发之测试号入坑大法(一)——联通公众号测试号

    一.前言 微信公众号开发真的是很麻烦,于是想弄一个方法,可以在vue开发模式下进行调试的.然后就不断踩坑,终于有了这系列的文章.话少说,直接上干货!(怎么注册公众号这里就省略了) 二.微信公众号测试号 ...

  2. 微信公众号开发入门教程第一篇

    微信公众号开发入门教程第一篇 关键字:微信公众平台开发 作者:方倍工作室 在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/ ...

  3. 【一篇就够了】springboot微信公众号开发,你的坑我来踩

    [一篇就够了]springboot微信公众号开发,你的坑我来踩 前些日子在抖音上看到一个写给女朋友的微信公众号突然心血来潮自己也想写一个,随后就开始在下面的踩坑填坑的阶段了,因为也是第一次写微信公众号 ...

  4. 微信开发学习总结(一)——微信公众号开发入门指引

    本节要求: ①微信公众号申请 ②测试公众号的注册 ③准备微信公众号开发的环境 微信公众号开发入门指引 微信公众号的接入在微信公众平台-微信公众平台技术文档中有着详细的介绍.在进行微信开发前,建议先完整 ...

  5. 腾讯云+CentOS 7.2+python:搭建微信公众号后台入门教程

    因为想自己编写微信公众号后台的程序,实现一些小功能,为以后的开发做准备,所以就从零开始,摸索着注册微信公众号,租用服务器,搭建环境进行开发. 简单的搭建过程中也经历了一些波折,踩了不少坑,仅留此文给跟 ...

  6. JAVA微信公众号开发入门

    好久没进博客,最近应某人的要求,要每周写一篇博客,故此今天就把我这周刚学的微信公众号开发的知识在此总结总结,以供后人查阅.我写博客都是简要白话文,勿喷. 1.为什么要学微信公众号开发 微信的用户量庞大 ...

  7. Java 进行微信公众号开发遇到的一些坑

    前言 最近试水了一下微信公众号,花了一天开发,记录下其中的坑,分享给大家.附上公众号二维码,实现讲笑话的功能,欢迎大家关注. 该公众号实现功能: 1.发送任意内容,随机返回笑话 2.笑话调用了网上开发 ...

  8. 微信公众号开发—入门系列(一)

    最近在学习微信公众号开发的相关内容,现将学习内容总结如下: 一.微信公众平台简介 微信公众平台,即我们平时所说的"公众号",曾用名"官方平台"."媒体 ...

  9. 微信公众号视频录制开发 踩坑汇总

    背景 微信公众号(PC)实现视频录制,技术栈 react. 1. http or https 视频录制如果是基于navigator.mediaDevices 这种方式,http协议下只能通过local ...

  10. 微信公众号简易入门教程

    前言 在我学习公众号开发,也有一段时间了,其中也做过两个公众号项目,最近有友人向我请教公众号该如何学习,特以此篇文章总结一下,同时也巩固一下我的知识(套路). 准备环境 系统:*nix(Ubuntu. ...

最新文章

  1. adc0808温度换算公式_温湿度传感器的三种模拟量换算关系
  2. 每日一皮:Bug 变 Feature !惊不惊喜,意不意外,刺不刺激!
  3. POJ2406 KMP前缀周期
  4. 生成对象---工厂方法模式
  5. Linux常用命令,超强万字总结!
  6. 程序一启动检查网络,如果没有网络就退出程序
  7. KAFKA 最新版 单机安装、配置、部署(linux环境)
  8. 计算机网络学习笔记(22. Web应用概述)
  9. 红黑树 c++ 实现
  10. python怎么画小海龟_python画图之“小海龟”turtle
  11. 极品飞车ol服务器连接不稳定,极品飞车OL常见客户端问题有哪些_客户端问题解决方法_3DM网游...
  12. 雷达存在感应器技术,实时感知控制应用,雷达人体探测方案
  13. 天宇优配|利好太多,写不下了!A股港股全线走高,股民嗨了
  14. 同一个项目中让R和Python无缝工作的五种方法
  15. 从低位开始取出长整型变量s中奇数位上的数,依次构成一个新数放在t中
  16. 中国汽车原始设备制造商的厂内物流市场趋势报告、技术动态创新及市场预测
  17. 虎牙直播怎么换html5,虎牙直播怎么换徽章-虎牙直播更换粉丝徽章的方法 - 河东软件园...
  18. 你真的了解什么是冒烟测试么?
  19. 用pandas的isin,~+isin筛选数据
  20. 用鲁迅的四本书来形容大学四年~

热门文章

  1. DPDK QOS4 -- PORT数据结构的初始化
  2. (七)洞悉linux下的Netfilteriptables:状态防火墙
  3. Linux Scheduling Domains
  4. 点击按钮跳转页面_获取快手主页跳转url scheme 协议的方法(app通用方法)
  5. 北京市土壤侵蚀强度空间分布数据
  6. 三种基本排序方法-冒泡排序,选择排序,插入排序
  7. 4月10日服务器例行维护公告,4月12日服务器例行维护公告(已完成)
  8. 天翼宽带怎么开虚拟服务器,天翼宽带怎么设置无线路由器?
  9. 移动端点击一下显示再点一下消失_App用户自然流量裂变增长:移动互联网社交+深度链接技术的应用!...
  10. v3是c语言吗 yolo_你真的明白yolo v3吗?