feat(mp-java): hjc 小程序接入链、微信接入自检、首页轮播与一站式出向推送

hjc 包的进展(按 AGENTS.md 约定,改动集中在 hjc 包内):

- HjcWechatController 新增三接口:
  - GET  /api/hjc/wechat/readiness  管理员自检,逐项报告小程序/公众号/支付/serverUrl
    是否配好、支付 appId 与小程序 appId 是否一致;?probe=true 实调微信验证 appSecret
    (失败只记日志、不抛异常)。appId 与商户号在 detail 里打码,appSecret 永不输出。
  - GET  /api/hjc/wechat/mp-appid   只回 appId,供 H5 渲染开放标签(不含密钥)。
  - POST /api/hjc/wechat/mp-login   uni.login 的 code 换小程序 openid/unionid;匿名放行,
    租户取 HjcAuthProperties 的配置值而非可伪造的请求头。
  配套 HjcWechatReadinessUtil(含单测)与 HjcWechatController 的两套配置读取:
  公众号 cache{t}:setting:wx-official、小程序 mp-weixin:{t} → setting:mp-weixin:{t} →
  跨库回源 gxwebsoft_core.sys_setting。
- HjcBannerController / Service / ServiceImpl / Mapper(+XML) / HjcBannerVo:只读
  GET /api/hjc/banner/list,按租户 + position + 启用状态 + 生效时间窗口过滤 CMS
  轮播组并扁平化;租户隔离交给 MyBatis-Plus 租户拦截器,不改 cms 及其他项目代码。
  配套 HjcBannerApiTest(最小上下文 MockMvc,含不串租户与位置过滤)。
- 一站式出向推送:CreatePurchaseDetails 补退款字段,HjcOrder 补 refund_time /
  refund_reason(配套 hjc_order_add_refund.sql 与 hjc_init.sql),HjcBizServiceImpl
  在 REFUNDED 时把退款时间与原因一并推送;配套推送报文单测。
- 共享文件 SecurityConfig.java 仅追加一行:匿名放行 /api/hjc/wechat/mp-login
  (注册页证件上传与 OCR 早先已放行)。这是本包唯一改到 common 的地方。
- 文档:CONTEXT.md、docs/一站式平台对接-接口文档.md。

**不含** scripts/hjc_test_push_out.py:该联调探针脚本内含与 HjcOneStopAuthUtil.java
相同的 APP_KEY / PASSWORD 明文,按此前排查记录「不得提交」处理,保留在工作区未跟踪。
This commit is contained in:
2026-09-14 19:01:47 +08:00
parent b2b1a1bdf9
commit 2cd60270b9
21 changed files with 1124 additions and 16 deletions
+36 -1
View File
@@ -112,7 +112,10 @@ POST {一站式BaseUrl}/api/biz/createPurchaseDetails
### 3.2 触发时机
- **支付成功后**(官方网 `PUT /api/hjc/order/mark-paid` 置已付)自动推送,请求状态 `status=PAID`
- **退款时**(官方网 `POST /api/hjc/order/refund` 置已退款)推送,请求状态 `status=REFUNDED`
- **退款时**(官方网 `POST /api/hjc/order/refund` 置已退款)推送,请求状态 `status=REFUNDED`**必须**携带 `refundTime`(退款时间)与 `refundReason`(退款原因)
- `refundTime`:官方网记录退款动作发生时间(服务器时间),落库 `hjc_order.refund_time`
- `refundReason`:后台退款弹窗填写(≤200 字),落库 `hjc_order.refund_reason`;未填写时取默认「管理员操作退款」。
- 推送失败进重试队列后,重试报文的退款时间/原因按订单落库值重建,不会丢失。
### 3.3 请求头
@@ -144,6 +147,8 @@ POST {一站式BaseUrl}/api/biz/createPurchaseDetails
| `paidAt` | string | 支付时间 `yyyy-MM-dd HH:mm:ss` |
| `payMethod` | string | `WECHAT_NATIVE` / `ALIPAY` |
| `status` | string | `PAID`(已支付)/ `REFUNDED`(已退款) |
| `refundTime` | string | **退款时必传**,退款时间 `yyyy-MM-dd HH:mm:ss``status=REFUNDED` 时推送,其余状态不出现在报文中) |
| `refundReason` | string | **退款时必传**,退款原因(≤255 字符;后台未填写时取默认「管理员操作退款」) |
| `invoiceStatus` | string | `NONE` / `APPLIED` / `ISSUED` |
请求体示例:
@@ -171,6 +176,33 @@ POST {一站式BaseUrl}/api/biz/createPurchaseDetails
}
```
退款推送请求体示例(`status=REFUNDED`,多出 `refundTime`/`refundReason`):
```json
{
"idempotencyKey": "HJC_ORD_HJC2026080101ABCD",
"orderNo": "HJC2026080101ABCD",
"projectNo": "ZB-2026-0001",
"projectName": "xxx采购项目",
"tenderPrice": 500.00,
"quantity": 1,
"totalAmount": 500.00,
"buyer": {
"enterpriseName": "某某科技有限公司",
"creditCode": "91110XXXX",
"contactName": "张三",
"contactPhone": "13800000000",
"contactEmail": "a@b.com"
},
"paidAt": "2026-08-01 10:30:00",
"payMethod": "WECHAT_NATIVE",
"status": "REFUNDED",
"refundTime": "2026-08-03 09:15:00",
"refundReason": "项目终止,客户申请退款",
"invoiceStatus": "NONE"
}
```
### 3.5 响应约定
- 一站式按自身 `API` 返回;官方网侧把 `HTTP 2xx` 视为成功,否则记入推送日志(`hjc_order_push_log`)待重试。
@@ -201,6 +233,8 @@ POST {一站式BaseUrl}/api/biz/createPurchaseDetails
| `fileList` | 公告附件 | `bulletin_file_list` |
| `needSellTender` | 是否卖标书 | `need_sell` |
| `sellingMethod` | 售卖方式 | `selling_method` |
| `refundTime` | 退款时间(出向) | `hjc_order.refund_time` |
| `refundReason` | 退款原因(出向) | `hjc_order.refund_reason` |
---
@@ -223,3 +257,4 @@ POST {一站式BaseUrl}/api/biz/createPurchaseDetails
2. `timestamp` 格式、时区、±10min 窗口是否认可。
3. `createPurchaseDetails` 字段名是否需与一站式现网入参完全一致(现按本表定义);如需调整字段名请给出一站式入参清单。
4. 入向:一站式调用官方网 `/api/hjc/push/project` 时是否也按同一套 `appKey/timestamp/sign` 鉴权(本表默认对称鉴权)。
5. 退款字段名 `refundTime` / `refundReason` 与一站式现网入参是否一致;格式默认 `yyyy-MM-dd HH:mm:ss`,如一站式要求其他命名或时间格式请同步调整 `CreatePurchaseDetails`