[转载红鱼儿]delphi 实现微信开发(2)接入微信公众号平台
先要学习一下接入的资料,在这里,因为原理都在,所以一定要认真阅读,然后,利用Delphi实现一个对应函数,然后申请微信公众平台接口测试帐号。
function CheckSignature(const signature, timestamp, nonce, token:
string): boolean;
var
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的目的,就是响应这些消息,与你的微信服务号关注者进行互动!
[转载红鱼儿]delphi 实现微信开发(2)接入微信公众号平台的更多相关文章
- Vue集成微信开发趟坑:公众号以及JSSDK相关
首先,类库方面,Vue中引入JSSDK的话,请引入weixin-js-sdk,而不是weixin-jsapi,原因在于weixin-jsapi不是最新版:还要注意JS接口安全域名,不需要http前缀, ...
- [转载红鱼儿]delphi 实现微信开发(1)
大体思路: 1.用户向服务号发消息,(这里可以是个菜单项,也可以是一个关键词,如:注册会员.) 2.kbmmw web server收到消息,生成一个图文消息给微信,在图文消息中做好自己的url,在u ...
- [转载红鱼儿]Delphi实现微信开发(3)如何使用multipart/form-data格式上传文件
开始前,先看下要实现的微信接口,上传多媒体文件,这个接口是用Form表单形式上传的文件.对我来说,对http的Form表单一知半解,还好,查到这个资料,如果你也和我一样,必须看看这篇文章. 在xali ...
- [转载红鱼儿]Delphi XE7 update1进步太大了
写以下的文字是怀着无比兴奋的心情写的,急于同朋友们分享XE7的进步! 1.更新的bug列表并不全 通过bug修正列表及发布的消息,可以看到up1修正了很多bug,正如我所说,有些bug并没有写到发布的 ...
- C#开发微信门户及应用(27)-公众号模板消息管理
通过模板消息接口,公众号能向关注其账号的用户发送预设模板的消息.模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等.不支持广告等营销类消 ...
- C#开发微信门户及应用(26)-公众号微信素材管理
微信公众号最新修改了素材的管理模式,提供了两类素材的管理:临时素材和永久素材的管理,原先的素材管理就是临时素材管理,永久素材可以永久保留在微信服务器上,微信素材可以在上传后,进行图片文件或者图文消息的 ...
- 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo
原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建 ...
- 微信公众号平台接口开发:基础支持,获取access_token
新建Asp.net MVC 4.0项目 WeChatSubscript是项目UI层 WeChatTools是封装操作访问公众号接口的一些方法类库 获取AccssToken 我们要的得到AccessTo ...
- 微信公众号平台接口开发:基础支持,获取微信服务器IP地址
官方说明 目前看不出来这个接口有哪些具体运用,但是既然有这个接口,那我们就试试能不能用 访问接口 修改WeCharBase.cs,新增以下2个方法 public static string Serve ...
随机推荐
- oracle使用随笔
一,centos 7安装桌面环境 首先使用命令yum grouplist查看可以使用的group ,第一步,命令安装Gnome Desktop,第二步,yum groupinstall "X ...
- CSS3d 基础
-webkit-transform-style:-webkit-preserve-3d;//设置3D转换 translateX:px; 平移 translateY:px; translateZ:px; ...
- nginx直接返回json
尝试配置nginx.conf之后,访问直接变成下载文件... 查阅之后,发现需要配置返回内容的格式. location ~ ^/get_json { default_type application/ ...
- 列表(ul ol dl)
Title 1 2 3 1 2 3 a 1 2 b 1 2 <!DOCTYPE html> <html lang="en"> <head> &l ...
- cv::Mat到YUV420的转换《转》
某些特定场合我们会经常遇到yuv420格式的视频文件,这种视频帧无法直接用于opencv,故而,需要进行格式转换:幸运的是,opencv提供了rgb到yuv420的格式转换函数:下面给出基本用法: 函 ...
- c++实现一个比较两个string类型的版本号的小demo
在软件实现更新模块的时候,有可能会判断一下服务器上的版本的版本号和本地版本的版本号. 下面有类似这样形式的版本号:string str = "0.0.0.1"; 分析一下可以看出, ...
- Objective C, erum 枚举类型
typedef NS_ENUM(NSInteger, MYENUM) { TYPE1, TYPE2, TYPE3 };
- Jsonlib 属性过滤器
/** * @title JSON转换属性过滤器 * @description 用于JSON lib的JSON转换 * @author maohuidong * @date 2017-04-06 */ ...
- 如何打开Windows Server 2008 R2的域安全策略
今天安装了Windows Server 2008 R2系统,并且建了域环境,在添加新用户的时候,发现用简单的密码时域安全策略提示密码复杂度不够,于是我就想在域安全策略里面把密码复杂度降低一点,但是很快 ...
- form表单重置、清空方法记录
myform 是form的id属性值 1.调用reset()方法 function fomrReset() { document.getElementById("myform"). ...