作为一个小白,记录一下学习算法签名的一刻,以便以后查阅,也希望能帮到其余的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; }