zoukankan      html  css  js  c++  java
  • delphi 实现微信开发

    大体思路:
    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
  • 相关阅读:
    二、计算属性和侦听器
    JS实现 带有话题的文本编辑 + 图片编辑(下)
    JS实现 带有话题的文本编辑 + 图片编辑(上)
    js 监听浏览器切换标签栏 之 更改标题
    Element-ui 自定义表单验证规则
    仿照旧版支付宝生活服务模块-常用应用的添加与删减(下)
    仿照旧版支付宝生活服务模块-滚动定位 + 点击定位(上)
    vue 中实现九宫格抽奖
    vue 中实现大转盘抽奖
    vue 中实现刮刮卡
  • 原文地址:https://www.cnblogs.com/findumars/p/4999240.html
Copyright © 2011-2022 走看看