微信扫码支付 签名错误 各个参数都检查好几遍了,都没有错的,就是报 签名错误,关键是我jsapi支付是可以通过的,现在扫码支付就提示说 签名错误。。。
下面是 调用 微信扫码支付 统一下单接口
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");
}