Java-微信 JSAPI 支付的坑总结

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('支付失败');
		}
	});

到此就让我折腾了一天................到处百度

在CSDN也找过贴发过贴很多人都遇到过这个问题 有的说已解决  但是并没有说明方法  说了也说的笼统  

翻了很多解决方法   没办法 只有一个一个测试 还有说  重置下key 的  我觉得 大家还是只是听听就好了

后来发现一贴  http://blog.csdn.net/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('支付失败');
		}
	});

我一脸怀疑的运行起来了,但我点击支付后发现弹窗的错误信息变成了一串英文数字混合字符串,再点完确定之后奇迹发生了支付框居然弹出来了,

腾讯懒了么?既然两种签名方式都支持了,就不能更新下文档吗?统一下单签名方式必须和页面签名方式一样也要说明啊!!!!

就到这里了 希望能帮助你们,哪里写得不对还请指教!!



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值