示例代码已经放出!请移步使用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—微信消息处理的更多相关文章

  1. [微信开发利器]微信内移动前端开发抓包调试工具fiddler使用教程

    [微信开发利器]微信内移动前端开发抓包调试工具fiddler使用教程   在朋友圈看到一款疯转的H5小游戏,想要copy,什么?只能在微信里打开?小样,图样图森破,限制了oauth.微信浏览器内打开, ...

  2. php 微信开发之 微信支付 V3 开发 -CURLOP_TIMEOUT问题

    如果不懂怎么配置的话请看文章 php 微信开发之 微信支付配置 基本配置后在继续本文章的开发 . 本文章就先继续基本的实现!也并不困难.我大概的思路的返回购买者的唯一id 和 订单号的唯一 id 就2 ...

  3. 微信开发_微信教程__微信通讯框架V1.0

    做个广告先, PHP千人群(6848027) C++群 (1414577) 看雪汇编&反汇编群(15375777) 看雪汇编&反汇编2群(4915800) 转载不一定注明出处,只要推荐 ...

  4. 使用delphi+intraweb进行微信开发4—微信消息加解密

    示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改. 在上一讲当中我做了个简单的微信文本消 ...

  5. 微信开发(2)---微信小程序开发实战part1

    微信开发现在来说,简单可以概括为两部分,微信公众号和微信小程序. 微信公众号的技术已经非常成熟.分为服务号和订阅号.简单的.可以弄一个个人订阅号,在编辑模式下就可以实现推送图文.自动回复.自定义菜单的 ...

  6. 微信开发系列——微信订阅号前端开发利器:WeUI

    前言:年前的两个星期,学习了下微信公众号的开发.后端基本能够基于盛派的第三方sdk能搞定大部分事宜.剩下的就是前端了,关于手机端的浏览器的兼容性,一直是博主的一块心病,因为博主一直专注于bootstr ...

  7. 【微信开发】微信公众平台接入及绑定提示“请求URL超时”的解决办法

    成为微信开发者的第一步--微信公众平台接入 第一步:填写服务器配置 在开发->基本配置处启用服务器配置.修改配置 其中URL是开发者用来接收微信消息和事件的接口URL. Token可由开发者可以 ...

  8. .Net 微信开发与微信支付

    .NET     https://github.com/JeffreySu/WeiXinMPSDK JAVA   http://git.oschina.net/pyinjava/fastweixin ...

  9. 微信开发那点事(No.001)

    MXS&Vincene  ─╄OvЁ  &0000024─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄OvЁ:今天很残酷,明天更残酷,后天很美好, ...

随机推荐

  1. JSPatch 中 defineClass 中覆盖方法的使用

    今天研究了一下JSPatch,发现好神奇好奇妙,感觉这几天我都会乐此不彼的去研究这个高大上的东西. 出处来着:https://github.com/bang590/JSPatch 简单介绍一下这个 d ...

  2. LDD3 字符设备驱动简单分析

    最近在看LDD3,理解了一下,为了加深自己的印象,自己梳理一下.我用的CentOS release 6.6 (Final)系统. 一.编写编译内核模块的Makefile 以下是我用的Makefile ...

  3. NuGet学习笔记3——搭建属于自己的NuGet服务器

    文章导读 创建NuGetServer Web站点 发布站点到IIS 添加本地站点到包包数据源 在上一篇NuGet学习笔记(2) 使用图形化界面打包自己的类库 中讲解了如何打包自己的类库,接下来进行最重 ...

  4. node基础05:路由基础

    1.基础实例 //server.js var http = require("http"); var url = require("url"); var rou ...

  5. Beta Daily Scrum 第四天

    [目录] 1.任务进度 2.困难及解决 3.燃尽图 4.代码check-in 5.站立会议图 6.总结 1. 任务进度 学号 今日完成 明日完成 612 完成成就界面的统计图表 继续编写成就界面的图表 ...

  6. Windows Azure Table storage 之 动态Table类 DynamicTableEntity

    在一般情况下,当我们在.net中使用Azure table storage的时候都会为该表建立一个TableEntity的派生类,如下所示. public class CustomerEntity : ...

  7. 《编写高质量代码:改善C#程序的157个建议》源码下载

    ==== 目录 前 言第一部分 语言篇第1章 基本语言要素 / 2建议1:正确操作字符串 / 2建议2:使用默认转型方法 / 6建议3:区别对待强制转型与as和is / 9建议4:TryParse比P ...

  8. PHP开发框架Laravel优点,Laravel5.3中文文档

    PHP开发框架Laravel优点 Laravel的设计思想是很先进的,非常适合应用各种开发模式TDD, DDD和BDD,作为一个框架,它为你准备好了一切,composer是个php的未来,没有comp ...

  9. [转载] 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc),编写函数 strcpy(C++版)

    已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串.不调用C++/C ...

  10. 螺旋矩阵 noip2014普及组

    本题可以直接模拟填数字,也可以直接计算结果. 代码一:(这个代码,缺陷在于数组太大,浪费内存啊.另外,循环次数也不少.总之,时间空间的消耗都不小.) /*======================= ...