package com.gxwebsoft.apps.controller; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.digest.DigestUtil; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.gxwebsoft.apps.entity.HualalaFood; import com.gxwebsoft.apps.entity.HualalaShop; import com.gxwebsoft.apps.entity.ItemVo; import com.gxwebsoft.apps.result.*; import com.gxwebsoft.apps.service.HualalaFoodService; import com.gxwebsoft.apps.service.HualalaService; import com.gxwebsoft.apps.service.HualalaShopService; import com.gxwebsoft.common.core.utils.CacheClient; import com.gxwebsoft.common.core.utils.JSONUtil; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.shop.entity.Order; import com.gxwebsoft.shop.entity.OrderGoods; import com.gxwebsoft.shop.param.OrderParam; import com.gxwebsoft.shop.service.OrderGoodsService; import com.gxwebsoft.shop.service.OrderService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.val; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.http.*; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; import static com.gxwebsoft.common.core.constants.OrderConstants.PAY_STATUS_SUCCESS; import static com.gxwebsoft.common.core.constants.RedisConstants.*; /** * 哗啦啦-购物车 * 教程参考 https://blog.csdn.net/qq_34383510/article/details/127824628 * @author 科技小王子 * @since 2022-11-25 12:55:33 */ @Api(tags = "哗啦啦-购物车") @RestController @RequestMapping("/api/apps/hualala-cart") public class HualalaCart extends BaseController { @Resource private StringRedisTemplate stringRedisTemplate; @Resource private CacheClient cacheClient; @Resource private HualalaService hualalaService; @Resource private HualalaFoodService hualalaFoodService; @Resource private OrderService orderService; @Resource private OrderGoodsService orderGoodsService; @Resource private HualalaShopService hualalaShopService; @ApiOperation("我的购物车") @GetMapping() public ApiResult cart(ItemVo param) { String key = getKey(param.getShopId()); return success("查询成功",showCart(key)); } @ApiOperation("添加购物车") @PostMapping("/addCart") public ApiResult addCart(@RequestBody ItemVo param) { String key = getKey(param.getShopId()); cacheClient.hPut(key,param.getFoodId().toString(),JSONUtil.toJSONString(param)); return success("添加成功",showCart(key)); } @ApiOperation("生成订单并清空购物车") @PostMapping("/createOrder") public ApiResult createOrder(@RequestBody Order order){ String key = getKey(order.getShopId().toString()); // 记录当前登录用户id、租户id User loginUser = getLoginUser(); if (loginUser != null) { order.setUserId(loginUser.getUserId()); } order.setMerchantCode(order.getShopId().toString()); order.setPayMethod("通联支付"); if (orderService.save(order)) { // 添加订单商品 List hValues = cacheClient.hValues(key); hValues.forEach(d -> { JSONObject json = JSONObject.parseObject(d.toString()); OrderGoods orderGoods = new OrderGoods(); orderGoods.setOrderId(order.getOrderId()); orderGoods.setGoodsName(json.getString("foodName")); orderGoods.setImageUrl(json.getString("imge")); orderGoods.setTotalNum(Integer.valueOf(json.getString("num"))); orderGoods.setGoodsId(Integer.valueOf(json.getString("foodId"))); orderGoods.setGoodsSkuId(json.getString("foodUnitID")); orderGoods.setUserId(getLoginUserId()); BigDecimal totalPrice = new BigDecimal(json.getString("price")); orderGoods.setTotalPrice(totalPrice); orderGoods.setTenantId(getTenantId()); orderGoodsService.save(orderGoods); }); // 清空购物车 cacheClient.delete(key); return success("订单创建成功",order); } return fail("订单创建失败"); } @ApiOperation("通联支付") @PostMapping("/allinPay") public ApiResult allinPay(@RequestBody Order order){ Order orderInfo = orderService.getById(order.getOrderId()); System.out.println("orderInfo = " + orderInfo); final HualalaShop shop = hualalaShopService.getByIdRel(orderInfo.getShopId()); final String payMerchantNo = shop.getPayMerchantNo(); final String paySecret = shop.getPaySecret(); System.out.println("payMerchantNo = " + payMerchantNo); System.out.println("paySecret = " + paySecret); // 正式接口 String url = "https://interface.allinpaygx.com/api/access/payInterface/unifiedPay"; // 测试接口 // String url = "https://interfacetest.allinpaygx.com/api/access/payInterface/unifiedPay"; // System.out.println("接口地址 = " + url); // map传参数 Map map = new HashMap<>(); // 计算金额 final BigDecimal orderPrice = orderInfo.getOrderPrice().multiply(new BigDecimal(100)); final int amount = Integer.parseInt(orderPrice.stripTrailingZeros().toPlainString()); map.put("merchantNo", payMerchantNo); // 正式商户 // map.put("merchantNo", "113201120053"); // 测试商户:113201120053 map.put("merchantOrderNo", orderInfo.getOrderNo()); map.put("amount",String.valueOf(amount)); map.put("notifyUrl","https://open.gxwebsoft.com/api/apps/hualala-cart/payNotify"); map.put("payType","W06S"); // 附加签名 String sign = getSign(map,paySecret); System.out.println("sign = " + sign); map.put("sign",sign); System.out.println("请求参数 = " + map); String result = HttpUtil.post(url,map); System.out.println("result = " + result); JSONObject resultObj = JSON.parseObject(result); JSONObject payinfo = JSON.parseObject(resultObj.getString("payinfo")); System.out.println("payinfo = " + payinfo); return success("支付参数",payinfo); } public static String getSign(Map treeMap, String paySecret) { // String secret = paySecret; // 正式秘钥 // String secret = "aceb62c896d849c89d1c8b9a4416d1a7"; // 测试秘钥 TreeMap tMap = new TreeMap<>(); for (Map.Entry entry : treeMap.entrySet()) { if (!StrUtil.isEmpty(entry.getValue().toString()) && !entry.getKey().equals("sign")) { tMap.put(entry.getKey(), entry.getValue().toString()); } } StringBuffer buf = new StringBuffer(); for (String key : tMap.keySet()) { buf.append(key).append(treeMap.get(key)); } buf.append(paySecret); System.out.println("buf = " + buf); return DigestUtil.md5Hex(buf.toString()).toUpperCase(); } @ApiOperation("通联支付") @PostMapping("/payNotify") public String payNotify(@RequestParam Map params){ // 支付成功 if (orderService.allinPay(params)) { return "success"; } return "error"; } @ApiOperation("交易查询") @PostMapping("/findOrderInfo") public ApiResult findOrderInfo(@RequestBody Order order){ final Order data = orderService.getByOutTradeNo(order.getOrderNo().toString()); return success("查询结果",data); } // 获取Key private String getKey(String shopId) { return HLL_CART_FOOD_KEY.concat(shopId).concat(":").concat(getLoginUserId().toString()); } private OperateVo showCart(String key){ // 获取购物车数据 List values = cacheClient.hValues(key); // System.out.println("values = " + values); List collect = values.stream().map(item -> JSONUtil.parseObject(JSONUtil.toJSONString(item), ItemVo.class)).collect(Collectors.toList()); // System.out.println("collect = " + collect); // 封装数据结果 OperateVo operateVo = new OperateVo(); operateVo.setTotalNum(0); operateVo.setTotalPrice(BigDecimal.valueOf(0)); operateVo.setItems(collect); collect.forEach(d -> { // System.out.println("operateVo.getTotalNum() + d.getNum() = " + operateVo.getTotalNum() + d.getNum()); operateVo.setTotalNum(operateVo.getTotalNum()+d.getNum()); operateVo.setTotalPrice(operateVo.getTotalPrice().add(d.getPrice().multiply(BigDecimal.valueOf(d.getNum())))); }); // System.out.println("operateVo = " + operateVo); return operateVo; } @ApiOperation("通联支付2") @PostMapping("/test") public ApiResult test(){ final Order order = orderService.getByOutTradeNo("2023030149684157"); order.setPayStatus(PAY_STATUS_SUCCESS); order.setPayPrice(order.getTotalPrice()); orderService.updateById(order); return success("成功",order); } }