先用WXPayUtil类中的public static Map<String, String> xmlToMap(String strXML)方法,将刚才返回的XML格式的字符串转成map(为了方便取值)。map.get(“prepay_id”)就得到了prepay_id的值(比如得到的是:“wx2018…250…9981…666”),记住它,先保留此值。

看看前台都需要接收哪些值吧。
6个参数,咱们还是一个一个分析:
1.appId:四大参数之一的APPID;
2.timestamp:时间戳(newDate()即可)
"noncestr" : jsonobj.noncestr, //随机串。"noncestr" : "${noncestr}", //随机串。串中已没有字符可与主串中当前字符s[i]比较,主串当前指针应后移至下一字符,再和模式串中第一字符进行比较。
4.package:就tm是它用到了prepay_id,但是还不是直接取值,还非要固定格式的,值的格式例如:”prepay_id= wx2018…250…9981…666”
5.signType:写MD5就好
其上是选定参数后,符合密码学里标准分类的算法,包括块加密算法,签名算法,非对称加密算法,mac算法等,例如: aes-128-cbc-pkcs7,rsaes-oaep ,rsassa-pkcs1-v1_5, hmac-sha256,ecdsa-p256,curve25519 等。除了上面提到的签名外,每个证书还包含签名的算法,和被签名的证书tbscertificate(to be signed certificate)三部分:。很多系统上 iptables 在默认情况下都不会理会网桥上的 forward 链,所以需要修改内核参数确保 bridge-nf-call-iptables=1,把这个修改可以放到 antispoofing() 函数里,这样每次 xen 配置网络的时候会自动配置内核参数:。
除了这两块千元滴,饼还无意间掉入了rumbatime的坑,表盘的立体感贼好,关键价格也动人。这个例子中,线程试图通过类似于数绵羊的传统方法进去休眠状态沦为了时这个例子能正确执行,asleep必须为volatile变量。需要注意的是,有两个变量,一个是shell,一个是makeflags,这两个变量不管你是否export,其总是要传递到下层makefile中,特别是makefiles变量,其中包含了make的参数信息,如果我们执行“总控makefile”时有make参数或是在上层makefile中定义了这个变量,那么makefiles变量将会是这些参数,并会传递到下层makefile中,这是一个系统级的环境变量。
//后台post微信传参地址 同时取得微信返回的参数 post 方法我写下面了。使用fiddler抓包,发现前端与后台都是采用post方法交互微信支付java开发详细,前端post数据,后台返回数据。/// 此参数设置为必须,它定义了要创建的direct3d设备的表示参数,如后台缓冲区的高度、宽度和像素格式、如何从后台缓冲区复制到前台缓存、以及屏幕显示的方式等等。
前端的工作就容易多了,格式比较固定因为是微信固定格式,所以直接贴出我的代码,你只要更换触发支付的事件和异步的地址即可.
当用户点击某个菜单或者按键时,不会跳转到其他的页面,前端会从后端获取对应页面的数据而不是html,之后在页面中需要更新内容的地方,局部动态刷新,而如果是多页网站,当用户访问不同的页面时,服务器会直接返回一个html,然后浏览器直接将这个html展现给用户。 锁定标签后在网页内进行跳转, 重启浏览器后, 会自动打开跳转后的页面。推荐前端先获取一个空框架的页面,再用ajax的方式和goahead通信来获取初始化数据。
2.pay.jsp中需要异步到后台需要带code参数,pay.jsp中页面的地址上带着code,想获取code的方法很多,抛砖引引玉:(定义一个按钮,按钮上绑定一个code的属性值是页面链接的code的值,用EL表达式取的参数值,点击按钮触发点击事件)。
3.接收后台传过来值,调用固定方法。
Pay.jsp中内容只有一个”微信支付”的按钮,和js的代码,以下是js内容(获取code方法可以修改),其它内容不要修改
<!—pay.jsp中点击”微信支付”按钮执行pay()方法> <input id="code"type="button" value="微信支付"onclick="pay()" code="${param.code }"/> <script type="text/javascript"> var appId,timeStamp,nonceStr,package,signType,paySign; function pay(){ var code = $("#code").attr("code");//页面链接上的code参数 if(code){ var url = "http://异步地址?code="+code+"; $.get(url,function(result) { appId = result.appId; timeStamp = result.timeStamp; nonceStr = result.nonceStr; package = result.package; signType = result.signType; paySign = result.paySign; if (typeof WeixinJSBridge == "undefined") { if (document.addEventListener) { document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); } else if (document.attachEvent) { document.attachEvent('WeixinJSBridgeReady', onBridgeReady); document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); } } else { onBridgeReady(); } }); } else { alert(“服务器错误”) } } function onBridgeReady(){ WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId":appId, //公众号名称,由商户传入 "timeStamp":timeStamp, //时间戳,自1970年以来的秒数 "nonceStr":nonceStr, //随机串 "package":package, "signType":signType, //微信签名方式: "paySign":paySign //微信签名 }, function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) { console.log('支付成功'); //支付成功后跳转的页面 }else if(res.err_msg == "get_brand_wcpay_request:cancel"){ console.log('支付取消'); }else if(res.err_msg == "get_brand_wcpay_request:fail"){ console.log('支付失败'); WeixinJSBridge.call('closeWindow'); } //使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 }); } </script>
/** * @Description 微信浏览器内微信支付/公众号支付(JSAPI) * @param request * @param code * @return Map */ @RequestMapping(value="orders", method = RequestMethod.GET) @ResponseBody public Map orders(HttpServletRequest request,String code) { try { //页面获取openId接口 String getopenid_url = https://api.weixin.qq.com/sns/oauth2/access_token; String param= "appid="+你appid+"&secret="+你secret+"&code="+code+"&grant_type=authorization_code"; //向微信服务器发送get请求获取openIdStr String openIdStr = HttpRequest.sendGet(getopenid_url, param); JSONObject json = JSONObject.parseObject(openIdStr);//转成Json格式 String openId = json.getString("openid");//获取openId //拼接统一下单地址参数 Map<String, String> paraMap = new HashMap<String, String>(); //获取请求ip地址 String ip = request.getHeader("x-forwarded-for"); if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ ip = request.getHeader("Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ ip = request.getHeader("WL-Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ ip = request.getRemoteAddr(); } if(ip.indexOf(",")!=-1){ String[] ips = ip.split(","); ip = ips[0].trim(); } paraMap.put("appid", 你appid); paraMap.put("body", "尧舜商城-订单结算"); paraMap.put("mch_id", 你mchId); paraMap.put("nonce_str", WXPayUtil.generateNonceStr()); paraMap.put("openid", openId); paraMap.put("out_trade_no", 你的订单号);//订单号 paraMap.put("spbill_create_ip", ip); paraMap.put("total_fee",”1”); paraMap.put("trade_type", "JSAPI"); paraMap.put("notify_url",www.*******.com/***/**);// 此路径是微信服务器调用支付结果通知路径随意写 String sign = WXPayUtil.generateSignature(paraMap, paternerKey); paraMap.put("sign", sign); String xml = WXPayUtil.mapToXml(paraMap);//将所有参数(map)转xml格式 // 统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder String unifiedorder_url = https://api.mch.weixin.qq.com/pay/unifiedorder; String xmlStr = HttpRequest.sendPost(unifiedorder_url, xml);//发送post请求"统一下单接口"返回预支付id:prepay_id //以下内容是返回前端页面的json数据 String prepay_id = "";//预支付id if (xmlStr.indexOf("SUCCESS") != -1) { Map<String, String> map = WXPayUtil.xmlToMap(xmlStr); prepay_id = (String) map.get("prepay_id"); } Map<String, String> payMap = new HashMap<String, String>(); payMap.put("appId", appid); payMap.put("timeStamp", WXPayUtil.getCurrentTimestamp()+""); payMap.put("nonceStr", WXPayUtil.generateNonceStr()); payMap.put("signType", "MD5"); payMap.put("package", "prepay_id=" + prepay_id); String paySign = WXPayUtil.generateSignature(payMap, paternerKey); payMap.put("paySign", paySign); return payMap; } catch (Exception e) { e.printStackTrace(); } return null; }
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/sanxing/article-112418-2.html
对敢于入侵我领土
别随便说同志不合法