1、发送

  1. /**
  2. * 客户端请求
  3. * @param url 接口地址
  4. * @param array $params(post)
  5. * @return json
  6. * @throws Exception
  7. */
  8. function openapi_curl_get($url, $params = array())
  9. {
  10. $params['timestamp'] = date('Y-m-d H:i:s', time());
  11. $sign = generateSign($params);
  12. $params['sign'] = $sign;
  13. $ch = curl_init();
  14. $a = array(" ");
  15. $b = array("%20");
  16. $url = str_replace($a, $b, $url);
  17. $params = json_encode($params);
  18. @curl_setopt($ch, CURLOPT_URL, $url);
  19. @curl_setopt($ch, CURLOPT_HEADER, 0);
  20. @curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  21. @curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  22. @curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
  23. @curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8'));
  24. if (count($params) > 0) {
  25. @curl_setopt($ch, CURLOPT_POST, 1);
  26. @curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
  27. }
  28. $result = @curl_exec($ch);
  29. $code = 1;
  30. if (curl_errno($ch)) {
  31. $code = curl_errno($ch);
  32. $result = json_encode(array('code'=>$code,'msg'=> getCurlError($code)));
  33. } else {
  34. $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  35. $code = $httpStatusCode;
  36. if (200 !== $httpStatusCode) {
  37. $result = json_encode(array('code'=>$httpStatusCode,'msg'=>'服务器错误'));
  38. }
  39. }
  40. curl_close($ch);
  41. return $result;
  42. }

curl 错误代码

  1. function getCurlError($code){
  2. $error = array(
  3. '1'=>'CURLE_UNSUPPORTED_PROTOCOL (1) – 您传送给 libcurl 的网址使用了此 libcurl 不支持的协议。 可能是您没有使用的编译时选项造成了这种情况(可能是协议字符串拼写有误,或没有指定协议 libcurl 代码)。',
  4. '2'=>'CURLE_FAILED_INIT (2) – 非常早期的初始化代码失败。 可能是内部错误或问题。',
  5. '3'=>'CURLE_URL_MALFORMAT (3) – 网址格式不正确。',
  6. '5'=>'CURLE_COULDNT_RESOLVE_PROXY (5) – 无法解析代理服务器。 指定的代理服务器主机无法解析。',
  7. '6'=>'CURLE_COULDNT_RESOLVE_HOST (6) – 无法解析主机。 指定的远程主机无法解析。',
  8. '7'=>'CURLE_COULDNT_CONNECT (7) – 无法通过 connect() 连接至主机或代理服务器。',
  9. '8'=>'CURLE_FTP_WEIRD_SERVER_REPLY (8) – 在连接到 FTP 服务器后,libcurl 需要收到特定的回复。 此错误代码表示收到了不正常或不正确的回复。 指定的远程服务器可能不是正确的 FTP 服务器。',
  10. '9'=>'CURLE_REMOTE_ACCESS_DENIED (9) – 我们无法访问网址中指定的资源。 对于 FTP,如果尝试更改为远程目录,就会发生这种情况。',
  11. '11'=>'CURLE_FTP_WEIRD_PASS_REPLY (11) – 在将 FTP 密码发送到服务器后,libcurl 需要收到正确的回复。 此错误代码表示返回的是意外的代码。',
  12. '13'=>'CURLE_FTP_WEIRD_PASV_REPLY (13) – libcurl 无法从服务器端收到有用的结果,作为对 PASV 或 EPSV 命令的响应。 服务器有问题。',
  13. '14'=>'CURLE_FTP_WEIRD_227_FORMAT (14) – FTP 服务器返回 227 行作为对 PASV 命令的响应。如果 libcurl 无法解析此行,就会返回此代码。',
  14. '15'=>'CURLE_FTP_CANT_GET_HOST (15) – 在查找用于新连接的主机时出现内部错误。',
  15. '17'=>'CURLE_FTP_COULDNT_SET_TYPE (17) – 在尝试将传输模式设置为二进制或 ascii 时发生错误。',
  16. '18'=>'CURLE_PARTIAL_FILE (18) – 文件传输尺寸小于或大于预期。当服务器先报告了一个预期的传输尺寸,然后所传送的数据与先前指定尺寸不相符时,就会发生此错误。',
  17. '19'=>'CURLE_FTP_COULDNT_RETR_FILE (19) – ‘RETR’ 命令收到了不正常的回复,或完成的传输尺寸为零字节。',
  18. '21'=>'CURLE_QUOTE_ERROR (21) – 在向远程服务器发送自定义 “QUOTE” 命令时,其中一个命令返回的错误代码为 400 或更大的数字(对于 FTP),或以其他方式表明命令无法成功完成。',
  19. '22'=>'CURLE_HTTP_RETURNED_ERROR (22) – 如果 CURLOPT_FAILONERROR 设置为 TRUE,且 HTTP 服务器返回 >= 400 的错误代码,就会返回此代码。 (此错误代码以前又称为 CURLE_HTTP_NOT_FOUND。)',
  20. '23'=>'CURLE_WRITE_ERROR (23) – 在向本地文件写入所收到的数据时发生错误,或由写入回调 (write callback) 向 libcurl 返回了一个错误。',
  21. '25'=>'CURLE_UPLOAD_FAILED (25) – 无法开始上传。 对于 FTP,服务器通常会拒绝执行 STOR 命令。错误缓冲区通常会提供服务器对此问题的说明。 (此错误代码以前又称为 CURLE_FTP_COULDNT_STOR_FILE。)',
  22. '26'=>'CURLE_READ_ERROR (26) – 读取本地文件时遇到问题,或由读取回调 (read callback) 返回了一个错误。',
  23. '27'=>'CURLE_OUT_OF_MEMORY (27) – 内存分配请求失败。此错误比较严重,若发生此错误,则表明出现了非常严重的问题。',
  24. '28'=>'CURLE_OPERATION_TIMEDOUT (28) – 操作超时。 已达到根据相应情况指定的超时时间。',
  25. '30'=>'CURLE_FTP_PORT_FAILED (30) – FTP PORT 命令返回错误。 在没有为 libcurl 指定适当的地址使用时,最有可能发生此问题。 请参阅 CURLOPT_FTPPORT。',
  26. '31'=>'CURLE_FTP_COULDNT_USE_REST (31) – FTP REST 命令返回错误。如果服务器正常,则应当不会发生这种情况。',
  27. '33'=>'CURLE_RANGE_ERROR (33) – 服务器不支持或不接受范围请求。',
  28. '34'=>'CURLE_HTTP_POST_ERROR (34) – 此问题比较少见,主要由内部混乱引发。',
  29. '35'=>'CURLE_SSL_CONNECT_ERROR (35) – 同时使用 SSL/TLS 时可能会发生此错误。您可以访问错误缓冲区查看相应信息,其中会对此问题进行更详细的介绍。可能是证书(文件格式、路径、许可)、密码及其他因素导致了此问题。',
  30. '36'=>'CURLE_FTP_BAD_DOWNLOAD_RESUME (36) – 尝试恢复超过文件大小限制的 FTP 连接。',
  31. '37'=>'CURLE_FILE_COULDNT_READ_FILE (37) – 无法打开 FILE:// 路径下的文件。原因很可能是文件路径无法识别现有文件。 建议您检查文件的访问权限。',
  32. '38'=>'CURLE_LDAP_CANNOT_BIND (38) – LDAP 无法绑定。LDAP 绑定操作失败。',
  33. '39'=>'CURLE_LDAP_SEARCH_FAILED (39) – LDAP 搜索无法进行。',
  34. '41'=>'CURLE_FUNCTION_NOT_FOUND (41) – 找不到函数。 找不到必要的 zlib 函数。',
  35. '42'=>'CURLE_ABORTED_BY_CALLBACK (42) – 由回调中止。 回调向 libcurl 返回了 “abort”。',
  36. '43'=>'CURLE_BAD_FUNCTION_ARGUMENT (43) – 内部错误。 使用了不正确的参数调用函数。',
  37. '45'=>'CURLE_INTERFACE_FAILED (45) – 界面错误。 指定的外部界面无法使用。 请通过 CURLOPT_INTERFACE 设置要使用哪个界面来处理外部连接的来源 IP 地址。 (此错误代码以前又称为 CURLE_HTTP_PORT_FAILED。)',
  38. '47'=>'CURLE_TOO_MANY_REDIRECTS (47) – 重定向过多。 进行重定向时,libcurl 达到了网页点击上限。请使用 CURLOPT_MAXREDIRS 设置上限。',
  39. '48'=>'CURLE_UNKNOWN_TELNET_OPTION (48) – 无法识别以 CURLOPT_TELNETOPTIONS 设置的选项。 请参阅相关文档。',
  40. '49'=>'CURLE_TELNET_OPTION_SYNTAX (49) – telnet 选项字符串的格式不正确。',
  41. '51'=>'CURLE_PEER_FAILED_VERIFICATION (51) – 远程服务器的 SSL 证书或 SSH md5 指纹不正确。',
  42. '52'=>'CURLE_GOT_NOTHING (52) – 服务器未返回任何数据,在相应情况下,未返回任何数据就属于出现错误。',
  43. '53'=>'CURLE_SSL_ENGINE_NOTFOUND (53) – 找不到指定的加密引擎。',
  44. '54'=>'CURLE_SSL_ENGINE_SETFAILED (54) – 无法将选定的 SSL 加密引擎设为默认选项。',
  45. '55'=>'CURLE_SEND_ERROR (55) – 无法发送网络数据。',
  46. '56'=>'CURLE_RECV_ERROR (56) – 接收网络数据失败。',
  47. '58'=>'CURLE_SSL_CERTPROBLEM (58) – 本地客户端证书有问题',
  48. '59'=>'CURLE_SSL_CIPHER (59) – 无法使用指定的密钥',
  49. '60'=>'CURLE_SSL_CACERT (60) – 无法使用已知的 CA 证书验证对等证书',
  50. '61'=>'CURLE_BAD_CONTENT_ENCODING (61) – 无法识别传输编码',
  51. '62'=>'CURLE_LDAP_INVALID_URL (62) – LDAP 网址无效',
  52. '63'=>'CURLE_FILESIZE_EXCEEDED (63) – 超过了文件大小上限',
  53. '64'=>'CURLE_USE_SSL_FAILED (64) – 请求的 FTP SSL 级别失败',
  54. '65'=>'CURLE_SEND_FAIL_REWIND (65) – 进行发送操作时,curl 必须回转数据以便重新传输,但回转操作未能成功',
  55. '66'=>'CURLE_SSL_ENGINE_INITFAILED (66) – SSL 引擎初始化失败',
  56. '67'=>'CURLE_LOGIN_DENIED (67) – 远程服务器拒绝 curl 登录(7.13.1 新增功能)',
  57. '68'=>'CURLE_TFTP_NOTFOUND (68) – 在 TFTP 服务器上找不到文件',
  58. '69'=>'CURLE_TFTP_PERM (69) – 在 TFTP 服务器上遇到权限问题',
  59. '70'=>'CURLE_REMOTE_DISK_FULL (70) – 服务器磁盘空间不足',
  60. '71'=>'CURLE_TFTP_ILLEGAL (71) – TFTP 操作非法',
  61. '72'=>'CURLE_TFTP_UNKNOWNID (72) – TFTP 传输 ID 未知',
  62. '73'=>'CURLE_REMOTE_FILE_EXISTS (73) – 文件已存在,无法覆盖',
  63. '74'=>'CURLE_TFTP_NOSUCHUSER (74) – 运行正常的 TFTP 服务器不会返回此错误',
  64. '75'=>'CURLE_CONV_FAILED (75) – 字符转换失败',
  65. '76'=>'CURLE_CONV_REQD (76) – 调用方必须注册转换回调',
  66. '77'=>'CURLE_SSL_CACERT_BADFILE (77) – 读取 SSL CA 证书时遇到问题(可能是路径错误或访问权限问题)',
  67. '78'=>'CURLE_REMOTE_FILE_NOT_FOUND (78) – 网址中引用的资源不存在',
  68. '79'=>'CURLE_SSH (79) – SSH 会话中发生无法识别的错误',
  69. '80'=>'CURLE_SSL_SHUTDOWN_FAILED (80) – 无法终止 SSL 连接'
  70. );
  71. return $error[$code];
  72. }

服务端签名生成

  1. /**
  2. * 服务端签名生成
  3. * @param array $params ERP传输的参数数组(不包含sign)
  4. * @return string
  5. */
  6. function generateSign($params)
  7. {
  8. global $config;
  9. $api_signkey = md5(md5($config['dev_api_key']));
  10. //所有请求参数按照字母先后顺序排序
  11. ksort($params);
  12. //定义字符串开始 结尾所包括的字符串
  13. $stringToBeSigned = $config['dev_api_key'];
  14. //把所有参数名和参数值串在一起
  15. foreach ($params as $k => $v) {
  16. if(is_array($v))$v = json_encode($v);
  17. $stringToBeSigned .= "$k$v";
  18. }
  19. unset($k, $v);
  20. //把venderKey夹在字符串的两端
  21. $stringToBeSigned .= $api_signkey;
  22. //使用MD5进行加密,再转化成大写
  23. return strtoupper(md5($stringToBeSigned));
  24. }

2、接收校验

  1. public function __construct(){
  2. if(!defined("API_KEY")){
  3. exit(json_encode(array('code' => 0, 'msg' => '网站未配置接口')));die;
  4. }
  5. $this->key = $config['dev_api_key'];
  6. $json_str = file_get_contents('php://input', 'r');
  7. $this->post = json_decode($json_str, true);
  8. $result = $this->checkSign($this->post);
  9. if( $result != 1 ){
  10. exit(json_encode(array('code' => $result, 'msg' => $this->msg[$result])));die;
  11. }
  12. }
  13.  
  14. /**
  15. * 效验签名是否匹配
  16. * @param $params
  17. * @param $erp_sign
  18. * @return type
  19. */
  20. protected function checkSign($params)
  21. {
  22. $code = 1;
  23. if (!isset($params['sign'])) {
  24. $code = 1001;
  25. } else if (!isset($params['timestamp'])) {
  26. $code = 1003;
  27. } else if (!preg_match("/^((?:19|20)[0-9]{2})-[0-9]{2}-[0-9]{2} [0-9]{2}(\:)[0-9]{2}(\:)[0-9]{2}$/", $params['timestamp'])) {
  28. $code = 1004;
  29. } elseif (time() - strtotime($params['timestamp']) > 600000) {
  30. $code = 1005;
  31. } else {
  32. $erp_sign = $params['sign'];
  33. unset($params['sign']);
  34. $sign = $this->generateSign($params);
  35. // print_r($sign);die;
  36. $code = $erp_sign == $sign ? 1 : 1002;
  37. }
  38. return $code;
  39. }
  40.  
  41. /**
  42. * 服务端签名生成
  43. * @param array $params 传输的参数数组(不包含sign)
  44. * @return string
  45. */
  46. protected function generateSign($params)
  47. {
  48. $api_signkey = md5(md5(API_KEY));
  49. //所有请求参数按照字母先后顺序排序
  50. ksort($params);
  51. //定义字符串开始 结尾所包括的字符串
  52. $stringToBeSigned = API_KEY;
  53. //把所有参数名和参数值串在一起
  54. foreach ($params as $k => $v) {
  55. if(is_array($v))$v = json_encode($v);
  56. $stringToBeSigned .= "$k$v";
  57. }
  58. unset($k, $v);
  59. //把venderKey夹在字符串的两端
  60. $stringToBeSigned .= $api_signkey;
  61. //使用MD5进行加密,再转化成大写
  62. return strtoupper(md5($stringToBeSigned));
  63. }

php api接口校验规则示例的更多相关文章

  1. 写了个TP5下PHP和手机端通信的API接口校验

    写了个PHP和手机端通信的API接口校验 直接发函数吧 public function _initialize() { //定义密码和盐 $password="123456"; $ ...

  2. 快递单号查询免费api接口(PHP示例)

    快递单号查询API,可以对接顺丰快递查询,邮政快递查询,中通快递查询等.这些快递物流企业,提供了快递单号自动识别接口,快递单号查询接口等快递物流服务.对于电商企业,ERP服务企业,集成此接口到自己的软 ...

  3. 快递鸟API接口调用代码示例(免费不限量)

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  4. API接口开发简述示例

    作为最流行的服务端语言PHP(PHP: Hypertext Preprocessor),在开发API方面,是很简单且极具优势的.API(Application Programming Interfac ...

  5. python接口自动化21-规范的API接口文档示例

    前言 接口文档到底长啥样?做接口测试最大的障碍在于没有接口文档,很多公司不注重接口文档的编写,导致测试小伙伴没见过接口文档. 运气好一点的测试小伙伴可能厚着脸皮找开发要过接口文档,然而拿过来的接口文档 ...

  6. 各开放平台API接口通用 SDK 前言

    最近两年一直在做API接口相关的工作,在平时工作中以及网上看到很多刚接触API接口调用的新人一开始会感到很不适应,包括自己刚开始做API接口调用的相关工作时,也是比较抓狂的,所有写一序列文章把之前的工 ...

  7. 各开放平台API接口通用SDK序列文章 前言

    最近两年一直在做API接口相关的工作,在平时工作中以及网上看到很多刚接触API接口调用的新人一开始会感到很不适应,要看的文档一大堆,自己要调用的接口找不着,或都找着了不知道怎么去调用,记得包括自己刚开 ...

  8. 智能识别快递地址api接口实现(PHP示例)

    电商.ERP等行业发货时,批量录入图片上的收件人地址是个难题:智能识别收件人API是近乎完美的解决方案,通过识别图片,解析出图片中收件人的姓名.电话.详细地址(省.市.区/县.详细地址).将此接口集成 ...

  9. APISpace 疫情地区校验API接口 免费好用

    从2019年疫情开始爆发到现在,我们去到某个地方都会提心吊胆的,很怕一不小心就染上了这个病毒.在去到某个地方之前,我们提前查看到它的一个疫情等级,同时做好防护再出门我们心里也会有底一些.所以疫情地区校 ...

随机推荐

  1. ListBox, ListView, GridView

    ListView是ListBox的派生类,而GridView是ViewBase的派生类 ListView的View属性是ViewBase,所以GridView可以作为ListView的属性 如 < ...

  2. CSS实现三列布局方法总结

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABYwAAAI7CAYAAABPx9+YAAARJElEQVR4nO3cwWnDQBBA0TioJrXhTl

  3. PowerDesigner16 把设计图导出成图片

    1. 用鼠标选择要导出的对象,必须先选择. 2. 选择Edit—>Export Image 导出为你需要的格式图片,见下图:

  4. 正则表达式实现将html文本转换为纯文本格式(将html字符串转换为纯文本方法)

    Regex regex = new Regex("<.+?>", RegexOptions.IgnoreCase); string strOutput = regex. ...

  5. VSCode Web Developement for Javascript. Must have plugins.

    Es6 Javascript front-end web developemnt must have plugins Prettier - Code Formatter Javascript (ES6 ...

  6. Centos 6.5下安装vsftpd服务器

    1.查看是否安装vsftp  [root@localhost ~]#rpm -qa|grep vsftpd 如果出现 vsftpd-2.2.2-13.el6_6.1.x86_64  则说明已经安装了v ...

  7. CSS 竖线 点 时间节点

    效果如图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  8. ThinkPHP5 正则验证中有“|”时提示“规则错误”的解决方案

    正则规则中有“|”时,会引起解析错误: 'regex:\d{3,4}[\s,-]?\d{7,8}|1[3,4,5,8]\d[\s,-]?\d{4}[\s,-]?\d{4}' 使用数组语法可以解决: [ ...

  9. arm---先搞清楚各种版本号【转】

    转自:http://blog.csdn.net/linnoo/article/details/53214689 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] ARM的几种版本 ...

  10. 自动化测试===Httprunner测试框架介绍

    项目地址: https://github.com/HttpRunner/HttpRunner 中文手册: http://cn.httprunner.org/ 首先是环境搭建: pip install ...