app接口设计之signature签名的php实现

app接口设计之signature签名的php实现

1、首先说一句什么是接口:接口简单来说就是服务器端用来返回给其他程序或者客户端数据的桥梁

2、接口的作用:根据固定参数返回固定数据,比如客户端传a=1,那么服务器端返回a的姓名,客户端传a=2,服务器端返回a的性别,而不会返回其他数据。

例如:app与服务器端的接口、java与php之间不同程序的接口,这些接口一般通过json格式传输数据

所以为了保证移动端和服务端数据传输相对安全,需要对接口进行加密传输

接口签名验证固定参数:
   接口签名验证固定参数是客户端调用所有接口时都需要传递的参数。用于接口版本管理(旧版本的安卓app依然可以使用)、安全校验等目的。

os    String  客户端操作系统名称  例如"android", "ios"

uuid  String  移动设备唯一标识符  例如安卓手机的IMEI,苹果手机的UUID

version  String   客户端版本号   例如"1.0","2.0"(接口设计高版本接口要兼容低版本的接口)

timestamp  long     客户端调用接口时的时间戳

signature   String   客户端接口调用签名


签名算法
     Ps: (可以根据实际变更其他算法使用)
     对除去signature外的所有参数,按参数名的字典顺序排序后计算sha1值。例如,某个接口的参数"mobile=18600933630&verifyCode=135466&os=android&uuid=GB1303EA&version=1.0&timestamp=1442067125464"
      a) 按参数名的字典顺序排序成  "mobile=18600933630os=androidtimestamp=1442067125464uuid=GB1303EAverifyCode=135466version=1.0"
      b) signature值为字符串"mobile=18600933630os=androidtimestamp=1442067125464uuid=GB1303EAverifyCode=135466version=1.0"的sha1值

注意:简而言之,签名设计的原则就是保证服务器所接收到的数据是自己的APP端传过来的,而不是其他人非法调用的,在APP端给签名加密时需要加上特有固定参数,服务器也是加上特有固定参数,从而来保证一对一的传输,每个接口都需要调用该签名验证方法


本项目实现签名及其验证的具体代码(php实现):


(1)签名的验证方法代码:
    // $signtype 'yes':验证,'no':不验证
    public static function checkSign($args,$signature,$signtype = 'yes')
    {
        if($signtype == 'no')  //上线时去除该部分,必须验证签名
        {
            return true;
        }
        if(!$args || !$signature)
        {
            return false;
        }
        if (time() - $args['timestamp'] > 300)  //同一签名调用时间限制
        {
            return false;
        }
        $args['xiaoming'] = 'wuyingqi431';  //特有固定参数
        ksort($args);  //按数组的键排序
        $sign = '';

        foreach($args as $k => $v)
        {
            $sign .= $k . '=' . $v;
        }
        $sign = sha1($sign);  //加密
        if($sign == $signature)
        {
            return true;
        }
        return false;
    }

(2)签名验证方法调用(其他必须传的固定参数也需要加入到$args数组当中):

$args = $res = array();
//下面是每个接口的参数(分为固定参数和不固定参数,固定参数必传)
$args['mobile'] = r_get('mobile');

//下面是签名固定参数
        $args['os'] = $_POST['os'];
        $args['uuid'] = $_POST['uuid'];
        $args['version'] = $_POST['version'];
        $args['timestamp'] = $_POST['timestamp'];
        $signature = $_POST['signature'];
        $signtype = $_POST['signtype'];
        $check = appuser::checkSign($args,$signature,$signtype);
        if(!$check)
        {
            $res['msg_code'] = 99999; //签名错误
            v_json($res);
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值