Pu Zhibing
2025-03-18 f615ec5c9239327740948501627545f8e78e2a9e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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);
 
    }
 
}