iw14.0.50来了,终于可以直接在地址栏输入url打开iw功能页面了;可以自由使用EasyUI等js框架了;显示模式对话框也不再七绕八绕惹人烦了;

示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改。

iw14.0.50来了,在新的版本中最吸引我的就是增加了完善的httphandler功能:终于可以直接在地址栏输入url打开iw功能页面了;可以自由使用EasyUI等js框架了;显示模式对话框也不再七绕八绕惹人烦了;呵呵,我感觉iw第一次接近主流web开发工具了!

兴奋过了,来尝试一下吧。其实iw的坑还是挺多的,虽然已经接近主流了,但是,后面慢慢都会说到…

1、新建一个iw工程,选择Stand Alone Server / Service,这种模式下进行开发是最理想的,调试很方便,正式发布时可以再建立一个library型的工程发布到.net服务器上。(是的,大家没有看错,现在iw已经脱离了isapi模式,可以像部署.net mvc4应用一样部署到iis上,后面会解释,.net虚拟主机也可以发布iw应用了!巨大的进步。)

2、保存工程后在工程中添加一个新的单元文件,例如起名为wxapi.pas,这个文件中的代码将承担微信接入工作。代码如下:

interface

uses 
  Classes, IW.Content.Base, System.SysUtils,HTTPApp, IWApplication, 
  IW.HTTP.Request, IW.HTTP.Reply;

type 
  /// <summary> 
  /// 从TContentBase继承下来的类,就相当于asp.net中的httphandler 
  /// </summary> 
  TWxApi = class(TContentBase) 
  protected 
    function Execute(aRequest: THttpRequest; aReply: THttpReply; const aPathname: string; aSession: TIWApplication; aParams: TStrings): Boolean; override
  public 
    constructor Create; override
  end;

implementation

uses 
  ServerController, UserSessionUnit, Crypt.SHA1;

{ TWxApi }

constructor TWxApi.Create; 
begin 
  inherited
  // 文件不需要真实存在 
  FileMustExist := False; 
end;

function TWxApi.Execute(aRequest: THttpRequest; aReply: THttpReply; 
  const aPathname: string; aSession: TIWApplication; 
  aParams: TStrings): Boolean; 
var 
  signature: string
  timestamp: string
  nonce: string
  echostr: string
  strs: TStringList; 
  tmpStr: string
begin 
  Result := True;

signature := aParams.Values[‘signature‘]; 
  timestamp := aParams.Values[‘timestamp‘]; 
  nonce := aParams.Values[‘nonce‘]; 
  echostr := aParams.Values[‘echostr‘];

strs := TStringList.Create; 
  strs.Add(‘MyTestToken‘);    // Token,要和微信接口配置信息保持一致 
  strs.Add(timestamp); 
  strs.Add(nonce); 
  strs.Sort;

tmpStr := strs[0]+strs[1]+strs[2]; 
  tmpStr := SHA1(AnsiString(tmpstr));

if tmpStr=signature then 
  begin 
    aReply.WriteString(echostr) 
  end else begin 
    aReply.WriteString(‘如果看到这个提示说明此链接地址可作为微信接口地址使用。‘); 
  end
  aSession.Terminate; // 释放会话资源,本handler无需会话 
end;

end.

如代码所示,TContentBase即iw版httphandler的基础类,如果不需要显示iwForm,从这个类型继承下来即可。如果需要使用iwForm还有个TContentForm基础类可以使用,哇哦,在浏览器地址栏输入url也可以直接打开iwform了哦。TWxApi.Execute中的代码即微信接入的代码,非常简单,不了解的看看微信帮助:微信接入指南

3、在ServerController中注册此httphandler,直接贴出ServerController注册代码: 
procedure TIWServerController.IWServerControllerBaseConfig(Sender: TObject); 
begin 
  // 在ServerController.OnConfig事件中注册我们定义的微信Handler 
  // ServerController.OnConfig事件在整个应用程序生命周期中只被运行一次 
  with THandlers.Add(‘‘, ‘wxapi.php‘, TWxApi.Create) do 
  begin 
    CanStartSession := True;            // 从字面上理解是能够启动会话 
    RequiresSessionStart := False;      // 从字面上理解是需要启动会话,这两个属性必须进行设置,否则输入 /wxapi.php 将转向主窗体 
                                        // 也就是不设置CanStartSession和RequiresSessionStart,则必须先执行/$/start 启动会话后才 
                                        // 能正常访问 /wxapi.php页面,这个显然不是我们需要的。 
  end
end;

如代码所示,红色的THandlers.Add(‘‘, ‘wxapi.php‘, TWxApi.Create)这段代码就完成了httphandler的注册,在浏览器地址栏输入http://localhost/wxapi.php即可访问刚刚注册的这个控制器。

但是这段代码中有个不大不小的坑,详见我代码中的注释。

这个坑是handler注册后启动iw应用但是不先在浏览器地址栏输入/$/start启动程序,而是直接输入/wxapi.php验证httphandler时失败,页面自动导航到主窗体!阅读帮助后发现,需要设置TContentBase.RequiresSessionStart:=false否则会导致iw应用必须先启动会话访问主窗体才能使用httphandler,按照帮助的说明设置了TContentBase.RequiresSessionStart:=false虽然直接输入/wxapi.php不再导航到主窗体了,但是会提示404代码错误,单步跟踪发现httphandler代码确实已经执行了,这样不应该出现404错误,多方查证和实验发现还需要设置TContentBase.CanStartSession := True,呵呵,这个在帮助中没有提到,估计是新版本新增加的属性。好了,现在在地址栏输入http://localhost/wxapi.php能正常打开页面了。

4、将编译完成的iw应用拷贝到主机上进行测试,实战微信接入

,居然提示配置失败!这是什么情况,我使用的代码是从别人写好的一个Delphi版微信接入接口代码中拷贝的,那个程序相同的代码没有任何问题,当时第一个念头是页面编码不正确,好吧,我改,iw的handler默认的编码是utf-8格式的,于是我尝试了gbk,iso-8859-1等多种编码格式,均提示上述错误。万般无奈只好写日志看看到底handler代码执行没有,结果令人震惊,放到真实服务器上后,微信验证时handler代码居然没有执行,而在我本机调试时和真实服务器的浏览器上浏览时都很好没有任何问题。巨大的坑啊,连着好几天各种测试,各种修改,都准备放弃了,呵呵,结果看了下iw自己的httphandler示例,发现在其ServerController中实现了一个事件:OnBrowserCheck,于是尝试在自己代码中增加了相同事件代码进行测试,哇塞,可以了。。。

procedure TIWServerController.IWServerControllerBaseBrowserCheck( 
  aSession: TIWApplication; var rBrowser: TBrowser); 
begin 
  // 这个事件代码很重要,我在这里卡了好几天!  
  // 
  // 在没有实现这个事件的时候,在任何浏览器输入 /wxapi.php 都能成功响应,唯独到了 
  // 微信中就显示配置失败,后来在代码中使用了日志输出才发现iw能收到微信请求,但是 
  // TWxApi.Execute方法却没有执行,后来去官网阅读了相关帮助,才发现iw只有支持的浏 
  // 览器才可正常响应输出,而微信发出的web请求显然不属于任何一个已知的浏览器 
  if rBrowser is TOther then begin 
    rBrowser.Free; 
    rBrowser := TInternetExplorer.Create(8); // 以兼容IE8页面浏览进行页面内容输出 
  end
end;

,呵呵,太不容易了,就这么几行代码折腾好几天,不过iw终于可以用于微信开发了。

我认为Delphi的强大在于除编译器外所有源代码均提供,这样出现问题了可以通过阅读源码解决,但是iw太封闭了,没有源码就算了,帮助也跟不上,在线那个帮助实在太太太弱了,建议用iw的朋友结合在线帮助和iw自己的示例工程一起看,少走弯路!不过,iw发展到今天确实已经挺好用了,尤其对于有delphi情节的人,能用自己最擅长的语言和开发工具进行web开发真是挺爽的一件事情。

未完,待续。。。

下一次讲讲iw的最新部署方式,以.net mvc4方式部署在iis上,呵呵,如果只看iw在线帮助关于mvc方式部署就去实践,也有小坑哦!

http://www.cnblogs.com/dpower/p/5138080.html

时间: 2024-12-25 09:10:21

iw14.0.50来了,终于可以直接在地址栏输入url打开iw功能页面了;可以自由使用EasyUI等js框架了;显示模式对话框也不再七绕八绕惹人烦了;的相关文章

windows如何禁用惹人烦的开机启动广告

本地组策略编辑器 建立新的路径规则 重启电脑 本地组策略编辑器 你现在还在为那些烦人的互联网开机广告而发愁嘛,比如一下几种广告:这样的 还是这样的: 又或者是这样的: 修改了dns也并没有什么卵用,所以今天百度了一下,以其人之道还其人之身,找到了一个比较靠谱的接近方案:使用windows 自带的组策略编辑器打开你的命令行窗口,使用windows图标+r,在里面输入gpedit.msc如下图所示: 然后不出意外你会看见如下的操作面板: 如果你是第一次打开的话,需要新建一个 软件限制策略,直接右键就

Android进阶(二十七)Android原生扰人烦的布局

Android原生扰人烦的布局 在开发Android应用时,UI布局是一件令人烦恼的事情.下面主要讲解一下Android中的界面布局. 一.线性布局(LinearLayout) 线性布局分为: (1)垂直线性布局: (2)水平线性布局: 针对这两种区别,只是一个属性的区别 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertic

string.Format(&quot;{0,-50}&quot;, &quot;qqqqqqqqqqqq&quot;)

//sss={"100"}.有两个花括号 string sss = string.Format("{{\"100\"}}", 100); //string.Format("{0,向(正为右,负为左)对齐的字符串长度}","展示的字符串"); string s = string.Format("{0,-50}", "qqqqqqqqqqqq")+string.Forma

《日语综合教程》第七册 第五課 みやこ人と都会人

上外 <日语综合教程> 翻译注解.点击生词后的数字可以跳转到解释,再次点击返回(BackSpace键也可).最后一页有课文翻译,支持键盘左右键(← →)翻页.第五課 みやこ人と都会人本文       酒井順子   日本人(にほんじん)はどうしてこうも京都(きょうと)が好(す)きなのかと.本屋(ほんや)[1] さんの雑誌売場(ざっしうりば)を眺(なが)めて[2] いると.思(おも)... 继续阅读:码农场 » <日语综合教程>第七册 第五課 みやこ人と都会人 原文链接:http://

react native 0.50 源码解析 再出发 持续更新

1.核心类 1.1 RCTRootView 一个RCTRootView持有一个RCTBridge成员变量 RCTRootView : UIView RCTBridge *bridge; UIViewController *reactViewController; UIView *contentView; UIView *loadingView; 1.2 RCTBridge 一个RCTBridge持有一个RCTCxxBridge成员变量 RCTBridge.h @interface RCTBrid

Linux探索之旅 | 第五部分第二课:一入Shell深似海,酷炫外壳惹人爱

-- 简书作者 谢恩铭 转载请注明出处 内容简介 前言 Shell是什么? 我们的第一个Shell脚本 运行Shell脚本 总结 第五部分第三课预告:变量在手,Shell不愁 1. 前言 上一课是 Linux探索之旅 | 第五部分第一课:Vim岂是池中物,宝剑锋从磨砺出 . 现在,我们已经学习了 Vim 这样强大的文本编辑器.相信我,Vim 对我们之后的课程会非常有用. 这一课我们可以进入第五部分的重心了:Shell 编程. 什么是Shell呢? 首先,shell 是英语"壳,外壳"的

lucene.net 3.0.3、结合盘古分词进行搜索的小例子(分页功能)

转自:http://blog.csdn.net/pukuimin1226/article/details/17558247 添加:2013-12-25 更新:2013-12-26 新增分页功能. 更新:2013-12-27 新增按分类查询功能,调整索引行新增记录的图片字段. 最新盘古分词dll和词典管理工具下载:http://pangusegment.codeplex.com/ 词典下载:http://pangusegment.codeplex.com/releases/view/47411 L

Asp.Net4.0/VS2010新变化(3):webform中也可以直接url路由

以前在做asp的时候,要把 /default.asp?id=123映射成/default/123,需要借助IISRewriter这个组件,到了asp.net以后,可以用代码写了,但是个人觉得很麻烦,要写一堆代码,还要修改web.config,现在好了:asp.net4.0中 asp.net mvc中的路由规则全部可以用于webform了 使用步骤: 1.Global.ascx.cs中先注册路由规则 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

git-【八】多人协作

当你从远程库克隆时候,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程库的默认名称是origin. 要查看远程库的信息 使用 git remote 要查看远程库的详细信息 使用 git remote –v 如下演示: 一:推送分支: 推送分支就是把该分支上所有本地提交到远程库中,推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上: 使用命令 git push origin master 比如我现在的github上的readme.txt