Skip to content
On this page

签名规则

请求数据样例

app_key:64a6285f23c5a
app_secret:MWh9Ij31oOWpiy2X

以下请求数据是通过该信息生成签名

json
{
	"app_key": "64a6285f23c5a",
	"customer_order_no": 1689736728,
	"product_code": "JDE",
	"card_secret": "i3uvtimoV\/8\/wc+ADBe1ceFjkQTBxcbW",
	"cookie": "GdhyHXsb6dxQsb0UVZgKoBRzWWSoKF4tqczq8PVdmtsnp\/rhqU8kBSQPCmGCxp2CK0IjzHBk6fTONMsAznbmtFFRT6FXrqnw1KYkxiTcvb83WPo17C6JtCs+ZIoJPAK50yRm71nBEDrQXVxpVStwo7vFgunAwyNkYgC\/QyQohBoewfZ8x4xoJn5Ok\/uXQHdAvyJO8\/1WIxFuQZXpknwNGdvPmZdn5rLGZCRDTEjyK58tUIqmpUZXRS6pq3Y95bucJdxF6YaQXY6Kes\/WKDdZPJUG8O8i7Molf4FwVln+Qen\/EdrkjNYsHbuYJyr3Omkjn65TH3\/R+qEcbRGYDmU5hLC7rhG7ELadB4+\/6S9dQV5JG0XzL4IRX1xzQohC8c\/UCYazJY+MyGsR5mfp42ftdpIa\/Cm7AUgFWd1PyaQvvCq3IJKHERt0+iEr\/77L5CvGIKnwdR1yuGXsoncSfB4VKblfsGi+CcGfzMfAYe1ko3jLh6DGOtdje9elJ8kln+e97l2eKuS4IvgdhII2dasyGlqP42iSHkMv7l2eKuS4IvgJRofJsbh2kR0guvuKIcNkO0X3cJpDoDlV11KRzD7N0irxFMoCApI0+8rMP8Rv4DziwjNdyl2rEhe2UZcjqIgP\/uF3qhl2aWwp3RWxelB9qUF4iZLBAFhdDNKvnpEBT6rGjZcP168jYl\/YZcT0+\/UeNJlErj5C5ulqFCwZk3twz3D8d3BiMFxvOn46EuKjZZ7evXCgyowZdwW7LZgTr17aKq0e\/HkemwQV3cIz9csd31b+wADP1Uxe7Fl+SlXvSMM2wATLn7vE6t7jVkuDyMeaE+KEK314V+cf80rqdG2r+VZ18TBQVS5K32Pdb9RNHuVLBKzMWMkQeElUQ0FnrOrQn6ZuDj4SRmTPK51\/PYlg7hai84nxVZvt3Eg93BT3qd8SEI+mkwrvsqhOsBgj7bKceUUA3EOFmhu77GMbc3ICq4QdDqQqZehEamze8Ro55CfyEES5Rm6O8diFs55mXKTfxCsECVz88CjxC6Tg9G0T8pbAbwDOIrYVfRDg0gr2f3YTnUuUtOibKjuxi3PDqC4NKF30uHVJRllM38ZG1kMYIAA39+lU0lMV1hKCsPSqmgNuqRR6sdrCnaB9qvBsAXAFW\/LN\/hkZcp7hG6gXm+B4bCkaVWKeMHiqlMEecRhuEncNJTKvvcygjOL5qWPlRzvas5vXlYsMvwnN1jYyq9WgXQqjEtapP+PtlGkKZ\/wru+UkaadlDP1bZIGOq1NgtJSjH9EC+vVNot1kNRt580bckWVYcfB17JnVo6Xxon0sXUdjUhhdqcJY5qFAEoSqyNs4RExtjwzFG2ylw0Lp\/565+ZaRKzDO1G2bgHcrpjVpczHcgCJEOuCxXBd6fcrCCP12flt14PJ8zgnOgkPBLXmqeZ8FCF4223WbTWyscc2q4bWnrxhpMm4u+AEneVRSrY+kUJGQ5uqpi\/GHgG48404+AbjBmiPq3I0SX4FRtyfFewj6QSBEfhvOEN\/qA4Vu4lPv89va+no+AXnDe1edyXDIYFvM+xdX\/2Gncbn7051fOhkYxno0XhYg\/PCNjz0EzQu4LJua\/kkqTczrxsTzRFYSSKUJaUSd\/7s6zYKo4iioXoOHutAIKAt+puep3xEU5AnXyaN7v+4vgPieUcrVwuw1CE4cO1rduckflqenkqMjSb\/Y8uZWprNULSDj6nydoU0yO2mq88RNh05oNz2l9gmTjZAQMswvNhgeGycsJSq6jcRWYbLFpNXY\/ykJc7\/NsE\/+FYfbeLYHPYPdYX1FEgL9k9HDJ91+jyp9zWqrbor3+lgcLGK3BiTmtYmnvR13eYw7kNv9nZ2zmONDclwKtbCa81myN2+bXV3fFm2ZLuYgINM5JRrT\/+XrbmxTuGNdDUHA6u5BDEdqkaS5PEaDTlYLBd6+Y3BkzhhK",
	"cookie_type": 1,
	"notify_url": "https:\/\/www.ebangka.com\/test\/notify",
	"timestamp": 1689736728,
	"sign": "bae559eb0168c3c04686a0d3a7ecd6da"
}

签名规则说明

  1. 将请求的数据按照键名进行升序排序。
  2. 过滤掉不需要参与签名的参数sign
  3. 将参与签名的参数用&符号进行字符串拼接,例如app_key=64a6285f23c5a&customer_order_no=16897367282&product_code=JDE
  4. 拼接完的字符串再和商户的app_secret进行拼接,拼接完成之后整体进行md5处理,最后将md5的结果进行小写转换即可。
  5. 请求参数拼接字符串app_key=64a6285f23c5a&customer_order_no=16897367282&product_code=JDE,拼接app_secret(MWh9Ij31oOWpiy2X) 得到字符串 app_key=64a6285f23c5a&customer_order_no=16897367282&product_code=JDEMWh9Ij31oOWpiy2X 最后md5得到签名字符串 0b546e9d979cd290172804157b2a59a7

PHP版本签名示例代码

php
<?php

function get_sign($params,$app_secret)
{
    ksort($params);
    $signItemList = [];
    foreach ($params as $key => $value){
        $signItemList []= "{$key}={$value}";
    }
    return md5(implode("&",$signItemList).$app_secret);
}

$postData = [
    'app_key'=> '64a6285f23c5a',
    'customer_order_no'=>'16897367282',
    'product_code' => 'JDE',
];

$appsecret = 'MWh9Ij31oOWpiy2X';
echo get_sign($postData,$appsecret)

java版本签名示例代码

java
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.math.BigInteger;
import java.security.MessageDigest;


public class MakeSign {
	public static void main(String[] args) {
		String appKey    = "64a6285f23c5a";
        String appSecret = "MWh9Ij31oOWpiy2X";
        Map<String, Object> params = new HashMap<>();
        params.put("app_key", appKey);
        params.put("product_code", "JDE");
        params.put("customer_order_no", "16897367282");
        String sign = generateSign(params,appSecret);
        //输出签名 0b546e9d979cd290172804157b2a59a7
        System.out.println(sign);
        
	}
	
    /**
     * 对请求参数进行处理,生成签名
     * @param params 请求参数
     * @return 签名值
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     */
    public static String generateSign(Map<String, Object> params, String AppSecret){
        StringBuilder sb = new StringBuilder();
        List<String> keys = new ArrayList<>(params.keySet());
        Collections.sort(keys);
        for (String key : keys) {
            Object value = params.get(key);
            sb.append(key).append("=").append(value.toString()).append("&");
        }
        String signString = sb.substring(0, sb.length()-1).toString().concat(AppSecret);
        //输出签名字符串 app_key=64a6285f23c5a&customer_order_no=16897367282&product_code=JDEMWh9Ij31oOWpiy2X
        String sign = getMD5(signString);
        return sign;
    }

    /**
     * 
     * @param plainText 原始字符串
     * @return md5加密字符串
     */
    public static String getMD5(String plainText) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(plainText.getBytes());
            byte[] byteArray = md5.digest();
            BigInteger bigInt = new BigInteger(1, byteArray);
            String result = bigInt.toString(16);
            while(result.length() < 32) {
                result = "0" + result;
            }
            return result;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }
}

golang版本签名示例代码

go
package main

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"sort"
)

func main() {
	params := make(map[string]string)
	params["app_key"] = "64a6285f23c5a"
	params["product_code"] = "JDE"
	params["customer_order_no"] = "16897367282"
	//加密秘钥
	appSecret := "MWh9Ij31oOWpiy2X"
	sign := getSign(params, appSecret)
	fmt.Printf("sign is: %s\n", sign)
}

func getSign(params map[string]string, appSecret string) string {
	var dataParams string
	//ksort
	var keys []string
	for k := range params {
		keys = append(keys, k)
	}
	sort.Strings(keys)

	//拼接
	for _, k := range keys {
		fmt.Println("key:", k, "Value:", params[k])
		dataParams = dataParams + k + "=" + params[k] + "&"
	}
	//去掉最后一个&符拼接appSecret 输出 app_key=64a6285f23c5a&customer_order_no=16897367282&product_code=JDEMWh9Ij31oOWpiy2X
	signString := dataParams[0:len(dataParams)-1] + appSecret
	fmt.Println("sign string:" + signString)
	//md5加密
	d := []byte(signString)
	m := md5.New()
	m.Write(d)
	sign := hex.EncodeToString(m.Sum(nil))
	return sign
}