调用微信红包接口返回签名错误

移动开发 码拜 4年前 (2016-09-20) 984次浏览
参数通过排序,过滤,重组之后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();
}

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();
}

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>”

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明调用微信红包接口返回签名错误
喜欢 (0)
[1034331897@qq.com]
分享 (0)