当前位置:   article > 正文

无人自助棋牌室系统使用Redis消息队列实现充值升级会员及开卡赠礼_无人棋牌室uniapp

无人棋牌室uniapp

本文将介绍如何利用Spring Boot与Redis结合实现消息队列的在实际业务中实践。

   具体场景描述步骤如下:

            用户在自助棋牌室小程序上充值支付后

            调用后台服务端接口首先添加用户充值订单为待支付状态

            调用微信支付接口,支付成功后,微信回调方法设置(充值订单为已支付、添加用户余额、同时发送消息队列通知升级会员、开卡赠礼)

  先视频看下效果吧,有个感观了解

无人自助棋牌室系统实现充值升级会员及开卡赠礼

后台设置会员等级效果

后台设置升级会员开卡效果

  程序开发实现步骤如下:

  1、用户在小程序充值,小程序使用uniapp开发

  1. // 充值提交
  2. confirmRechargeMoney(){
  3. let that = this
  4. if(this.topUpList.length<=0){
  5. uni.showToast({
  6. title: '商家未设置充值信息',
  7. icon: 'none',
  8. duration: 2000,
  9. })
  10. }else{
  11. let doRechargeParam = {
  12. storeId:this.storeId,
  13. userId:this.userInfo.uid,
  14. rechargeAmount:this.rechargeAmount
  15. }
  16. doRecharge(doRechargeParam).then(res => {
  17. var payment = res.data.payment;
  18. weappPay(payment)
  19. .then(() => {
  20. this.$yrouter.back();
  21. })
  22. })
  23. }
  24. },

  2、调用后台服务端接口

  1. export function doRecharge(data) {
  2. return request.post("/balance/doRecharge", data, {
  3. login: true
  4. });
  5. }

  3、后台服务端添加用户充值订单为待支付状态

  1. /**
  2. * 充值余额
  3. */
  4. @AppLog(value = "充值余额", type = 1)
  5. //@AuthCheck
  6. @PostMapping("/balance/doRecharge")
  7. @ApiOperation(value = "充值余额", notes = "充值余额")
  8. public ApiResult<Map<String, Object>> doRecharge(HttpServletRequest request, @RequestBody TBalanceParam param) {
  9. //Integer storeId = request.getHeader("storeId") == null ? 0 : Integer.parseInt(request.getHeader("storeId"));
  10. // Integer userId = Integer.parseInt(param.get("userId").toString());
  11. Integer storeId = param.getStoreId();
  12. Integer userId = param.getUserId();
  13. Map<String, Object> data = new HashMap();
  14. // String rechargeAmount = param.get("rechargeAmount") == null ? "" : param.get("rechargeAmount").toString();
  15. //String customAmount = param.get("customAmount") == null ? "" : param.get("customAmount").toString();
  16. String rechargeAmount = param.getRechargeAmount();
  17. String customAmount = param.getCustomAmount();
  18. if (StringUtil.isEmpty(rechargeAmount) && StringUtil.isEmpty(customAmount)) {
  19. //return getFailureResult(2000, "请确认充值金额");
  20. //throw new YshopException("请确认充值金额");
  21. return ApiResult.fail(ErrorEnum.E_100028.getErrorMsg(), data);
  22. }
  23. // 充值赠送金额
  24. String ruleParam = "";
  25. MtSetting mtSetting = mtSettingService.querySettingByName(BalanceSettingEnum.RECHARGE_RULE.getKey(), storeId);
  26. if (StringUtil.isNotEmpty(rechargeAmount) && mtSetting != null) {
  27. if (mtSetting.getValue() != null && StringUtil.isNotEmpty(mtSetting.getValue())) {
  28. String rules[] = mtSetting.getValue().split(",");
  29. for (String rule : rules) {
  30. String amountArr[] = rule.split("_");
  31. if (amountArr.length == 2) {
  32. if (amountArr[0].equals(rechargeAmount)) {
  33. ruleParam = rule;
  34. break;
  35. }
  36. }
  37. }
  38. }
  39. }
  40. // 自定义充值没有赠送金额
  41. if (StringUtil.isEmpty(rechargeAmount)) {
  42. rechargeAmount = customAmount;
  43. ruleParam = customAmount + "_0";
  44. }
  45. if (StringUtil.isEmpty(ruleParam)) {
  46. ruleParam = rechargeAmount + "_0";
  47. }
  48. MtStore mtStore = storeService.queryStoreById(storeId);
  49. BigDecimal amount = new BigDecimal(rechargeAmount);
  50. OrderDto orderDto = new OrderDto();
  51. orderDto.setType(OrderTypeEnum.RECHARGE.getKey());
  52. orderDto.setUserId(userId);
  53. orderDto.setStoreId(storeId);
  54. orderDto.setAmount(amount);
  55. orderDto.setUsePoint(0);
  56. if(mtStore!=null){
  57. orderDto.setRemark(mtStore.getName()+"会员充值");
  58. }else{
  59. orderDto.setRemark("平台通用会员充值");
  60. }
  61. orderDto.setParam(ruleParam);
  62. orderDto.setStatus(OrderStatusEnumV.CREATED.getKey());
  63. orderDto.setPayStatus(PayStatusEnum.WAIT.getKey());
  64. orderDto.setPointAmount(new BigDecimal("0"));
  65. orderDto.setOrderMode("");
  66. orderDto.setCouponId(0);
  67. MtOrder orderInfo = mtOrderService.saveOrder(orderDto);
  68. YxUser user = userService.getById(userId);
  69. String ip = CommonUtilV.getIPFromHttpRequest(request);
  70. BigDecimal pay = amount.multiply(new BigDecimal("100"));
  71. orderInfo.setPayType(PayTypeEnumV.JSAPI.getKey());
  72. ResponseObject paymentInfo = weixinService.createPrepayOrder(user, orderInfo, (pay.intValue()), "", 0, ip, PlatformTypeEnum.MP_WEIXIN.getCode());
  73. //ResponseObject paymentInfo = weixinService.createPrepayOrder(user, orderInfo, pay, "", 0, ip,PlatformTypeEnum.MP_WEIXIN.getCode());
  74. if (paymentInfo.getData() == null) {
  75. //return getFailureResult(201, "抱歉,发起支付失败");
  76. return ApiResult.fail(ErrorEnum.E_100029.getErrorMsg(), data);
  77. }
  78. Object payment = paymentInfo.getData();
  79. data.put("payment", payment);
  80. data.put("orderInfo", orderInfo);
  81. return ApiResult.ok(data);
  82. }

  注:weixinService.createPrepayOrder为微信支付方式

 4、微信回调方法-充值订单为已支付、添加用户余额

  1. /**
  2. * 支付回调
  3. */
  4. @RequestMapping(value = "/pay/weixinCallback", method = RequestMethod.POST)
  5. @CrossOrigin
  6. public void weixinCallback(HttpServletRequest request, HttpServletResponse response) throws Exception {
  7. log.info("微信支付结果回调....");
  8. Map<String, String> inParams = weixinService.processResXml(request);
  9. log.info("微信返回Map:" + inParams);
  10. if (!CollectionUtils.isEmpty(inParams)) {
  11. String orderSn = inParams.get("out_trade_no");// 商户订单号
  12. String orderId = inParams.get("transaction_id");// 微信订单号
  13. String tranAmt = inParams.get("total_fee");// 交易金额
  14. BigDecimal tranAmount = new BigDecimal(tranAmt).divide(new BigDecimal("100"), BigDecimal.ROUND_CEILING);
  15. // 参数校验
  16. if (StringUtil.isNotEmpty(orderSn) && StringUtil.isNotEmpty(tranAmt) && StringUtil.isNotEmpty(orderId)) {
  17. UserOrderDto orderInfo = mtOrderService.getOrderByOrderSn(orderSn);
  18. if (orderInfo != null) {
  19. //MtStore storeInfo = orderInfo.getStoreInfo();
  20. String callbackUrl = this.getApiUrl() + "/api/pay/weixinCallback";
  21. WXPayConfigImpl wxPayConfig = WXPayConfigImpl.getInstance(callbackUrl, orderInfo.getStoreId(), redisUtils, storeService);
  22. //WXPayConfigImpl wxPayConfig = WXPayConfigImpl.getInstance(env, storeInfo == null ? 0 : storeInfo.getId(), storeService);
  23. boolean valid = WXPayUtil.isSignatureValid(inParams, wxPayConfig.getKey());
  24. /* if (!valid) {
  25. log.error("微信支付回调接口验签失败");
  26. return;
  27. }*/
  28. // 订单金额
  29. BigDecimal payAmount = orderInfo.getPayAmount();
  30. int compareFlag = tranAmount.compareTo(payAmount);
  31. if (true) { // compareFlag == 0,测试暂时去掉
  32. if (orderInfo.getStatus().equals(OrderStatusEnumV.CREATED.getKey())) {
  33. boolean flag = weixinService.paymentCallback(orderInfo);
  34. log.info("回调结果:" + flag);
  35. if (flag) {
  36. weixinService.processRespXml(response, true);
  37. } else {
  38. weixinService.processRespXml(response, false);
  39. }
  40. } else {
  41. log.error("订单{}已经支付,orderInfo.getStatus() = {}, CREATED.getKey() = {}", orderSn, orderInfo.getStatus(), OrderStatusEnumV.CREATED.getKey());
  42. }
  43. } else {
  44. log.error("回调金额与支付金额不匹配 tranAmount = {}, payAmount = {}, compareFlag = {}", tranAmount, orderInfo.getPayAmount(), compareFlag);
  45. }
  46. } else {
  47. log.error("支付订单{}对应的信息不存在", orderSn);
  48. }
  49. }
  50. }
  51. }

 5、微信回调方法-同时发送消息队列通知升级会员、开卡赠礼

   以下是关键代码步骤片段

  1. // redis发送消息队列,充值升级会员等级,享受预约下单折扣,并有开卡赠礼(赠券)
  2. PublishMessage publishMessage = new PublishMessage();
  3. publishMessage.setMsgType(2);
  4. publishMessage.setStoreId(orderInfo.getStoreId());
  5. publishMessage.setUserId(orderInfo.getUserId());
  6. redisSqueueService.doSomethingAndPublishMessage(publishMessage);

 doSomethingAndPublishMessage()方法时,消息将被发布到Redis的消息队列中,并由订阅者接收和处理

  1. @Service
  2. public class RedisSqueueService {
  3. private final MessagePublisher messagePublisher;
  4. public RedisSqueueService(MessagePublisher messagePublisher) {
  5. this.messagePublisher = messagePublisher;
  6. }
  7. public void doSomethingAndPublishMessage(PublishMessage publishMessage) {
  8. // 执行一些操作
  9. // String message = uid.toString();
  10. messagePublisher.publishMessage(publishMessage);
  11. }
  12. }
消息订阅者接收消息,进行升级会员、开卡赠礼
  1. @Override
  2. public void onMessage(Message message, byte[] pattern) {
  3. // 获取消息
  4. byte[] messageBody = message.getBody();
  5. // 使用值序列化器转换
  6. Object msg = redisTemplate.getValueSerializer().deserialize(messageBody);
  7. PublishMessage publishMessage = (PublishMessage)msg;
  8. // 添加新注册用户赠送卡券
  9. if(publishMessage.getMsgType()==1){
  10. Integer userId = publishMessage.getUserId();
  11. MtCoupon coupon = new MtCoupon();
  12. // 是否新注册赠送,A:是;D:否
  13. coupon.setIsNewGive("A");
  14. List<MtCoupon> list = couponService.queryCouponListByCondi(coupon);
  15. if(list!=null && list.size()>0){
  16. for(MtCoupon mtCoupon:list){
  17. if(mtCoupon.getStoreIds()!=null||!"".equals(mtCoupon.getStoreIds())){
  18. String[] storeIds = mtCoupon.getStoreIds().split(",");
  19. for(String storeId : storeIds){
  20. couponService.sendCoupon(mtCoupon.getId(), 1 , userId, Integer.parseInt(storeId));
  21. }
  22. }
  23. }
  24. }
  25. // 充值升级会员等级,享受预约下单折扣,并有开卡赠礼(赠券)
  26. }else if (publishMessage.getMsgType()==2){
  27. LambdaQueryWrapper<MtUserGrade> lambdaQueryWrapper = Wrappers.lambdaQuery();
  28. lambdaQueryWrapper.eq(MtUserGrade::getStatus, StatusEnum.ENABLED.getKey());
  29. lambdaQueryWrapper.orderByDesc(MtUserGrade::getId);
  30. List<MtUserGrade> dataList = mtUserGradeMapper.selectList(lambdaQueryWrapper);
  31. log.info("dataList.size():"+dataList.size());
  32. if(dataList!=null){
  33. for (MtUserGrade item : dataList) {
  34. // 升级方式是充值获取的
  35. if(item.getCatchType().equals(UserGradeCatchTypeEnum.RECHARGE.getKey())){
  36. log.info(" openGiftService.openGift");
  37. openGiftService.openGift(
  38. publishMessage.getUserId(),
  39. item.getId(),
  40. false,
  41. publishMessage.getStoreId());
  42. }
  43. }
  44. }
  45. }
  46. }

具体Redis消息队列基础实现说明,在无人自助系统使用Redis消息队列实现新用户注册送券 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/601931
推荐阅读
相关标签
  

闽ICP备14008679号