微信红包接口提示签名错误

richie441111 2015-11-30 07:57:20
参考微信红包支付开发的文档,无论如何都提示“签名错误”,请大神搭救!
微信红包支付的开发文档:https://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_5

下面贴出我的部分代码,部分涉及隐私的内容没有实际给出或是用xxx代替了。跟微信平台提供的签名测试工具对比了下,微信测试平台生成的签名跟我自己代码生成的签名完全一致,但就是提示签名错误。

入口:

public String sendRedPack(String fromUserName, int amount) {
SortedMap<String, Object> map = new TreeMap<String, Object>();

map.put("nonce_str", WeixinUtil.createNoncestr(32)); // 随机字符串,不长于32位
// 商户订单号(每个订单号必须唯一)。组成:mch_id+yyyymmdd+10位一天内不能重复的数字。接口根据商户订单号支持重入,如出现超时可再调用。
map.put("mch_billno", WeixinUtil.getMchBillNo());
map.put("mch_id", Constants.MCH_ID); // 微信支付分配的商户号
map.put("wxappid", Constants.getAppId()); // 微信分配的公众账号ID(企业号corpid即为此appId)
map.put("send_name", "CanguangMedia"); // 商户名称, 红包发送者名称
map.put("re_openid", fromUserName); // "oy-yfuAMQ4tynMP98bOdMmuS4Bk4"; // 接受红包的用户.用户在wxappid下的openid
map.put("total_amount", amount + ""); // 付款金额,单位分
map.put("total_num", "1"); // 红包发放总人数
map.put("wishing", "ThankYou"); // 红包祝福语
map.put("client_ip", "xxx.xx.xx.xxx"); // 调用接口的机器Ip地址
map.put("act_name", "TestRedPackage"); // 活动名称
map.put("remark", "ThankYou2"); // 备注信息
String sign = WxPayHelper.createSign("UTF-8", map); // 签名
map.put("sign", sign);

String xmlParam = WeixinUtil.mapToXml(map);
log.info("sendRedPack, 入参xmlParam=" + xmlParam);

String result = "";
try {
result = MoneyUtils.doSendMoney(Constants.SEND_REDPACK_URL, fromUserName, xmlParam);
Map resultMap = XmlUtil.xml2map(result);
if("FAIL".equals(resultMap.get("result_code"))) {
result = (String) resultMap.get("error_code_des");
}
else {
result = "感谢您的支持,红包已发放到您的微信上,请查收!";
}
log.info("sendRedPack获取结果:" + result);
} catch (Exception e) {
log.error("sendRedPack发生异常:" + e.getMessage(), e);
System.out.println("sendRedPack发生异常:" + e.getMessage());
}
return result;
}


WeixinUtil.java

/**
* 生成随机数
* @param length 要生成的长度
* @return
*/
public static String createNoncestr(int length) {
String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String res = "";
for (int i = 0; i < length; i++) {
res += chars.charAt(rd.nextInt(chars.length() - 1));
}
return res;
}

/**
* 创建商户订单号
* @return
*/
public static String getMchBillNo() {
String mchBillNo = "";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat sdf2 = new SimpleDateFormat("HHmmssSSS");
Date now = new Date();
mchBillNo = Constants.MCH_ID + sdf.format(now) + sdf2.format(now) + rd.nextInt(9);
return mchBillNo;
}

/**
* map转换成微信标准的xml格式
* @param map 微信入参map
* @return
*/
public static String mapToXml(SortedMap<String, Object> map) {
String xml = "<xml>";

Iterator<Entry<String, Object>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Entry<String, Object> entry = iter.next();
String key = entry.getKey();
Object val = entry.getValue();
xml += "<" + key + "><![CDATA[" + val + "]]></" + key + ">";
}
xml += "</xml>";
return xml;
}



WxPayHelper.java

/**
* 微信支付签名算法sign
* @param characterEncoding
* @param parameters
* @return
*/
public static String createSign(String characterEncoding, SortedMap<String, Object> parameters) {
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
Object v = entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + Constants.API_KEY);
String sign = MD5Util.MD5(sb.toString()).toUpperCase();
log.info("signStr=" + sb.toString() + ", sign=" + sign);
// String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}



MoneyUtils.java

public static String doSendMoney(String url, String fromName, String data) throws Exception {
log.info("doSendMoney入参:url=" + url + ", fromName=" + fromName + ", data=" + data);
KeyStore keyStore = KeyStore.getInstance("PKCS12");
// FileInputStream instream = new FileInputStream(new File(Constants.KEYSTORE_FILE));//P12文件目录
InputStream instream = null;
try {
instream = MoneyUtils.class.getResourceAsStream("apiclient_cert.p12");
// instream = new FileInputStream(new File("apiclient_cert.p12"));//P12文件目录
} catch(Exception e) {
log.error("doSendMoney 00发生异常:" + e.getMessage(), e);
e.printStackTrace();
}
log.info("doSendMoney instream====>" + instream.toString());
try {
keyStore.load(instream, Constants.KEYSTORE_PASSWORD.toCharArray());//这里写密码..默认是你的MCHID
} catch (Exception e) {
e.printStackTrace();
log.error("doSendMoney 1发生异常:" + e.getMessage(), e);
}
finally {
instream.close();
}
// Trust own CA and all self-signed certs
SSLContext sslcontext = SSLContexts.custom()
.loadKeyMaterial(keyStore, Constants.KEYSTORE_PASSWORD.toCharArray())//这里也是写密码的
.build();
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
try {
HttpPost httpost = new HttpPost(url); // 设置响应头信息
httpost.addHeader("Connection", "keep-alive");
httpost.addHeader("Accept", "*/*");
httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
httpost.addHeader("Host", "api.mch.weixin.qq.com");
httpost.addHeader("X-Requested-With", "XMLHttpRequest");
httpost.addHeader("Cache-Control", "max-age=0");
httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
httpost.setEntity(new StringEntity(data, "UTF-8"));
CloseableHttpResponse response = httpclient.execute(httpost);
try {
HttpEntity entity = response.getEntity();
String jsonStr = toStringInfo(response.getEntity(),"UTF-8");
log.info("doSendMoney返回:jsonStr=" + jsonStr);

//微信返回的报文时GBK,直接使用httpcore解析乱码
// String jsonStr = EntityUtils.toString(response.getEntity(),"UTF-8");
EntityUtils.consume(entity);
return jsonStr;
} catch(Exception e) {
log.error("doSendMoney 发生异常:" + e.getMessage(), e);
return null;
} finally {
response.close();
}
} finally {
httpclient.close();
}
}
...全文
4994 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Evan_fighting 2017-10-09
  • 打赏
  • 举报
回复
有人解决了么?
asd524557563 2017-10-09
  • 打赏
  • 举报
回复
都是高手来的啊
虚幻者 2017-03-09
  • 打赏
  • 举报
回复
我也老报这个错误,key是哪个里面的key
虚幻者 2017-03-09
  • 打赏
  • 举报
回复
key 是哪个key
ltmwqy 2016-11-17
  • 打赏
  • 举报
回复
参数有误,比如说key可能不对
码无边 2016-03-18
  • 打赏
  • 举报
回复
java的微信开发包,本身就存在bug
Bob_張 2016-03-17
  • 打赏
  • 举报
回复
JAVA微信红包源码 http://blog.csdn.net/u011738153/article/details/50521547
cssdn001 2016-03-16
  • 打赏
  • 举报
回复
引用 9 楼 vampire104 的回复:
楼上这个是普通红包接口的,普通红包接口没问题,可以使用,裂变红包我也遇到这个问题了,不管怎么样都是签名错误,也是醉了
微信红包自带clientip,裂变红包没有这个参数,去掉试试,应该就可以了。
vampire104 2016-02-02
  • 打赏
  • 举报
回复
楼上这个是普通红包接口的,普通红包接口没问题,可以使用,裂变红包我也遇到这个问题了,不管怎么样都是签名错误,也是醉了
longdengpan 2015-12-26
  • 打赏
  • 举报
回复
终于调通了,针对微信公众号 发红包给粉丝接口,出现签名错误的问题。 请务必按照下面的参数顺序生成xml字符串。这个是我复制微信在线接口调试生成的数据示例。也就是他拯救了我。跟大家分享一下,如有问题QQ我:32124984,加我请说明在csdn上。ps:微信支付文档上的示例真是坑人。 public String createXml() { String sb = "<xml>"; sb += "<act_name>"+act_name+"</act_name>"; sb += "<client_ip>"+client_ip+"</client_ip>"; sb += "<mch_billno>"+mch_billno+"</mch_billno>"; sb += "<mch_id>"+mch_id+"</mch_id>"; sb += "<nonce_str>"+nonce_str+"</nonce_str>"; sb += "<re_openid>"+re_openid+"</re_openid>"; sb += "<remark>"+remark+"</remark>"; sb += "<send_name>"+send_name+"</send_name>"; sb += "<total_amount>"+total_amount+"</total_amount>"; sb += "<total_num>"+total_num+"</total_num>"; sb += "<wishing>"+wishing+"</wishing>"; sb += "<wxappid>"+wxappid+"</wxappid>"; sb += "<sign>"+sign+"</sign>"; sb += "</xml>"; return sb; }
longdengpan 2015-12-26
  • 打赏
  • 举报
回复
引用 5 楼 wzxhzjlheshe1993 的回复:
请问你的问题解决了吗?没有的话,我将我的代码贴出来,我调通了。
问题没解决,能把代码贴出来吗?一直提示签名错误
ken_fishman 2015-12-23
  • 打赏
  • 举报
回复
引用 5 楼 wzxhzjlheshe1993 的回复:
请问你的问题解决了吗?没有的话,我将我的代码贴出来,我调通了。
你怎么解决的?
贤龙 2015-12-22
  • 打赏
  • 举报
回复
请问你的问题解决了吗?没有的话,我将我的代码贴出来,我调通了。
zhoufifi 2015-12-03
  • 打赏
  • 举报
回复
我的之前是测试过可以发红包的,过了几天就不行了,现在的情况跟你说的一样,签名跟微信平台提供的测试验证接口平台加密出来的是一模一样的,就是提示签名错误,改了商户平台api安全里面的密钥10几次了,都不行。。。。。你的问题解决了吗?
richie441111 2015-12-01
  • 打赏
  • 举报
回复
有人会吗?
richie441111 2015-11-30
  • 打赏
  • 举报
回复
不知道是微信商户上的接口文档有问题,还是我弄得不对。试过自己代码加密出来的,跟微信平台提供的测试验证接口平台加密出来的是一模一样的,就是不对。不知道是不是少了参数还是咋的。 还有谁有遇到过,而且解决了的吗?
zhoufifi 2015-11-30
  • 打赏
  • 举报
回复
我也遇到了这个问题,之前测试是可以的,过来几天突然就不行了,一直提示签名错误,无论是去掉全部中文,去掉cdata标签,改商户平台的秘钥均解决不了问题。。。。

3,143

社区成员

发帖
与我相关
我的任务
社区描述
微信开发即微信公众平台开发,将企业信息、服务、活动等内容通过微信网页的方式进行表现,通过二次开发可以将公众账号由一个媒体型营销工具转化成提供服务的产品。
社区管理员
  • 微信开发
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧