一、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;
}
}