日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

尚医通(二十四)微信退款(取消预约功能)

發布時間:2024/3/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 尚医通(二十四)微信退款(取消预约功能) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一、取消預約
    • 1、需求描述
    • 2、開發取消預約接口

一、取消預約

1、需求描述

取消訂單分兩種情況:
(1)未支付取消訂單,直接通知醫院更新取消預約狀態
(2)已支付取消訂單,先退款給用戶,然后通知醫院更新取消預約狀態

2、開發取消預約接口

參考文檔:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
該接口需要使用證書,詳情參考文檔并下載證書
(1)配置證書
請下載的證書放在service-order模塊/resources/cert文件夾下

記得修改HttpClient里面的方法,改成證書所放的路徑

(2)添加退款記錄
添加RefundInfoMapper

public interface RefundInfoMapper extends BaseMapper<RefundInfo> { }

添加RefundInfoService方法和實現

//RefundInfoService public interface RefundInfoService extends IService<RefundInfo> {RefundInfo saveRefundInfo(PaymentInfo paymentInfo); }//RefundInfoServiceImpl @Service public class RefundInfoServiceImpl extends ServiceImpl<RefundInfoMapper, RefundInfo> implements RefundInfoService {@Overridepublic RefundInfo saveRefundInfo(PaymentInfo paymentInfo) {Long orderId = paymentInfo.getOrderId();QueryWrapper<RefundInfo> queryWrapper=new QueryWrapper<RefundInfo>();queryWrapper.eq("order_id",orderId);RefundInfo refundInfo1 = baseMapper.selectOne(queryWrapper);if(refundInfo1 != null){return refundInfo1;}RefundInfo refundInfo=new RefundInfo();refundInfo.setOutTradeNo(paymentInfo.getOutTradeNo());refundInfo.setOrderId(paymentInfo.getOrderId());refundInfo.setPaymentType(PaymentTypeEnum.WEIXIN.getStatus());refundInfo.setTotalAmount(paymentInfo.getTotalAmount());refundInfo.setSubject("想退款...");refundInfo.setRefundStatus(RefundStatusEnum.UNREFUND.getStatus());baseMapper.insert(refundInfo);return refundInfo;} }

(3)添加微信退款方法
在WeixinService添加方法

/**** 退款* @param orderId* @return*/boolean refund(Long orderId);

在WeixinServiceImpl添加實現

@Overridepublic boolean refund(Long orderId) {QueryWrapper<PaymentInfo> queryWrapper=new QueryWrapper<PaymentInfo>();queryWrapper.eq("order_id",orderId);PaymentInfo paymentInfo = paymentService.getOne(queryWrapper);RefundInfo refundInfo=refundInfoService.saveRefundInfo(paymentInfo);//已退款if(refundInfo.getRefundStatus().intValue() == RefundStatusEnum.REFUND.getStatus().intValue()){return true;}//執行微信退款HttpClient httpClient=new HttpClient("https://api.mch.weixin.qq.com/secapi/pay/refund");Map<String,String> paramMap = new HashMap<>(8);paramMap.put("appid",weiPayProperties.getAppid()); //公眾賬號IDparamMap.put("mch_id",weiPayProperties.getPartner()); //商戶編號paramMap.put("nonce_str",WXPayUtil.generateNonceStr());paramMap.put("transaction_id",paymentInfo.getTradeNo()); //微信支付訂單號paramMap.put("out_trade_no",paymentInfo.getOutTradeNo()); //商戶訂單編號paramMap.put("out_refund_no","tk"+paymentInfo.getOutTradeNo()); //商戶退款單號// paramMap.put("total_fee",paymentInfoQuery.getTotalAmount().multiply(new BigDecimal("100")).longValue()+"");// paramMap.put("refund_fee",paymentInfoQuery.getTotalAmount().multiply(new BigDecimal("100")).longValue()+"");paramMap.put("total_fee","1");paramMap.put("refund_fee","1");try {String paramXml = WXPayUtil.generateSignedXml(paramMap,weiPayProperties.getPartnerkey());httpClient.setXmlParam(paramXml);httpClient.setHttps(true);httpClient.setCert(true); //設置證書支持httpClient.setCertPassword(weiPayProperties.getPartner()); //設置證書密碼httpClient.post();String content = httpClient.getContent();Map<String, String> resultMap = WXPayUtil.xmlToMap(content);if("SUCCESS".equals(resultMap.get("result_code"))){ //微信退款成功refundInfo.setTradeNo(resultMap.get("refund_id"));//微信退款交易號refundInfo.setRefundStatus(RefundStatusEnum.REFUND.getStatus());refundInfo.setCallbackTime(new Date());refundInfo.setCallbackContent(JSONObject.toJSONString(resultMap));refundInfoService.updateById(refundInfo);return true;}return false;}catch (Exception ex){ex.printStackTrace();}return false;}

(4)完成取消預約方法
在OrderService添加和實現

/*** 取消訂單* @param orderId*/void cancelOrder(Long orderId);//實現方法@Overridepublic void cancelOrder(Long orderId) {OrderInfo orderInfo = baseMapper.selectById(orderId);DateTime quitTime = new DateTime(orderInfo.getQuitTime());//1.確定當前取消預約的時間 和 掛號訂單的取消預約截止時間 對比, 當前時間是否已經超過了 掛號訂單的取消預約截止時間//1.1 如果超過了,直接拋出異常,不讓用戶取消if(quitTime.isBeforeNow()){throw new YyghException(20001,"超過了退號的截止時間");}Map<String,Object> hospitalParamMap=new HashMap<String,Object>();hospitalParamMap.put("hoscode",orderInfo.getHoscode());hospitalParamMap.put("hosRecordId",orderInfo.getHosRecordId());//2.從平臺請求第三方醫院,通知第三方醫院,該用戶已取消JSONObject jsonObject = HttpRequestHelper.sendRequest(hospitalParamMap, "http://localhost:9998/order/updateCancelStatus");//2.1 第三方醫院如果不同意取消:拋出異常,不能取消if(jsonObject == null || jsonObject.getIntValue("code") != 200){throw new YyghException(20001,"取消失敗");}//3.判斷用戶是否對當前掛號訂單是否已支付if(orderInfo.getOrderStatus() == OrderStatusEnum.PAID.getStatus()){//3.1.如果已支付,退款boolean flag= weixinService.refund(orderId);if(!flag){throw new YyghException(20001,"退款失敗");}}//無論用戶是否進了支付//4.更新訂單的訂單狀態 及 支付記錄表的支付狀態orderInfo.setOrderStatus(OrderStatusEnum.CANCLE.getStatus());baseMapper.updateById(orderInfo);UpdateWrapper<PaymentInfo> updateWrapper=new UpdateWrapper<PaymentInfo>();updateWrapper.eq("order_id",orderInfo.getId());updateWrapper.set("payment_status", PaymentStatusEnum.REFUND.getStatus());paymentService.update(updateWrapper);//5.更新醫生的剩余可預約數信息OrderMqVo orderMqVo=new OrderMqVo();orderMqVo.setScheduleId(orderInfo.getScheduleId());SmsVo msmVo=new SmsVo();msmVo.setPhone(orderInfo.getPatientPhone());msmVo.setTemplateCode("xxxx.....");msmVo.setParam(null);orderMqVo.setSmsVo(msmVo);//6.給就診人發送短信提示:rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_ORDER,MqConst.ROUTING_ORDER,orderMqVo);}

(5)在WeixinService添加方法
在OrderInfoController添加方法

@GetMapping("/cancel/{orderId}")public R cancelOrder(@PathVariable Long orderId){orderInfoService.cancelOrder(orderId);return R.ok();}

(6)修改監聽器方法
service-hosp
修改OrderMqListener類

@Component public class OrderMqListener {@Autowiredprivate ScheduleService scheduleService;@Autowiredprivate RabbitService rabbitService;@RabbitListener(bindings = {@QueueBinding(value =@Queue(name = MqConst.QUEUE_ORDER,durable = "true"),//創建隊列exchange = @Exchange(name = MqConst.EXCHANGE_DIRECT_ORDER), //創建交換機key=MqConst.ROUTING_ORDER)})//確認掛號:走該方法 -n//取消預約:走方法 : +1public void consume(OrderMqVo orderMqVo, Message message, Channel channel){String scheduleId = orderMqVo.getScheduleId();Integer availableNumber = orderMqVo.getAvailableNumber();SmsVo msmVo = orderMqVo.getSmsVo();if(availableNumber != null){boolean flag= scheduleService.updateAvailableNumber(scheduleId,availableNumber);}else{scheduleService.cancelSchedule(scheduleId);}if(msmVo != null){rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_SMS,MqConst.ROUTING_SMS_ITEM,msmVo);}} }

取消預約了,把可預約人數加回去

void cancelSchedule(String scheduleId);@Overridepublic void cancelSchedule(String scheduleId) {Schedule schedule=scheduleRepository.findByHosScheduleId(scheduleId);schedule.setAvailableNumber(schedule.getAvailableNumber()+1);scheduleRepository.save(schedule);} @Repository public interface ScheduleRepository extends MongoRepository<Schedule,String> {Schedule findByHosScheduleId(String scheduleId); }

3、開發微信退款前端
(1)添加wx.js添加方法

cancelOrder(orderId) {return request({url: `/api/order/orderInfo/cancel/${orderId}`,method: 'get'}) },

(2)修改show.vue組件

//取消預約方法cancelOrder() {this.$confirm('確定取消預約嗎, 是否繼續?', '提示', {confirmButtonText: '確定',cancelButtonText: '取消',type: 'warning'}).then(() => {wxApi.cancelOrder(this.orderId).then(resp=>{this.$message.success("取消成功")this.init()})}).catch(() => {this.$message({type: 'info',message: '已取消操作'}); });},

總結

以上是生活随笔為你收集整理的尚医通(二十四)微信退款(取消预约功能)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。