仅限测试使用
{
"app_key":"i4esv1l+76l/7NQCL3QudG90Fq+YgVfFGJAWgT+7qO1Bm9o/adG/1iwO2qXsAXNB",
"method":"fulu.order.direct.add",
"timestamp":"2019-12-30 14:23:06",
"version":"2.0",
"format":"json",
"charset":"utf-8",
"sign_type":"md5",
"sign":"d2ca1003c1852e1846c9466adec18b68",
"app_auth_token":"",
"biz_content":"{\"customer_order_no\":\"20191230142306472\",\"product_id\":10000585,\"buy_num\":1,\"charge_account\":\"888888\",\"charge_ip\":\"\",\"charge_password\":\"\",\"charge_game_name\":\"\",\"charge_game_role\":\"\",\"charge_game_region\":\"\",\"charge_game_srv\":\"\",\"charge_type\":\"\",\"contact_tel\":\"\",\"contact_qq\":\"\"}"
}
1)将除sign参数之外的所有参数包装成Dictionary<string,string>字典;(接口响应的签名直接使用result的内容从第3步操作开始)
2)将Dictionary<string,string>字典进行Json序列化;
3)将Json字符串转化为字符数组charObjectArray,然后将charObjectArray进行Array.Sort()排序;
4)将排序后的charObjectArray转化为字符串string,然后在string后直接拼接应用密钥;
5)将第4步拼接了应用密钥的字符串进行md5(注意:待md5字符串最前面有个空格),最后将得到的值转化为小写字符串即得到sign签名值;
6)注意:退款回调签名时,order_money和refund_money需先转字符串再签名;
在线Md5参照地址:http://tool.chinaz.com/tools/md5.aspx
1)将除sign参数之外的所有参数包装成Dictionary<string,string>字典;
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("app_key", "i4esv1l+76l/7NQCL3QudG90Fq+YgVfFGJAWgT+7qO1Bm9o/adG/1iwO2qXsAXNB");
dictionary.Add("method", "fulu.order.direct.add");
dictionary.Add("timestamp", "2019-12-30 14:23:06");
dictionary.Add("version", "2.0");
dictionary.Add("format", "json");
dictionary.Add("charset", "utf-8");
dictionary.Add("sign_type", "md5");
dictionary.Add("app_auth_token", "");
dictionary.Add("biz_content", "{\"customer_order_no\":\"20191230142306472\",\"product_id\":10000585,\"buy_num\":1,\"charge_account\":\"888888\",\"charge_ip\":\"\",\"charge_password\":\"\",\"charge_game_name\":\"\",\"charge_game_role\":\"\",\"charge_game_region\":\"\",\"charge_game_srv\":\"\",\"charge_type\":\"\",\"contact_tel\":\"\",\"contact_qq\":\"\"}");
2)将字典进行Json序列化;
string jsonData = JsonConvert.SerializeObject(dictionary);
序列化后的结果:
{
"app_key": "i4esv1l+76l/7NQCL3QudG90Fq+YgVfFGJAWgT+7qO1Bm9o/adG/1iwO2qXsAXNB",
"method": "fulu.order.direct.add",
"timestamp": "2019-12-30 14:23:06",
"version": "2.0",
"format": "json",
"charset": "utf-8",
"sign_type": "md5",
"app_auth_token": "",
"biz_content": "{\"customer_order_no\":\"20191230142306472\",\"product_id\":10000585,\"buy_num\":1,\"charge_account\":\"888888\",\"charge_ip\":\"\",\"charge_password\":\"\",\"charge_game_name\":\"\",\"charge_game_role\":\"\",\"charge_game_region\":\"\",\"charge_game_srv\":\"\",\"charge_type\":\"\",\"contact_tel\":\"\",\"contact_qq\":\"\"}"
}
3)将Json字符串转化为字符数组charObjectArray,然后将charObjectArray进行Array.Sort()排序;
var chars = jsonData.ToCharArray();
Array.Sort(chars);
4)将排序后的charObjectArray转化为字符串string,然后在string后直接拼接应用密钥;
string data = new string(chars) + secret;
结果:
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""+++,,,,,,,,,,,,,,,,,,,,---....///000000000000111111111112222222223333344445556667777888888889999::::::::::::::::::::::::AABBCFFGGGJLNNOOQQTVWXXY\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_______________________aaaaaaaaaaaaaaaaaaaaaaaaabbcccccccccccccccccccddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffgggggggggggggggghhhhhhhhhhhiiiiiiiiiijkklllllmmmmmmmmmmmmmnnnnnnnnnnnnnooooooooooooooooooppppppppppqqqqqrrrrrrrrrrrrrrrrrrrrrrssssssssssstttttttttttttttttttttuuuuuuuuuuvvvwwyyyyz{{}}0a091b3aa4324435aab703142518a8f7
5)将第4步拼接了应用秘钥的字符串进行md5(注意:待md5字符串最前面有个空格),最后将得到的值转化为小写字符串即得到sign签名值;
var chars = jsonData.ToCharArray();
Array.Sort(chars);
结果:
d2ca1003c1852e1846c9466adec18b68
Md5方法(.NET版本)
public string Md5(string str){
Encoding encode = Encoding.UTF8;
var cl = str;
var md5 = MD5.Create();
var s = md5.ComputeHash(encode.GetBytes(cl));
return s.Aggregate("", (current, t) => current + t.ToString("x2"));
}
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import net.sf.json.JSONObject;
public class InputParamSign {
public static void main(String[] args) {
String sysSecret = "0a091b3aa4324435aab703142518a8f7";
String sign = Sign(sysSecret);
}
public static String Sign(String sysSecret){
Map<String, String> map = new HashMap<String, String>();
map.put("app_key","i4esv1l+76l/7NQCL3QudG90Fq+YgVfFGJAWgT+7qO1Bm9o/adG/1iwO2qXsAXNB");
map.put("method", "fulu.user.info.get");
map.put("timestamp", "2019-07-24 09:45:11");
map.put("version", "2.0");
map.put("format", "json");
map.put("charset", "utf-8");
map.put("sign_type", "md5");
map.put("app_auth_token", "");
map.put("biz_content", "{}");
JSONObject resultJson = JSONObject.fromObject(map);
char[] s = JSONObject.toJSONString(resultJson, SerializerFeature.WriteMapNullValue).toCharArray();
Arrays.sort(s);
String outputSignOriginalStr = new String(s) + sysSecret;
String sign = MD5Utils.MD5(outputSignOriginalStr);
return sign;
}
}
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils { /**
* 获取MD5加密
*
* @param pwd
* 需要加密的字符串
* @return String字符串 加密后的字符串
*/
public static String MD5(String pwd) {
try {
// 创建加密对象
MessageDigest digest = MessageDigest.getInstance("md5");
// 调用加密对象的方法,加密的动作已经完成
byte[] bs = digest.digest(pwd.getBytes());
// 第一步,将数据全部转换成正数:
String hexString = "";
for (byte b : bs) {
// 第一步,将数据全部转换成正数:
// 解释:为什么采用b&255
/*
* b:它本来是一个byte类型的数据(1个字节) 255:是一个int类型的数据(4个字节)
* byte类型的数据与int类型的数据进行运算,会自动类型提升为int类型 eg: b: 1001 1100(原始数据)
* 运算时: b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000
* 0000 0000 0000 0000 0000 1111 1111 结果:0000 0000 0000 0000
* 0000 0000 1001 1100 此时的temp是一个int类型的整数
*/
int temp = b & 255;
// 第二步,将所有的数据转换成16进制的形式
// 注意:转换的时候注意if正数>=0&&<16,那么如果使用Integer.toHexString(),可能会造成缺少位数
// 因此,需要对temp进行判断
if (temp < 16 && temp >= 0) {
// 手动补上一个“0”
hexString = hexString + "0" + Integer.toHexString(temp);
} else {
hexString = hexString + Integer.toHexString(temp);
}
}
return hexString;
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
}
/**
* php签名方法
*/
public function getSign($Parameters)
{
//签名步骤一:把字典json序列化
$json = json_encode( $Parameters, 320 );
//签名步骤二:转化为数组
$jsonArr = $this->mb_str_split( $json );
//签名步骤三:排序
sort( $jsonArr );
//签名步骤四:转化为字符串
$string = implode( '', $jsonArr );
//签名步骤五:在string后加入secret
$string = $string . $this->AppSecret;
//签名步骤六:MD5加密
$result_ = strtolower( md5( $string ) );
return $result_;
}
/**
* 可将字符串中中文拆分成字符数组
*/
function mb_str_split($str){
return preg_split('/(?<!^)(?!$)/u', $str );
}
仅限测试使用
{
"code":0,
"message":"接口调用成功",
"result":"{\"order_id\":\"19123033155353051423\",\"product_id\":10000585,\"product_name\":\"视频/文娱直充测试商品-返回充值失败\",\"charge_account\":\"888888\",\"customer_order_no\":\"20191230142306472\",\"create_time\":\"2019-12-30 14:23:04\",\"buy_num\":1,\"order_price\":1.0300,\"order_state\":\"untreated\",\"finish_time\":null,\"area\":\"\",\"server\":\"\",\"type\":\"\",\"order_type\":4,\"operator_serial_number\":\"\"}",
"sign":"e9d393b03df909feb7f687a49ad1952a"
}
示例仅供参考
1)将response响应结果中的result的值转换为字符数组charObjectArray,然后将charObjectArray进行Array.Sort()排序;
2)将排序后的charObjectArray转化为字符串string,然后在string后直接拼接应用密钥;
3)将第4步拼接了应用密钥的字符串进行md5(注意:待md5字符串最前面有个空格),最后将得到的值转化为小写字符串即得到sign签名值;
在线Md5参照地址:http://tool.chinaz.com/tools/md5.aspx
示例:
var chars = jsonData.ToCharArray();
Array.Sort(chars);
将排序后的charObjectArray转化为字符串string,然后在string后直接拼接应用密钥;
示例:
string data = new string(chars) + secret;
结果:
"""""""""""""""""""""""""""""""""""""""""""""""""",,,,,,,,,,,,,,---./000000000000000111111111111122222222233333333333444444555555678888888999:::::::::::::::::______________aaaaaaaaaabbccccccccddddddddddeeeeeeeeeeeeeeeeeeeeeeeefghhiiiiiiiilllmmmmmmnnnnnnnnoooooooooooopppppprrrrrrrrrrrrrrrrrrrrrrrrsssssttttttttttttttuuuuuuuuuvyyy{}值充充品商回失娱文测直视试败返频0a091b3aa4324435aab703142518a8f7
将第4步拼接了应用秘钥的字符串进行md5(注意:待md5字符串最前面有个空格),最后将得到的值转化为小写字符串即得到sign签名值;
示例:
string sign = Md5(data).ToLower();
结果:
e9d393b03df909feb7f687a49ad1952a
Md5方法(.NET版本)
public string Md5(string str){
Encoding encode = Encoding.UTF8;
var cl = str;
var md5 = MD5.Create();
var s = md5.ComputeHash(encode.GetBytes(cl));
return s.Aggregate("", (current, t) => current + t.ToString("x2"));
}