String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+config.getAppID()+"&secret="+config.getAppsecret()+"&code="+code+"&grant_type=authorization_code";
//appid,appsecret,前往 公众号 里面查看 code 详情查看文档 这里没有坑
String result = HttpUtil.sendGet(url, "utf-8");
JSONObject json = JSONObject.fromObject(result);
System.out.println(json.toString());
String openid = json.getString("openid");
SortedMap<String, String> finalpackage = new TreeMap<String, String>();//使用 SortedMap 实现 参数名ASCII码从小到大排序(字典序)
String timestamp = Sha1Util.getTimeStamp();//时间戳
String packages = "prepay_id="+prepay_id;//预支付ID,使用统一下单接口成功后可获取 JSAPI 支付必须获取用户 openid
finalpackage.put("appId", appid);
finalpackage.put("timeStamp", timestamp);
finalpackage.put("nonceStr", nonce_str);
finalpackage.put("package", packages);
finalpackage.put("signType", "MD5");//此处有坑
//要签名
String finalsign = reqHandler.createSign(finalpackage);
String finaPackage = "\"appId\":\"" + appid + "\",\"timeStamp\":\"" + timestamp
+ "\",\"nonceStr\":\"" + nonce_str + "\",\"package\":\""
+ packages + "\",\"signType\" : \"MD5" + "\",\"paySign\":\""
+ finalsign + "\"";
WeixinJSBridge.invoke('getBrandWCPayRequest',{请注意,这个地方放Demo.java中生成的package}, //就是 后台的 finaPackage 有坑
function(res){
//支付成功或失败前台判断
if(res.err_msg=='get_brand_wcpay_request:ok'){
alert('恭喜您,支付成功!');
}else{
alert('支付失败');
}
});
官方提供的 获取签名的方法 即 签名后 生成的 finalPackage
当我使用时 错误 提示 缺少 appid 可是我明明传了appid
于是我封装了一个参数对象传一个对象到页面然后就是这样
WeixinJSBridge.invoke('getBrandWCPayRequest',{
"appId":data.appid, //公众号名称,由商户传入
"timeStamp":data.mytimestamp, //时间戳,自1970年以来的秒数
"nonceStr":data.nonce_str, //随机串
"package":"prepay_id="+data.prepay_id,
"signType":"MD5", //微信签名方式: 公众号强调 得使用 MD5 加密 见下图 这是一个坑
"paySign":data.finalsign //微信签名
},function(res){
//支付成功或失败前台判断
if(res.err_msg=='get_brand_wcpay_request:ok'){
alert('支付成功');
}else{
alert('支付失败');
}
});
到此就让我折腾了一天................到处百度
在优快云也找过贴发过贴很多人都遇到过这个问题 有的说已解决 但是并没有说明方法 说了也说的笼统
翻了很多解决方法 没办法 只有一个一个测试 还有说 重置下key 的 我觉得 大家还是只是听听就好了
后来发现一贴 http://blog.youkuaiyun.com/wangfei0904306/article/details/77547583 说是签名方式不对
统一下单接口使用的是 HMAC-SHA256 签名方式 然而 公众号 说明了 对于页面的加密暂支持 MD5 方式 ,
于是我就去更改 下单签名方式 如下代码
data.put("body", sf);
data.put("out_trade_no", ser.toString());
data.put("fee_type", "CNY");
data.put("total_fee", pricess.toString());
data.put("spbill_create_ip", "127.0.0.1");
data.put("trade_type", "JSAPI");
data.put("openid", session.getAttribute("useropenid").toString());//下单需要 openid
data.put("sign_type", "MD5");//更改签名方式为 MD5
但是我更改完之后 再 支付 还是签名验证失败,于是我想着应该是没有吧下单的签名方式更改过来,后来找了些 方法 也并不行 可能无法更改吧!还请知道的指教下!
现在还有个方法就是更改页面的签名方式,可是官方文档说明暂支持 MD5 加密 ,我觉得可能也不行,于是我抱着试一试的态度更改了,见下面代码
SortedMap<String, String> finalpackage = new TreeMap<String, String>();
String timestamp = Sha1Util.getTimeStamp();
String packages = "prepay_id="+r.get("prepay_id");
finalpackage.put("appId", config.getAppID());
finalpackage.put("nonceStr", r.get("nonce_str"));
finalpackage.put("package", packages);
finalpackage.put("signType", "HMAC-SHA256");
finalpackage.put("timeStamp", timestamp);
//要签名
String wxsign = WXPayUtil.generateSignature(finalpackage, config.getKey(), SignType.HMACSHA256);
WeixinJSBridge.invoke('getBrandWCPayRequest',{
"appId":data.appid, //公众号名称,由商户传入
"timeStamp":data.mytimestamp, //时间戳,自1970年以来的秒数
"nonceStr":data.nonce_str, //随机串
"package":"prepay_id="+data.prepay_id,
"signType":"HMAC-SHA256", //微信签名方式:
"paySign":data.wxsign //微信签名
},function(res){
//支付成功或失败前台判断
if(res.err_msg=='get_brand_wcpay_request:ok'){
location.href= contextPath +"/weixin/ceshiNameHis.jsp"
}else{
alert('支付失败');
}
});
我一脸怀疑的运行起来了,但我点击支付后发现弹窗的错误信息变成了一串英文数字混合字符串,再点完确定之后奇迹发生了支付框居然弹出来了,
腾讯懒了么?既然两种签名方式都支持了,就不能更新下文档吗?统一下单签名方式必须和页面签名方式一样也要说明啊!!!!
就到这里了 希望能帮助你们,哪里写得不对还请指教!!