Sign
Last updated
Last updated
Refer to the demo on GitHub.
Extract all keys and sort them
Stitching key-value pair string
Use Md5 encryption
const crypto = require('crypto');
function sign(data, secret) {
// Extract all keys and sort them
const keys = Object.keys(data).sort();
// Stitching key-value pair string
const keyValueStrings = keys
.filter(key => key !== 'sign') // Exclude the sign key
.map(key => `${key}=${data[key]}`);
const result = keyValueStrings.join('&') + '&' + secret;
// Use md5 encryption
const hash = crypto.createHash('md5');
hash.update(result);
return hash.digest('hex');
}
// test
let tmp = Date.now()
const data = {
"file_base64": "Your base64 string contains data:image/png;base64",
"timestamp": "xxx",
"merchant_no": xxx,
"mode": "nude",
"notify_url": "string"
};
const secret = 'Your secret';
console.log(tmp,sign(data, secret));
import hashlib
from time import time
def sign(data, secret):
# Extract all keys and sort them
keys = sorted(data.keys())
# Concatenate key-value pair strings
keyValueStrings = [f"{key}={data[key]}" for key in keys if key != 'sign']
result = '&'.join(keyValueStrings) + '&' + secret
# Encrypt using md5
md5 = hashlib.md5()
md5.update(result.encode('utf-8'))
return md5.hexdigest()
# 测试
timestamp = int(time() * 1000)
data = {
"file_base64": "Your base64 string contains data:image/png;base64",
"timestamp": timestamp,
"merchant_no": xxx,
"mode": "nude",
"notify_url": "string"
}
secret = 'Your secret'
print(timestamp, sign(data, secret))
package main
import (
"crypto/md5"
"encoding/hex"
"sort"
"strings"
)
func sign(data map[string]string, secret string) string {
keys := make([]string, 0, len(data))
for key := range data {
keys = append(keys, key)
}
sort.Strings(keys)
var keyValueStrings []string
for _, key := range keys {
if key != "sign" {
keyValueStrings = append(keyValueStrings, key+"="+data[key])
}
}
result := strings.Join(keyValueStrings, "&") + "&" + secret
hash := md5.New()
hash.Write([]byte(result))
return hex.EncodeToString(hash.Sum(nil))
}
func main() {
timestamp := "timestamp"
data := map[string]string{
"file_base64": "Your base64 string contains data:image/png;base64",
"timestamp": timestamp,
"merchant_no": xxx,
"mode": "nude",
"notify_url": "string"
}
secret := "your_sercret"
println(timestamp, sign(data, secret))
}
<?php
function sign($data, $secret) {
// Extract all keys and sort them
$keys = array_keys($data);
sort($keys);
// Concatenate key-value pair strings
$keyValueStrings = [];
foreach ($keys as $key) {
if ($key !== 'sign') {
$keyValueStrings[] = $key . '=' . $data[$key];
}
}
$result = implode('&', $keyValueStrings) . '&' . $secret;
// Encrypt using md5
return md5($result);
}
// 测试
$tmp = time() * 1000;
$data = [
"file_base64": "Your base64 string contains data:image/png;base64",
"timestamp": $tmp,
"merchant_no": xxx,
"mode": "nude",
"notify_url": "string"
];
$secret = 'Your secret';
echo $tmp, ' ', sign($data, $secret);
?>
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Map;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
long tmp = System.currentTimeMillis();
Map<String, String> data = new TreeMap<>();
data.put("timestamp", String.valueOf(tmp));
data.put("file_base64", "Your file_base64 str contains data:image/png;base64");
data.put("merchant_no", "Your merchant_no");
data.put("mode", "nude");
data.put("notify_url", "Your notify_url");
String secret = "Your secret";
System.out.println(tmp + " " + sign(data, secret));
}
public static String sign(Map<String, String> data, String secret) {
// Extract all keys and sort them
String[] keys = data.keySet().toArray(new String[0]);
Arrays.sort(keys);
// Concatenate key-value pair strings
StringBuilder result = new StringBuilder();
for (String key : keys) {
if (!key.equals("sign")) {
result.append(key).append("=").append(data.get(key)).append("&");
}
}
result.append(secret);
// Encrypt using md5
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(result.toString().getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
}