使用delphi+intraweb进行微信开发3—微信消息处理
示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改。
在第二讲使用delphi+intraweb进行微信开发2—intraweb以.net方式发布(以asp.net mvc4模式部署)在IIS(.net虚拟主机)上 我们成功把iw应用部署在了云虚拟主机上,在这一讲里,我们将延续第一讲的内容回归微信开发,这次讲解微信消息处理。
首先明确几个知识点:
1、微信服务器转发用户消息使用的http post方法,在第一讲中关于微信服务器的http数据提交方法我们并没有细说,实际上微信进行接入验证使用的是http get方法;而转发用户消息则使用的http post方法,并且转发消息时消息以xml格式进行编码,ContentType=text/xml。
2、微信服务器消息转发是可以选择三种数据传递方式的,一、明文;二、加密;三、混合。在这一讲了为了调试方便,我们采用明文方式传递数据。下一讲再讲解消息加密方式的处理。
本来感觉这一讲的内容没什么难度,要是.net、php甚至是delphi的webbroker都应该很容易实现。但是用上iw后发现问题很复杂!
iw处理http请求数据的类是THttpRequest,但是我看遍了THttpRequest的属性和方法就没有找到直接存取http content的地方,只有个似乎是读取http content的THttpRequest.ContentFields属性,但是实际执行代码并调试后发现,这个属性根本无法取到微信服务器传递过来的xml文件,内容始终是空的。
经过反复验证发现这个ContentFields属性只能对http request时ContentType为application/x-www-form-urlencoded时传递的键值对内容有效,也就是对于表单类型的提交是可以取到数据的,在第一讲的微信接入中就是这种情况,微信传递过来的signature、timestamp、nonce等字段值都是可以通过THttpRequest.ContentFields取出来的。
事情发展到现在彻底陷入困境了,那么ContentType=text/xml时如何用THttpRequest类的方法获取内容呢?经过研究发现THttpRequest类有个Files属性,当时感觉希望就在这个属性上,毕竟xml也可以当做文件来上传不是吗?呵呵,遗憾的是,我当时无论怎么实验(反汇编dcu都用上了),这个属性的文件数始终是0,这个希望也断了!
于是乎在iw官方的问题贴论坛上发帖留言开始了求教之路,1天、2天始终有人看没人回,在屡次搜索相关提问后发现了曾经有人和我遇到同样的问题,当时作者给了回应说提问者表示不清楚要求发电子邮件给作者代码,呵呵,算是抓到稻草了,立即冒充提问者给作者发送我的代码并附上了提问,呀呀,石沉大海啊,呵呵,iw真是想爱你这么的不容易。
没有办法继续搜索其他人的提问吧,功夫不负有心人啊,终于找到了一个帖子,里面提问者和我的问题不相同,但是回答者提到iw demos里面有个PostFormData示例工程,立即查看我下载的demo,发现根本没有这个工程,上官网重新下载例子工程,呵呵,终于有了!打开代码一看,原来如此!跟第一讲一样就是一行代码难受我好几天。
亲们看吧:

就是那个“RegisterContentType”方法,呵呵,你能想到吗?帮助里面有提到吗?我靠!
好吧,总算可以了,那么接着说,增加了content-type注册之后,就可以用THttpRequest.Files获取post过来的xml了,这倒是和我最初的预测差不多,小安慰一下。
亲们,我的血泪历程告诉大家,针对iw这种帮助不完善又没源代码的web开发框架,提问区查找和iw demos就是我们最大的依靠了,要用iw就赶紧下载个最新的demo看看吧。
剩下就没什么好说了,贴个代码截图大伙看看,照着微信的文档做,比较容易:

TEventHandler类:

部署到服务器上后用微信客户端测试截屏:

如果你看到这里了,好吧,我再告诉你个小秘密吧:
经我反复测试,那个“RegisterContentType”方法只在SA、ISAPI模式下有效,当我按照第二讲说的编译成library并按照aspx模式部署好后,无论如何也取不到xml文件,仅仅是工程类型由于部署要求做了个变化,其它代码都没有任何变化,就是不知道是为什么,上图大伙看到的截图是我以ISAPI方式部署在我服务器上实现的。
最后再附上微信消息的xml格式中日期字段的编解码函数,微信的日期类型是整形值,所以需要将整形值转成TDateTime类型,微信的整形值的计算是以'1970-01-01 00:00:00'作为基准时间计算的秒差。另外需要注意的是,微信时间是UTC时间,也就是转换成北京时间要加上8个小时。
/// <summary>
/// 微信的日期时间都是int64类型,是和1970-01-01 00:00:00之间的秒差,这个函数用来返回1970-01-01 00:00:00时刻
/// </summary>
/// <returns>1970-01-01 00:00:00</returns>
function GetWxBaseDt: TDateTime;
begin
Result := VarToDateTime('1970-01-01 00:00:00');
end;
/// <summary>
/// 获取适合微信使用的当前日期,以int64表示,是当前时间和1970-01-01 00:00:00之间的秒差
/// 然后再减去3600*8转成UTC时间秒差即为微信时间
/// </summary>
/// <returns>当前时间,int64格式</returns>
function GetWxNow: Int64;
begin
Result := SecondsBetween(Now, GetWxBaseDt) - 3600 * 8;
end;
function GetWxNowStr: string;
var
i64: Int64;
begin
i64 := GetWxNow;
Result := IntToStr(i64);
end;
*8);
end;
使用delphi+intraweb进行微信开发3—微信消息处理的更多相关文章
- [微信开发利器]微信内移动前端开发抓包调试工具fiddler使用教程
[微信开发利器]微信内移动前端开发抓包调试工具fiddler使用教程 在朋友圈看到一款疯转的H5小游戏,想要copy,什么?只能在微信里打开?小样,图样图森破,限制了oauth.微信浏览器内打开, ...
- php 微信开发之 微信支付 V3 开发 -CURLOP_TIMEOUT问题
如果不懂怎么配置的话请看文章 php 微信开发之 微信支付配置 基本配置后在继续本文章的开发 . 本文章就先继续基本的实现!也并不困难.我大概的思路的返回购买者的唯一id 和 订单号的唯一 id 就2 ...
- 微信开发_微信教程__微信通讯框架V1.0
做个广告先, PHP千人群(6848027) C++群 (1414577) 看雪汇编&反汇编群(15375777) 看雪汇编&反汇编2群(4915800) 转载不一定注明出处,只要推荐 ...
- 微信开发:微信js_sdk 分享,前端部分(二)
微信开发:微信js-sdk前端分享,代码如下: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"> ...
- 使用delphi+intraweb进行微信开发4—微信消息加解密
示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改. 在上一讲当中我做了个简单的微信文本消 ...
- 微信开发(2)---微信小程序开发实战part1
微信开发现在来说,简单可以概括为两部分,微信公众号和微信小程序. 微信公众号的技术已经非常成熟.分为服务号和订阅号.简单的.可以弄一个个人订阅号,在编辑模式下就可以实现推送图文.自动回复.自定义菜单的 ...
- 微信开发系列——微信订阅号前端开发利器:WeUI
前言:年前的两个星期,学习了下微信公众号的开发.后端基本能够基于盛派的第三方sdk能搞定大部分事宜.剩下的就是前端了,关于手机端的浏览器的兼容性,一直是博主的一块心病,因为博主一直专注于bootstr ...
- 微信开发:微信js_sdk分享,使用场景,网页在微信app内部分享时的标题与描述,包括logo设置(一)
主要有下面几步.首先大家先分清楚 小程序的appid,appSecret 跟公众号的appid,appSecret是不一样的.因为这两个都能拿到token,且是不同的值. 准备开始: 1.准备好 公众 ...
- 【微信开发】微信公众平台接入及绑定提示“请求URL超时”的解决办法
成为微信开发者的第一步--微信公众平台接入 第一步:填写服务器配置 在开发->基本配置处启用服务器配置.修改配置 其中URL是开发者用来接收微信消息和事件的接口URL. Token可由开发者可以 ...
随机推荐
- Localization要从第一天开始计划
最近E3,微软说可以在任何region玩任何语言的游戏了.换一个语言么,听起来没有那么复杂,其实操作起来还得是从软件工程初期就好好计划. Windows在很长一段时间,你安装完了,就不能换语言了.大学 ...
- RSA不限长度非对称加密解密C#
RSA 分段加解密[解决“不正确的长度”的异常] RSA 是常用的非对称加密算法.最近使用时却出现了“不正确的长度”的异常,研究发现是由于待加密的数据超长所致. .NET Framework 中提供的 ...
- java.nio.ByteBuffer中flip,rewind,clear方法的区别
对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. p ...
- Enhanced Mitigation Experience Toolkit 软件安全性强化工具
Enhanced Mitigation Experience Toolkit软件是微软为应对互联网中层出不穷的漏洞而推出的一款安全工具,可以在Window Update未获取到补丁前,对系统进行保护. ...
- 结对编程--基于android平台的黄金点游戏(2.0版本)
在昨天上传完博客之后发现一个重大的bug...故在此推出2.0版本. 博文详情见:http://www.cnblogs.com/RayShea/p/5372398.html coding地址:http ...
- WCF初体验(C#操作Exchange)
最近再做一个Exchange的客户端维护工具,遇到了很多问题. 由于刚接触C#和Exchange,所以还需要继续学习.在此记录一下,只是一个新手的记录. 环境: 服务器:Exchang ...
- 听桶哥讲session和cookie
首先,cookie和session是什么关系? 他们的关系很简单,利用和被利用的关系. 话说,由于http协议的无状态特性,同一client两个不同的请求之间完全独立,没有很好的办法进行一些数据共享, ...
- Web 应用程序中的安全向量 – ASP.NET MVC 4 系列
Web 程序运行在标准的.基于文本的协议(HTTP 和 HTML)之上,所以特别容易受到自动攻击的伤害.本章主要介绍黑客如何滥用应用程序,以及针对这些问题的应对措施. 威胁:跨站脚本 ...
- [PHP] - Laravel 5 的 Hello Wold
吐槽一段 整了半天,Laravel下载麻烦得可以去死.先要安装composer,而composer又被共墙了,之后又要安装git,安装完git还要注册git,等等.... 最终放弃这种玩法,太恶心了. ...
- pstools使用教程
pstools是sysinternals开发的一个功能强大的nt/2k远程管理工具包. 官方网址为http://www.sysinternals.com/ 下载地址为http://www.sysint ...