先上代码:
public static string acceptSalesOrder(Dictionary<string, object> dicpostData)
{
string jsontoken =XT.Utility.EncryptObject.UnicodeToGB(JSONHelper.ToJson(dicpostData));
string md5token = XT.Utility.EncryptObject.GetMD5(token + jsontoken);
string jsontokenj = jsontoken.Replace("+", "%2B");
string postData = "&token=" + md5token + "&postData=" + jsontokenj;
string strUrl = "acceptSalesOrder.pub";
string htmlUrl = string.Format("{0}{1}", url, strUrl);
return Web_Request.POST_WebRequestHTML(encodingName, htmlUrl, postData);
}
上面是一段post方式推送数据的代码。
安全验证方式是:ip白名单+token值验证
token值获取方式:顺丰接口给的一个固定值key+json数据,把这个值进行MD5加密,这样实现了token的动态变化(有利于安全)以下为jsontoken数据:
{
"infoOrderCode": "201812211631487272",
"orderCode": "S201901021645",
"serviceCode": "201901021645",
"serviceType": "维保",
"serviceRemark": "滤芯+漏斗",
"serviceCharge": "50",
"serviceRebate": "10",
"partsCharge": "990",
"totalPrice": "1030",
"serviceUser": "王志贤",
"serviceUserMobile": "13617004599",
"imageUrl": "",
"status": "0",
"product": [{
"productCode": "1300245",
"productName": "",
"serialNum": "LS/3776691",
"uniqueness": "20190107121906923_3776691",
"detail": [{
"partsCode": "1000002",
"partsName": "净水超滤机LH3",
"partsPrice": "990",
"partsCount": "1"
}]
}]
}
客户端调用接口:
1、用一个固定token值+这段json数据 进行MD5加密,这样就能得到动态token值
2、用token值+上面的json数据就得到需要推送的数据 postData:
&token=EFE0091197FA99424D9CE3695048CC5A&postData={"infoOrderCode":"201812211631487272","orderCode":"S201901021645","serviceCode":"201901021645","serviceType":"维保","serviceRemark":"滤芯%2B漏斗","serviceCharge":"50","serviceRebate":"10","partsCharge":"990","totalPrice":"1030","serviceUser":"王志贤","serviceUserMobile":"13617004599","imageUrl":"","status":"0","product":[{"productCode":"1300245","productName":"","serialNum":"LS/3776691","uniqueness":"20190107121906923_3776691","detail":[{"partsCode":"1000002","partsName":"净水超滤机LH3","partsPrice":"990","partsCount":"1"}]}]}
服务端接收数据:
1、获取到postData数据 取出其中客户端传过来的token值
2、取出postData参数值,通过postData参数值加上给客户端的固定token值进行MD5加密 得到服务端的token值
3、跟客户端传过来的token值匹配(以此来验证身份)
这其中就有一个问题:如上图 我在serviceRemark中传输了一个“+” ,两边分别解析能匹配上,但是通过http传输协议传输就会使“+”变成空格,这样就导致两边生成token值不一样,造成token值不匹配的情况。
解决方法:客户端生成token时不用直接对原数据进行MD5加密,但是传输postData给服务端(即接口端)把“+” 用 "%2B" 代替。这样传过去客户端和接口端MD5的postData数据对象就能保持一致,于是就解决了token不匹配(即http 传输“+” 乱码的)的问题