<>();repData.put("appid", appId);repData.put("noncetr", nonce_str);repData.put("partnerid", mchId);repData.put("prepayid", data.get("prepay_id"));repData.put("package", "Sign=WXPay");repData.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));String sign1 = PayCommonUtil.createSign("UTF-8", repData, key);JSONObject json = new JSONObject();json.put("appid", appId);json.put("partnerid", mchId);json.put("package", "Sign=WXPay");json.put("noncestr", nonce_str);json.put("prepayid", data.get("prepay_id"));json.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));json.put("sign", "1232");return json.toString();} else {return "";}} catch (JDOMException | IOException e) {e.printStackTrace();return "";}}@PostMapping("/wxPayAppCallback")public void wxPayCallback(HttpServletRequest request, HttpServletResponse response) throws JDOMException, Exception {System.out.println("微信支付回调");InputStream inStream = request.getInputStream();ByteArrayOutputStream outSteam = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inStream.read(buffer)) != -1) {outSteam.write(buffer, 0, len);}String resultxml = new String(outSteam.toByteArray(), "utf-8");Map<String, String> map = XMLUtil.doXMLParse(resultxml);outSteam.close();inStream.close();System.out.println("微信返回值:" + map);String resultCode = map.get("result_code");//订单号String out_trade_no = map.get("out_trade_no");if (StringUtils.equals(resultCode, "SUCCESS")) {//业务代码System.out.println("微信回调成功");//返回微信处理成功response.setContentType("text/xml");response.getWriter().println("success");} else {response.setContentType("text/xml");response.getWriter().println("fail");}}支付宝支付代码支付宝支付和回调
/** * 获取支付宝加签后台的订单信息字符串 */@Overridepublic String getAliPayOrderStr(String orderNo) {String teaNames = "";//商品名称//最终返回加签之后的,app需要传给支付宝app的订单信息字符串String orderString = "";System.out.println("==================支付宝下单,商户订单号为:" + orderNo);try {//实例化客户端(参数:网关地址、商户appid、商户私钥、格式、编码、支付宝公钥、加密类型),为了取得预付订单信息AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID,AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET,AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGN_TYPE);//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.payAlipayTradeAppPayRequest ali_request = new AlipayTradeAppPayRequest();//SDK已经封装掉了公共参数,这里只需要传入业务参数 。以下方法为sdk的model入参方式AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();//业务参数传入,可以传很多,参考API//model.setPassbackParams(URLEncoder.encode(request.getBody().toString())); //公用参数(附加数据)model.setBody("购买商品");//对一笔交易的具体描述信息 。如果是多种商品,请将商品描述字符串累加传给body 。model.setSubject(teaNames);//商品名称model.setOutTradeNo(orderNo);//商户订单号(自动生成)model.setTimeoutExpress("15m");//交易超时时间model.setTotalAmount(String.valueOf(orderTea.getOrderTotal()));//支付金额model.setProductCode("QUICK_MSECURITY_PAY");//销售产品码(固定值)ali_request.setBizModel(model);ali_request.setNotifyUrl(AlipayConfig.notify_url);//异步回调地址(后台)ali_request.setReturnUrl(AlipayConfig.return_url);//同步回调地址(APP)// 这里和普通的接口调用不同,使用的是sdkExecuteAlipayTradeAppPayResponse alipayTradeAppPayResponse = alipayClient.sdkExecute(ali_request); //返回支付宝订单信息(预处理)orderString = alipayTradeAppPayResponse.getBody();//就是orderString 可以直接给APP请求,无需再做处理 。} catch (AlipayApiException e) {e.printStackTrace();}return orderString;}@PostMapping("/appCallback")public void appCallback(HttpServletRequest request, HttpServletResponse response) { try {// 获取支付宝POST过来反馈信息Map<String, String> params = new HashMap<>();Map requestParams = request.getParameterMap();for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ",";}// 乱码解决,这段代码在出现乱码时使用 。如果mysign和sign不相等也可以使用这段代码转化valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}// 调用SDK验证签名boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGN_TYPE);//先不做回调验证//if (signVerified) {System.out.println("回调验签");// 商户订单号(后台生成)String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");// 支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");// 交易状态String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");System.out.println("trade_no:" + trade_no);// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//if (StringUtils.equals("TRADE_SUCCESS", trade_status)) {//ZK表示用户购买了赚客商品开通了赚客if (out_trade_no.contains("d") || out_trade_no.contains("ZK")) {String[] orderNoArr = new String[1024];int a = 0;//根据订单号修改订单状态MallOrder mallOrder = new MallOrder();mallOrder.setOrderStatus(Byte.valueOf("1"));mallOrder.setOutTradeNo(trade_no);//支付宝交易号mallOrder.setPayChannel(Byte.valueOf("2"));//支付方式mallOrder.setPayTime(new Date());mallOrder.setCreated(true);if (out_trade_no.contains(",")) {orderNoArr = out_trade_no.split(",");for (String orderNo : orderNoArr) {MallOrderExample mallOrderExample = new MallOrderExample();mallOrderExample.createCriteria().andOrderNoEqualTo(orderNo);saveRecord(orderNo);a += orderService.updateByExampleSelective(mallOrder, mallOrderExample);}} else {saveRecord(out_trade_no);MallOrderExample mallOrderExample = new MallOrderExample();mallOrderExample.createCriteria().andOrderNoEqualTo(out_trade_no);a = orderService.updateByExampleSelective(mallOrder, mallOrderExample);}if (a > 1) {System.out.println("修改成功");}System.out.println("订单提交成功");} else {//根据订单号修改订单状态,生成取货码machineOrderTea orderTea = machineService.findMachineOrder(out_trade_no);String prefix = RandomStringUtils.random(4, "1234567890").toUpperCase();long l = System.currentTimeMillis();String newSuffix=String.valueOf(l).substring(String.valueOf(l).length()-5,String.valueOf(l).length());String suffix = String.valueOf(l / 500000000);//String verificationCode = prefix + suffix;String verificationCode = prefix + newSuffix;orderTea.setVerificationCode(verificationCode);orderTea.setTradeNo(trade_no);orderTea.setOrderNo(out_trade_no);orderTea.setPayMethod("Alipay");orderTea.setOrderStatus("1");//如果使用了优惠券则将优惠券设置为已使用Integer couponLinkId = orderTea.getCouponId();if (null != couponLinkId) {MemberCouponsLink link = couponsLinkMapper.selectByPrimaryKey(couponLinkId);//设置优惠为已使用//link.setIsUse(true);/*临时方案↓*///如果优惠券码不为"888888"或者"666666",则设置优惠券为"已使用"if(!(link.getCouponCode().equals("888888")||link.getCouponCode().equals("666666"))){link.setIsUse(true);}/*临时方案↑*/couponsLinkMapper.updateByPrimaryKeySelective(link);}machineService.updateMachineOrder(orderTea);System.out.println("订单提交成功");}String result = "success";//if(signVerified){//验签成功//result="success";//}else{//result="fail";//}//,不然业务代码不会执行BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());out.write(result.getBytes());out.flush();out.close();}//} else {//System.out.println("回调验签失败");//}} catch (Exception e) {e.printStackTrace();throw new RuntimeException("支付异常");}}
推荐阅读
- javascript中的继承与实现
- 微信青少年模式监护人功能怎么用?
- 王者退款是退到微信吗?
- 犀牛书作者:最该忘记的JavaScript特性
- JavaScript 如何读取本地文件
- 微信歌曲怎么保存本地?
- 大悟绿茶整合区域品牌闯市场
- 微信|微信Mac 3.4.0新版发布:二维码、朋友圈更方便了
- 康佳|康佳要用!Smartisan TV OS实机演示曝光:支持微信
- 微信聊天记录删掉就没了?警方可以查到吗
