旋转的钢笔 2020-07-13 09:22 采纳率: 54.5%
浏览 227
已采纳

微信充值成功,但是数据库却没有记录,createOrder 没有执行?

改方法的业务逻辑是,当用户点击下单的时候执行orders方法,很奇怪的是,微信支付回调成功,数据库中却没有用户下单的数据,也就是createOrder方法没有执行,日志也没有输出什么信息,方法也单元测试了,没有找到问题所在,请大佬帮助,万分感谢!!1

/**
 * 微信支付
 *
 * @author yadu
 */
public class SendPayAction extends HttpServlet {

    private static final long serialVersionUID = 1L;
    private static Logger logger = Logger.getLogger(SendPayAction.class);
    private Connection con_kq;
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        String method = request.getParameter("method");
        if("orders".equals(method)){
            try {
                orders(request, response);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * @Description 微信浏览器内微信支付/公众号支付(JSAPI)
     * @param request
     * @return Map
     */
    public  void orders(HttpServletRequest request, HttpServletResponse response) {
        String wxid = request.getParameter("wxid");
        String money=request.getParameter("money");
        try {
            //判断用户
            boolean flag1=userAccount(wxid);
            if (flag1==false){
                Map<String, String> payTip = new HashMap<String, String>(16);
                payTip.put("tip","抱歉,您还没有开通微信充值账号,不能充值!");
                JSONObject json = JSONObject.fromObject(payTip);
                PrintWriter out1 = response.getWriter();
                out1.print(json);
                out1.flush();
                out1.close();
            }else {
                //String 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();
                }
                // 商家平台ID
                paraMap.put("appid", AuthUtil.APPID);
                // 商家名称-销售商品类目、String(128)
                paraMap.put("body", "餐卡充值");
                // 商户ID
                paraMap.put("mch_id", AuthUtil.MCHID);
                // UUID
                paraMap.put("nonce_str", WXPayUtil.generateNonceStr());
                paraMap.put("openid", wxid);
                // 订单号,每次都不同
                String orderId=OrderId.getSuffix();
                paraMap.put("out_trade_no", orderId);
                paraMap.put("spbill_create_ip", ip);
                // 支付金额,单位分
                paraMap.put("total_fee", String.valueOf(Arith.changeY2F(Double.valueOf(money))));
                // 支付类型
                paraMap.put("trade_type", "JSAPI");
                // 此路径是微信服务器调用支付结果通知路径随意写
                // paraMap.put("notify_url", "用户支付完成后,你想微信调你的哪个接口");
                String url="http://kq.yadugroup.com:8443/yadu_OA/servlet/PayResultAction";
                paraMap.put("notify_url", url);
                String sign = WXPayUtil.generateSignature(paraMap, AuthUtil.PATERNERKEY);
                paraMap.put("sign", sign);
                // 将所有参数(map)转xml格式
                String xml = WXPayUtil.mapToXml(paraMap);
                // 统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder
                String unifiedorder_url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
                System.out.println("xml为:" + xml);
                // String xmlStr = HttpRequest.sendPost(unifiedorder_url,
                // xml);//发送post请求"统一下单接口"返回预支付id:prepay_id
                String xmlStr = HttpRequest.httpsRequest(unifiedorder_url, "POST", xml);
                System.out.println("xmlStr为:" + xmlStr);

                // 以下内容是返回前端页面的json数据
                // 预支付id
                String prepay_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", AuthUtil.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, AuthUtil.PATERNERKEY);
                payMap.put("paySign", paySign);
                payMap.put("tip","");
                System.out.println("prepay_id是:" + prepay_id);

                //讲订单写入数据库
                createOrder(wxid,orderId,money,ip);
                //判断微信接口是否能链接
                if (StringUtils.isBlank(prepay_id)){
                    Map<String, String> payTip = new HashMap<String, String>(16);
                    payTip.put("tip","微信服务器连接超时,请稍后再试!");
                    JSONObject json = JSONObject.fromObject(payTip);
                    PrintWriter out1 = response.getWriter();
                    out1.print(json);
                    out1.flush();
                    out1.close();
                }else{
                    JSONObject jsonobject = JSONObject.fromObject(payMap);
                    PrintWriter out = response.getWriter();
                    out.print(jsonobject);
                    out.flush();
                    out.close();
                }
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 查询员工账号是否存在
     * @param wxid
     * @return
     */
    public boolean userAccount(String wxid) throws SQLException {
        JdbcCard jdbcCard=new JdbcCard();
        if (jdbcCard.connection == null || jdbcCard.connection.isClosed()) {
            jdbcCard.connection = jdbcCard.getConnection("ydsy");
        }
        ResultSet rs_oaqj=null;
        try {
            String sql = " SELECT p.jobNumber jobNo,p.cpsn_name personName,p.vIDNo certificateNo,p.cPsnMobilePhone phoneNo,p.cpsnURL wxid from hr_hi_person p where p.cPsnURL = '" + wxid + "'  and p.dleaveDate is null ";
            Statement st_oaqj = jdbcCard.connection.createStatement();
            rs_oaqj = st_oaqj.executeQuery(sql);

            if(!rs_oaqj.isBeforeFirst()){
                jdbcCard.connection = jdbcCard.getConnection("wps");
                Statement st = jdbcCard.connection.createStatement();
                rs_oaqj = st.executeQuery(sql);
                if(!rs_oaqj.isBeforeFirst()){
                    jdbcCard.connection = jdbcCard.getConnection("mdk");
                    Statement st1 = jdbcCard.connection.createStatement();
                    rs_oaqj = st1.executeQuery(sql);
                }
            }
            while (rs_oaqj.next()) {
                String certificateNo = rs_oaqj.getString("certificateNo");
                Employee emp=new Employee();
                emp.setCertificateNo(certificateNo);
                emp.setCertificateType("111");
                String StringeResult = callPostStringApi(emp,"/api/resource/v1/person/certificateNo/personInfo");
                com.alibaba.fastjson.JSONObject jsonx = JSON.parseObject(StringeResult);
                com.alibaba.fastjson.JSONObject obj = jsonx.getJSONObject("data");
                if(obj!=null){
                    return true;
                }else {
                    return false;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            logger.info(e.getMessage());
        }finally {
            try {
                if(rs_oaqj != null){
                    rs_oaqj.close();
                }
                if(jdbcCard.connection != null){
                    jdbcCard.connection.close();
                }
            } catch (SQLException e) {
                logger.error(e.getMessage());
            }
        }

        return false;
    }

    /**
     *
     * 下订单
     *
     */
    public void createOrder(String wxid,String orderId,String amount,String ip) throws SQLException {
        JdbcCard jdbcCard=new JdbcCard();
        if (jdbcCard.connection == null || jdbcCard.connection.isClosed()) {
            jdbcCard.connection = jdbcCard.getConnection("ydsy");
        }
        ResultSet rs_oaqj=null;
        String  insertOderSql = "insert into wx_order (orderId,totalFee,status,pid,wxurl,phone,name,ip) values(?,?,?,?,?,?,?,?)";
        try {
            String sql = " SELECT p.jobNumber jobNo,p.cpsn_name personName,p.vIDNo certificateNo,p.cPsnMobilePhone phoneNo,p.cpsnURL wxid from hr_hi_person p where p.cPsnURL = '" + wxid + "'  and p.dleaveDate is null ";
            Statement st_oaqj = jdbcCard.connection.createStatement();
            rs_oaqj = st_oaqj.executeQuery(sql);

            if(!rs_oaqj.isBeforeFirst()){
                jdbcCard.connection = jdbcCard.getConnection("wps");
                Statement st = jdbcCard.connection.createStatement();
                rs_oaqj = st.executeQuery(sql);
                if(!rs_oaqj.isBeforeFirst()){
                    jdbcCard.connection = jdbcCard.getConnection("mdk");
                    Statement st1 = jdbcCard.connection.createStatement();
                    rs_oaqj = st1.executeQuery(sql);
                }
            }
            while (rs_oaqj.next()) {
                String certificateNo = rs_oaqj.getString("certificateNo");
                String Name = rs_oaqj.getString("personName");
                String phoneNo = rs_oaqj.getString("phoneNo");
                String wxid1 = rs_oaqj.getString("wxid");
                List list=new ArrayList();
                list.add(orderId);
                list.add(amount);
                list.add("0");
                list.add(certificateNo);
                list.add(wxid1);
                list.add(phoneNo);
                list.add(Name);
                list.add(ip);
               boolean flag=updDetailed(list,insertOderSql);
               if(flag){
                   logger.info("创建订单成功");
               }else{
                   logger.info("创建订单失败");
               }
            }

        }catch (Exception e){
            e.printStackTrace();
            logger.info(e.getMessage());
        }finally {
            try {
                if(rs_oaqj != null){
                    rs_oaqj.close();
                }
                if(jdbcCard.connection != null){
                    jdbcCard.connection.close();
                }
            } catch (SQLException e) {
                logger.error(e.getMessage());
            }
        }


    }


    public boolean updDetailed(List list, String sql) {
        try {

            return updateByPreparedStatement(sql, list);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return false;
    }

    public boolean updateByPreparedStatement(String sql, List<Object> params) throws SQLException, ClassNotFoundException {
        JdbcCard jdbcCard=new JdbcCard();
        boolean flag = false;
        int result = -1;
        if ((this.con_kq == null) || (this.con_kq.isClosed())) {
            this.con_kq = jdbcCard.getKqjlCon();
        }
        PreparedStatement pstmt = con_kq.prepareStatement(sql);
        int index = 1;
        if (params != null && !params.isEmpty()) {
            for (int i = 0; i < params.size(); i++) {
                //System.out.println("^^^^^^^^"+index++);//输出1,2,3
                pstmt.setObject(index++, params.get(i));
            }
        }
        result = pstmt.executeUpdate();
        flag = result > 0 ? true : false;
        return flag;
    }

}

  • 写回答

2条回答 默认 最新

  • WriteProcessMomory 2020-07-13 10:04
    关注

    写入过程如果发生异常你已经try了,一定会去写日志的。那么问题就出在根本没有进入updDetailed(list,insertOderSql)方法, 所以问题出在这里: while (rs_oaqj.next()) {

    SELECT  p.jobNumber jobNo ,
        p.cpsn_name personName ,
        p.vIDNo certificateNo ,
        p.cPsnMobilePhone phoneNo ,
        p.cpsnURL wxid
    

    FROM hr_hi_person p
    WHERE p.cPsnURL = 'wxid'
    AND p.dleaveDate IS NULL

    
    如果空逻辑后面的写的就不对!!!!!!!!!!!!!!
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 10月31日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵