什么是微信公众平台

微信公众号主要面向名人、政府、媒体、企业等机构推出的合作推广业务。在这里可以通过微信渠道将品牌推广给上亿的微信用户,减少宣传成本,提高品牌知名度,打造更具影响力的品牌形象。

初始微信公众平台

官方网址

https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN

帐号分类

微信公众平台介绍

消息管理

用户管理

素材管理

基本设置

服务器配置(未启用)

启用并设置服务器配置后,用户发给公众号的消息以及开发者需要的事件推送,将被微信转发到该URL中

外网映射工具

Ngrok使用

●windows用户:

1,下载windows版本的客户端,解压到你喜欢的目录
2,在命令行下进入到path/to/windows_386/下
3,执行 ngrok -config=ngrok.cfg -subdomain xxx 80 //(xxx 是你自定义的域名前缀)

4,如果开启成功 你就可以使用 xxx.tunnel.qydev.com 来访问你本机的 127.0.0.1:80 的服务啦
5,如果你自己有顶级域名,想通过自己的域名来访问本机的项目,那么先将自己的顶级域名解析到123.57.165.240(域名需要已备案哦),然后执行./ngrok -config=ngrok.cfg -hostname xxx.xxx.xxx 80 //(xxx.xxx.xxx是你自定义的顶级域名)
6,如果开启成功 你就可以使用你的顶级域名来访问你本机的 127.0.0.1:80 的服务啦

Natapp使用

  windows ,点击开始->运行->命令行提示符 后进入 natapp.exe的目录
    运行   natapp -authtoken= 175396706488ac93

公众测试平台

因为是非认证公众号,部分权限不足,建议大家测试中使用公众测试平台。

https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

微信环境搭建

相关依赖

itmayiedu-shopp-parent 新增

<dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId></dependency><dependency><groupId>org.glassfish.jersey.core</groupId><artifactId>jersey-server</artifactId></dependency>

配置文件

application.yml

server:port: 81#  context-path: /webeureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/spring:application:name: weixin

微信事件通知验证

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

工具

CheckUtil

public class CheckUtil {public static final String tooken = "itmayiedu"; // 开发者自行定义Tookenpublic static boolean checkSignature(String signature, String timestamp, String nonce) {// 1.定义数组存放tooken,timestamp,nonceString[] arr = { tooken, timestamp, nonce };// 2.对数组进行排序Arrays.sort(arr);// 3.生成字符串StringBuffer sb = new StringBuffer();for (String s : arr) {sb.append(s);}// 4.sha1加密,网上均有现成代码String temp = getSha1(sb.toString());// 5.将加密后的字符串,与微信传来的加密签名比较,返回结果return temp.equals(signature);}public static String getSha1(String str) {if (str == null || str.length() == 0) {return null;}char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };try {MessageDigest mdTemp = MessageDigest.getInstance("SHA1");mdTemp.update(str.getBytes("UTF-8"));byte[] md = mdTemp.digest();int j = md.length;char buf[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];buf[k++] = hexDigits[byte0 >>> 4 & 0xf];buf[k++] = hexDigits[byte0 & 0xf];}return new String(buf);} catch (Exception e) {return null;}}}

XmlUtils

public class XmlUtils {/*** 解析微信发来的请求(XML)** @param request* @return Map<String, String>* @throws Exception*/@SuppressWarnings("unchecked")public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {// 将解析结果存储在HashMap中Map<String, String> map = new HashMap<String, String>();// 从request中取得输入流InputStream inputStream = request.getInputStream();// 读取输入流SAXReader reader = new SAXReader();Document document = reader.read(inputStream);// 得到xml根元素Element root = document.getRootElement();// 得到根元素的所有子节点List<Element> elementList = root.elements();// 遍历所有子节点for (Element e : elementList)map.put(e.getName(), e.getText());// 释放资源inputStream.close();inputStream = null;return map;}/*** 文本消息对象转换成xml** @param textMessage*            文本消息对象* @return xml*/public static String messageToXml(TextMessage textMessage) {xstream.alias("xml", textMessage.getClass());return xstream.toXML(textMessage);}/*** 扩展xstream使其支持CDATA*/private static XStream xstream = new XStream();}

JSONObject

// 调用第三方智能接口String resultStr = HttpClientUtil.doGet("http://api.qingyunke.com/api.php?key=free&appid=0&msg=" + content);JSONObject jsonObject = new JSONObject().parseObject(resultStr);Integer integer = jsonObject.getInteger("result");if (integer == null || integer != 0) {textMessage = setTextMessage("亲,系统出错啦!", toUserName, fromUserName);} else {String result = jsonObject.getString("content");textMessage = setTextMessage(result, toUserName, fromUserName);}

HttpClientUtil

public class HttpClientUtil {public static String doGet(String url, Map<String, String> param) {// 创建Httpclient对象CloseableHttpClient httpclient = HttpClients.createDefault();String resultString = "";CloseableHttpResponse response = null;try {// 创建uriURIBuilder builder = new URIBuilder(url);if (param != null) {for (String key : param.keySet()) {builder.addParameter(key, param.get(key));}}URI uri = builder.build();// 创建http GET请求HttpGet httpGet = new HttpGet(uri);// 执行请求response = httpclient.execute(httpGet);// 判断返回状态是否为200if (response.getStatusLine().getStatusCode() == 200) {resultString = EntityUtils.toString(response.getEntity(), "UTF-8");}} catch (Exception e) {e.printStackTrace();} finally {try {if (response != null) {response.close();}httpclient.close();} catch (IOException e) {e.printStackTrace();}}return resultString;}public static String doGet(String url) {return doGet(url, null);}public static String doPost(String url, Map<String, String> param) {// 创建Httpclient对象CloseableHttpClient httpClient = HttpClients.createDefault();CloseableHttpResponse response = null;String resultString = "";try {// 创建Http Post请求HttpPost httpPost = new HttpPost(url);// 创建参数列表if (param != null) {List<NameValuePair> paramList = new ArrayList<>();for (String key : param.keySet()) {paramList.add(new BasicNameValuePair(key, param.get(key)));}// 模拟表单UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);httpPost.setEntity(entity);}// 执行http请求response = httpClient.execute(httpPost);resultString = EntityUtils.toString(response.getEntity(), "utf-8");} catch (Exception e) {e.printStackTrace();} finally {try {response.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return resultString;}public static String doPost(String url) {return doPost(url, null);}public static String doPostJson(String url, String json) {// 创建Httpclient对象CloseableHttpClient httpClient = HttpClients.createDefault();CloseableHttpResponse response = null;String resultString = "";try {// 创建Http Post请求HttpPost httpPost = new HttpPost(url);// 创建请求内容StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);httpPost.setEntity(entity);// 执行http请求response = httpClient.execute(httpPost);resultString = EntityUtils.toString(response.getEntity(), "utf-8");} catch (Exception e) {e.printStackTrace();} finally {try {response.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return resultString;}}

BaseMessage

@Getter@Setterpublic class BaseMessage {/*** 开发者微信*/private String ToUserName;/*** 发送方openid*/private String FromUserName;/*** 创建时间*/private long CreateTime;/*** 内容类型*/private String MsgType;// /**// * 消息id// */// private long MsgId ;}

TextMessage

@Getter@Setterpublic class TextMessage extends BaseMessage {private String Content;}

DispatCherServlet

@Slf4j@RestControllerpublic class DispatCherServlet {private static final String REQEST_HTTP = "http://api.qingyunke.com/api.php?key=free&appid=0&msg=";@RequestMapping(value = "/dispatCherServlet", method = RequestMethod.GET)public String dispatCherServletGet(String signature, String timestamp, String nonce, String echostr) {// 1.验证是否微信来源boolean checkSignature = CheckUtil.checkSignature(signature, timestamp, nonce);// 2.如果是微信来源 返回 随机数echostrif (!checkSignature) {return null;}return echostr;}@RequestMapping(value = "/dispatCherServlet", method = RequestMethod.POST)public void dispatCherServletPost(HttpServletRequest reqest, HttpServletResponse response) throws Exception {reqest.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");Map<String, String> mapResult = XmlUtils.parseXml(reqest);if (mapResult == null) {return;}String msgType = mapResult.get("MsgType");PrintWriter writer = response.getWriter();switch (msgType) {case "text":// 获取消息内容String content = mapResult.get("Content");// 发送消息String toUserName = mapResult.get("ToUserName");// 来自消息String fromUserName = mapResult.get("FromUserName");// 調用智能机器人接口String requestResultJson = HttpClientUtil.doGet(REQEST_HTTP + content);JSONObject jsonObject = new JSONObject().parseObject(requestResultJson);String result = jsonObject.getString("result");String msg = null;if (result.equals("0")) {msg = jsonObject.getString("content");} else {msg = "我也不知道回答什么!";}String resultTestMsg = setTextMess(msg, toUserName, fromUserName);writer.print(resultTestMsg);break;default:break;}writer.close();}public String setTextMess(String content, String fromUserName, String toUserName) {TextMessage textMessage = new TextMessage();textMessage.setFromUserName(fromUserName);textMessage.setToUserName(toUserName);textMessage.setContent(content);textMessage.setMsgType("text");textMessage.setCreateTime(new Date().getTime());String messageToXml = XmlUtils.messageToXml(textMessage);log.info("####setTextMess()###messageToXml:" + messageToXml);return messageToXml;}}

青云客智能聊天机器人API

http://api.qingyunke.com/

智能机器人API接口说明
支持功能:天气、翻译、藏头诗、笑话、歌词、计算、域名信息/备案/收录查询、IP查询、手机号码归属、人工智能聊天
接口地址:http://api.qingyunke.com/api.php?key=free&appid=0&msg=关键词
key 固定参数free
appid 设置为0,表示智能识别,可忽略此参数
msg 关键词,请参考下方参数示例,该参数可智能识别,该值请经过 urlencode 处理后再提交
返回结果:{"result":0,"content":"内容"}
result 状态,0表示正常,其它数字表示错误
content 信息内容

使用第三方框架开发微信公众号

weixin-java-tools

https://github.com/wechat-group/weixin-java-tools

微信消息模板接口

概述

模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。

参考网址: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277

代码

@RestController@RequestMapping("/weiXin")public class WeiXinCatController {@Autowiredprivate WxMpService wxService;@RequestMapping("/sendTemplate")public String createWeiXinCat(@RequestBody WxMpTemplateMessage wxMpTemplateMessage) throws WxErrorException {WxMpTemplateMsgService templateMsgService = wxService.getTemplateMsgService();return templateMsgService.sendTemplateMsg(wxMpTemplateMessage);}}

参数

请求地址http://127.0.0.1:81/weiXin/sendTemplate{"toUser": "okYSmt0cItTc4dZXFn43BbmYW8Rw","templateId": "eLozPgRNCPMEgOWGHwNW6cXkfrVqtsyDsyEwVabu0ww","url": "http://www.itmayiedu.com","data": [{"name": "first","value": "2017年11月06日 23:32","color": "#173177"},{"name": "keyword1","value": "30","color": "#173177"},{"name": "keyword2","value": "201410515111522","color": "#173177"}]}

网页授权

参考文章: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

Http协议转码

UrlEnCodeUrlDeCode

有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值。例如 空格的编码值是"%20"。
下表中列出了一些URL特殊符号及编码
:替换为%3A 
1. + URL 中+号表示空格 %2B 
2. 空格 URL中的空格可以用+号或者编码 %20 
3. / 分隔目录和子目录 %2F 
4. ? 分隔实际的 URL 和参数 %3F 
5. % 指定特殊字符 %25 
6. # 表示书签 %23 
7. & URL 中指定的参数间的分隔符 %26 
8. = URL 中指定参数的值 %3D

@RequestMapping("/test")public String test(String name) {System.out.println("name:" + name);return "test" + name;}
public static void main(String[] args) {String userNameEncode = URLEncoder.encode("yusheng+jun");System.out.println("userNameEncode:" + userNameEncode);String userNameDecode = URLDecoder.decode(userNameEncode);System.out.println("userNameDecode:" + userNameDecode);}

微信公众号平台项目开发相关推荐

  1. 微信公众号平台接口开发:发送客服消息

    官方接口介绍 发送文本信息 参数有4个, access_token这个就不用介绍了,就是之前得到的那个AccessToken,就是在这个接口里边当中参数用的 touser是关注了公众号的微信用户的op ...

  2. php微信公众号天气预报,微信公众号平台天气预报开发

    获取天气的代码,然后方法放在微信中调用便可 function httpRequest($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, ...

  3. 公众号第三方平台和微信公众号平台的区别与开发步骤

    我们知道通过微信公众号平台的开放API可以实现用户个性制定制的功能,我们又知道使用开放API时必须知道AppID(应用ID)和AppSecret(应用密钥),而且还要配置URL(服务器地址).Toke ...

  4. 微信公众号Java开发-笔记01【微信公众号介绍、开发环境搭建】

    学习网址:哔哩哔哩网站 微信公众号开发-Java版 微信公众号Java开发-笔记01[微信公众号介绍.开发环境搭建] 微信公众号Java开发-笔记02[] 微信公众号Java开发-笔记03[] 微信公 ...

  5. 微信公众号消息模板开发

    为什么80%的码农都做不了架构师?>>>    ##背景 新需求,需要在订单的时候给用户,商家,配送员发送想对于的微信消息模板,之前没有做过微信公众号相关的开发,这次就一并熟悉吧 # ...

  6. 微信公众号对接PHP电影网站,wxapi 微信公众号平台与电影类网站对接源码 wxapi 联合开发网 - pudn.com...

    wxapi 所属分类:微信小程序 开发工具:Java 文件大小:3KB 下载次数:0 上传日期:2019-02-16 23:41:01 上 传 者:lziccard 说明:  微信公众号平台与电影类网 ...

  7. 适合新手学习的laravel接入微信接口,实现微信公众号二次开发

    2019独角兽企业重金招聘Python工程师标准>>> 最近使用laravel做微信公众号二次开发,发现网上能够参考的资料基本上很少,很多地方都讲的不够详细,致使许多新手采坑无数,所 ...

  8. 微信公众号平台登陆-你已授权登陆过XXXX

    上周开始开发微信 从微信公众号点击按钮去我们的服务器 结果除了第一次点击按钮确认授权以外,以后每次都会出现这个页面 加班研究了好几天 终于解决了 原来参考微信公众号平台文档 文档告诉我,state这个 ...

  9. 微信公众号二次开发实现自动回复文字,图片,图文功能

    微信公众号二次开发实现自动回复文字,图片,图文功能 自动回复文字或图片: 表单里需要有关键字和内容.但就这两个字段也需要在两个数据表里分别显示,因为要提前准备字段内容里有可能是图片,图文等等类型.所以 ...

最新文章

  1. No module named ‘jieba‘ python3.7
  2. 【机器学习】算法大全
  3. WEKA The workbench for machine learning
  4. Vue 跳转相同路由携带不同参数,而页面不刷新
  5. android 恢复app 到前台,android手机把app disable了,怎么恢复
  6. 分布式任务调度框架hanzelcast使用
  7. 好用的python表白神器_Python|520表白神器
  8. Windows创建的基本含义和进程的进程的内核
  9. Android AIDL
  10. OSS SSL 访问异常
  11. 自动阅读软件脚本应用开发app头条新闻引流阅读
  12. 电视html接口,HDMI是什么接口?
  13. android 格式化sd咔_在Android手机上怎么对SD卡进行格式化
  14. 为何中华武术不堪一击?武学大师临终前解密搏击格斗的残酷真相
  15. php eval函数的用法,php eval函数用法详解
  16. 机顶盒ttl无法输入_连接TTL线后无法输入代码、不跑码乱码的解决方法
  17. 学习H5仿制网站时遇到的问题
  18. 各类支付通道大全以及支付通道选择
  19. cocos2d-x 横板游戏触屏人物和背景移动 方法1
  20. 欢迎使用CSDN-markdown编辑器lalal

热门文章

  1. 2010 年 Web 设计风 (下)
  2. 万年历软件各个接口功能的实现
  3. videojs 从上次播放的时间点开始播放
  4. 微信小程序添加全景实例
  5. Windows系统文件夹加密解密教程
  6. SQL中drop table语句删除数据表
  7. 【笔记】电商RFM模型
  8. 2020年英语六级作文(附翻译)
  9. 七段数码管数字时钟实时显示显示(年月日时分秒)
  10. python爬虫豆瓣评论实验报告_用python实现豆瓣短评通用爬虫(登录、爬取、可视化分析)...