问题描述

1、一般计算签名的算法是将请求数据key=>value ,参数名ASCII码从小到大排序(字典序), 然后按照 key=>value 使用& 拼接,

错误(偷懒)做法

$map=['name'=>'王力宏','age'=>33,'address'=>'中国','idcard'=>'533433434343434444','map'=>json_encode([1,2,3])
];
ksort($map);            //对数组按key进行排序
$str = http_build_query($map); //将数组转成querystring
$sign = md5($str);             //将querystring 进行md5 散列计算
echo "签名值(MD5)=".$sign;
echo "<pre>";
echo "签名字符串=".$str;
echo "<pre>";
//输出如下
签名值(MD5)=d75b7c3c3d612d00287eae8853458a88
签名字符串=address=%E4%B8%AD%E5%9B%BD&age=33&idcard=533433434343434444&map=%5B1%2C2%2C3%5D&name=%E7%8E%8B%E5%8A%9B%E5%AE%8F

使用 http_build_query 完成拼接,方法会将中文和符号进行urlencode 编码

正确的招式

$map=['name'=>'王力宏','age'=>33,'address'=>'中国','idcard'=>'533433434343434444','map'=>json_encode([1,2,3])
];
ksort($map);                    //对数组进行按key 排序
$str = createLinkString($map);  //进行字符串拼接
$sign = md5($str);               //md5 进行散列计算 /*** @function 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串* @param array $para 需要拼接的数组* @return string* @throws \Exception*/
function createLinkString($para)
{reset($para);$arg  = "";foreach ($para as $key=>$val){if (is_array($val)) {continue;}$arg.=$key."=".urldecode($val)."&"; //将已经被编码的数据进行反编码,确保是原样值}$arg = rtrim($arg, '&');//如果存在转义字符,那么去掉转义if (get_magic_quotes_gpc()) {$arg = stripslashes($arg);}return $arg;
}echo "签名值(MD5)=".$sign;
echo "<pre>";
echo "签名字符串=".$str;
echo "<pre>";
//输出如下
签名值(MD5) = d98c3af7527378c56f457a660f315d83
签名字符串 = address=中国&age=33&idcard=533433434343434444&map=[1,2,3]&name=王力宏

经过上面两段代码发现什么不一样了吗?

签名字符串” 完全不一样,所以计算出来的散列值就是错误的

关于PHP签名中的容易犯错问题记录相关推荐

  1. java中最容易犯错的特殊字符

    问题背景 能准确说出下面的java 执行完毕后会打印出什么? System.out.println(String.class.getName()+ ".class");System ...

  2. u0027代表JAVA_java中最容易犯错的特殊字符

    问题背景 能准确说出下面的java 执行完毕后会打印出什么? System.out.println( String.class.getName()+ ".class"); Syst ...

  3. 管理就是通过别人完成任务,别怕员工犯错

    互联网时代,每一位知识工作者,都是管理者.领导力已不再是某些人的专属能力,而成为每一个人生存.发展所需的硬技能.领导力不是天生的基因带来的能力,而是一系列可操作.可模仿.可践行的工具:沟通视窗.目标管 ...

  4. 《统计会犯错——如何避免数据分析中的统计陷阱》—第2章置信区间的优势

    本节书摘来自异步社区<统计会犯错--如何避免数据分析中的统计陷阱>一书中的第2章置信区间的优势,作者[美]Alex Reinhart(亚历克斯·莱因哈特),更多章节内容可以访问云栖社区&q ...

  5. 《统计会犯错——如何避免数据分析中的统计陷阱》—第2章膨胀的真理

    本节书摘来自异步社区<统计会犯错--如何避免数据分析中的统计陷阱>一书中的第2章膨胀的真理,作者[美]Alex Reinhart(亚历克斯·莱因哈特),更多章节内容可以访问云栖社区&quo ...

  6. 正面刚CNN,Transformer居然连犯错都像人类

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 梦晨 水木番 发自 凹非寺 量子位 报道 | 公众号 QbitAI ...

  7. JavaScript容易犯错的九个陷阱

    以下是JavaScript容易犯错的九个陷阱.虽然不是什么很高深的技术问题,但注意一下,会使您的编程轻松些,即所谓make life easier. 以及对某些陷阱会混杂一些评点. 1. 最后一个逗号 ...

  8. m_Orchestrate learning system---二十、如何写代码不容易犯错

    m_Orchestrate learning system---二十.如何写代码不容易犯错 一.总结 一句话总结:能排序多排序 这次查错的启示: 1.代码数据更规整:要是取出的数据排序的话可以减少很多 ...

  9. 新驾考科目三有四个地方易犯错 多名教练提供对策

    驾考科目三 四个地方易犯错 多名驾校教练为学员分析原因提供对策 "现在电子评判,比起原来人工评判,更客观,更公平."有驾校教练把自己这两天当安全员参加考试的经验拿出来与学员们分享. ...

  10. 电子路考容易犯错的五大细节

    正在学车的你,知道在电子路考中哪些是考生常犯的错误吗?下面,小编为大家带来学车考生参加科目三考试特别容易犯错的地方,尤其是不按规定使用转向灯和在超车时不能根据道路交通情况合理选择行车道或速度这两项犯错 ...

最新文章

  1. 每天2小时,吃透 985博士总结的这份保姆级TensorFlow + PyTorch笔记(20G高清/PPT/代码)...
  2. java VM 推荐的命令行设置
  3. C#委托的介绍(delegate、Action、Func、predicate)
  4. JavaScript的Prototype实现
  5. data怎么给echart传值_通用技术 VUE 子父组件传值
  6. 迁移学习 Transfer Learning—通俗易懂地介绍(常见网络模型pytorch实现)
  7. 简单又有效!神奇的轻量级通用上采样算子CARAFE
  8. hdu 1286找新朋友 (简单数学题)
  9. document.body、document.documentElement和window获取视窗大小的区别
  10. Android应用开发(1)---Android五大UI布局的特有属性
  11. 直角三角形的边角关系_三角形的边角关系巩固练习
  12. SQL语句BETWEEN
  13. java-ToStringBuilder介绍
  14. Hbase 查询命令 条件筛选
  15. 用cmd命令下载百度云的资源
  16. 任正非的艰难时刻的启示
  17. Flyway数据库版本管理工具
  18. 【蓝桥杯】单片机学习(7)——UART串口通信
  19. brctl 使用说明
  20. ON DUPLICATE KEY UPDATE 作用及一句SQL实现批量修改

热门文章

  1. java葫芦娃喜羊羊格斗_继明日之后看葫芦娃和奥特曼,玩家也能在绝地求生中看喜羊羊了...
  2. JPEG算法 格式压缩方案
  3. python人脸识别实验报告总结_人脸识别实验报告.doc
  4. LSTM 08:超详细LSTM调参指南
  5. UIPATH 下载文件
  6. Dissect RB-Tree
  7. dfuse 发布全新 EOSIO 链迁移工具
  8. petalinux-build 报错解决
  9. 华硕美版路由器RT-AC1200G+解决无线信号弱问题
  10. uni-app开发模式中的选择图片(uni.chooseImage)、上传图片(uni.uploadFile)、图片预览(uni.previewImage)