最近做项目,碰着一个奇怪的请求,后台说在调用接口之前需要验证签名和有效时间,当场就懵逼了,要生成一个sign签名,下面来说说怎么做
首先说说大致思路: sign 的生成:按照规则来是键值对的形式(key=value),拼接的时候按照key=value&key=value(注意:key:后台所需的参数名,value:前台所获取到的值)&time=系统所获取的时间&salt = fangzhou(这个参数按照后台要求),而后进行 urlencode 编码(Java中有方法),下一步进行MD5加密,如果需要将加密后的值全部转化为大写(小写),Java中有方法直接调用即可;
接下来说说具体怎么实现:
1.请求数值的拼接(key=value&key=value):
String name = "宋小宝";
String address = "东北";
String panameter = "name="+ name + "& address = "+address;
2.在请求数值的拼接字符串后面加上时间戳和特定值(根据后台要求来)
//获取系统时间戳
Date dt= new Date();
Long timeStamp= dt.getTime();
String signText = panameter +"&time="+timeStamp + "&salt=fangzhou";
3.拼接完成后,对signText进行 urlencode 编码
try { String urlencoderText = URLEncoder.encode(signText,"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }注:这里会抛出一个异常,直接 try 就可以了,这只是一个Java方法直接调用就完毕了
4.然后进行md5加密
//MD5加密
String md5Text = md5(urlencoderText);
md5加密的方法了,网上有,直接c,v就ok了;
如果要对加密后的值,字母全部转化为大写(小写)直接这样:
//MD5加密 String md5Text = md5(urlencoderText).trim().toUpperCase();注:这是转化为大写的方法(小写的方法:直接在字符串后面这样加就可以了
.trim().toLowerCase();
这样就可以了;但是你以为这样就完了? 哥们儿,你想的太简单了;下面才是最坑...的时候,怎么形容了,直接上代码吧!
首先说明一点我用的xutils请求框架(具体怎么用我就不说了,相信大家都会用的-中国的程序猿是最棒的);
//设置请求地址 params = new RequestParams(url); //添加请求参数 params.addBodyParameter("name",name); params.addBodyParameter("address",address); //---添加时间戳--- params.addBodyParameter("time",timeStamp+""); //加密的参数-sign params.addBodyParameter("sign",md5Text );看见没有, 没有进行转码的请求参数,照样去添加,一个都不能少,反而还多了一个时间戳的参数,但是注意我上面加密了salt请求参数,这里没有添加!!在最后面添加了转码加密后的请求参数-sign
而后就用正常的发请求的流程就可以啦,,,就是这样--完美
总之一句话-先拼接-后转码-再加密-再发请求
给自己学到的东西-记录下来,别忘了,有问题可以咨询我,我的邮箱:[email protected];
如果有不对,欢迎骚扰我-我乐意奉陪哟,最好是妹子........
同时分享是美德