package com.ruoyi.order.event;
|
|
import cn.hutool.http.HttpRequest;
|
import cn.hutool.http.HttpUtil;
|
import cn.hutool.json.JSONUtil;
|
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSONObject;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.ruoyi.account.api.feignClient.AppUserClient;
|
import com.ruoyi.account.api.model.AppUser;
|
import com.ruoyi.order.model.OrderGood;
|
import com.ruoyi.order.service.OrderGoodService;
|
import com.ruoyi.order.service.OrderService;
|
import com.ruoyi.order.vo.delivery.*;
|
import com.ruoyi.other.api.domain.Goods;
|
import com.ruoyi.other.api.domain.Shop;
|
import com.ruoyi.other.api.feignClient.ShopClient;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.context.event.EventListener;
|
import org.springframework.scheduling.annotation.Async;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.Resource;
|
import java.time.OffsetDateTime;
|
import java.time.ZoneOffset;
|
import java.time.format.DateTimeFormatter;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
@RequiredArgsConstructor
|
@Component
|
@Slf4j
|
public class ConfirmDeliveryEventListener {
|
private final OrderService orderService;
|
private final OrderGoodService orderGoodService;
|
@Resource
|
private ShopClient shopClient;
|
@Resource
|
private AppUserClient appUserClient;
|
|
/**
|
* 发货信息同步至微信
|
*/
|
@Async
|
@EventListener(ConfirmDeliveryEvent.class)
|
public synchronized void confirmDelivery(ConfirmDeliveryEvent event) {
|
Long orderId = (Long) event.getSource();
|
Order order = buildOrder(orderId);
|
|
log.info("发货信息同步至微信");
|
// 1. 获取access_token(GET请求)
|
String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential"
|
+ "&appid=wxdeed472c98e42a54"
|
+ "&secret=c89c697c981452480e0781fb82d4284c";
|
|
// 发送GET请求[1](@ref)
|
String tokenResponse = HttpUtil.get(tokenUrl);
|
cn.hutool.json.JSONObject tokenJson = JSONUtil.parseObj(tokenResponse);
|
String accessToken = tokenJson.getStr("access_token");
|
|
|
// 构建请求体(使用Hutool的JSONObject)
|
JSONObject requestBody = new JSONObject();
|
requestBody.put("order_key", order.getOrder_key());
|
requestBody.put("delivery_mode", order.getDelivery_mode());
|
requestBody.put("logistics_type", order.getLogistics_type());
|
requestBody.put("shipping_list", JSON.parseArray(JSONObject.toJSONString(order.getShipping_list())));
|
requestBody.put("upload_time", order.getUpload_time());
|
requestBody.put("payer", JSONObject.parseObject(JSONObject.toJSONString(order.getPayer())));
|
log.info("请求体:" + requestBody);
|
|
// 2. 上传物流信息(POST请求)
|
String logisticsUrl = "https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=" + accessToken;
|
// 发送POST请求[3](@ref)
|
String result = HttpRequest.post(logisticsUrl)
|
.header("Content-Type", "application/json;charset=UTF-8") // 设置请求头[1](@ref)
|
.body(requestBody.toString()) // 设置JSON请求体[3](@ref)
|
.timeout(5000) // 设置超时时间
|
.execute()
|
.body();
|
|
System.out.println("接口返回结果:" + result);
|
}
|
|
public Order buildOrder(Long orderId) {
|
com.ruoyi.order.model.Order tOrder = orderService.getById(orderId);
|
Shop shop = shopClient.getShopById(tOrder.getShopId()).getData();
|
List<OrderGood> orderGoods = orderGoodService.list(new LambdaQueryWrapper<OrderGood>()
|
.eq(OrderGood::getOrderId, orderId));
|
|
|
String expressJson = tOrder.getExpressJson();
|
JSONObject jsonObject = JSONObject.parseObject(expressJson);
|
String com = jsonObject.getString("com");
|
String num = jsonObject.getString("num");
|
|
Order order = new Order();
|
order.setDelivery_mode(1);
|
order.setLogistics_type(1);
|
order.setUpload_time(dateToString(OffsetDateTime.now(ZoneOffset.of("+08:00"))));
|
OrderKey orderKey = new OrderKey();
|
orderKey.setOrder_number_type(2);
|
orderKey.setTransaction_id(tOrder.getSerialNumber());
|
order.setOrder_key(orderKey);
|
|
List<Shipping> shippingList = new ArrayList<>();
|
for (OrderGood orderGood : orderGoods) {
|
Integer orderGoodNum = orderGood.getNum();
|
String goodJson = orderGood.getGoodJson();
|
Goods goods = JSONObject.parseObject(goodJson, Goods.class);
|
String name = goods.getName();
|
Shipping shipping = new Shipping();
|
shipping.setTracking_no(num);
|
shipping.setExpress_company(com);
|
shipping.setItem_desc(name + "*" + orderGoodNum);
|
String phone = maskPhoneNumber(shop.getPhone());
|
Contact contact = new Contact();
|
contact.setConsignor_contact(phone);
|
shipping.setContact(contact);
|
shippingList.add(shipping);
|
}
|
order.setShipping_list(shippingList);
|
|
AppUser appUser = appUserClient.getAppUserById(tOrder.getAppUserId());
|
Payer payer = new Payer();
|
payer.setOpenid(appUser.getWxOpenid());
|
order.setPayer(payer);
|
return order;
|
}
|
|
/**
|
* 将手机号码中间四位替换为掩码
|
* @param phoneNumber 原始手机号码
|
* @return 掩码后的手机号码
|
*/
|
public static String maskPhoneNumber(String phoneNumber) {
|
if (phoneNumber == null || phoneNumber.length() != 11) {
|
throw new IllegalArgumentException("手机号码必须为11位数字");
|
}
|
// 使用正则表达式替换中间四位为****
|
return phoneNumber.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
|
}
|
|
/**
|
* 将时间类型转换成字符串
|
*/
|
public static String dateToString(OffsetDateTime now) {
|
// 获取当前时间,并指定时区偏移为 +08:00
|
// OffsetDateTime now = OffsetDateTime.now(ZoneOffset.of("+08:00"));
|
|
// 定义日期时间格式
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxxx");
|
|
// 将时间格式化为字符串
|
return now.format(formatter);
|
|
}
|
|
}
|