JSON文件里的!x19sign!是什么

内容如标题所示,总体分为三个部分:
一、win10下安装openssl,然后通过openssl工具生成RSA的公钥和私钥
(1)win10下安装openssl需要的工具有:VS2013,Perl,nasm,openssl源码
其中,VS2013的安装、注册和激活请自行百度,ActivePerl、nasm和openssl源码也请自行下载安装,ActivePerl好说(执行perl example.pl,若提示:Hello from ActivePerl! 则说明Perl安装成功),nasm我选的是nasm-2.11.02-installer.exe,openssl的部分版本在后面配置的时候会报错,我最后选的是openssl-1.0.2j.tar.gz (SHA256) (PGP sign) (SHA1)。
(2)设置环境变量
打开我的电脑-&属性-&高级系统设置-&环境变量,找到Path系统变量,点击编辑,添加C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\C:/Perl64/C:/c:/windows/system32
我是按默认指示全都放在C盘,可以根据情况自己修改安装路径,安装Perl的时候它会在Path中添加C:/Perl64/site/bin,里面有一个dmake.exe运行文件,这里我把它复制到自己手动添加的C:/Perl64/bin目录下面,除此之外,还要将C:/nasm下面的name.exe和ndisasm.exe拷贝至C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin,设置完环境变量记得重启电脑才能生效。
(3)执行命令
打开Visual Studio的开发人员命令提示(找了半天,原来放在C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts),并进入openssl的目录(我的放在C盘根目录),执行命令perl Configure VC-WIN32 --prefix=C:/openssl & & 注意:这里的prefix是用来指定安装目录。然后运行 ms\do_nasm 来创建Makefile文件,运行 nmake -f ms\ntdll.mak 进行编译生成openssl动态库(如果报错Cannot&open&include&file:&'windows.h',需要先定位到C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin运行 vcvars32.bat 来设置VC命令行编译的环境变量),然后耐心等待。。。接着运行 nmake -f ms/ntdll.mak test 来测试,若显示passed all tests,就可以运行 nmake -f ms\ntdll.mak install 来安装编译后的openssl到之前指定的目录。查看安装结果,即在 C:\openssl 下有三个文件夹bin、lib和include,其中bin目录下包括openssl.exe(openssl指令程序)、ssleay32.dll(ssl协议动态库)、libeay32.dll(密码算法库),lib目录下包括ssleay32.lib,libeay32.lib,include目录则包括了OpenSSL开发设计的头文件。另外,如果之前你已经编译出错了,请先清除:nmake -f ms\ntdll.mak clean。
(4)生成RSA的公钥和私钥
打开bin文件夹下面的openssl.exe,运行 genrsa -out rsa_private_key.pem 1024 在当前目录下生成一个名为rsa_private_key的pem格式文件,用记事本方式打开它,可以看到-----BEGIN RSA PRIVATE KEY-----开头,-----END RSA PRIVATE KEY-----结尾的没有换行的字符串,这个就是原始的私钥;
接着运行 pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt -out PKCS8_rsa_private_key.pem 把刚才的私钥转换成PKCS8格式,转换后的结果可以在命令行中看到,也可以在当前目录下生成的一个名为PKCS8_rsa_private_key的pem格式文件里看到;
最后运行 rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 生成公钥,可以在当前目录下生成的一个名为rsa_public_key的pem格式文件里看到,注意这里依据的是转换之前的原始私钥。
二、前端jsrsa签名
文字看得累,还是直接上代码吧。。。
// 引入非对称加密rsa的前台签名文件(github上有,我下的版本是6.2.2)
import Jsrsasign from "jsrsasign";
// 导入的Jsrsasign模块里面有很多实用的对象,对应不同的方法
console.log(Jsrsasign)
// 引入私钥文件(一般java后台产生密匙对中的私钥是放在pem文件里,可以把里面的内容(字符串格式,带有头和尾,换行用\)取出来放进js文件,然后用module.exports导出来)
import PrivateKey from "privateKey.js";
// 实例化rsa
var rsa=new Jsrsasign.RSAKey();
// 传入私钥
// 默认传入的私钥是PKCS#1的格式,所以采用readPrivateKeyFromPEMString(keyPEM)这个方法
// rsa.readPrivateKeyFromPEMString(PrivateKey);
// 如果后台生产出来的私钥是PKCS#8的格式,就不能用readPrivateKeyFromPEMString(keyPEM)这个方法
rsa=Jsrsasign.KEYUTIL.getKey(key);
// 对要签名的json数据进行排序、拼接成用=和&连接起来的URL的参数形式,参数依次是要排序的json对象、是否倒序(默认为false)
function jsonURLParams(json,reverse){
// 创建一个空数组
var jsonArr = [];
// 往空数组里面导入json对象
for(var i in json){
var obj = {}
obj[i] = json[i];
jsonArr.push(obj);
// 数组长度小于2
或 不是json格式数据
if(jsonArr.length & 2 || typeof jsonArr[0] !== "object") return jsonA
// 数字类型排序
if(typeof getKey(jsonArr[0]) === "number") {
jsonArr.sort(function(x, y) { return getKey(x) - getKey(y)});
// 字符串类型排序
if(typeof getKey(jsonArr[0]) === "string") {
// 按字符编码的顺序来排序
jsonArr.sort(function(x, y) {       var lenX = getKey(x).length,lenY = getKey(y).length,len = (lenX &= lenY) ? lenX : lenY;       for (var i = 0; i & i++) {        if (getKey(x).charCodeAt(i) != getKey(y).charCodeAt(i)) {          return getKey(x).charCodeAt(i) - getKey(y).charCodeAt(i);        }        if (i == len - 1) {         
return getKey(x).length - getKey(y).        }       }     }
if(reverse) {
jsonArr.reverse();
// 创建一个空字符串
var jsonString = "";
for(var i in jsonArr){
if(i & jsonArr.length - 1){
jsonString += getKey(jsonArr[i]) + "=" + jsonArr[i][getKey(jsonArr[i])] + "&"
jsonString += getKey(jsonArr[i]) + "=" + jsonArr[i][getKey(jsonArr[i])]
// 封装函数获取json的key
function getKey(json){
for(var i in json){
return jsonS
var signParams = jsonURLParams(data)
// 选择哪种hash算法(散列生成一个报文摘要,目的是防篡改)
var hashAlg="sha1";
// 进行签名(对生成的报文摘要进行私钥加密,目的是身份验证)
var sign=rsa.signString(signParams,hashAlg);
// 将签名结果转成base64编码格式
sign=Jsrsasign.hex2b64(sign);
// 一般是将签名后的参数放进需要传递的json数据的末尾,对应的字段名为signture
data["signature"]=
三、后端nodejs签名(使用的express框架4.14.0)
(1)先简单地封装了两个函数,记得要先引入JavaScript加密库crypto.js:
// 封装公钥单行字符串转换成PEM编码格式字符串的函数
function keyPem(str, insert_str, sn) {
var newstr = "";
for (var i = 0; i & str. i += sn) {
var tmp = str.substring(i, i + sn);
newstr += tmp + insert_
// 封装验签函数,data是前端传上来的json数据,sign是前端生成的签名字符串,key是验签用的公钥
function verifySign(data,sign,key){
// 注意如果传上来的json数据里包含签名键值对,需要先将其剔除
delete data["signature"];
// 如果前端签名之前对上传数据进行了排序和字符串拼接,那么这里也要作同样操作,即要保持签名和验签的源数据相同,继续调用前面封装好的jsonURLParams函数
var data = jsonURLParams(data);
// 如果sign取的是公钥文件头尾之间的一段字符串,需要先将其拼接回原来的PEM编码格式
// var key = keyPem(key,"\n",64);
// key = '-----BEGIN PUBLIC KEY-----\n' + key + '-----END PUBLIC KEY-----';
console.log("需要验证签名的数据:"+ data);
console.log("进行验证签名的公钥:\n" + key);
// 选择与前端签名相匹配的hash算法
var verifier = crypto.createVerify('RSA-SHA1');
// 防止中文乱码
verifier.update(new Buffer(data, 'utf-8'));
// 输出验签结果,如果前端签名后使用base64编码,这里也要作同样操作
return verifier.verify(key, sign, 'base64');
(2)在需要验签的地方调用上述函数
// 获取上传json数据
var data = req.
// 获取上传json数据中的签名字符串
var sign = data["signature"];
// 获取openssl生成的PEM编码格式的公钥
var key = "-----BEGIN PUBLIC KEY-----\n"+
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAH6/6+YVYA2FmF6H8uBmivR20\n"+
"ZbArDlDj1xG12w52XC47xTHrVp+PRufOUnUG58oNRO1SyD3ViZ6EzUclfVC/e8SS\n"+
"6y6/4wDYAsNke1tWH+M52O7S5ICfiULm6fLULc9rXxbZz6AT1PtD/JdRUKBtAGTx\n"+
"C+sR6OyH2UaqLra3qQIDAQAB\n"+
"-----END PUBLIC KEY-----";
// var key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAH6/6+YVYA2FmF6H8uBmivR20ZbArDlDj1xG12w52XC47xTHrVp+PRufOUnUG58oNRO1SyD3ViZ6EzUclfVC/e8SS6y6/4wDYAsNke1tWH+M52O7S5ICfiULm6fLULc9rXxbZz6AT1PtD/JdRUKBtAGTxC+sR6OyH2UaqLra3qQIDAQAB";
// 将三个参数传入封装好的验签函数
var result = verifySign(data,sign,key);
阅读(...) 评论()JSON 数字类型问题_百度知道
JSON 数字类型问题
这些图片是什么意思??
下面是文档的介绍,但是还是看不明白
8 NumbersA number is represented in base 10 with no superfluous leading zero. It may have a preceding minus sign (U+002D). It may have a . (U+002E) prefixed fractional par...
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
从结构上看,所有的数据(data)最终都可以分解成三种类型:第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如&北京&这个单独的词。第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如&北京,上海&。第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如&首都:北京&。Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。1) 并列的数据之间用逗号(&, &)分隔。2) 映射用冒号(&: &)表示。3) 并列数据的集合(数组)用方括号(&[]&)表示。4) 映射的集合(对象)用大括号(&{}&)表示。
采纳率:92%
来自团队:
为您推荐:
其他类似问题
json的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。做最好的Java WEB 程序员!
json对象load到表单中,这样后台Ajax过来的数据就可以直接加载
废话不多说,直接上代码,javascript的。
function loadJsonDataToForm(jsonStr){
var obj = jsonS
var key,value,tagName,type,
for(x in obj){
value = obj[x];
$("[name='"+key+"'],[name='"+key+"[]']").each(function(){
tagName = $(this)[0].tagN
type = $(this).attr('type');
if(tagName=='INPUT'){
if(type=='radio'){
$(this).attr('checked',$(this).val()==value);
}else if(type=='checkbox'){
arr = value.split(',');
for(var i =0;i&arr.i++){
if($(this).val()==arr[i]){
$(this).attr('checked',true);
$(this).val(value);
}else if(tagName=='SELECT' || tagName=='TEXTAREA'){
$(this).val(value);
}catch(e){
alert("加载表单:"+e.message+",数据内容"+JSON.stringify(jsonStr));
平时我就是Ajax到后台拿数据,拿完之后直接loadJsonDataToForm(obj),相当好用。
使用jQuery将数据快速填充到表单
JQuery加载Json对象到form
jquery form 加载数据
jquery load方法用法详解
easyui form load方法
利用jQuery来动态添加属性 jQuery.ajax
$.post $.load 序列化表单
jquery load方法
jQuery.ajax $.post $.load 序列化表单(ajax提交表单,post传递参数,序列化表单)
easyui datagrid如何加载通过ajax获得的json格式的数据
没有更多推荐了,如何实现基于http的json格式接口
import java.text.ParseE
import java.text.SimpleDateF
import net.sf.json.JSONO
import org.apache.log4j.L
import org.springframework.util.StringU
import com.alibaba.fastjson.JSON;
* 线下报文通用服务类,
* &p&Description: 负责报文的通用服务,包括:输入输出报文(初始化报文和检测接收到的报文);检测报文签名 &/p&
* @date 日
public class OfflinePacketsService {
protected static final Logger logger = Logger.getLogger(OfflinePacketsService.class);
* 解析加密请求报文并验证报文头参数
* @param requestJson
* @return EncryptRequestPackets
* @throws BussinessExceptionNeedCatch
public static EncryptRequestPackets parseEncryptRequestPacketAndValidHead(String requestJson) throws BussinessExceptionNeedCatch {
EncryptRequestPackets encryptRequestPackets = JSON.toJavaObject(JSON.parseObject(requestJson), EncryptRequestPackets.class);
if (null == encryptRequestPackets || null == encryptRequestPackets.getHead() ) {
throw new BussinessExceptionNeedCatch(ErrorCode.PARA_SP_CODE_XML_IS_NULL,
GenerateMonitorDataFactory.buildErrorMonitorData(WarnBussinessTypeEnum.P_OTHER_SERVICE, null));
validRequestParameterHead(encryptRequestPackets.getHead());
return encryptRequestP
/** 验证请求报文头参数
private static void validRequestParameterHead(PacketsHead requestHead) throws BussinessExceptionNeedCatch {
if (requestHead instanceof RequestPacketsHead) {
RequestPacketsHead head = (RequestPacketsHead) requestH
if (StringUtils.isEmpty(head.getSpCode())) {
throw new BussinessExceptionNeedCatch(ErrorCode.PARA_SP_CODE_XML_IS_NULL,
GenerateMonitorDataFactory.buildErrorMonitorData(WarnBussinessTypeEnum.P_OTHER_SERVICE, null));
if (StringUtils.isEmpty(head.getBussinessCode()) || null == resolveBussinessType(head.getBussinessCode())) {
throw new BussinessExceptionNeedCatch(ErrorCode.SYS_UNKNOW_BUSSINESS_CODE,
GenerateMonitorDataFactory.buildErrorMonitorData(WarnBussinessTypeEnum.P_OTHER_SERVICE, null));
if (StringUtils.isEmpty(head.getSigned())) {
throw new BussinessExceptionNeedCatch(ErrorCode.SYS_SIGNED_ERROR,
GenerateMonitorDataFactory.buildErrorMonitorData(WarnBussinessTypeEnum.P_OTHER_SERVICE, null));
if (StringUtils.isEmpty(head.getVersion())) {
throw new BussinessExceptionNeedCatch(ErrorCode.RESULT_SYSTEM_VERSION_ERROR,
GenerateMonitorDataFactory.buildErrorMonitorData(WarnBussinessTypeEnum.P_OTHER_SERVICE, null));
if (StringUtils.isEmpty(head.getTimeStamp())) {
throw new BussinessExceptionNeedCatch(ErrorCode.SYS_TIMESTAMP_IS_NULL,
GenerateMonitorDataFactory.buildErrorMonitorData(WarnBussinessTypeEnum.P_OTHER_SERVICE, null));
throw new BussinessExceptionNeedCatch(ErrorCode.PARA_FORMAT_MISS,
GenerateMonitorDataFactory.buildErrorMonitorData(WarnBussinessTypeEnum.P_OTHER_SERVICE, null));
/** 解析并检验请求报文 **/
public static RequestPackets parseRequestPackets(RequestPacketsHead requestHead, String jsonString,
ScInterfaceDetailVo scInterfaceDetailVo) throws BussinessExceptionNeedCatch {
String decryptBody = OfflinePacketsService.decryptBody(jsonString, scInterfaceDetailVo.getSecretKey());
if (null == decryptBody) {
throw new BussinessExceptionNeedCatch(ErrorCode.SYS_SECRET_KEY_ERROR,
GenerateMonitorDataFactory.buildErrorMonitorData(
WarnBussinessTypeEnum.OTM_SALE_REFUND_SETTLEMENT,
"解密失败,body[" + jsonString + "]"));
BussinessEnum bussinessEnum =
bussinessEnum = BussinessEnum.parseBussinessCodeToEnum(requestHead.getBussinessCode());
} catch (ComponentExceptionNeedConvert e) {
throw new BussinessExceptionNeedCatch(e.getErrorCode(),
GenerateMonitorDataFactory.buildBussinessMonitorData(WarnBussinessTypeEnum.BASE_PACKAET_PARSED,
requestHead.getSpCode(), null, requestHead.toString(), e.getMessage()));
RequestPacketsBody reqBody =
switch (bussinessEnum) {
case SALE_REFUND_SETTLEMENT:
reqBody = JSON.toJavaObject(JSON.parseObject(decryptBody), RequestSaleAggregatePacketsBody.class);
case USED_RATE_REPORT:
reqBody = JSON.toJavaObject(JSON.parseObject(decryptBody), RequestUsedRateAggregatePacketsBody.class);
case USED_DAY_REPORT:
reqBody = JSON.toJavaObject(JSON.parseObject(decryptBody), RequestUsedDayAggregatePacketsBody.class);
case OFFLINE_EXCHANGE_TICKET:
reqBody = JSON.toJavaObject(JSON.parseObject(decryptBody), RequestOfflineExchangeTicketBody.class);
case OFFLINE_UPDATE_APPLY_ORDER:
reqBody = JSON.toJavaObject(JSON.parseObject(decryptBody), RequestOfflineUpdateApplyOrderBody.class);
case QUERY_APPLY_ORDER:
reqBody = JSON.toJavaObject(JSON.parseObject(decryptBody), RequestQueryApplyOrderBody.class);
case OFFLINE_UPDATE_GOODS:
reqBody = JSON.toJavaObject(JSON.parseObject(decryptBody), RequestOfflineUpdateGoodsBody.class);
throw new BussinessExceptionNeedCatch(ErrorCode.SYS_UNKNOW_BUSSINESS_CODE,
GenerateMonitorDataFactory.buildBussinessMonitorData(WarnBussinessTypeEnum.BASE_PACKAET_PARSED,
requestHead.getSpCode(), null, requestHead.toString(), "解析请求参数体失败"));
RequestPackets requestPackets = new RequestPackets();
requestPackets.setHead(requestHead);
requestPackets.setBody(reqBody);
logger.debug("解密收到的request:" + requestPackets.toJSON());
return requestP
* 方法用途: 组装消息体消息头&br&
* 实现步骤: &br&
* @param requestPackets
* @param responseBody
* @param statucCode
* @param responsePacket
* @throws ComponentExceptionNeedConvert
public static ResponsePackets generateReturnPackets(RequestPackets requestPackets, ResponsePacketsBody responseBody,
IErrorCodeInterface statucCode) throws BussinessExceptionNeedCatch {
ResponsePackets responsePacket = new ResponsePackets();
ResponsePacketsHead responseHead = new ResponsePacketsHead();
String spCode =
String reqBodyJson =
responseHead.setStatusCode(statucCode.getCode());
responseHead.setMessage(statucCode.getMessage());
reqBodyJson = requestPackets.toJSON();
RequestPacketsHead requestHead = (RequestPacketsHead)requestPackets.getHead();
responseHead.setVersion(requestHead.getVersion());
responseHead.setTimeStamp(requestHead.getTimeStamp());
spCode = requestHead.getSpCode();
responsePacket.setHead(responseHead);
responsePacket.setBody(responseBody);
responseHead.setSigned(OfflinePacketsService.generateSigned(responsePacket));
} catch (ComponentExceptionNeedConvert e) {
throw new BussinessExceptionNeedCatch(e.getErrorCode(),
GenerateMonitorDataFactory.buildBussinessMonitorData(
WarnBussinessTypeEnum.BASE_PACKAET_PARSED, spCode, null, reqBodyJson,
e.getMessage()));
} catch (Exception e) {
throw new BussinessExceptionNeedCatch(ErrorCode.PARA_ERROR,
GenerateMonitorDataFactory.buildBussinessMonitorData(
WarnBussinessTypeEnum.BASE_PACKAET_PARSED, spCode, null, reqBodyJson,
e.getMessage()));
return responseP
* 生成加密的报文&br&
* 根据 respons报文做判断,如果该报文异常,则创建携带错误信息的new response
* @param requestPackets
* @param responsePacket
* @param resultEx
* @param scInterfaceDetailVo
* @throws BussinessExceptionNeedCatch
public static String generateEncryptResponsePackets(RequestPackets requestPackets, ResponsePackets responsePacket,
IErrorCodeInterface statucCode, String spCode, ScInterfaceDetailVo scInterfaceDetailVo ) throws BussinessExceptionNeedCatch {
String strBodyJson =
if (null == responsePacket || null == responsePacket.getHead()
|| StringUtils.isEmpty(((ResponsePacketsHead)responsePacket.getHead()).getStatusCode())){
RequestPacketsHead requestHead = (RequestPacketsHead)requestPackets.getHead();
if (responsePacket == null) responsePacket = new ResponsePackets();
ResponsePacketsHead responseHead = new ResponsePacketsHead();
responseHead.setStatusCode(statucCode.getCode());
responseHead.setMessage(statucCode.getMessage());
responseHead.setVersion(requestHead.getVersion());
responseHead.setTimeStamp(requestHead.getTimeStamp());
responsePacket.setHead(responseHead);
responsePacket.setBody(null);
responseHead.setSigned(generateSigned(responsePacket));
} catch (ComponentExceptionNeedConvert e) {
throw new BussinessExceptionNeedCatch(e.getErrorCode(),
GenerateMonitorDataFactory.buildBussinessMonitorData(
WarnBussinessTypeEnum.BASE_PACKAET_PARSED, requestPackets.getHead().getSpCode(), null, "签名错误",
e.getMessage()));
logger.debug("待加密的 responsePacket:" + responsePacket.toJSON());
//如果未取得sp,则无法加密,只能放弃加密
if(scInterfaceDetailVo!=null ){
EncryptResponsePackets encryptResponsePackets = new EncryptResponsePackets();
//加密报文返回
encryptResponsePackets.setHead((ResponsePacketsHead) responsePacket.getHead());
String secretKey = (scInterfaceDetailVo!=null ? scInterfaceDetailVo.getSecretKey():null);
String encryptBody = encryptBody(strBodyJson, secretKey
encryptResponsePackets.setBody(encryptBody);
return encryptResponsePackets.toJSON();
//无法签名
throw new BussinessExceptionNeedCatch(ErrorCode.PARA_SP_CODE_IS_ERROR,
GenerateMonitorDataFactory.buildBussinessMonitorData(
WarnBussinessTypeEnum.BASE_PACKAET_PARSED, spCode, null, null,
"找不到业务运营商(" + spCode
* 生成报文签名
* @throws ComponentExceptionNeedConvert
public static String generateSigned(JsonFormatPackets packets) throws ComponentExceptionNeedConvert {
if (null == packets) {
throw new ComponentExceptionNeedConvert(ErrorCode.PARA_FORMAT_MISS, "Request format error! packets is null:"
+ packets);
if (packets instanceof RequestPackets) {
RequestPackets reqPackets =(RequestPackets)
RequestPacketsHead curHead = (RequestPacketsHead) reqPackets.getHead();
String strBody = reqPackets.getBody() == null ? "" : reqPackets.getBody().toJSON();
return Base64.encode(Md5.encode(curHead.getVersion() + curHead.getTimeStamp() + curHead.getSpCode()
+ curHead.getBussinessCode() + strBody.length()));
} else if (packets instanceof ResponsePackets) {
ResponsePackets respPackets =(ResponsePackets)
ResponsePacketsHead curHead = (ResponsePacketsHead) respPackets.getHead();
String strBody = respPackets.getBody() == null ? "" : respPackets.getBody().toJSON();
return Base64.encode(Md5.encode(curHead.getVersion() + curHead.getTimeStamp() + curHead.getStatusCode()
+ strBody.length()));
throw new ComponentExceptionNeedConvert(ErrorCode.PARA_FORMAT_MISS, "Packets format error! packets:"
+ packets);
* 验证签名
* @param packets 待验证的报文
* @throws ComponentExceptionNeedConvert
public static void validateSinged(JsonFormatPackets packets) throws ComponentExceptionNeedConvert {
String sign = generateSigned(packets);
String packetsS
if (packets instanceof RequestPackets) {
RequestPackets reqPackets =(RequestPackets)
RequestPacketsHead curHead = (RequestPacketsHead) reqPackets.getHead();
packetsSign = curHead.getSigned();
} else if (packets instanceof ResponsePackets) {
ResponsePackets respPackets =(ResponsePackets)
ResponsePacketsHead curHead = (ResponsePacketsHead) respPackets.getHead();
packetsSign = curHead.getSigned();
throw new ComponentExceptionNeedConvert(ErrorCode.PARA_FORMAT_MISS, "Packets format error! packets:"
+ packets);
if (!sign.equals(packetsSign)) {
throw new ComponentExceptionNeedConvert(ErrorCode.SYS_SIGNED_ERROR, "request sign is: "
+ packetsSign + ",
but body make sign is :
" + sign);
* 解密报文
* @param encodeBody
* @param secretKey
public static String decryptBody(String encodeBody, String secretKey) {
return DesSecret.decrypt(Base64.decode(encodeBody), secretKey);
/** 加密报文 **/
public static String encryptBody(String body, String secretKey) {
return Base64.encode(DesSecret.encrypt(body, secretKey));
private static BussinessEnum resolveBussinessType(String bussinessCode) {
BussinessEnum bussinessTypeCode =
if (null != bussinessCode && null != BussinessEnum.valueOf(bussinessCode) ){
bussinessTypeCode =
BussinessEnum.valueOf(bussinessCode);
}catch(IllegalArgumentException e1){
logger.error("can't get bussnisee type! BussinessEnum=" + bussinessCode);
return bussinessTypeC
http+json 格式的接口开发实践与思考
对接第三方接口--使用post请求发送json数据
常见的JSON格式服务接口
http发送json格式数据请求 demo示例
服务器接口json格式的数据协议
各种常用的JSON接口,值得收藏
APP接口, 图片json格式
http传输json进行服务端接口与客户端对接,以及restful实现
没有更多推荐了,

我要回帖

更多关于 noainx19 的文章

 

随机推荐