自己平时工作中用到的一套接口加密规则,记录下来以后用:
/**
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;
}
客户端代码demo:
package com.xpplove.newxpp.activity;
import java.util.hashmap;
import java.util.iterator;
import java.util.map;
import java.util.treemap;
import org.apache.commons.codec.binary.base64;
import android.os.bundle;
import com.alibaba.fastjson.json;
import com.xpplove.newxpp.baseactivity;
import com.xpplove.newxpp.bean.params;
import com.xpplove.newxpp.net.netposttask;
import com.xpplove.newxpp.utils.densityutil;
public class testactivity extends baseactivity {
private string url = "http://c.lovexpp.com/";
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
loadmesage();
}
private void loadmesage() {
base64 base64 = new base64();
map<string, string> paramsmap = new hashmap<string, string>();
paramsmap.put("timestamp", (system.currenttimemillis() / 1000 + ""));
string cmd = new string(base64.encode("user-camlist".getbytes()));
string dcmd = new string(base64.decode(cmd.getbytes()));
paramsmap.put("cmd", cmd);
paramsmap.put("sign", getstring(paramsmap));
string str = getkeyvalues(paramsmap);
paramsmap = new hashmap<string, string>();
paramsmap.put("param", str);
params params = new params();
params.listener = this;
params.url = url;
//new networktask().executeproxy(params);
new netposttask(paramsmap).executeproxy(params);
}
@override
public void ongetresult(int errorcode, object result) {
super.ongetresult(errorcode, result);
system.out.println();
}
private string getstring(map<string, string> paramsmap) {
treemap tm = new treemap(paramsmap);
iterator i = tm.descendingmap().entryset().iterator();
stringbuffer buffer = new stringbuffer();
while (i.hasnext()) {
buffer.append(i.next() + "&");
}
buffer.append(appkey);
return densityutil.md5(buffer.tostring());
}
// 得到键值对
private string getkeyvalues(map<string, string> paramsmap) {
treemap tm = new treemap(paramsmap);
iterator i = tm.descendingkeyset().iterator();
string jsontext = json.tojsonstring(tm.descendingmap(), true);
return jsontext;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持硕编程。
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!