微信企业号二次开发--自定义菜单接口开发--应用中心

https://zb.oschina.net/market/opus/1444646_161 代码

1.注册完微信企业号,需要扫描二维码。就出现输入账号和密码的表单了。登陆就会出现下面的页面了。

2.点击应用中心,新建一个应用,必须上传一个LOGO,基本都是必填项。

3.进入应用,现在回调模式,并开启。

4.开启在右上角

5.确认开启回调模式

6.输入相应的地址和配置数据

基本完成了前面的要求。开发自定义菜单就好说了。具体的有接口文档

http://qydev.weixin.qq.com/wiki/index.php?title=%E5%9B%9E%E8%B0%83%E6%A8%A1%E5%BC%8F

回调模式

在回调模式下,企业不仅可以主动调用企业号接口,还可以接收用户的消息或事件。接收的信息使用XML数据格式、UTF8编码,并以AES方式加密

企业号的每个应用都有自己的回调模式开关。在管理端开启并设置好相关参数后,此应用的回调模式才生效。

针对加解密的处理,微信提供了各种语言的库,企业可以在附录中下载。

开启应用的回调模式

当你开启应用的回调模式时,企业号会要求你填写应用的URL、Token、EncodingAESKey三个参数。

URL是企业应用接收企业号推送请求的访问协议和地址,支持http或https协议。

Token可由企业任意填写,用于生成签名。

EncodingAESKey用于消息体的加密,是AES密钥的Base64编码。

验证URL、Token以及加密的详细处理请参考后续'接收消息时的加解密处理'的部分。

验证URL有效性

当你提交以上信息时,企业号将发送GET请求到填写的URL上,GET请求携带四个参数,企业在获取时需要做urldecode处理,否则会验证不成功。

参数

描述

是否必带

msg_signature

微信加密签名,msg_signature结合了企业填写的token、请求中的timestamp、nonce参数、加密的消息体

timestamp

时间戳

nonce

随机数

echostr

加密的随机字符串,以msg_encrypt格式提供。需要解密并返回echostr明文,解密后有random、msg_len、msg、$CorpID四个字段,其中msg即为echostr明文

首次校验时必带

企业通过参数msg_signature对请求进行校验,如果确认此次GET请求来自企业号,那么企业应用对echostr参数解密并原样返回echostr明文(不能加引号),则接入验证生效,回调模式才能开启。

后续回调企业时都会在请求URL中带上以上参数(echostr除外),校验方式与首次验证URL一致。

使用回调模式

企业号在回调企业URL时,会对消息体本身做AES加密,以XML格式POST到企业应用的URL上;企业在被动回复时,也需要对数据加密,以XML格式返回给微信。企业的回复支持文本、图片、语音、视频、图文等格式

微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。如果在调试中,发现员工无法收到响应的消息,可以检查是否消息处理超时。

关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime排重。

假如企业无法保证在五秒内处理并回复,可以直接回复空串,企业号不会对此作任何处理,并且不会发起重试。这种情况下,可以使用发消息接口进行异步回复。

假设企业回调URL为http://api.3dept.com

  • 请求说明:

http://api.3dept.com/?msg_signature=ASDFQWEXZCVAQFASDFASDFSS&timestamp=13500001234&nonce=123412323

  • 回调数据格式:
<xml> 
   <ToUserName><![CDATA[toUser]]</ToUserName>
   <AgentID><![CDATA[toAgentID]]</AgentID>
   <Encrypt><![CDATA[msg_encrypt]]</Encrypt>
</xml>
1.msg_encrypt为经过加密的密文
2.AgentID为接收的应用id,可在应用的设置页面获取
3.ToUserName为企业号的CorpID

企业需要对msg_signature进行校验,并解密msg_encrypt,得出msg的原文。

  • 回复给微信的数据格式:
<xml>
   <Encrypt><![CDATA[msg_encrypt]]></Encrypt>
   <MsgSignature><![CDATA[msg_signature]]></MsgSignature>
   <TimeStamp>timestamp</TimeStamp>
   <Nonce><![CDATA[nonce]]></Nonce>
</xml>

接收消息时的加解密处理

企业可以直接使用微信提供的库进行加解密的处理,目前提供的有c++/python/php/java/c#等语言版本。代码提供了解密、加密、验证URL三个接口,企业可根据自身需要下载(参见附录)。以下为库函数的使用说明(以c++为例),更详细的加解密方案请参考附录。

1、解密函数

int DecryptMsg(const string &sMsgSignature, const string &sTimeStamp, const string &sNonce, const string &sPostData, string &sMsg);
  • 参数说明

参数

必须

说明

sMsgSignature

从回调URL中获取的msg_signature参数

sTimeStamp

从回调URL中获取的timestamp参数

sNonce

从回调URL中获取的nonce参数

sPostData

从回调URL中获取的整个post数据

sMsg

用于返回解密后的msg,以xml组织

  • 返回说明

请参阅附录加密部分。

2、加密函数

int EncryptMsg(const string &sReplyMsg, const string &sTimeStamp, const string &sNonce, string &sEncryptMsg);
  • 参数说明

参数

必须

说明

sReplyMsg

返回的消息体原文

sTimeStamp

时间戳,调用方生成

sNonce

随机数,调用方生成

sEncryptMsg

用于返回的密文,以xml组织

  • 返回说明

请参阅附录加密部分。

3、验证URL函数

int VerifyURL(const string &sMsgSignature, const string &sTimeStamp, const string &sNonce, const string &sEchoStr, string &sReplyEchoStr);
  • 参数说明

参数

必须

说明

sMsgSignature

从回调URL中获取的msg_signature参数

sTimeStamp

从回调URL中获取的timestamp参数

sNonce

从回调URL中获取的nonce参数

sEchoStr

从回调URL中获取的echostr参数。注意,此参数必须是urldecode后的值

sReplyEchoStr

解密后的echostr,用于回包。注意,必须原样返回,不要做加引号或其它处理

  • 返回说明

请参阅附录加密部分。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

BT5 + wireshark玩wifi捕获和中间人攻击

前言:先说明一下,这个文章不是我写的,是一个老外(Deepanshu Kapoor)安全专家写的,我一开始就是看着玩,但整个看完被老外那个细心和耐心给打动了,整...

30950
来自专栏Hadoop实操

如何禁止Namenode格式化

众所周知,Namenode存放Hadoop集群的元数据,Datanode存放数据。如果Namenode被格式化,那意味着整个集群的数据将全部丢失。除非元数据有备...

35780
来自专栏信安之路

逻辑漏洞之密码重置

案例介绍: 问题出现在忘记密码处,可以通过手机找回和邮箱找回密码两种方式获得指定帐户的新密码设置权限

20100
来自专栏黑白安全

用aircrack-ng破解 wifi 密码

开始前,先连上无线网卡,因为虚拟机中的kali系统不用调用笔记本自带的无线网卡,所以需要一个外接无线网卡,然后接入kali系统。

39740
来自专栏安富莱嵌入式技术分享

【RL-TCPnet网络教程】第33章 SMTP简单邮件传输协议基础知识

本章节为大家讲解SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)的基础知识,方便后面章节的实战操作。

20420
来自专栏雪胖纸的玩蛇日常

django 发送手机验证码

1K30
来自专栏Android开发与分享

【Android】Mob短信验证

86550
来自专栏FreeBuf

Linux SSH密码暴力破解技术及攻防实战

对于Linux操作系统来说,一般通过VNC、Teamviewer和SSH等工具来进行远程管理,SSH是 Secure Shell的缩写,由IETF的网络小组(N...

1.5K100
来自专栏俗人笔记

如何免费将网站升级到HTTPS

由于HTTPS可以防止页面被中间人攻击、确保数据传输过程不被篡改,保证内容完整性。所以升级网站到HTTPS是大的趋向。像苹果AppStore已经禁止使用HTTP...

36860
来自专栏闻道于事

前后端分离之JWT用户认证(转)

在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个requ...

25210

扫码关注云+社区

领取腾讯云代金券