微信支付java版bug 报签名错误
1.requestHandler的init方法参数列表有问题,后两个参数位置要对调
2.md5加密的时候key值没有赋值,getKey 要返回 partnerkey
3.jspapi中signParams集合中的key值都要小写,它的noncestr大写导致签名无效
报参数错误
1,确保你的微信的app_id,app_secret,parent_id,parent_key,parent_sign_key的信息是否填写正确了。
2,请检查package的参数是否错误或为空等情况,具体设置可参考开发文档。
3,微信的金额是以分为单位的,所以请检查一下你传入的金额最小值是不是大于1(千万不要传小数点进去)。
回调类中,验证财付通签名不通过,原因:key值不正确,key值=PARTNER_KEY值
验证是否微信签名 不通过,,我选择直接跳过验证。。
java代码
public class WXPayController extends AbstractController {
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
//=================================
//jsapi接口
//=================================
//初始化
RequestHandler reqHandler = new RequestHandler(request, response);
TenpayHttpClient httpClient = new TenpayHttpClient();
TreeMap<String, String> outParams = new TreeMap<String, String>();
//初始化
reqHandler.init();
reqHandler.init(PropertiesUtil.getPropertyFromFile("APP_ID"),PropertiesUtil.getPropertyFromFile("APP_SECRET"),PropertiesUtil.getPropertyFromFile("APP_KEY"),PropertiesUtil.getPropertyFromFile("PARTNER_KEY"));
Orders orders=orderMgr.getOrder(970374);
//当前时间 yyyyMMddHHmmss
String currTime = TenpayUtil.getCurrTime();
//8位日期
String strTime = currTime.substring(8, currTime.length());
//四位随机数
String strRandom = TenpayUtil.buildRandom(4) + "";
//10位序列号,可以自行调整。
String strReq = strTime + strRandom;
//订单号,此处用时间加随机数生成,商户根据自己情况调整,只要保持全局唯一就行
String out_trade_no = orders.getOrderNo();
//获取提交的商品价格转化为分
String order_price = String.valueOf(orders.getReadPrice().multiply(new BigDecimal(100)).intValue());
//获取提交的商品名称
String product_name ="huimeihui";
//设置package订单参数
SortedMap<String, String> packageParams = new TreeMap<String, String>();
packageParams.put("banktype", "WX"); //支付类型 必填
packageParams.put("body", product_name); //商品描述 必填
packageParams.put("fee_type","1"); //银行币种 必填
packageParams.put("input_charset", "UTF-8"); //字符集
packageParams.put("notify_url", PropertiesUtil.getPropertyFromFile("NOTIFY_URL")); //通知地址 必填
packageParams.put("out_trade_no", out_trade_no); //商户订单号 必填
packageParams.put("partner", PropertiesUtil.getPropertyFromFile("PARTNER")); //设置商户号 必填
packageParams.put("spbill_create_ip", "101.231.125.118"); //订单生成的机器IP,指用户浏览器端IP 必填
packageParams.put("total_fee", order_price); //商品总金额,以分为单位 必填
//获取package包
String packageValue = reqHandler.genPackage(packageParams);
String noncestr = Sha1Util.getNonceStr();
String timestamp = Sha1Util.getTimeStamp();
//设置支付参数
SortedMap<String, String> signParams = new TreeMap<String, String>();
signParams.put("appid", PropertiesUtil.getPropertyFromFile("APP_ID"));
signParams.put("noncestr", noncestr);
signParams.put("package", packageValue);
signParams.put("timestamp", timestamp);
signParams.put("appkey", PropertiesUtil.getPropertyFromFile("APP_KEY"));
//生成支付签名,要采用URLENCODER的原始值进行SHA1算法!
String sign = Sha1Util.createSHA1Sign(signParams);
System.out.println(sign);
//增加非参与签名的额外参数
signParams.put("paySign", sign);
signParams.put("signType", "SHA1");
StringBuffer sb = new StringBuffer();
sb.append("{");
sb.append("\"appId\":\"");sb.append(PropertiesUtil.getPropertyFromFile("APP_ID"));sb.append("\",");
sb.append("\"timeStamp\":\"");sb.append(timestamp);sb.append("\",");
sb.append("\"nonceStr\":\"");sb.append(noncestr);sb.append("\",");
sb.append("\"package\":\"");sb.append(packageValue);sb.append("\",");
sb.append("\"signType\":\"");sb.append("SHA1");sb.append("\",");
sb.append("\"paySign\":\"");sb.append(sign);sb.append("\"");
sb.append("}");
log.PrintLogResult(sb.toString(), "wxpay");
response.setContentType("application/json;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write(sb.toString());
writer.flush();
writer.close();
return null;
}
我是把商户号什么的都配置在配置文件,这个可以按自己的需求该,加密什么的都是wx开发demo中的。
js代码:
<script>
function callpay(){
if (typeof WeixinJSBridge == "undefined") {
alert("请先通过微信访问!");
} else {
$.getScript("http://域名/wxap/getwxpay/",function(){
WeixinJSBridge.invoke('getBrandWCPayRequest',{
"appId":jobj.appId,
"timeStamp":jobj.timeStamp,
"nonceStr":jobj.nonceStr,
"package" : jobj.package,
"signType" : jobj.signTupe,
"paySign" : jobj.paySign
},function(res){
WeixinJSBridge.log(res.err_msg);
alert(res.err_code + res.err_desc + res.err_msg);
});
});
}
}
</script>
我已经对接成功了,希望大家也顺利接通。