尚医通 166-77 处理支付结果

一、controller
1、调用微信接口查询订单支付状态
判断支付结果
1、失败 返货结果
2、在支付 返回结果
3、成功:
调用服务层 修改订单状态 以及订单信息 如 可预约人数

//查询订单状态 queryPayStatus/${orderId}
    //生成支付二维码
    @ApiOperation("查询订单状态")
    @GetMapping("queryPayStatus/{orderId}")
    public Result queryPayStatus(@PathVariable Long orderId){
        //调用微信接口查询订单支付状态
     Map<String,String> resultMap = weixinService.queryPayStatus(orderId);
        //判断 result
        if (resultMap == null){
            return  Result.ok().message("支付失败");
        }
        //支付成功
        if ("SUCCESS".equals(resultMap.get("trade_state"))){
        //修改订单状态 以及订单信息 如 可预约人数
            String out_trade_no = resultMap.get("out_trade_no");//支付订单编号
            paymentService.paySuccess(out_trade_no, resultMap);

            return Result.ok().message("支付成功");
        }
        return Result.ok().message("支付中");
    }

service:

 //调用微信接口查询订单支付状态
    @Override
    public Map<String, String> queryPayStatus(Long orderId) {
        try {
            //1、查询订单状态
            OrderInfo orderInfo = orderService.getById(orderId);
            //2、封装微信接口参数
            Map paramMap = new HashMap<>();
            paramMap.put("appid", ConstantPropertiesUtils.APPID);
            paramMap.put("mch_id", ConstantPropertiesUtils.PARTNER);
            paramMap.put("out_trade_no", orderInfo.getOutTradeNo());
            paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
            //3、设置请求
            HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
            client.setXmlParam(WXPayUtil.generateSignedXml(paramMap, ConstantPropertiesUtils.PARTNERKEY));
            client.setHttps(true);
            client.post();
            //4、返回第三方微信的数据,转成Map
            String xml = client.getContent();
            Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
            //5、返回
            return resultMap;
        } catch (Exception e) {
            return null;
        }

    }

二、修改订单状态 以及订单信息 如 可预约人数 serviceimpl
1、根据订单编号 查询支付信息表 payment_info
2、更新支付记录
3、根据支付信息表的订单id修改订单表的支付状态
4、根据订单表中的医院信息id修改医院信息 (远程调用医院接口)

//修改订单状态 以及订单信息 如 可预约人数
    @Transactional(rollbackFor=Exception.class)
    @Override
    public void paySuccess(String out_trade_no, Map<String, String> resultMap) {
        //1根据订单编号 查询支付信息表
        PaymentInfo paymentInfo = this.getPaymentInfo(out_trade_no, PaymentStatusEnum.PAID.getStatus());
        if (null == paymentInfo) {
            throw new YyghException(ResultCodeEnum.PARAM_ERROR);
        }
        if (paymentInfo.getPaymentStatus() != PaymentStatusEnum.UNPAID.getStatus()) {
            return;
        }
        //2更新支付记录
        paymentInfo.setPaymentStatus(PaymentStatusEnum. PAID. getStatus()) ;
        paymentInfo.setCallbackTime(new Date() ) ;
        paymentInfo.setTradeNo(resultMap.get("transaction_id") ) ;
        paymentInfo.setCallbackContent(resultMap.toString() ) ;
        baseMapper. updateById(paymentInfo);

        //3、根据支付信息表的订单id修改订单表的支付状态
        OrderInfo orderInfo = orderService.getById(paymentInfo.getOrderId()) ;
        orderInfo.setOrderStatus(OrderStatusEnum. PAID.getStatus() ) ;
        orderService.updateById(orderInfo) ;

        //4、根据订单表中的医院信息id修改医院信息  (远程调用医院接口)
        SignInfoVo signInfoVo = hospitalFeignClient.getSignInfoVo(orderInfo.getHoscode()) ;
        Map<String,Object> reqMap = new HashMap<>();
        reqMap.put("hoscode" , orderInfo.getHoscode()) ;
        reqMap.put("hosRecordId", orderInfo.getHosRecordId() ) ;
        reqMap.put ("timestamp", HttpRequestHelper.getTimestamp() ) ;
        String sign = HttpRequestHelper.getSign(reqMap,signInfoVo.getSignKey());
        reqMap.put("sign", sign);
        //注意请求路劲
        JSONObject result =HttpRequestHelper.sendRequest(reqMap, signInfoVo.getApiUrl() + "/order/updatePayStatus");

    }

    //查询根据支付编号和类型支付表
    private PaymentInfo getPaymentInfo(String outTradeNo,Integer paymentType){
        //根据订单编号得到支付记录
        QueryWrapper<PaymentInfo> wrapper = new QueryWrapper<>() ;
        wrapper.eq("out_trade_no" , outTradeNo);
        wrapper.eq ("payment_type",paymentType) ;
        PaymentInfo paymentInfo = baseMapper.selectOne(wrapper);
        return paymentInfo;
    }

    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐睡睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值