通用的验签规则,并赋有php验签类

一、各端app_key值如下:
'app_key1' => '3c8f7f66b1c8f4cef872f6371c9020237329da2', 
'app_key2' => '84185ada783488bee32ebc8ac30d4ed6b7a2d45',
'app_key3' => '73d6c94786553ebd2b485dea0cb91bca76f2d1c',
'app_key4' => '77cf49c82f223660e3dda49611049c6b3591d27',
二、为了保证支付支付下单和回调接口的安全性,对请求增加签名验证,签名算法如下:
step1:按字典序排序数组参数并拼接,以key=value&key=value形式拼接
step2:将step1生成的字符串拼接上AppKey,拼接成key=appKeyValue(注,这里以key为键)
step3:将step2生成的字符串进行base64的转换
step4:将step3编码完成的字符串,拼接上时间戳(timestamp)
step5:将step4的字符串用MD5加密
step6:截取step5某一段字符串,截取开始位置为时间戳 最后一位数字,结束位置21
step7:将step6截取成功的字符串所有字符转为大写
三、下面的代码可以直接使用或参考

/**
 * Created by PhpStorm.
 * User: Alan-wyb
 * Date: 2018/2/3
 * Time: 10:19
 */
namespace  Common\Tools;

/**
 * 验签工具类
 * Class Attestation
 * @package Common\Tools
 */
class Attestation{
    
    private $appKeyCollection = [
        'app_key1'=>'3c8f7f66b1c8f4cef872f6371c9020237329da2',
        'app_key2'=>'84185ada783488bee32ebc8ac30d4ed6b7a2d45',
        'app_key3'=>'73d6c94786553ebd2b485dea0cb91bca76f2d1c',
        'app_key4'=>'77cf49c82f223660e3dda49611049c6b3591d27',
    
    private $nowAppKey;
    
    /**
     * @name 初始化
     * Attestation constructor.
     */
    public function __construct($appTarget){
        $this->nowAppKey =$this->appKeyCollection[$appTarget] ;
    }
    
    
    /**
     * 生成签名
     *  @return 签名
     */
    public function MakeSign( $params,$acquireSign,$timestamp){
        //签名步骤一:按字典序排序数组参数
        ksort($params);
        $string = $this->ToUrlParams($params);
      
        //签名步骤二:在string后加入KEY
        $string = $string . "&key=".$this->nowAppKey;
       
        //签名步骤三:将str进行base64加密
        $string  = base64_encode($string);
      
        //签名步骤四:将base64加密的字符串拼接上时间戳
        $string   .=$timestamp;
        //签名步骤五:MD5加密
        $string = md5($string);
        
        //签名步骤六:进行时间截取
        $start = (int) substr($timestamp, - 1);
        //签名步骤七:进行签名截取
        $sign = substr($string, $start, 22 - $start);
        
        签名步骤八:所有字符转为大写
        $result = strtoupper($sign);
        if($acquireSign == $result){
            return true;
        }else{
            return false;
        }
        
    }
    
    /**
     * 将参数拼接为url: key=value&key=value
     * @param   $params
     * @return  string
     */
    private function ToUrlParams( $params ){
        $string = '';
        if( !empty($params) ){
            $array = array();
            foreach( $params as $key => $value ){
                if(!empty($value)){
                    $array[] = $key.'='.$value;
                }
                
            }
            $string = implode("&",$array);
        }
        return $string;
    }
    
    
}

你可能感兴趣的:(php,文章,验签规则,php验签类)