当前位置: API文档
Java语言示例:
/**
* 慧经营签名工具类
*/
@Slf4j
public class HjySignUtil {
private static String slipt = ":";
private static String link = "&";
/**
* 校验sign param生成sign与remoteSign进行比较
*
* @param params 需要校验的数据
* @param appKey 安全key
* @param remoteSign 校验的sign
* @return
*/
public static boolean checkSign(Map<String, Object> params, String appKey, String remoteSign) {
try {
params.remove("sign");
params.remove("hjySign");
String localSign = sign(params, appKey);
log.info("根据远程调用的请求参数生成的签名:{}", localSign);
if (localSign.equals(remoteSign)) {
return true;
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 获取签名-慧经营开发平台
*
* @param params
* @param appKey
* @return
* @throws IOException
*/
public static String sign(Map<String, Object> params, String appKey) throws IOException {
StringBuilder sb = new StringBuilder(getParamStrFromMap(params));
sb.append(appKey);
String sbStr = sb.toString().replace("\"", "");
sbStr = sbStr.replace(" ", "");
String md5 = md5Hex(sbStr);
log.info("带验签的参数 sbT:{}", sbStr);
return md5.toLowerCase();
}
public static String md5Hex(String message) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
return hex(md.digest(message.getBytes("UTF-8")));
} catch (NoSuchAlgorithmException var2) {
} catch (UnsupportedEncodingException var3) {
}
return null;
}
public static String hex(byte[] array) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString(array[i] & 255 | 256).substring(1, 3));
}
return sb.toString();
}
private static String getParamStrFromMap(Map<String, Object> params) {
StringBuilder sb = new StringBuilder();
if (params != null && !params.isEmpty()) {
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
for (int i = 0; i < keys.length; ++i) {
String name = keys[i];
sb.append(name);
sb.append(slipt);
sb.append(params.get(name));
sb.append(link);
}
}
String substring = sb.substring(0, sb.length() - 1);
return substring;
}
//测试验证签名
public static void main(String[] args) throws IOException {
Map<String, Object> map = new HashMap<>();
map.put("businessDate", "2023-11-02");
map.put("voucherNo", "SalVchRv289697553763745510");
map.put("shopNo", "0100001180");
map.put("warehouseNo", "BC");
map.put("appId", "fa330697b64a49a9a4f6fe6b7fef57a7");
map.put("sid", "hjytest41");
String sign = sign(map, "869eae0c3c39e13dc8bb6d78d910fc1a64cb7ac6");
System.out.println(sign);
boolean flag = checkSign(map, "869eae0c3c39e13dc8bb6d78d910fc1a64cb7ac6", sign);
if (!flag) {
System.out.println("shibai");
} else {
System.out.println("chenggong");
}
}
}
Python语言示例:
import hashlib
import logging
from collections import OrderedDict
# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 定义常量
SPLIT = ":"
LINK = "&"
def check_sign(params: dict, app_key: str, remote_sign: str) -> bool:
"""
校验签名是否一致
:param params: 请求参数
:param app_key: 应用密钥
:param remote_sign: 远程签名
:return: 是否一致
"""
params.pop("sign", None)
params.pop("hjySign", None)
try:
local_sign = sign(params, app_key)
logger.info(f"根据远程调用的请求参数生成的签名:{local_sign}")
return local_sign == remote_sign
except Exception as e:
logger.error(f"签名校验异常:{e}")
return False
def sign(params: dict, app_key: str) -> str:
"""
生成签名
:param params: 参数字典
:param app_key: 应用密钥
:return: MD5 签名
"""
param_str = get_param_str_from_map(params)
param_str += app_key
param_str = param_str.replace('"', "").replace(" ", "")
logger.info(f"带验签的参数:{param_str}")
return md5_hex(param_str).lower()
def md5_hex(message: str) -> str:
"""
计算字符串的 MD5 值
:param message: 输入字符串
:return: MD5 字符串
"""
md = hashlib.md5()
md.update(message.encode("utf-8"))
return md.hexdigest()
def get_param_str_from_map(params: dict) -> str:
"""
将参数字典转换为签名字符串
:param params: 参数字典
:return: 签名字符串
"""
if not params:
return ""
# 按 key 排序
sorted_params = OrderedDict(sorted(params.items()))
result = ""
for key, value in sorted_params.items():
result += f"{key}{SPLIT}{value}{LINK}"
return result[:-1] # 去掉最后一个 &
if __name__ == "__main__":
test_params = {
"businessDate": "2023-11-02",
"voucherNo": "SalVchRv289697553763745510",
"shopNo": "0100001180",
"warehouseNo": "BC",
"appId": "fa330697b64a49a9a4f6fe6b7fef57a7",
"sid": "hjytest41",
}
app_key = "869eae0c3c39e13dc8bb6d78d910fc1a64cb7ac6"
signature = sign(test_params, app_key)
print(f"生成的签名:{signature}")
is_valid = check_sign(test_params, app_key, signature)
print("验证结果:chenggong" if is_valid else "shibai")
C#语言示例:
private static string getParamStrFromMap(Dictionary<string, object> paramsDict)
{
var sb = new System.Text.StringBuilder();
if (paramsDict != null && paramsDict.Count > 0)
{
var keys = paramsDict.Keys.ToArray();
Array.Sort(keys);
foreach (var name in keys)
{
sb.Append(name);
sb.Append(slipt); // 注意: 这里的 slipt 和 link 变量需要定义
sb.Append(paramsDict[name]);
sb.Append(link);
}
}
string result = sb.ToString(0, sb.Length - 1);
return result;
}
public static string Hex(byte[] array)
{
var sb = new StringBuilder();
for (int i = 0; i < array.Length; ++i)
{
sb.Append(((array[i] & 255) | 256).ToString("X2").Substring(1, 2));
}
return sb.ToString();
}
public static string Md5Hex(string message)
{
try
{
using (MD5 md5 = MD5.Create())
{
byte[] inputBytes = Encoding.UTF8.GetBytes(message);
byte[] hashBytes = md5.ComputeHash(inputBytes);
return Hex(hashBytes);
}
}
catch (CryptographicException)
{
// 处理加密算法异常
}
catch (EncoderFallbackException)
{
// 处理编码异常
}
return null;
}
public static string Sign(Dictionary<string, object> paramsDict, string appKey)
{
try
{
StringBuilder sb = new StringBuilder(getParamStrFromMap(paramsDict));
sb.Append(appKey);
string sbStr = sb.ToString().Replace("\"", "").Replace(" ", "");
string md5 = Md5Hex(sbStr);
Logger.LogInformation("带验签的参数 sbT:{0}", sbStr);
return md5.ToLower();
}
catch (IOException ex)
{
Logger.LogError(ex, "发生 IO 异常");
throw;
}
}