微信企业号开发入门(回调模式)java
最近在开发微信企业号,刚接触时云里雾里的,在摸索过程中终于清晰了一点。
刚开始我以为订阅号、服务号、企业号的接口差不多,就一直用订阅号的教程来入门,后来才发现差的挺多的。
首先,微信企业号不像订阅号和服务号,就一个主页面。企业号的开发其实是对应用的开发。
先附上微信企业号开发官方文档:https://qydev.weixin.qq.com/wiki/index.php
一、企业微信管理页面配置
网址:https://work.weixin.qq.com/wework_admin/frame
1、在注册完企业号后,先创建一个应用
2、在应用管理--自建的应用中配置可信域名
需要注意的是,微信公众号的开发测试需要访问到外网的服务器,且端口只能为80。
这里推荐使用 natapp进行配置,具体使用看 :https://blog.csdn.net/qq_33922980/article/details/90244160 (自备域名的可以忽略)
启动后,填写可信域名
3、配置接收消息的api(这里我已经配好了)
Token和EncodingAESKey可以使用随机获取,url填写刚刚配置的可信域名,及准备调用的接口。
此时点击保存,会提示服务器异常,请稍后再试。
这是由于点击保存时,微信会向我们添加的url发送一个get请求,需要我们返回值。
附上官方说明:
附上url检验代码:
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public String checkToken(@RequestParam(name = "msg_signature") String signature, String timestamp, String nonce, String echostr) throws AesException {
//token和encoding_aeskey就是上诉随机获取的值,corp_id是企业id,在企业微信管理页面点击: 我的企业,拉到最下方可以看到
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(TOTKN, ENCODING_AESKEY, CORP_ID);
String sEchoStr = wxcpt.VerifyURL(signature, timestamp,nonce, echostr);
System.out.println("-----签名校验通过-----");
return sEchoStr;
}
其中,WXBizMsgCrypt是官方提供的加解密库,下载地址:https://qydev.weixin.qq.com/download/java.zip
为方便使用,我直接打成了jar包,有需要的自取。链接: https://pan.baidu.com/s/1Xtzd69T8jVL3w8Kg1jnreQ 提取码: jeeu
再点击保存,就通过了。
此时后台管理的配置完成。
二、实际功能开发
1、回调模式
该url的调用有两个,一个是上述的url检验时调用,第二个是回调模式调用。不同点是回调模式是发post请求,且携带的参数不一样。
这里说明一下,第二个回调模式是说,成员发送消息或触发事件时都会调用该接口,我们根据逻辑处理后再进行反馈。
接收的信息使用XML数据格式、UTF8编码,并以AES方式加密。
这里我们封装一个类,来接收回调数据。
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="xml")
@XmlAccessorType(XmlAccessType.FIELD)
public class InMsgEntity {
/**
* 接收的应用id,可在应用的设置页面获取
*/
@XmlElement(name = "AgentID")
private String agentID;
/**
* 经过加密的密文
*/
@XmlElement(name = "Encrypt")
private String encrypt;
/**
* 发送方帐号
*/
@XmlElement(name="ToUserName")
private String toUserName; public String getAgentID() {
return agentID;
} public void setAgentID(String agentID) {
this.agentID = agentID;
} public String getEncrypt() {
return encrypt;
} public void setEncrypt(String encrypt) {
this.encrypt = encrypt;
} public String getToUserName() {
return toUserName;
} public void setToUserName(String toUserName) {
this.toUserName = toUserName;
}
}
再写两个工具类,来转换格式。
(1)因为要调用官方的加解密库,所以要封装成他需要格式的字符串。
import com.newland.bean.InMsgEntity;
public class FormatUtils {
/**
* 接收请求格式封装
* @param msg
* @return
*/
public static String getReqData(InMsgEntity msg){
return "<xml><ToUserName><![CDATA["+msg.getToUserName()+"]]></ToUserName><Encrypt><![CDATA[" +msg.getEncrypt()+
"]]></Encrypt><AgentID><![CDATA["+msg.getAgentID()+"]]></AgentID></xml>";
} /**
* 发送文字消息格式封装
* @param content
* @return
*/
public static String getTextRespData(String content){
return "<xml><MsgType><![CDATA[text]]></MsgType><Content><![CDATA["+content+"]]></Content></xml>";
}
}
(2)为方便处理xml格式的数据,写一个标签处理的工具类
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.StringReader;
public class ElementUtils {
private Element root = null;
/**
* 根据xml格式的字符串建document
* @param sMsg
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
*/
public ElementUtils(String sMsg) throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
StringReader sr = new StringReader(sMsg);
InputSource is = new InputSource(sr);
Document document = db.parse(is);
root = document.getDocumentElement();
} /**
* 根据tagName获取内容
* @param tagName
* @return
*/
public String get(String tagName){
return root.getElementsByTagName(tagName).item(0).getTextContent();
}
}
最后回调模式代码:(这里没写太多,可以根据自身需要写逻辑)
@RequestMapping(method = RequestMethod.POST,produces = {"application/xml;charset=UTF-8"})
@ResponseBody
public Object handlerMessage(@RequestBody InMsgEntity msg, @RequestParam(name = "msg_signature") String signature,
String timestamp, String nonce) throws Exception {
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(TOTKN, ENCODING_AESKEY, CORP_ID);
String sReqData = FormatUtils.getReqData(msg);
String sMsg = wxcpt.DecryptMsg(signature, timestamp, nonce, sReqData);
ElementUtils element = new ElementUtils(sMsg);
String msgType = element.get("MsgType");
String content = "";
switch (msgType){
/**
* 事件类型处理
*/
case "event":content = "触发事件";break;
/**
* 文字消息处理:这里是将用户发送的消息原样返回
*/
case "text": content = element.get("Content");break;
default:break;
}
String sRespData = FormatUtils.getTextRespData(content);
String sEncryptMsg = wxcpt.EncryptMsg(sRespData, timestamp, nonce);
return sEncryptMsg;
}
很奇怪的是,在企业微信官方文档里,并没有给出Encrypt解密之后的格式,要在微信公众号官方文档里看:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html
或者你也可以通过在上诉代码获得sMsg之后,打断点或输出sMsg的值来查看格式。
这里附上几种常用类型的数据格式。其中ToUserName、FromUserName、CreateTime、MsgType是公共标签。
(1)文字消息类型格式:
(2)图片消息格式
(3)关注取关事件数据格式:
到这里,可以试着向应用发送消息了,或者尝试重新关注,看看是否有回复消息。
因为我目前这个企业号功能不多,所以只写了文字格式的回复,有需要的话可以自行去官方文档那对应消息格式进行改动~
微信企业号开发入门(回调模式)java的更多相关文章
- .net之微信企业号开发(三) 回调模式的接口开发
一.前言 微信企业号应用中,有两种模式,一种是普通模式,这种模式只能进行简单网页链接,以及发送固定的消息.为了可以让企业号的用户更好的与应用交互,微信提供了回调模式,这种回调模式的可以将用户发送给微信 ...
- .net之微信企业号开发(二) 企业号人员身份认证与开发
前言 这里完全可以链接一个登录页面,让用户输入用户名密码进行登录的...2333 但是,这样所就完全失去了微信企业号的意义,本来进入微信企业号的时候,就已经对人员身份进行认证了,你这里再让别人登录,不 ...
- .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
前言 一直以来,从事的是.net winform的编程,虽然对移动互联这块很感兴趣,但是由于现有的工作和移动互联之间隔的太远,也就没有时间和精力好好的去研究和实现.今年年初辞职了,刚好朋友那里希望建立 ...
- 微信企业号开发之-如何获取secret 序列号
最近有项目基于微信企业号开发,简单记录下如何查看企业号secert 工具/原料 微信企业号 方法/步骤 用管理员的帐号登录后,选择[设置]-[权限管理]进入管理组设置界面 在左边点击[ ...
- Force.com微信企业号开发系列(一) - 启用二次验证
微信于9月份推出企业号后引起了业界不小的反响,许多企业都在思索企业号将如何影响企业的运营,从本文开始,我将详细阐述微信企业号开发的相关知识,而本文将着重介绍如何实现更高安全机制的二次验证. 申请企业体 ...
- 微信企业号开发(1)WebAPI在回调模式中的URL验证
微信回调模式的官方文档. 开发语言:C#(微信相关功能代码可以从官网下载) 首先,必须要明确几个参数,这几个参数在微信企业号中,每次调用都会使用到. 1.msg_signature:签名(已加密,加密 ...
- 如何用php开启企业微信开发的回调模式
猜想: 懵逼 实践: 微信公众号开发的手册中甚至给出了只需要修改几个参数就能使用的范例.企业微信开发中在一个很不显眼的地方放了一个sample. https://work.weixin.qq.com/ ...
- 基于Java spring框架的微信企业号开发中关于js-sdk的配置
在调用js-sdk的第一步,我们需要引入js-sdk的js链接,然后执行wx.config,官方示例如下所示: wx.config({ debug: true, // 开启调试模式,调用的所有api的 ...
- 微信测试号开发入门配置问题java
这个测试号配置弄了好几天了,入了无数坑,终于解决了...辛苦我了,手动安慰一下自己.. 为了萌新们以后不要再浪费时间绕半天做无用功.看看楼楼的艰苦历程吧. 此教程针对没有云服务器,没有自己的域名的.没 ...
随机推荐
- Servlet实现用户登录
1.登录过程分析: 通过表单收集用户的数据,Servlet通过request对象获得用户提交的数据,服务器还需要从数据库中通过sql语句查询有没有表单提交的数据中的用户.有则登录成功,否则,登录失败. ...
- CSS——样式表的引入
1.内部样式表 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- IPMI在linux下常用命令
ipmitool lan print 1 ipmitool lan set 1 ipaddr 192.168.0.12 ipmitool lan set 1 netmask 255.255.255.0 ...
- SpringBoot的一个小彩蛋
彩蛋这种东西还算比较常见,在电影或者游戏里面我们也遇见过不少.今天就简单介绍一下SpringBoot里面的一个小彩蛋. 玩过SpringBoot的同志都知道,SpringBoot的启动界面是这酱紫的: ...
- 06.Django基础五之django模型层(二)多表操作
一 创建模型 表和表之间的关系 一对一.多对一.多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束. ...
- 第八届蓝桥杯java b组第十题
标题: k倍区间 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...
- selenium-05-问题2
现在的项目组用开源的Selenium做测试,但不得不说,这个东东bug奇多,下面是我遇到的一些问题,有些提供了解决方法,有些则需要继续研究,希望对各位看官有所帮助. 一.不能从命令行运行Seleniu ...
- 认识Airflow的DAG
前文Airflow的第一个DAG已经跑起来了我们的第一个任务. 本文就来丰富这个任务. 回顾我们的任务内容 我们定义了DAG的名称为Hello-World, 这个叫dag_id, 补充说明descri ...
- 基于Docker搭建大数据集群(一)Docker环境部署
本篇文章是基于Docker搭建大数据集群系列的开篇之作 主要内容 docker搭建 docker部署CentOS 容器免密钥通信 容器保存成镜像 docker镜像发布 环境 Linux 7.6 一.D ...
- redis常用操作-键的生存时间
System.out.println("设置 key001的过期时间为5秒:"+jedis.expire("key001", 5)); System.out.p ...