import { Inject, Provide } from '@midwayjs/core'; import axios from 'axios'; import dayjs = require('dayjs'); import utc = require('dayjs/plugin/utc'); import timezone = require('dayjs/plugin/timezone'); // 扩展dayjs功能 dayjs.extend(utc); dayjs.extend(timezone); // Wintopay 物流更新请求接口 interface LogisticsUpdateRequest { trade_id: string; // 订单的流水号 track_number: string; // 物流单号 track_brand: string; // 物流公司编号 } // Wintopay 物流更新响应接口 interface LogisticsUpdateResponse { code: string; message: string; data: { trade_id: string; track_brand: string; track_number: string; time: number; }; error: any; request_id: string; } @Provide() export class WintopayService { @Inject() logger; // 默认配置 private config = { //测试环境配置,在生产环境记得换掉 apiBaseUrl: 'https://stage-merchant-api.wintopay.com', Authorization: 'Bearer kV8w1er8dFw9p9g2kb0mer398hD8hfWk', }; // 发送请求 private async sendRequest(url: string, data: any): Promise { try { const headers = { 'Content-Type': 'application/json', 'Authorization': this.config.Authorization, }; // 发送请求 - 临时禁用SSL证书验证以解决UNABLE_TO_VERIFY_LEAF_SIGNATURE错误 const response = await axios.post( `${this.config.apiBaseUrl}${url}`, data, { headers, httpsAgent: new (require('https').Agent)({ rejectUnauthorized: false }) } ); return response.data; } catch (error) { this.logger.error('Wintopay API请求失败:', error); throw error; } } /** * 更新订单物流信息 * @param params 物流更新参数 * @returns 物流更新响应 */ async logisticsUpdate(params: LogisticsUpdateRequest): Promise { try { this.logger.info('开始更新物流信息:', params); const response = await this.sendRequest('/v1/logistics/update', params); this.logger.info('物流更新成功:', response); return response; } catch (error: any) { this.logger.error('物流更新失败:', error); // 处理API返回的错误 if (error.response?.data) { throw new Error(`物流更新失败: ${error.response.data.message || '未知错误'}`); } throw new Error(`物流更新请求失败: ${error.message || '网络错误'}`); } } }