第一步:在网站根文件夹建立“1.php”文件,写入以下数据:
<?php
define('CHARSET', 'GBK'); //服务器端数据编码。
require './source/class/class_xml.php'; //XML格式的文档和array的相互转换的类。
error_reporting(7);。
$charset = $_GET['charset'] ? $_GET['charset'] : $_POST['charset']; //客户端数据编码。
//数据转码
if(strtoupper($charset) != CHARSET) {。
foreach($POST as $key => $value) {。
$POST[$key] = iconv($charset, CHARSET, $value);。
foreach($GET as $key => $value) {。
$GET[$key] = iconv($charset, CHARSET, $value);。
$data = array('html'=>'', 'data'=>''); //初始化要返回数据。
$sign = $_GET['sign'] ? $_GET['sign'] : $_POST['sign']; //获取客户端请求数据的签名。
$clientid = $_GET['clientid'] ? $_GET['clientid'] : $_POST['clientid']; //客户端ID。
$client = get_client_by_clientid($clientid); //得到客户端的相关信息。
if(empty($client)) { //客户端不存在。
exit('CLIENT_NOT_EXISTS'); //直接返回失败。
$datasign = ''; //数据签名。
if(!empty($_POST)) {。
unset($_POST['sign']); //删除签名参数,此参数不参加签名计算。
$datasign = get_sign($_POST, $client['key']); //计算数据的签名。
} else {
unset($_GET['sign']); //删除签名参数,此参数不参加签名计算。
$datasign = get_sign($_GET, $client['key']); //计算数据的签名。
if($datasign != $sign) { //签名不正确。
exit('SIGN_ERROR'); //输入签名错误。
if($_POST['op'] == 'getdata') { //判断是否为请求数据列表。
$datalist = $data = array();//数据列表。
$wherearr = array(); //SQL 条件数组。
//获取客户端POST参数
$start = intval($_POST['start']); //起始数据行数。
$limit = intval($_POST['items']); //要显示多少条数。
$bannedids = addslashes($_POST['bannedids']); //客户端屏蔽的IDS。
$param1 = addslashes($_POST['param1']); //数据调用参数1,假设此值要求为string型。
$param2 = intval($_POST['param2']); //数据调用参数2,假设此值要求为int型。
//处理参数1
if(!empty($param1)){。
$wherearr[] = "fieldsparam1='$param1'";。
//处理参数2
if(!empty($param2)) {。
$wherearr[] = "fieldsparam2='$param2'";。
//处理客户端屏蔽的IDS
if(!empty($bannedids)) {。
$banids = explode(',', $bannedids);。
$wherearr[] = "csid NOT IN (".implode("','", $banids)."')";。
$where = !empty($wherearr) ? 'WHERE '.implode(' AND ', $wherearr) : ''; //构造条件。
/*数据库相关处理
$query = DB::query('SELECT * FROM '.DB::table('tablename')." $where LIMIT $start, $limit"); //SQL查询。
while($value = DB::fetch($query)) {。
//此处为数据处理逻辑代码
$data[] = $value;。
*/
//以下为临时测试数据,正式环境请根据自己的业务做相关调整。
$url = 'http://www.xxx.com/';。
$data = range($start, $start + $limit);//构造临时的假数据。
foreach($data as $value) {。
//需要注意: 除 id, title, url, pic, picflag, summary 几个字段外,其它字段需要放到 fields 数组里。
$datalist[] = array(。
'id' => $value,。
'title' => 'xml_block_title'.$value, //标题。
'url' => $url.'xml_server.php?csid='.$value, //链接地址。
'pic' => $url.'/data/attachment/photo.gif', //图片地址。
'picflag' => '0', //0为url 1为本地 2 为ftp远程;如果图片是DX系统中的图片可以情况设置为1或2,其它情况为0。
'summary' => '', //简介。
'fields' => array( //配置规范中fields中指定的字段。
'author' => 'xml_user'.$value,。
'authorid' => $value,。
'field1' => 'field1value'.$value,。
'field2' => 'field2value'.$value。
);
$data['data'] = $datalist;。
//如果要返回HTML代码,可直接使用以下代码。
//$data['html'] = 'HTML CODE';。
$xml = array2xml($data); //转换为XML文档。
} else if($_GET['op'] == 'getconfig') {。
$xml = file_get_contents('block_xml_sample.xml');//block_xml_sample.xml文件中的内容为 配置规范XML文档示例 的内容。
} else {
$xml = 'NO_OPERATION';。
ob_end_clean();。
@header("Expires: -1");。
@header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);。
@header("Pragma: no-cache");。
header("Content-type: text/xml");。
echo $xml;
exit();
/**
* 获得客户端信息
* @param $clientid。
* @return array 客户端信息数组。
*/
function get_client_by_clientid($clientid){。
$client = array();。
$clientid = intval($clientid);。
if($clientid) {。
/*数据库相关处理
$client = DB::fetch_first('SELECT * FROM '.DB::table('clienttable')." clientid='$clientid'"); //SQL查询。
*/
//以下为临时测试数据,正式环境请根据自己的业务做相关调整。
//模拟数据库
$CLIENTSDB = array(。
'100000' => array(。
'clientid' => '100000',。
'key' => '*654%#(asd94',。
),
'200000' => array(。
'clientid' => '200000',。
'key' => '1#9!(@@34#94',。
),
'300000' => array(。
'clientid' => '300000',。
'key' => '7$@^8^$7as89',。
),
'400000' => array(。
'clientid' => '400000',。
'key' => '23@#86^%4&32',。
),
);
$client = isset($CLIENTSDB[$clientid]) ? $CLIENTSDB[$clientid] : array();。
return $client;。
/**
* 生成签名
* @param array $para 参数数组。
* @param string $key 加密密钥。
* @return string 签名。
*/
function get_sign($para, $key = ''){。
ksort($para);
$signarr = array();。
foreach($para as $k => $v) {。
$signarr[] = $k.'='.$v;。
$sign = implode('&', $signarr);。
$sign = md5($sign.$key);。
return $sign;
?>
注意:不是网站记录的URL来调试的时候,会出现“Access Denied”,那是网站防止文件外部打开的标志,进入“./source/class/class_xml.php”暂时关闭开头的二行:
if(!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {。
exit('Access Denied');}。
特别注意:99行时候的“$xml = file_get_contents('block_xml_sample.xml');//block_xml_sample.xml文件中的内容为 配置规范XML文档示例 的内容”;就是这个文件造成很多人安装第三方插件不成功的。这个文件改名称的同时记得要修改1.php的99行;
特别注意文件block_xml_sample.xml中的“<item id="name"><![CDATA[C/S 数据类]]></item>”中间的“C/S 数据类”就是模块名称;有的时候如“<item id="version"><![CDATA[X1.5]]></item>”版本号不对也会报错;修改为网站的版本即可。
第二步:建立“block_xml_sample.xml”文件,写入如下数据:。
<?xml version="1.0" encoding="ISO-8859-1"?>。
<root>
<item id="Title"><![CDATA[Discuz! Block]]></item>。
<item id="Data">。
<item id="version"><![CDATA[X1.5]]></item>。
<item id="name"><![CDATA[C/S 数据类]]></item>。
<item id="fields">。
<item id="url">。
<item id="name"><![CDATA[链接地址]]></item>。
<item id="formtype"><![CDATA[text]]></item>。
<item id="datatype"><![CDATA[string]]></item>。
</item>
<item id="title">。
<item id="name"><![CDATA[标题]]></item>。
<item id="formtype"><![CDATA[title]]></item>。
<item id="datatype"><![CDATA[title]]></item>。
</item>
<item id="pic">。
<item id="name"><![CDATA[图片]]></item>。
<item id="formtype"><![CDATA[pic]]></item>。
<item id="datatype"><![CDATA[pic]]></item>。
</item>
<item id="summary">。
<item id="name"><![CDATA[简介]]></item>。
<item id="formtype"><![CDATA[summary]]></item>。
<item id="datatype"><![CDATA[summary]]></item>。
</item>
<item id="author">。
<item id="name"><![CDATA[作者]]></item>。
<item id="formtype"><![CDATA[text]]></item>。
<item id="datatype"><![CDATA[text]]></item>。
</item>
<item id="authorid">。
<item id="name"><![CDATA[作者ID]]></item>。
<item id="formtype"><![CDATA[text]]></item>。
<item id="datatype"><![CDATA[int]]></item>。
</item>
<item id="field1">。
<item id="name"><![CDATA[字段1]]></item>。
<item id="formtype"><![CDATA[text]]></item>。
<item id="datatype"><![CDATA[string]]></item>。
</item>
<item id="field2">。
<item id="name"><![CDATA[字段2]]></item>。
<item id="formtype"><![CDATA[text]]></item>。
<item id="datatype"><![CDATA[string]]></item>。
</item>
</item>
<item id="getsetting">。
<item id="param1">。
<item id="title"><![CDATA[数据调用参数1]]></item>。
<item id="type"><![CDATA[text]]></item>。
<item id="default"><![CDATA[]]></item>。
</item>
<item id="param2">。
<item id="title"><![CDATA[数据调用参数2]]></item>。
<item id="type"><![CDATA[mcheckbox]]></item>。
<item id="value">。
<item id="0">。
<item id="0"><![CDATA[1]]></item>。
<item id="1"><![CDATA[选项1]]></item>。
</item>
<item id="1">。
<item id="0"><![CDATA[2]]></item>。
<item id="1"><![CDATA[选项2]]></item>。
</item>
</item>
<item id="default"><![CDATA[1]]></item>。
</item>
<item id="titlelength">。
<item id="title"><![CDATA[标题长度]]></item>。
<item id="type"><![CDATA[text]]></item>。
<item id="default"><![CDATA[40]]></item>。
</item>
<item id="summarylength">。
<item id="title"><![CDATA[简介长度]]></item>。
<item id="type"><![CDATA[text]]></item>。
<item id="default"><![CDATA[80]]></item>。
</item>
<item id="start">。
<item id="title"><![CDATA[起始数据行数]]></item>。
<item id="type"><![CDATA[text]]></item>。
<item id="default"><![CDATA[0]]></item>。
</item>
</item>
<item id="style">。
<item id="0">。
<item id="name"><![CDATA[模板名称]]></item>。
<item id="template"><![CDATA[<div class="module cl xl xl1"><ul>[loop]<li><em><a href="home.php?uid={authorid}"><FONT COLOR="RED">{author}</FONT></a></em><a href="{url}">{title}</a></li>[/loop]</ul></div>]]></item>。
</item>
<item id="1">。
<item id="name"><![CDATA[模板名称红色]]></item>。
<item id="template"><![CDATA[<div class="module cl xl xl1"><ul>[loop]<li><em><font color="red"><a href="home.php?uid={authorid}">{author}</a></font></em><a href="{url}">{title}</a></li>[/loop]</ul></div>]]></item>。
</item>
</item>
</item>
</root>
第三步:建立第三方模块
管理平台 》 门户 》 第三方模块 》 添加:
第三方地址:url/1.php。
客户短ID:200000 见1.php的133行。
签名加密方式:MD5签名
通信密匙:1#9!(@@34#94。
点击提交,完成模块建立工作。
第四步:前台页面调用:
DIY网页 》 DIY 》 高级模式 》 模块 》 第三方类。
是不是看到刚刚建立的模块了。
选择调用即可。
第五步:扩展读取任一(包括外部)网页HTML代码数据,新建一个网页“ee.htm”,数据规范如下:
<?xml version="1.0" encoding="ISO-8859-1"?>。
<root>
<item id="html"><![CDATA[]]></item>。
<item id="data">。
<item id="0">。
<item id="id"><![CDATA[14]]></item>。
<item id="title"><![CDATA[xml_block_title14]]></item>。
<item id="url"><![CDATA[xml_server.php]]></item>。
<item id="pic"><![CDATA[nophoto.gif]]></item>。
<item id="picflag"><![CDATA[1]]></item>。
<item id="summary"><![CDATA[]]></item>。
<item id="fields">。
<item id="author"><![CDATA[xml_user14]]></item>。
<item id="authorid"><![CDATA[14]]></item>。
<item id="field1"><![CDATA[field1value14]]></item>。
<item id="field2"><![CDATA[field2value14]]></item>。
</item>
</item>
<item id="1">。
<item id="id"><![CDATA[15]]></item>。
<item id="title"><![CDATA[xml_block_title15]]></item>。
<item id="url"><![CDATA[xml_server.php]]></item>。
<item id="pic"><![CDATA[nophoto.gif]]></item>。
<item id="picflag"><![CDATA[1]]></item>。
<item id="summary"><![CDATA[]]></item>。
<item id="fields">。
<item id="author"><![CDATA[xml_user15]]></item>。
<item id="authorid"><![CDATA[15]]></item>。
<item id="field1"><![CDATA[field1value15]]></item>。
<item id="field2"><![CDATA[field2value15]]></item>。
</item>
</item>
</item>
</root>
第六步:读取外部网页(ee.htm)时1.PHP的代码:
适合格式固化的网页使用,安全则自己去加上。
<?php
define('CHARSET', 'GBK'); //服务器端数据编码。
if($_POST['op'] == 'getdata') { //判断是否为请求数据列表。
$xml = file_get_contents('ee.htm');//读取网页数据 如下传递参数另.. 。
} else if($_GET['op'] == 'getconfig') {。
$xml = file_get_contents('block_xml_sample.xml'); //安装时候需要调用的网页;为配置规范XML文档示例。
} else {
$xml = 'NO_OPERATION';。
ob_end_clean();。
@header("Expires: -1");。
@header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);。
@header("Pragma: no-cache");。
header("Content-type: text/xml");。
echo $xml;
exit();
?>
以上的步骤就解决了DZ可以与任一网站数据共享的问题。
对接第三方支付接口如下要求:
1.企业资质:公司需为大陆注册公司,且拥有营业执照、组织机构代码证、税务登记证、开户许可证、法人身份证。个体工商户则需提供个体工商户、税务登记证、开户许可证即可。
2.特殊资质:涉及到游戏、房产、餐饮等行业,则需持有该行业的特殊资质方可申请。
3.行业限定:产品行业不涉及政治类话题、不涉及黄赌毒、不涉及军警察,治安,侵害隐私等内容。
第三方电子商务平台,也可以称为第三方电子商务企业。泛指独立于产品或服务的提供者和需求者,通过网络服务平台,按照特定的交易与服务规范,为买卖双方提供服务,其服务内容可以包括但不限于“供求信息发布与搜索、交易的确立、支付、物流”。
了解api常识
调用第三方平台接口需要进行系统间的通信,目前常用的协议是http和https;简单理解https是http的加密版,可以将用户到服务端请求的信息进行加密,避免因明文传输被截获而获知用户信息。基于http协议的接口具有轻量级、跨平台、和跨语言的特点,为了适应不同的开发者,目前各个第三方平台都会提供基于各种常用语言的接口形式,因此大多采用http或https协议;举例,百度、科大讯飞:笔者查阅了百度、腾讯、旷视、阿里的云平台发现在视觉方面均都采用的是https协议;对于视觉,图片数据本身包含的信息就很丰富,尤其是人脸,因此采用https还是有利于保护用户隐私信息的。
接口的请求方式了解接口的请求方式有助于了解用户端和服务端间的交互方式,基于http协议的常用请求方式是post和get;两者的主要区别如下:(1)直观区别:get请求方式是将请求参数放到url中,post是将参数放到requstbody中,所带来的的直接影响是get的请求参数存在长度限制,post无限制;其次是get将参数放到url中安全性弱于post;(2)深度区别:get请求方式用户端和服务端只产生一次交互,post请求方式用户端会和服务端产生两次交互,举例:快递小哥是用户端,你是服务端,则get就像常来你们小区和你认识的快递员直接将快件送到你家,你跟他说声谢谢;post就像新来的快递员先打个电话问下你在家吗?你告诉他你在家呢,过了5分钟他将快递送到你家了,你跟他说声谢谢;目前百度、腾讯、旷视的图像识别接口均采用的是post请求方式。
3、接口响应机制最后了解接口的响应机制:同步接口和异步接口;简单理解同步接口即实时返回消息给调用方,异步接口就是可以延迟返回消息给调用方;实时性要求高的且只能线性工作的需要采用同步接口,其他可以优先使用异步接口;当然不同的场景,同样的服务接口会被要求同步或异步;以人脸识别中的人脸注册为例:(1)刷脸支付:以支付宝为例,使用之前需要按照步骤采集人脸,后台会调用人脸注册将当前人脸注册进人脸库并和该支付宝账号信息绑定,这一步人脸注册通常是同步接口,因为不会要求用户在APP前等待太久,需要及时返回注册成功信息;(2)客流系统:现在商超使用的客流系统一般已经采用人脸识别取代头肩模型,这样不仅可以统计人数还可以统计人次,其中对于首次识别的陌生人脸通常需要注册进陌生人脸库,这里的人脸注册一般为异步接口,因为大型商超每天数十万客流且对于陌生人无会员信息,所以不需要实时注册,只要进入队列能在当日24小时内注册完即可;。
把对接这个动作 抽成一个方法,将接口路径 接口参数作为参数 传给这个方法,方法执行 统一返回json ,这样就只需要处理回调数据的时候 针对不同的接口写就可以了。
1、进入微信公众平台后台,进入开发者中心。
2、同意成为开发者
3、获得开发者appid和APPsecret 等开发数据。
4、在你所进行开发的项目的服务器上做配置。
5、获取你开发项目的服务器的 url和token,并填到微信公众平台的开发者中心。
6、微信公众平台api接入成功。