Appearance
签名规则
请求数据样例
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"
}
签名规则说明
- 将请求的数据按照键名进行升序排序。
- 过滤掉不需要参与签名的参数
sign
。 - 将参与签名的参数用&符号进行字符串拼接,例如
app_key=64a6285f23c5a&customer_order_no=16897367282&product_code=JDE
。 - 拼接完的字符串再和商户的app_secret进行拼接,拼接完成之后整体进行md5处理,最后将md5的结果进行小写转换即可。
- 请求参数拼接字符串
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
}