using AllBase; using AllBase.Model.Result; using AllBase.Model.Param.WXParam; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; namespace Work.Api.Wx { /// 微信小店销售、评分及物流统计接口;独立于原窗体,使用 HttpHelper 发送请求。 /// 传入原 ShopLoginInfo 登录信息;方法同步执行,界面调用请置于后台任务。返回原始正文,不自动登录、重试或解释业务状态。 public static class WxStatisticsApi { /// 查询影响商品质量评分的退款订单明细。 /// 店铺登录信息;Cookies 为原程序保存的 CefSharp.Cookie 列表 JSON,图片上传还需 openid。 /// 页码,从 1 开始;部分接口仅用于页面 Referer。 /// 统计开始时间的 Unix 秒时间戳。 /// 统计结束时间的 Unix 秒时间戳。 /// 微信接口原始 JSON 正文;传输或登录参数配置失败可能返回错误文字。调用方须验证响应格式和业务状态,不能仅以非空判断成功。 /// /// 来源:TEMUKJD\WXForms\ShopForms\WXShopOptimizeForm.cs,ShopOptimize.GetProductRefundOrder。 /// 原方法中直接拼接的 ID、JSON 数值片段应按上述格式传入;不会自动转义或转换单位。参数模型构造或序列化失败会向调用方抛出异常。 /// public static string GetProductRefundOrder(ShopLoginInfo shop, int pageId, int beginTick, int endTick) { string url = "https://store.weixin.qq.com/shop-faas/statistic/dsr/product/refund/order?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/setting/ratedetail?type=product&key=productQualityRatio_30d&detail=product"; string body = @"{""page"":" + pageId + @",""pageSize"":20,""beginTs"":" + beginTick + @",""endTs"":" + endTick + @"}"; var result = WxHttpClient.Post(shop, url, body, referer); return result; } /// 查询指定时间范围内的商品评价。 /// 店铺登录信息;Cookies 为原程序保存的 CefSharp.Cookie 列表 JSON,图片上传还需 openid。 /// 页码,从 1 开始;部分接口仅用于页面 Referer。 /// 统计开始时间的 Unix 秒时间戳。 /// 统计结束时间的 Unix 秒时间戳。 /// 微信接口原始 JSON 正文;传输或登录参数配置失败可能返回错误文字。调用方须验证响应格式和业务状态,不能仅以非空判断成功。 /// /// 来源:TEMUKJD\WXForms\ShopForms\WXShopOptimizeForm.cs,ShopOptimize.GetProductEvaluation。 /// 原方法中直接拼接的 ID、JSON 数值片段应按上述格式传入;不会自动转义或转换单位。参数模型构造或序列化失败会向调用方抛出异常。 /// public static string GetProductEvaluation(ShopLoginInfo shop, int pageId, int beginTick, int endTick) { string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradeevaluation/cgi/search?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/evaluate/home"; string body = @"{""orderId"":"""",""productId"":"""",""productEvaluationId"":"""",""buyerEvaluationTimeStart"":" + beginTick + @",""buyerEvaluationTimeEnd"":" + endTick + @",""status"":2,""page"":" + pageId + @",""visibleType"":0}"; var result = WxHttpClient.Post(shop, url, body, referer); return result; } /// 查询店铺评分项目,供业务方判断使用 24 小时或 48 小时揽收指标。 /// 店铺登录信息;Cookies 为原程序保存的 CefSharp.Cookie 列表 JSON,图片上传还需 openid。 /// 微信接口原始 JSON 正文;传输或登录参数配置失败可能返回错误文字。调用方须验证响应格式和业务状态,不能仅以非空判断成功。 /// /// 来源:TEMUKJD\WXForms\ShopForms\WXShopOptimizeForm.cs,ShopOptimize.Get24H48HFlag。 /// 原方法中直接拼接的 ID、JSON 数值片段应按上述格式传入;不会自动转义或转换单位。参数模型构造或序列化失败会向调用方抛出异常。 /// public static string Get24H48HFlag(ShopLoginInfo shop) { string url = "https://store.weixin.qq.com/shop-faas/statistic/cgi/search?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/setting/rate2"; string body = "{\"days\":14,\"scoreTypeList\":[63,1000]}"; var result = WxHttpClient.Post(shop, url, body, referer); return result; } /// 查询影响揽收及时率的订单明细。 /// 店铺登录信息;Cookies 为原程序保存的 CefSharp.Cookie 列表 JSON,图片上传还需 openid。 /// 页码,从 1 开始;部分接口仅用于页面 Referer。 /// 统计开始时间的 Unix 秒时间戳。 /// 统计结束时间的 Unix 秒时间戳。 /// 是否使用 24 小时揽收相关页面上下文;false 使用 48 小时上下文。 默认值:false。 /// 微信接口原始 JSON 正文;传输或登录参数配置失败可能返回错误文字。调用方须验证响应格式和业务状态,不能仅以非空判断成功。 /// /// 来源:TEMUKJD\WXForms\ShopForms\WXShopOptimizeForm.cs,ShopOptimize.GetProductOrderWayBill。 /// 原方法中直接拼接的 ID、JSON 数值片段应按上述格式传入;不会自动转义或转换单位。参数模型构造或序列化失败会向调用方抛出异常。 /// public static string GetProductOrderWayBill(ShopLoginInfo shop, int pageId, int beginTick, int endTick, bool is24 = false) { string url = "https://store.weixin.qq.com/shop-faas/statistic/dsr/logistics/pickup/insale?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/setting/ratedetail?type=logistics&key=collectIn_48hOrdRatio_30d&valid=collectIn_48hOrdRatio_30d|waybillArriveOntimeRatio_30d|waybillNegtiveOrdRatio_30d&detail=insale"; if (is24) referer = "https://store.weixin.qq.com/shop/setting/ratedetail?type=logistics&key=collectIn_24hOrdRatio_30d&valid=collectIn_24hOrdRatio_30d|waybillArriveOntimeRatio_30d|waybillNegtiveOrdRatio_30d&detail=insale"; string body = @"{""page"":" + pageId + @",""pageSize"":20,""beginTs"":" + beginTick + @",""endTs"":" + endTick + @"}"; var result = WxHttpClient.Post(shop, url, body, referer); return result; } /// 查询物流轨迹及时率订单明细,沿用原统计查询协议。 /// 店铺登录信息;Cookies 为原程序保存的 CefSharp.Cookie 列表 JSON,图片上传还需 openid。 /// 页码,从 1 开始;部分接口仅用于页面 Referer。 /// 预期的开始时间(Unix 毫秒);原实现未使用此值,见 remarks。 /// 结束时间(Unix 毫秒);原实现同时用于 startMs 和 endMs。 /// 是否使用 24 小时揽收相关页面上下文;false 使用 48 小时上下文。 默认值:false。 /// 微信接口原始 JSON 正文;传输或登录参数配置失败可能返回错误文字。调用方须验证响应格式和业务状态,不能仅以非空判断成功。 /// /// 来源:TEMUKJD\WXForms\ShopForms\WXShopOptimizeForm.cs,ShopOptimize.GetOrderLinerCgi。 /// 保留旧行为:startMs 与 endMs 均取 endTick;需要修正时间范围时应单独确认业务影响。 /// 原方法中直接拼接的 ID、JSON 数值片段应按上述格式传入;不会自动转义或转换单位。参数模型构造或序列化失败会向调用方抛出异常。 /// public static string GetOrderLinerCgi(ShopLoginInfo shop, int pageId, long beginTick, long endTick, bool is24 = false) { // shortcut: 保留旧代码 startMs 取 endTick 的行为,业务确认时间范围修正后再改为 beginTick。 string url = "https://store.weixin.qq.com/shop-faas/mmecnodelinercgi/cgi/liner/query?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/setting/ratedetail?type=logistics&key=waybillArriveOntimeRatio_30d&valid=collectIn_48hOrdRatio_30d|waybillArriveOntimeRatio_30d|waybillNegtiveOrdRatio_30d"; if (is24) referer = "https://store.weixin.qq.com/shop/setting/ratedetail?type=logistics&key=waybillArriveOntimeRatio_30d&valid=collectIn_24hOrdRatio_30d|waybillArriveOntimeRatio_30d|waybillNegtiveOrdRatio_30d"; string body = @"{""time_query"":{""dateFormat"":2,""dateType"":0,""dateRange"":30,""startMs"":" + endTick + @",""endMs"":" + endTick + @"},""limit"":10,""offset"":" + (Math.Max(0, pageId - 1) * 10) + @",""id"":""ratedetail-wuliu-route-order-table"",""biz"":""store"",""is_std"":""0"",""sort"":[""std_route_rate"",""desc""]}"; var result = WxHttpClient.Post(shop, url, body, referer); return result; } /// 查询物流负向反馈订单明细。 /// 店铺登录信息;Cookies 为原程序保存的 CefSharp.Cookie 列表 JSON,图片上传还需 openid。 /// 页码,从 1 开始。 /// 统计开始时间的 Unix 秒时间戳。 /// 统计结束时间的 Unix 秒时间戳。 /// 是否使用 24 小时揽收相关页面上下文;false 使用 48 小时上下文。 默认值:false。 /// 微信接口原始 JSON 正文;传输或登录参数配置失败可能返回错误文字。调用方须验证响应格式和业务状态,不能仅以非空判断成功。 /// /// 来源:TEMUKJD\WXForms\ShopForms\WXShopOptimizeForm.cs,ShopOptimize.GetFeedbackOrder。 /// 原方法中直接拼接的 ID、JSON 数值片段应按上述格式传入;不会自动转义或转换单位。参数模型构造或序列化失败会向调用方抛出异常。 /// public static string GetFeedbackOrder(ShopLoginInfo shop, int page, int beginTs, int endTs, bool is24 = false) { string url = "https://store.weixin.qq.com/shop-faas/statistic/dsr/logistics/feedback/order?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/setting/ratedetail?type=logistics&key=waybillNegtiveOrdRatio_30d&valid=collectIn_48hOrdRatio_30d|waybillArriveOntimeRatio_30d|waybillNegtiveOrdRatio_30d&detail=company"; if (is24) referer = "https://store.weixin.qq.com/shop/setting/ratedetail?type=logistics&key=waybillNegtiveOrdRatio_30d&valid=collectIn_24hOrdRatio_30d|waybillArriveOntimeRatio_30d|waybillNegtiveOrdRatio_30d&detail=company"; string body = @"{""page"":" + page + @",""pageSize"":20,""beginTs"":" + beginTs + @",""endTs"":" + endTs + @"}"; var result = WxHttpClient.Post(shop, url, body, referer); return result; } /// 查询店铺首页待办数量,包括待发货、售后和物流异常等。 /// 店铺登录信息;Cookies 为原程序保存的 CefSharp.Cookie 列表 JSON,图片上传还需 openid。 /// 微信接口原始 JSON 正文;传输或登录参数配置失败可能返回错误文字。调用方须验证响应格式和业务状态,不能仅以非空判断成功。 /// /// 来源:TEMUKJD\WXForms\ShopForms\WxShopStatisticsForm.cs,WxShopStatisticsForm.GetShopMainInfoList。 /// 原方法中直接拼接的 ID、JSON 数值片段应按上述格式传入;不会自动转义或转换单位。参数模型构造或序列化失败会向调用方抛出异常。 /// public static string GetShopMainInfoList(ShopLoginInfo shop) { string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradehome/home/main?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/home"; var result = WxHttpClient.Get(shop, url, referer); return result; } /// 查询指定时间范围内的离线销售统计。 /// 店铺登录信息;Cookies 为原程序保存的 CefSharp.Cookie 列表 JSON,图片上传还需 openid。 /// 统计开始时间的 Unix 毫秒时间戳。 /// 统计结束时间的 Unix 毫秒时间戳。 /// 微信接口原始 JSON 正文;传输或登录参数配置失败可能返回错误文字。调用方须验证响应格式和业务状态,不能仅以非空判断成功。 /// /// 来源:TEMUKJD\WXForms\ShopForms\WxShopStatisticsForm.cs,WxShopStatisticsForm.GetShopSaleInfoList。 /// 原方法中直接拼接的 ID、JSON 数值片段应按上述格式传入;不会自动转义或转换单位。参数模型构造或序列化失败会向调用方抛出异常。 /// public static string GetShopSaleInfoList(ShopLoginInfo shop, long startTime, long endTime) { string url = "https://store.weixin.qq.com/shop-faas/mmecnodelinercgi/cgi/liner_query/3/home-overview-shop-offline?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/home"; string data = @"{""time_query"":{""dateFormat"":2,""dateType"":0,""dateRange"":7,""startMs"":" + startTime + @",""endMs"":" + endTime + "}}"; var result = WxHttpClient.Post(shop, url, data, referer); return result; } /// 查询指定时间范围内的实时销售统计。 /// 店铺登录信息;Cookies 为原程序保存的 CefSharp.Cookie 列表 JSON,图片上传还需 openid。 /// 统计开始时间的 Unix 毫秒时间戳。 /// 统计结束时间的 Unix 毫秒时间戳。 /// 微信接口原始 JSON 正文;传输或登录参数配置失败可能返回错误文字。调用方须验证响应格式和业务状态,不能仅以非空判断成功。 /// /// 来源:TEMUKJD\WXForms\ShopForms\WxShopStatisticsForm.cs,WxShopStatisticsForm.GetShopSaleInfoRealTimeList。 /// 原方法中直接拼接的 ID、JSON 数值片段应按上述格式传入;不会自动转义或转换单位。参数模型构造或序列化失败会向调用方抛出异常。 /// public static string GetShopSaleInfoRealTimeList(ShopLoginInfo shop, long startTime, long endTime) { string url = "https://store.weixin.qq.com/shop-faas/mmecnodelinercgi/cgi/liner_query/3/home-overview-shop-realtime?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/home"; string data = @"{""time_query"":{""dateFormat"":1,""dateType"":0,""dateRange"":1,""startMs"":" + startTime + @",""endMs"":" + endTime + "}}"; var result = WxHttpClient.Post(shop, url, data, referer); return result; } /// 查询店铺首页评分等次要统计信息。 /// 店铺登录信息;Cookies 为原程序保存的 CefSharp.Cookie 列表 JSON,图片上传还需 openid。 /// 微信接口原始 JSON 正文;传输或登录参数配置失败可能返回错误文字。调用方须验证响应格式和业务状态,不能仅以非空判断成功。 /// /// 来源:TEMUKJD\WXForms\ShopForms\WxShopStatisticsForm.cs,WxShopStatisticsForm.GetShopScore。 /// 原方法中直接拼接的 ID、JSON 数值片段应按上述格式传入;不会自动转义或转换单位。参数模型构造或序列化失败会向调用方抛出异常。 /// public static string GetShopScore(ShopLoginInfo shop) { string url = "https://store.weixin.qq.com/shop-faas/mmchannelstradehome/home/minor?token=&lang=zh_CN"; string referer = "https://store.weixin.qq.com/shop/home"; var result = WxHttpClient.Get(shop, url, referer); return result; } } }