PHP签名生成通用步骤

作为一个小白,记录一下学习算法签名的一刻,以便以后查阅,也希望能帮到其余的PHP小白

话不多说,上干货

签名生成的通用步骤:
第一步:设所有发送或者接收到的数据为集合M,将集合M 内非空参数值的参数按照参数名ASCII 码从小到大排序(字典序),使用URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
• 参数名ASCII 码从小到大排序(字典序);
• 如果参数的值为空不参与签名;
• 参数名区分大小写;
• 验证调用返回或支付中心主动通知签名时,传送的sign 参数不参与签名, 将生成的签名与该sign 值作校验;
• 支付中心接口可能增加字段,验证签名时必须支持增加的扩展字段。
第二步:在stringA 最后拼接上“&key=${key}”得到stringSignTemp 字符串,并对stringSignTemp 进行MD5 运算,再将得到的字符串所有字符转换为大写,得到sign 值 signValue。支付中心会分配业务系统key,业务系统通过该key 进行数据的加签和验签操作。

public function opp()
{
   //获取参数
   $sign = $_GET['sign'];
   $data = ['income' => $_GET['income'], 'payOrderId' => $_GET['payOrderId'], 'amount' => $_GET['amount'], 'mchId' => $_GET['mchId'], 'productId' => $_GET['productId'], 'mchOrderNo' => $_GET['mchOrderNo'], 'paySuccTime' => $_GET['paySuccTime'], 'resultCode' => $_GET['resultCode'], 'backType' => $_GET['backType'], 'param1' => $_GET['param1'], 'param2' => $_GET['param2'], 'resultMsg' => $_GET['resultMsg'], 'appId' => $_GET['appId']];
   //调用asc_sort方法 这是CI框架的调用方法$this->asc_sort($data)
   $s_data = ($this->asc_sort($data));
   echo $s_data . "<br>";
   //使用strtoupper函数把字符串进行转化成大写
   //并对stringSignTemp 进行MD5 运算,再将得到的字符串所有字符转换为大
   echo strtoupper(md5($s_data));
   echo '<br>';
   echo $sign;
}

function asc_sort($params = array())
{

   $keys = '7CKA9DBYRZKOK2JPZN86YIGOW26HGMXQA0ZWIHHA08CC8QIJTQB5BLHEYWS8NN8NVMTQGXOQLQA4JQ0DZPMAG2GBXA9VG9VIOSBPMQ24Z85QFTRYYUND7QWD3COWIT1U';
   if (!empty($params)) {
      //ksort按数组的键进行升序排序
      $p = ksort($params);
      if ($p) {
         //$str相当于stringA
         $str = '';
         foreach ($params as $k => $val) {
            //参数的值为空不参与签名;
            if ($val != '') {
               $str .= $k . '=' . $val . '&';
            }
         }
         //echo ($str);
         //die;
         //rtrim进行右移除 此处是吧最后一个&移除
         $strs = rtrim($str, '&');
         //在stringA 最后拼接上“&key=${key}”
         return ($strs . '&key' . $keys);
      }
   }
   return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值