0.3API接口方式

优质
小牛编辑
125浏览
2023-12-01

基本要求

1.请求地址URL大小写敏感,请按协议要求的大小写地址。

2.协议返回数据格式为json,如:{"status":1,"info":"提交成功"},

{"status":0,"info":"保存失败"}下面协议中不再重复说明。

返回数据中,status为返回码,协议约定1为正常返回,0或非1为出错,错误信息为info。

3.协议URL参数中必须要有的参数如下:

msid:门店编号

timestamp:日期格式yyyyMMddHHmmss,如:20141124081245;注意:时间会进行校验,请保证时间误差不超过60分钟

nonce:随机数

signtype:签名方式,目前取值:sha1

下面协议中的请求参数为除上述项目之外的参数要求。

http://api.dc78.cn/Api/xxx_yyy?id=233718&msid=103×tamp=20141124081245&none=8464801738&signtype=sha1&msg_sign=7A823DF9C64D342BBB1599FD5A2F60AC7DFD9562

协议编号加*号的协议,已经在通用接口程序中实现,软件厂商可以直接使用通用接口,无需开发。

POST参数

1.注意我们参数中需要POST的参数提交是以FORM的名称、值对的方式进行提交,注意在提交时的方式和参数名称。

2.如果文件中有+号,请一定使用urlencode进行url编码,否则上传时会被替换成空格而丢失+号。

JSON数据解析

平台采用的数据交换格式为JSON,注意在相应开发平台下使用相应的JSON解析控件或源码,避免自己进行拼写或解析,JSON数据格式虽然简单,如果自己处理需要考虑编码转换、特殊字符处理等等特殊情况。我们强烈建议不要自行处理,之前已经有不少工程师自行处理碰到了很多的问题。如果开发采用的是DELPHI ,我们的DEMO程序中已经包含了JSON控件包及使用例程,可以直接使用。其它开发工具相应的控件源码我们也会进行整理。

数字签名生成方式

每个客户会有一个对应的ApiKey如5d048e69ee55a71899392f5c2c8b24f1db07b7c5

http请求时,将上述要求所有的URL参数按键名排序后,用&号连接,再最后再加上ApiKey,(APiKey与前面串用逗号分隔)如下验证串

“id=233187&msid=113&nonce=112&signtype=sha1&timestamp=20150807123101,5d048e69ee55a71899392f5c2c8b24f1db07b7c5”

msg_sign=sha1(验证串)

最后提交的请求为:

http://api.dc78.cn/Api/do_get_order?id=233187&msid=113&nonce=112&signtype=sha1&timestamp=20150807123101&msg_sign=52562447054C3C94CFBD34F659DCC16D8D547B0F

注意:

ApiKey仅仅在生成签名时需要用,在提交时不能加上,否则会签名验证失败。

涉及到URL参数中有中文,会涉及到签名问题。

首先URL参数的内容先进行AnsiToUtf8转换赋值后,再按要求进行签名。注意签名完成拼接成URL串时一定要用UrlEncode进行URL编码,否则提交参数错误,导致服务端校验签名错误。

增加了接口秘钥加强签名,详情请查看接口说明0.9

PHP调用示例

<!--?php
/*
接口示例
*/
//函数定义
function PostUrl($url,$postvar,$proxy='',$headers=false){
$ch = curl_init();
$lu = explode('://',$url);
$htp = strtolower($lu[0]); //判断http协议
$ls = explode('/',end($lu));
$lp = explode(':',current($ls));
$port = count($lp)>1?intval(end($lp)):0;
if ($port) curl_setopt($ch, CURLOPT_PORT, $port); //如果有端口,处理端口,端口号不能直接在url中
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
if ($headers) curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers);
if ($htp=='https'){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvar);
if ($proxy){ //处理代理服务器
$ls = explode(':',$proxy);
$proxy = current($ls);
$port = $ls[1]?$ls[1]:80;
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); //使用http代理模式
//curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); //代理认证模式
curl_setopt($ch, CURLOPT_PROXY, $proxy); //代理服务器地址
curl_setopt($ch, CURLOPT_PROXYPORT, $port); //代理服务器端口
}
$res = curl_exec ($ch);
curl_close ($ch);
return $res;

} function getSign($params,$key){
ksort($params,SORT_STRING);
$ar = array();
foreach ($params as $k=>$v){
$ar[] = $k.'='.$v;
}
$str = implode('&',$ar).','.$key;
return sha1($str);
}

function urlApiCall($action,$msid,$apiKey,$urlPara,$postPara=null){ //封装url接口调用,JSON返回
$urlPara['msid'] = $msid;
$urlPara['timestamp'] = date('YmdHis');
$urlPara['signtype'] = 'sha1';
$urlPara['nonce'] = rand(0,999999);
$urlPara['msg_sign'] = getSign($urlPara,$apiKey);
$post['get'] = $urlPara;
$post['action']['action'] = $action;
if ($postPara) $post['post'] = $postPara;
$host = 'http://api.dc78.cn/Api';
$str = PostUrl($host,json_encode($post));
$ret = json_decode($str,true);
return $ret;
}

//测试示例,扫码支付
header("Content-type: text/html; charset=utf-8");
$msid = 6786; //平台门店编号
$apiKey = '75b5b6cc27725435484a155652332ca907503d16';
$get['auth_code'] = $_GET['auth_code']; //付款码
$get['amt'] = 0.01; // 支付金额
$ret = urlApiCall('cash_code_pay',$msid,$apiKey,$get);
var_dump($ret);