大体思路:
1.用户向服务号发消息,(这里可以是个菜单项,也可以是一个关键词,如:注册会员。)
2.kbmmw web server收到消息,生成一个图文消息给微信,在图文消息中做好自己的url,在url中,可以把第一步消息带来的openid写到url的参数表中。
3.用户点这个图文消息
4.web server收到这个图文消息的url,根据这个url,生成一个网页给微信,这里面关键是把openid写到网页中
5.用户填写这个网页,提交(提交的同时也把openid也提交回来了)
6.Ok,现在得到我想要的内容,最需要的openid.即那个用户提交的,就这样被提交回来了。
7.根据6返回的内容,实现业务逻辑。
 
openid:做为微信用户,当你关注一个服务号时生成的唯一值,从服务号的角度看,这是你的服务号的关注者。如果你想发消息给你的微信用户,只能通过这个openid.
进入开发:
首先,在这里,可以申请一个测试账号用于开发。过程很简单,用你的手机号申请,给你手机发个验证码,就开通了!
然后,还需要一个静态IP及80端口,理论上讲用动态域名也可以。绑定到你这个开发账号上。
接下来,你还要熟悉一下微信的API,了解一些基本概念。
现在,就可以用delphi开发了!
 
先要学习一下接入的资料,在这里,因为原理都在,所以一定要认真阅读,然后,利用Delphi实现一个对应函数,然后申请微信公众平台接口测试帐号
function CheckSignature(const signature, timestamp, nonce, token: string): boolean;
var
  strs: TStringList;
  tmpStr: string;
begin

strs := TStringList.Create;
  try
    strs.Add(token);
    strs.Add(timestamp);
    strs.Add(nonce);

strs.Sort;
    tmpStr := strs[0] + strs[1] + strs[2];
    tmpStr := SHA1(tmpStr);

if tmpStr = signature then
      Result := True
    else
      Result := False;
  finally
    FreeAndNil(strs);
  end;
end;
函数的返回结果为真时,表示接入成功!该函数,参考csdn朋友上传的范例,表示感谢。在这个范例中,提供了SHA1函数的单元,所以,你要下载回来。

准备完这个函数,接下来,如何使用这个函数呢?
因为微信服务器是向接入的web服务器发送Get请求,所以,我们要在自己实现的kbmMW web server的PerformGet方法中来调用这个CheckSignature。

function TDJ_FrmPhoneHTTPService.PerformGet(ClientIdent: TkbmMWClientIdentity; const AURL: string;
  const Args: array of Variant): Variant;
var
  FuncName: string;
  qv: TkbmMWHttpQueryValues;//处理Get请求传递来的参数.
begin

if Length(Args) < 1 then
    kbmMWRaiseException(KBMMW_ERR_SERVICE_HTTP_URLMISSING, 'Missing URL.')
  else
  begin
    FuncName := UpperCase(copy(Args[0], 2, Length(Args[0]) - 1));
    if FuncName.Equals('WECHAT.HTML') then
    begin
      // 转微信接口
      qv := TkbmMWHttpQueryValues.Create;
      qv.AsString := Args[2];//取得get请求传递来的参数.
      try
        // 验证接入
        if qv.ValueByName['echostr'] <> '' then//如果echostr不为空,表明是验证请求
        begin
          Result := '';
          if dmwx.CheckSignature(qv.ValueByName['id'], qv.ValueByName['signature'],
            qv.ValueByName['timestamp'], qv.ValueByName['nonce']) then
            Result := qv.ValueByName['echostr'];//如果验证成功,返回echostr,告知微信服务器验证成功.
        end;
        SetResponseMimeType('text/HTML');
        SetResponsecharset('utf-8');
      finally
        FreeAndnil(qv);
      end;
      exit;//结束本次对Get的响应.
    end;
....略去下面的实现

在实际的项目,我是这样实现的,将微信的接口代码,实现在一个单元wechatImpl中,再实现一个DataModule,对wechatImpl的方法进一步封装,封装的时候,来实现对数据库的操作。

还是以验证为例,来看一下DataModule中是如何实现的?

function tdmwx.CheckSignature(id, signature, timestamp, nonce: string): Boolean;
begin
  result:=False;
  if not qWXFWH.Active then
    qWXFWH.Open;
  if qWXFWH.Locate('fid', VarArrayOf([id]), []) then//查询服务号表,是否存在对应的id记录
  begin
    if wechatImpl.CheckSignature(signature, timestamp, nonce, qWXFWH.FieldByName('FToken').AsString)//存在,则取在表中定义的token值,去调用验证函数.
    then
      Result := true;
  end;
end;
其中,qWXFWH是一个kbmMWuniDACQuery对象,用以保存微信服务号的一张表,表结构如下:
CREATE TABLE WX_FWH (
    FID INTEGER,//一个服务号的id,达到管理多个服务号的目的。
    FTOKEN VarChar(32),//每个服务号的token值
    FAPPID VarChar(16),
    FAPPSECRET varchar(16),
    FACCESSTOKEN VARCHAR (512),
    FEXPIRESIN INTEGER,
    FGETDATE DATETIME);
在注册服务器时,要先在这个表中增加注册信息,比如:id=1,token=kbmmwtoken1
对应的注册内容为:
url=www.test.cc/wechat.html?id=1
token=kbmmwtoken1
这样,当微信服务器发送验证请求时,会把id当作参数一并传递过来,datamodule的CheckSignature方法,会根据id的值,取得数据表中定义token值,然后再调用微信接口的验证方法。

总结一下上面的内容,为了实现微信接入,我将实现的代码分为三层:
1.在kbmmw web server的get方法中调用数据库层的验证函数
2.在数据库层实现验证函数,从取表中取得预先定义的微信号的相关信息,如id,token,再调用具体的微信接口
3.实现具体的微信接口,供数据库层调用。

计划等微信接口的实现全部完成后共享给朋友们,无奈近期时间紧,杂事多,还需要一段时间。就先把实现完成的思路先放上来分享。

对接入web server的url地址验证是做微信服务的第一步,所以,上面相关的内容一定要理解,才可继续进行下去。
实际上是这样:
关注你服务号的微信用户,向你的服务号发送消息,微信平台,会往你验证的url进行转发,这就相当于你微信服务号的微信用户,向你的Web server发送消息。你开发的Web server的目的,就是响应这些消息,与你的微信服务号关注者进行互动!

 
http://blog.sina.com.cn/s/blog_44fa172f0102uzrw.html
http://blog.sina.com.cn/s/blog_44fa172f0102v077.html

delphi 实现微信开发的更多相关文章

  1. delphi 实现微信开发(1) (使用kbmmw web server)

    原文地址:delphi 实现微信开发(1)作者:红鱼儿 大体思路: 1.用户向服务号发消息,(这里可以是个菜单项,也可以是一个关键词,如:注册会员.) 2.kbmmw web server收到消息,生 ...

  2. [转载红鱼儿]delphi 实现微信开发(2)接入微信公众号平台

    先要学习一下接入的资料,在这里,因为原理都在,所以一定要认真阅读,然后,利用Delphi实现一个对应函数,然后申请微信公众平台接口测试帐号. function CheckSignature(const ...

  3. [转载红鱼儿]delphi 实现微信开发(1)

    大体思路: 1.用户向服务号发消息,(这里可以是个菜单项,也可以是一个关键词,如:注册会员.) 2.kbmmw web server收到消息,生成一个图文消息给微信,在图文消息中做好自己的url,在u ...

  4. [转载红鱼儿]Delphi实现微信开发(3)如何使用multipart/form-data格式上传文件

    开始前,先看下要实现的微信接口,上传多媒体文件,这个接口是用Form表单形式上传的文件.对我来说,对http的Form表单一知半解,还好,查到这个资料,如果你也和我一样,必须看看这篇文章. 在xali ...

  5. 使用delphi+intraweb进行微信开发5—准备实现微信API,先从获取AccessToken开始

    在前4讲中我们已经使iw开发的应用成功和微信进行了对接,再接下来的章节中我们开始逐一尝试和实现微信的各个API,开始前先来点准备工作 首先需要明确的是,微信的API都是通过https调用实现的,分为p ...

  6. 使用delphi+intraweb进行微信开发1~4代码示例

    前几讲重点阐述的是使用iw进行微信开发的技术难点及解决方法,提供的都是代码片段(微信消息加解密是完整代码),实际上我始终感觉按照教程实作是掌握一门技术的最重要的方法!不过对于刚刚接触这类开发的朋友来说 ...

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

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

  8. 使用delphi+intraweb进行微信开发3—微信消息处理

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

  9. 使用delphi+intraweb进行微信开发2—intraweb以.net方式发布(以asp.net mvc4模式部署)在IIS(.net虚拟主机)上

    在第一讲使用delphi+intraweb进行微信开发1--微信平台接入中我们编写了一个简单的微信接口程序,这个程序我是用Stand Alone Server / Service 方式编译的程序,并且 ...

随机推荐

  1. 【CKEditor ASP.NET】解决360安全浏览器极速模式下不显示

    博主问题只是出在误删了style.js文件 首先我用的是这种模式,在单个页面上导入: <%@ Register Assembly="CKEditor.NET" Namespa ...

  2. 正式学习 react(三)

    有了基础的webpack基础,我们要对react的基本语法进行学习. 我这个教程全部用es6 实现.可能会忽略一些最基本的语法讲解,这些你在官网上或者其他别的地方都比我讲的全. 今天我要讲一下reac ...

  3. 如何让ios app支持32位和64位?

    将ios app转换为兼容32位和64位步骤:  1. 安装 Xcode 5.  2. 打开你的项目.Xcode会提示你更新你的项目,其中的警告和错误信息对于转换到64位相当重要.  3. 将你的项目 ...

  4. Unix/Linux环境C编程入门教程(22) C/C++如何获取程序的运行时间

    1.问:知道程序运行时间我们可以做什么? 在<C++应用程序性能优化>一书中,如果大家读过相信大家一定对性能优化这一块非常上心,文中总是对优化前后的时间对比非常直观给我们一个感受. 那么我 ...

  5. linux的NetworkManager服务(转)

    在开启NetworkManager服务的情况下,在终端下敲“service network restart”命令: 正在关闭接口 eth0: 设备状态:3 (断开连接) [确定] 正在关闭接口 eth ...

  6. codevs2822 爱在心中

      2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无 ...

  7. web前端开发工程师

    web前端开发工程师 百科名片 Web前端开发工程师是一个很新的职业,在国内乃至国际上真正开始受到重视的时间不超过5年.Web前端开发是从网页制作演变而来的,名称上有很明显的时代特征.在互联网的演化进 ...

  8. google地图marker文字label添加js lib

    google的地图marker需要使用js开发库,文件并允许使用js库 在JSP页面中需要添加地图引用如: <script src="http://maps.googleapis.co ...

  9. [Leetcode][Python]50: Pow(x, n)

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 50: Pow(x, n)https://leetcode.com/probl ...

  10. 使用 fastlane 实现 iOS 持续集成(转)

    http://www.cocoachina.com/ios/20150916/13433.html 简介 持续集成是个“一次配置长期受益”的工作.但很多小公司都没有.以前在做Windows开发配置感觉 ...