微信公众号 JSAPI(WeixinServiceController)¶
微信公众号 JS-SDK 配置与媒体下载接口:获取 JSAPI 配置(签名 / appId / nonceStr / timestamp / signature),以及从微信下载媒体文件到本地存储。基址为 /api/portal/weixin/jsapi。
- 接口类型:REST 资源(
@RestController,方法返回Map<String, Object>,由 Spring Jackson 序列化为 JSON 对象;响应非统一Resource,统一封装为{ "status": 1/0, "message": "ok"/"error", "data": <数据> },详见「公共说明 · 响应结构」) - 基址:
${myapps.context-path.runtime:}/api/portal/weixin/jsapi - Tag:微信
公共说明¶
- 鉴权(据源码):基址
/api/portal/weixin/jsapi不在RestSecurityHandlerInterceptor覆盖范围(拦截器仅覆盖/api/runtime/**与/api/rest/bpm/**)。鉴权由全局过滤器RuntimeSecurityFilter(/*)执行登录态校验,未登录返回401(或 SSO 模式重定向到/signon)。所有端点均需 accessToken,可通过 Cookie / 请求头 / query 参数任一方式传递。控制器内getUser()优先走AuthTimeServiceManager.getWebUser(request),无登录态时若请求 User-Agent 含MicroMessenger则 fallback 到 CookieWEB_USER_COOKIE_KEY(解密后取loginNo反查UserVO重建WebUser)——为微信网页内置登录态续接逻辑。 - 响应结构(据源码
WeixinServiceController.addActionResult):本控制器所有端点返回Map<String, Object>,结构为: status:1成功,0失败;message:成功ok,失败error;data:业务数据(经ESAPI.encode(data)XSS 编码处理);当业务返回null时data字段缺省。- 与统一
Resource(errcode/errmsg/data/errors)约定不一致,本文档按源码如实记录。 - 参数读取:通过
getParams()(基于ParamsTable.convertHTTP(request))统一从 query / form 读取;_pagelines默认Web.DEFAULT_LINES_PER_PAGE。
1. 获取 JSAPI 配置¶
按 _url、_appid 与当前用户企业域调用 WeixinServiceProxy.getJsapiConfig,返回微信 JS-SDK 注入所需的配置对象。
- 接口类型:REST 资源
- 请求方式:
@RequestMapping(未限定 method,支持 GET / POST 等所有方法) - 请求路径:
/getJsapiConfig.action(完整:{runtime-context}/api/portal/weixin/jsapi/getJsapiConfig.action) - 鉴权:是(需 accessToken,据源码)
- Tag:微信
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| _url | query | string | 否 | 当前页面 URL(参与签名) |
| _appid | query | string | 否 | 微信公众号 appId |
请求示例¶
GET /api/portal/weixin/jsapi/getJsapiConfig.action?_url=https%3A%2F%2Fexample.com%2Fpage&_appid=wx1234567890 HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:Map(详见「公共说明 · 响应结构」)。
data:Map<String, String>,微信 JS-SDK 配置(典型含 appId / nonceStr / timestamp / signature / jsApiList)。
{
"status": 1,
"message": "ok",
"data": {
"appId": "wx1234567890",
"nonceStr": "abc123",
"timestamp": "1754000000",
"signature": "9e7c4f..."
}
}
2. 上传文件(微信媒体下载)¶
按 serverId(微信媒体 id)+ appId + 当前用户企业域,调用 WeixinServiceProxy.downloadMedia 把微信服务器上的媒体文件下载到本地存储路径 /uploads/<folder>/<year>/<uuid>.<fileType>,返回相对存储路径。
- 接口类型:REST 资源
- 请求方式:
@RequestMapping(未限定 method) - 请求路径:
/upload.action(完整:{runtime-context}/api/portal/weixin/jsapi/upload.action) - 鉴权:是(需 accessToken,据源码)
- Tag:微信
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| serverId | query | string | 否 | 微信媒体 id |
| folder | query | string | 否 | 保存目录名,默认 photo |
| fileType | query | string | 否 | 保存文件扩展名,默认 jpg |
| appId | query | string | 否 | 微信公众号 appId |
请求示例¶
GET /api/portal/weixin/jsapi/upload.action?serverId=SERVER_MEDIA_ID&appId=wx1234567890&folder=photo&fileType=jpg HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:Map(详见「公共说明 · 响应结构」)。
data:string,本地存储相对路径(/uploads/<folder>/<year>/<uuid>.<fileType>,经 ESAPI.encode 编码)。
{
"status": 1,
"message": "ok",
"data": "/uploads/photo/2026/550e8400-e29b-41d4-a716-446655440000.jpg"
}
失败示例: