微信扫码支付 签名错误 各个参数都检查好几遍了,都没有错的,就是报 签名错误,关键是我jsapi支付是可以通过的,现在扫码支付就提示说 签名错误。。。

寒江_陪烟火 2016-01-29 04:03:52
下面是 调用 微信扫码支付 统一下单接口

public String createPayOrderForNATIVE() {
WxPaySendData sendData = new WxPaySendData();
sendData.setAppid("appid");
sendData.setMch_id("mchid");
sendData.setNonce_str(WxSign.getNonceStr());
sendData.setBody("测试扫码支付body字段");
sendData.setAttach("测试扫码支付attach扩展字段");
sendData.setOut_trade_no("342425r2350980000");
sendData.setTotal_fee("100");
sendData.setSpbill_create_ip("12.12.12.12");
sendData.setNotify_url("123");
sendData.setTrade_type("NATIVE");
sendData.setProduct_id("1001");

// 请求签名 参数
SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
parameters.put("appid", sendData.getAppid());
parameters.put("mch_id", sendData.getMch_id());
parameters.put("nonce_str", sendData.getNonce_str());
parameters.put("attach", sendData.getAttach());
parameters.put("body", sendData.getOut_trade_no());
parameters.put("out_trade_no", sendData.getOut_trade_no());
parameters.put("total_fee", sendData.getTotal_fee());
parameters.put("spbill_create_ip", sendData.getSpbill_create_ip());
parameters.put("notify_url", sendData.getNotify_url());
parameters.put("trade_type", sendData.getTrade_type());
parameters.put("product_id", sendData.getProduct_id());
try {
// 生成 请求签名
String sign = WxSign.createSign(parameters, "key");
sendData.setSign(sign);
XStream xs = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));
xs.alias("xml", WxPaySendData.class);
String xml = xs.toXML(sendData);
String newXml = new String(xml.toString().getBytes(), "ISO8859-1");
String returnXml = HttpPostForString.postRequest("https://api.mch.weixin.qq.com/pay/unifiedorder", newXml);

XStream retXs = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));
retXs.alias("xml", RetDateVo.class);
RetDateVo retVo = (RetDateVo) retXs.fromXML(returnXml);
return retVo.toString();

} catch (Exception e) {
String msg = "createPayOrderForNATIVE() method catch exception";
return null;
}
}

-----------------------------------------------------------------------------------------------------------------------------------------
下面为 生成签名 方法

public static String createSign(SortedMap<Object,Object> parameters,String key){
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=" + key);
String sign = MD5Util.MD5Encode(sb.toString(), "UTF-8").toUpperCase();
return sign;
}

-----------------------------------------------------------------------------------------------------------------------------------------
下面为 生成 随机数方法

public static String getNonceStr() {
Random random = new Random();
return MD5Util.MD5Encode(String.valueOf(random.nextInt(10000)), "UTF-8");
}
...全文
439 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
寒江_陪烟火 2016-02-01
  • 打赏
  • 举报
回复
找到 错误了, parameters.put("body", sendData.getOut_trade_no()); parameters.put("out_trade_no", sendData.getOut_trade_no()); 怪自己粗心了。。。。
寒江_陪烟火 2016-02-01
  • 打赏
  • 举报
回复
引用 1 楼 itfirefly 的回复:
首先看看你的商户账号有没有开通扫描支付的功能,然后 认证看看文档,貌似两个的签名算法不是一致的(蛮久没弄微信支付了不太确认)
签名算法是一致的,微信 jsapi , wap, native 支付 的签名方式是同一规则, 商户账号没有开通扫码支付功能,那提示错误也不应该是 签名错误呀
望舒 2016-01-30
  • 打赏
  • 举报
回复
首先看看你的商户账号有没有开通扫描支付的功能,然后 认证看看文档,貌似两个的签名算法不是一致的(蛮久没弄微信支付了不太确认)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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