示例代码已经放出!请移步使用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. handlebars.js的运用与整理

    最近在做部门的技术分享网站,主要是一些文章的列表和演讲信息展示,内容比较规律,复用性较高.同事推荐了 handlebars.js.用来看看. handlebars.js是一种静态JS模板,用起来还蛮简 ...

  2. Gradle Maven 依赖管理

    仓库管理简介 本质上说,仓库是一种存放依赖的容器,每一个项目都具备一个或多个仓库. Gradle支持以下仓库格式: Ivy仓库 Maven仓库 Flat directory仓库 我们来看一下,对于每一 ...

  3. 【转载】maven插件mybatis-generator自动生成 (1)

    http://blog.csdn.net/itlqi/article/details/49534447 1.新建一个maven项目在pom.xml添加如下: <plugins> <p ...

  4. C语言实现GPT头和分区表的读取(gcc)

    #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h&g ...

  5. 如何使用Nginx对抗DDoS攻击?

    时不时的就有客户会被DDoS一下.很多时候攻击很简单也容易封堵,但是攻击的目标是应用的时候就更难防御.在这里云端卫士介绍一下使用Nginx作为代理过滤器来封堵一些这种攻击. Apache DDoS攻击 ...

  6. Arp攻击实战

    hyddd原创,转载请说明出处. 现在网上很多关于ARP攻击的文章,但多数是描述其原理,少数会以某个工具作为例子展开说明,但感觉说的还是不够详细,今天写个文章以实战介绍一个叫"WinArpA ...

  7. c_str 以及atoi

    const char *c_str();c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类 ...

  8. FZU 2140 Forever 0.5

     Problem 2140 Forever 0.5 Accept: 36    Submit: 113    Special JudgeTime Limit: 1000 mSec    Memory ...

  9. Java中的I/O流

    import java.io.*//生成代表输入流的对象fis=new FileInputStream("e:/src/from.txt") //生成代表输出流的对象 fos=ne ...

  10. u-boot子目录Makefile分析

    一.概述 u-boot的子目录Makefile是整个Makefile体系的重要组成部分,决定了对应子目录的编译过程. 二.分析 以cpu/arm920t/Makefile为例进行说明 (1)首先,调用 ...