解析介面
客戶端介面傳輸規則:
1.用cmd參數(base64)來動態呼叫不同的介面,介面位址統一為http://a.lovexpp.com。
2.將要傳過來的參數組成一個數組,數組添加timestamp元素(當前時間戳,精確到秒),將數組的鍵值按照自然排序從大到小排序
# 3.將陣列組成key=val&key=val的形式的字串,將字串與XPP_KEY連接在一起,用md5加密一次(32位元小寫),得到sign
4.將sign加入到參數陣列中
5.將參數陣列轉換成json用post請求請求介面位址,key值為param
服務端介面解析規則:
1.接收參數param,將結果解析json得到參數數組
2.取出sign,去掉參數數組中的sign
3.將參數數組key值依照自然排序從大到小排序
4.將排序後的參數陣列依照key=val&key=val的形式組成字串,將字串與XPP_KEY連接,用md5加密一次(32位元小寫),得到sign
5.將sign與客戶端傳過來的sign進行比對,如不一樣則可能是中途被篡改參數,伺服器拒絕此次請求
6.將sign與session中的sign對比,如果一樣,則為重複提交,伺服器拒絕此次請求
7.此次的sign存入session
#8.執行路由cmd(base64解析後),將參數帶到方法中
<?php $xpp_key = "xxx"; //接收参数param,将结果解析json得到参数数组 $param = json_decode($_POST['param'] , true); //取出sign,去掉参数数组中的sign $client_sign = $param['sign']; unset($param['sign']); //将参数数组key值按照自然排序从大到小排序 krsort($param); //将排序后的参数数组按照key=val&key=val的形式组成字符串,将字符串与XPP_KEY连接,用md5加密一次(32位小写),得到sign $sb = ''; foreach($param as $key=>$val){ $sb .= $key . '=' . $val . '&'; } $sb .= $xpp_key; $server_sign = md5($sb); //将sign与客户端传过来的sign进行比对,如不一样则可能是中途被篡改参数,服务器拒绝此次请求 if($server_sign !== $client_sign){ echo json_encode(array('code'=>'invalid request')); exit; } //将sign与session中的sign对比,如果一样,则为重复提交,服务器拒绝此次请求 if($server_sign == $_SESSION['last_sign']){ echo json_encode(array('code'=>'Repeated requests')); exit(); } //此次的sign存入session $_SESSION['last_sign'] = $server_sign; //执行路由cmd(base64解析后),将参数带到该方法中 $cmd = base64_decode($param['cmd']); list($__controller,$__action) = explode('-' , $cmd); // 设置请求参数 unset($param['cmd']); unset($param['timestamp']); foreach($param as $key => $val){ $_REQUEST[$key] = $val; }
推薦教學:PHP影片教學
以上是php介面加密怎麼做的詳細內容。更多資訊請關注PHP中文網其他相關文章!