为了账号安全,请及时绑定邮箱和手机立即绑定

php公众号开发,消息丢失的原因和解决办法

标签:
PHP

在使用PHP进行公众号开发时,如果出现消息部分丢失的话,很可能是下载到旧的sdk。
    这种情况一般出现在从网上下载SDK而不是从官方下载sdk,导致下载到旧的sdk。而旧的sdk中有bug会导致公众号消息解密失败,从而漏掉消息。
    官方提供的旧的sdk中的 checkSignature 函数,导致回复的消息经常性的丢失。 官方示例代码中的 checkSignature 函数:

//这里是官方旧的sdk代码,是错误的,别复制黏贴。private function checkSignature() { 
      $signature = $_GET["signature"]; 
      $timestamp = $_GET["timestamp"]; 
      $nonce = $_GET["nonce"]; 
      $token = TOKEN; 
      $tmpArr = array($token, $timestamp, $nonce); 
      sort($tmpArr);
      $tmpStr = implode( $tmpArr ); 
      $tmpStr = sha1( $tmpStr ); 
      if( $tmpStr == $signature ){ 
            return true; 
       }else{ 
            return false;
       }
 }

其中的 sort($tmpArr);修改为 sort($tmpArr, SORT_STRING);
正确代码为:

private function checkSignature() { 
      $signature = $_GET["signature"]; 
      $timestamp = $_GET["timestamp"]; 
      $nonce = $_GET["nonce"]; 
      $token = TOKEN; 
      $tmpArr = array($token, $timestamp, $nonce); 
      sort($tmpArr, SORT_STRING);
      $tmpStr = implode( $tmpArr ); 
      $tmpStr = sha1( $tmpStr ); 
      if( $tmpStr == $signature ){ 
            return true; 
       }else{ 
            return false;
       }
 }

    这个bug的出现时因为sort函数默认把每一项按常规顺序排列(Standard ASCII,不改变类型)的,因此解密时会出现偶现性解密失败。而SORT_STRING参数是把每一项作为字符串来处理,使用类似 natsort() 的自然排序。



作者:周五晚上
链接:https://www.jianshu.com/p/51268892abf9


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消