论坛后台门户第三访模块
添加第三方模块, 后台需要填写以下选项

第三方地址: 输入 第三方模块的 URL 地址,第三方返回的内容必须 XML 模块的格式
客户端 ID: 此 ID 由数据源方提供
签名加密方式: 目前支持 MD5 加密方式,也可以不使用签名,由数据源方提供
通信密钥: 从 URL 地址获得数据时的密钥,如果数据源不需要密钥可以为空。此密钥由数据源方提供

提交的时候程序会使用 import_block 函数 去服务端请求配置

其间 该函数会调用 create_sign_url 函数 生成签名

  1. function create_sign_url($para, $key = '', $signtype = ''){
  2.         ksort($para);
  3.         $url = http_build_query($para);
  4.         if(!empty($signtype) && strtoupper($signtype) == 'MD5') {
  5.                 $sign = md5(urldecode($url).$key);
  6.                 $url = $url.'&sign='.$sign;
  7.         } else {
  8.                 $url = $url.'&sign='.$key;
  9.         }
  10.         return $url;
  11. }

create_sign_url 会将第一个参数 url 参数的数组 $para(包括:clientid 、 op 、 charset) 用 ksort 排序
然后 用 http_build_query 函数转义生成 url 的参数 连上后台设置的 通信密钥 进行 md5 加密后生成的 sign
然后拼接着请求的参数
如 charset=gbk&clientid=100000&op=getconfig&sign=ce09add6aaadfcc58f7d6140dc55fa09
如果后台没有设置加密方式 sign 为后台设置的通信密钥

请求的参数与后台设置的 第三方地址 拼成完成的向第三请求的地址
使用 dz 的 dfsockopen 函数请求第三方服务端

服务端需要返回 xml 有 Title 和 Data 两部分的配置
其中 Title 分部是固定的且区分大小写:<item id="Title"><![CDATA[Discuz! Block]]></item>
Data 分部主要包括 5 个属性:
a 、 version: 版本号 (必需)
b 、 name: 模块名 (必需)
c 、 fields: 可显示的字段, 在模块样式中使用 (必需)
* name 为该字段的显示名称
* formtype 决定编辑单条数据时该字段的显示方式: 类型有: text, textarea, date, title, summary, pic;
* datatype 决定该字段的数据展示,类型有: string, int, date, title, summary, pic;
d 、 getsetting: 可设置和接收的参数 (必需)
* title 为显示的名称
* type 为表单类型, 有: text, password, number, textarea, radio, select, mselect, mradio, mcheckbox, calendar;
f 、 style: 内置的显示样式 (非必需)

前台模块更新 除了向第三方请求数据时除了会以 POST 方式向第三方服务端传递后台设置的参数外 还会以 POST 的方式附加传递以下参数:* op=getdata ,此参数表示客户端要请求数据;
* clientid ,客户端 ID(服务器分配给客户端的 ID);
* op=getdata ,此参数表示客户端要请求数据;
* items ,为用户指定显示的模块数据条数;
* bannedids ,为用户选择屏蔽某数据时记录在模块中的该数据 id,多个 id 以半角分号 (,) 分隔。 应该在获取数据时屏蔽该数据;
* charset,客户端的数据编码
* sign ,数据签名,如果服务器端没有设置通信密钥则此值为空

第三方服务端返回数据的 data 中应该包含 上面配置中可显示的字段 fields 指定的所有字段。并附加以下字段:* id 标志该数据的
id,如果用户屏蔽某数据时,会将该数据的 id 以 POST 的方式变量名为 bannedids,多个 id 以半角逗号 (,) 分隔提交到服务器端
* picflag 如果有图片,则该值标志图片的类型,0 为 url 、 1 为本地、 2 为 ftp 远程;如果图片是 Discuz! X 系统中的图片可以情况设置为 1 或 2,其它情况为 0
需要注意: 除 id,title, url, pic, picflag, summary 几个字段外,其它字段需要放到 fields 数组里。