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

先要学习一下接入的资料,在这里,因为原理都在,所以一定要认真阅读,然后,利用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的目的,就是响应这些消息,与你的微信服务号关注者进行互动!

时间: 2024-10-26 11:24:49

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

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

大体思路: 1.用户向服务号发消息,(这里可以是个菜单项,也可以是一个关键词,如:注册会员.) 2.kbmmw web server收到消息,生成一个图文消息给微信,在图文消息中做好自己的url,在url中,可以把第一步消息带来的openid写到url的参数表中. 3.用户点这个图文消息 4.web server收到这个图文消息的url,根据这个url,生成一个网页给微信,这里面关键是把openid写到网页中 5.用户填写这个网页,提交(提交的同时也把openid也提交回来了) 6.Ok,现在得

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

开始前,先看下要实现的微信接口,上传多媒体文件,这个接口是用Form表单形式上传的文件.对我来说,对http的Form表单一知半解,还好,查到这个资料,如果你也和我一样,必须看看这篇文章. 在xalion窑主的指导下,我使用了indy自带的TIdMultiPartFormDataStre am类,来提交上传的文件. 如果使用indy的idhttp,则调用这个方法,即可以提交Form. function Post(AURL: string; ASource: TIdMultiPartFormDat

[转载红鱼儿]Delphi XE7 update1进步太大了

写以下的文字是怀着无比兴奋的心情写的,急于同朋友们分享XE7的进步! 1.更新的bug列表并不全 通过bug修正列表及发布的消息,可以看到up1修正了很多bug,正如我所说,有些bug并没有写到发布的bug列表中,如TextPrompt不显示的问题. 2.解决了对象释放的问题 基于XE7,我做了测试代码,也是我想象中,开发一个实际的项目要用到很多Form,并且是用到时再建立,需要的话,用完就释放掉.为了这个想法,我测试 了很长时间,也看了相关的代码,无耐,实际的结果让人颓丧.问题就是建立一个Fo

微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台

原文:微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台  微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 上节我们简单介绍了一下什么是公众号第三方平台,今天我们将具体操作如何创建属于您自己的微信第三方平台. 注册认证 用户首选需要注册成为开发平台的用

C#开发微信门户及应用(26)-公众号微信素材管理

原文:C#开发微信门户及应用(26)-公众号微信素材管理 微信公众号最新修改了素材的管理模式,提供了两类素材的管理:临时素材和永久素材的管理,原先的素材管理就是临时素材管理,永久素材可以永久保留在微信服务器上,微信素材可以在上传后,进行图片文件或者图文消息的发送,关注的公众号可以在素材有效期内查看相关的资源,对于永久素材,那就不会存在过期的问题,只是纯粹数量上限的限制.本文综合两方面进行介绍素材管理的各种接口和实现. 1.素材类型和功能点 关于素材的官方说明: 临时素材: 公众号经常有需要用到一

C#开发微信门户及应用(27)-公众号模板消息管理

原文:C#开发微信门户及应用(27)-公众号模板消息管理 通过模板消息接口,公众号能向关注其账号的用户发送预设模板的消息.模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等.不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息.本文主要介绍基于C#开发实现公众号模板消息的管理功能. "模板消息功能的推出,将极大地增强服务号的服务通知能力",在一些一直期待微信模板消息功能开放的公众号运营者看来,微信一对一沟通的社交属性

微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码

原文:微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台  微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码 由于最近比较忙,这个教程没有连续上,我会尽量连载.书节上回,上次我介绍

微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo

原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台  微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo   前几章中我讲解了微信开发平台提供第三方平台的好处,和使用流程,如果你看了我的文章相信你对开放平台有了初步的了解,但是在实际的开

微信开发,将微信官网源码(java版)导入,用tomcat发布时报错,求解答?

问题描述 微信开发,将微信官网源码(java版)导入,用tomcat发布时报错,求解答? 2016-3-17 14:19:13 org.apache.catalina.core.AprLifecycleListener init 信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.li