- <?php
- /**
- inc
- 解析接口
- 客户端接口传输规则:
- 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 解析后), 将参数带到该方法中
- */
- $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;
- }
来源: http://www.bubuko.com/infodetail-2678675.html