参数通过排序,过滤,重组之后MD5加密,转大写得出sign,然后将同样的参数跟得出的sign放到xml里面发送https的post请求最终得到结果为“参数错误。”不知道问题出在哪。有哪位高手能帮本人看看嘛。到底是本人sign参数生成有问题还是post的xml格式有问题。
string nonce_str = Get_GuidStr();//随机字符串 string sign = "";//签名 string mch_id = "100000000";//商户号 string mch_billno = Get_BillNo(mch_id);//商户订单号 string wxappid = "wx8asdfderqweqweqwe2b";//公众账号appid string nick_name = "aa";//提供方名称 string send_name = "aa";//商户名称 string re_openid = "asdfasfwerqweqeqweqe";//用户openid int total_amount = 100;//付款金额(分) int min_value = 100;//最小红包金额 int max_value = 100;//最大红包金额 int total_num = 1;//红包发放总人数 string wishing = "新年新气象,祝您身体健康,万事如意!";//红包祝福语 string client_ip = "114.249.210.173"; //"221.5.252.231";//Ip地址 string act_name = "测试红包功能。";//活动名称 string remark = "测的越多,送的越多。";//备注 string logo_imgurl = "";//商户logo的url string share_content = "";//分享文案 string share_url = "";//分享链接 string share_imgurl = "";//分享的图片
SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>(); sParaTemp.Add("nonce_str", nonce_str); sParaTemp.Add("sign", sign); sParaTemp.Add("mch_billno", mch_billno); sParaTemp.Add("mch_id", mch_id); sParaTemp.Add("wxappid", wxappid); sParaTemp.Add("nick_name", nick_name); sParaTemp.Add("send_name", send_name); sParaTemp.Add("re_openid", re_openid); sParaTemp.Add("total_amount", total_amount.ToString()); sParaTemp.Add("min_value", min_value.ToString()); sParaTemp.Add("max_value", max_value.ToString()); sParaTemp.Add("total_num", total_num.ToString()); sParaTemp.Add("wishing", wishing); sParaTemp.Add("client_ip", client_ip); sParaTemp.Add("act_name", act_name); sParaTemp.Add("act_id", "12041"); sParaTemp.Add("remark", remark); sParaTemp.Add("logo_imgurl", logo_imgurl); sParaTemp.Add("share_content", share_content); sParaTemp.Add("share_url", share_url); sParaTemp.Add("share_imgurl", share_imgurl); string signStr = BuildRequest(sParaTemp); return signStr;
//获取过滤后的数组 Dictionary<string, string> dicPara = new Dictionary<string, string>(); dicPara = FilterPara(sParaTemp); //组合参数数组 string prestr = CreateLinkString(dicPara); //拼接支付密钥 string stringSignTemp = prestr + "&key=" + key; //获得加密结果 string myMd5Str = GetMD5(stringSignTemp); //返回转换为大写的加密串 return myMd5Str.ToUpper();
strXml.Append("<xml>"); strXml.Append("<sign><![CDATA[" + sign + "]]></sign>"); strXml.Append("<mch_billno><![CDATA[" + mch_billno + "]]></mch_billno>"); strXml.Append("<mch_id><![CDATA[" + mch_id + "]]></mch_id>"); strXml.Append("<wxappid><![CDATA[" + wxappid + "]]></wxappid>"); strXml.Append("<nick_name><![CDATA[" + nick_name + "]]></nick_name>"); strXml.Append("<send_name><![CDATA[" + send_name + "]]></send_name>"); strXml.Append("<re_openid><![CDATA[" + re_openid + "]]></re_openid>"); strXml.Append("<total_amount><![CDATA[" + total_amount + "]]></total_amount>"); strXml.Append("<min_value><![CDATA[" + min_value + "]]></min_value>"); strXml.Append("<max_value><![CDATA[" + max_value + "]]></max_value>"); strXml.Append("<total_num><![CDATA[" + total_num + "]]></total_num>"); strXml.Append("<wishing><![CDATA[" + wishing + "]]></wishing>"); strXml.Append("<client_ip><![CDATA[" + client_ip + "]]></client_ip>"); strXml.Append("<act_name><![CDATA[" + act_name + "]]></act_name>"); strXml.Append("<act_id><![CDATA[12041]]></act_id>"); strXml.Append("<remark><![CDATA[" + remark + "]]></remark>"); strXml.Append("<logo_imgurl><![CDATA[" + logo_imgurl + "]]></logo_imgurl>"); strXml.Append("<share_content><![CDATA[" + share_content + "]]></share_content>"); strXml.Append("<share_url><![CDATA[" + share_url + "]]></share_url>"); strXml.Append("<share_imgurl><![CDATA[" + share_imgurl + "]]></share_imgurl>"); strXml.Append("<nonce_str><![CDATA[" + nonce_str + "]]></nonce_str>"); strXml.Append("</xml>");
<xml> <return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[签名错误.]]></return_msg> <result_code><![CDATA[FAIL]]></result_code> <err_code><![CDATA[NOAUTH]]></err_code> <err_code_des><![CDATA[签名错误.]]></err_code_des> <mch_billno><![CDATA[10017876201501050145335395]]></mch_billno> <mch_id>10017876</mch_id> <wxappid><![CDATA[wx83ebd841d284292b]]></wxappid> <re_openid><![CDATA[osrd5uFQmotuVVq4lnvRh3O4x748]]></re_openid> <total_amount>100</total_amount> </xml>
解决方案
2
数据为空,不参与签名
2
你的act_id 是哪来的?
2
问题解决了吗,本人也遇到相同的问题了,怎么办的?
2
和你报的错是一模样的,怎么解决的呀
2
求指导啊!
2
/// <summary>
/// 创建签名
/// </summary>
/// <returns></returns>
/// <remarks>必须保证全部传入的参数都有值,没有值的要过滤掉</remarks>
static string CreateSignString(Dictionary<string, string> parameters, string paySecret)
{
foreach (var key in parameters.Keys.Where(key => string.IsNullOrEmpty(parameters[key])))
{
parameters.Remove(key);
}
//第一步,设全部収送戒者接收到的数据为集合 M,将集合 M 内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),
//使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串 stringA。
//特别注意以下重要规则:
//1.参数名 ASCII 码从小到大排序(字典序) ;
//2.假如参数的值为空不参与签名;
//3.参数名区分大小写;
//4.验证调用返回戒微信主劢通知签名时,传送的 sign 参数不参与签名,将生成的签名与该 sign 值作校验。
var keyArray = parameters.Keys.ToArray();
Array.Sort(keyArray);
var keyString = keyArray.Aggregate(“”, (current, t) => current + (t + “=” + parameters[t] + “&”));
//第二步,在 stringA 最后拼接上 key=商户支付密钥得到 stringSignTemp 字符串,
//并对 stringSignTemp 进行 MD5 运算,再将得到的字符串全部字符转换为大写,得到 sign的值 signValue
keyString += “key=” + paySecret;
return EncryptionHelper.Md5Encrypt(keyString).ToUpper();
}
/// 创建签名
/// </summary>
/// <returns></returns>
/// <remarks>必须保证全部传入的参数都有值,没有值的要过滤掉</remarks>
static string CreateSignString(Dictionary<string, string> parameters, string paySecret)
{
foreach (var key in parameters.Keys.Where(key => string.IsNullOrEmpty(parameters[key])))
{
parameters.Remove(key);
}
//第一步,设全部収送戒者接收到的数据为集合 M,将集合 M 内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),
//使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串 stringA。
//特别注意以下重要规则:
//1.参数名 ASCII 码从小到大排序(字典序) ;
//2.假如参数的值为空不参与签名;
//3.参数名区分大小写;
//4.验证调用返回戒微信主劢通知签名时,传送的 sign 参数不参与签名,将生成的签名与该 sign 值作校验。
var keyArray = parameters.Keys.ToArray();
Array.Sort(keyArray);
var keyString = keyArray.Aggregate(“”, (current, t) => current + (t + “=” + parameters[t] + “&”));
//第二步,在 stringA 最后拼接上 key=商户支付密钥得到 stringSignTemp 字符串,
//并对 stringSignTemp 进行 MD5 运算,再将得到的字符串全部字符转换为大写,得到 sign的值 signValue
keyString += “key=” + paySecret;
return EncryptionHelper.Md5Encrypt(keyString).ToUpper();
}
2
/// <summary>
/// 创建签名
/// </summary>
/// <returns></returns>
/// <remarks>必须保证全部传入的参数都有值,没有值的要过滤掉</remarks>
static string CreateSignString(Dictionary<string, string> parameters, string paySecret)
{
foreach (var key in parameters.Keys.Where(key => string.IsNullOrEmpty(parameters[key])))
{
parameters.Remove(key);
}
//第一步,设全部収送戒者接收到的数据为集合 M,将集合 M 内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),
//使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串 stringA。
//特别注意以下重要规则:
//1.参数名 ASCII 码从小到大排序(字典序) ;
//2.假如参数的值为空不参与签名;
//3.参数名区分大小写;
//4.验证调用返回戒微信主劢通知签名时,传送的 sign 参数不参与签名,将生成的签名与该 sign 值作校验。
var keyArray = parameters.Keys.ToArray();
Array.Sort(keyArray);
var keyString = keyArray.Aggregate(“”, (current, t) => current + (t + “=” + parameters[t] + “&”));
//第二步,在 stringA 最后拼接上 key=商户支付密钥得到 stringSignTemp 字符串,
//并对 stringSignTemp 进行 MD5 运算,再将得到的字符串全部字符转换为大写,得到 sign的值 signValue
keyString += “key=” + paySecret;
return EncryptionHelper.Md5Encrypt(keyString).ToUpper();
}
/// 创建签名
/// </summary>
/// <returns></returns>
/// <remarks>必须保证全部传入的参数都有值,没有值的要过滤掉</remarks>
static string CreateSignString(Dictionary<string, string> parameters, string paySecret)
{
foreach (var key in parameters.Keys.Where(key => string.IsNullOrEmpty(parameters[key])))
{
parameters.Remove(key);
}
//第一步,设全部収送戒者接收到的数据为集合 M,将集合 M 内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),
//使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串 stringA。
//特别注意以下重要规则:
//1.参数名 ASCII 码从小到大排序(字典序) ;
//2.假如参数的值为空不参与签名;
//3.参数名区分大小写;
//4.验证调用返回戒微信主劢通知签名时,传送的 sign 参数不参与签名,将生成的签名与该 sign 值作校验。
var keyArray = parameters.Keys.ToArray();
Array.Sort(keyArray);
var keyString = keyArray.Aggregate(“”, (current, t) => current + (t + “=” + parameters[t] + “&”));
//第二步,在 stringA 最后拼接上 key=商户支付密钥得到 stringSignTemp 字符串,
//并对 stringSignTemp 进行 MD5 运算,再将得到的字符串全部字符转换为大写,得到 sign的值 signValue
keyString += “key=” + paySecret;
return EncryptionHelper.Md5Encrypt(keyString).ToUpper();
}
2
同求关注,有没有人解决了的呀?
2
本人也出现这个问题了,最后排除了排序,排除了MD5加密,最后把中文全部换成英文就通过了。应该是中文的原因导致的。
2
你好,本人想问一下是不是调用红包接口必须使用证书文件呢,本人用php开发的,不会使用证书文件,腾讯那边提示是输入xml参数格式错误,本人想问一下是不是和证书文件有关系呢?
<xml>
<return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[输入xml参数格式错误]]></return_msg>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[PARAM_ERROR]]></err_code>
<err_code_des><![CDATA[输入xml参数格式错误]]></err_code_des>
<mch_id>0</mch_id>
<total_amount>0</total_amount>
</xml>”
<xml>
<return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[输入xml参数格式错误]]></return_msg>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[PARAM_ERROR]]></err_code>
<err_code_des><![CDATA[输入xml参数格式错误]]></err_code_des>
<mch_id>0</mch_id>
<total_amount>0</total_amount>
</xml>”