ThinkPHP对接京东宙斯API的核心是严格遵循OAuth2.0授权码模式,服务端闭环完成code换token、安全存储refresh_token并自动刷新,调用时使用官方SDK签名请求,全程HTTPS+state校验防CSRF,client_secret严禁泄露。

ThinkPHP 对接京东宙斯 API 的核心是严格遵循 OAuth2.0 授权码模式,不跳过任何安全环节,也不在客户端暴露敏感凭证。关键不在“怎么调接口”,而在于“如何安全拿 token、稳存 token、正确用 token”。
授权流程必须走服务端闭环
京东宙斯只支持 authorization_code 模式,ThinkPHP 必须作为纯客户端,全程由服务端完成 code 换 token 步骤:
- 用户点击登录/授权按钮,ThinkPHP 后端生成带 state 参数的授权 URL(如
https://oauth.jd.com/oauth/authorize?app_key=xxx&response_type=code&redirect_uri=https%3A%2F%2Fyour.com%2Fjos%2Fcallback&state=abc123),并重定向 - 回调地址(
/jos/callback)必须与京东开放平台应用中配置的 完全一致(协议、域名、路径、末尾斜杠都不能差) - 收到 code 后,ThinkPHP 必须用
cURL或GuzzleHttp向https://oauth.jd.com/oauth/token发起 POST 请求换 token,严禁前端 JS 直接调用 - 请求体需含
grant_type=authorization_code、code、redirect_uri、client_id(即 app_key)、client_secret,且 Content-Type 为application/x-www-form-urlencoded
Token 存储与刷新要可靠
京东返回的 access_token 有不同有效期(常见 24 小时或 1 年),refresh_token 可用于续期。不能靠 session 或 cookie 临时存,必须落库:
- 建议字段:user_id(可选关联京东用户标识)、app_key、access_token、refresh_token、expires_in(秒数)、create_time(时间戳)
- 每次调用 API 前检查
create_time + expires_in > time(),过期则用 refresh_token 调用/oauth/token?grant_type=refresh_token更新 - 刷新成功后,务必更新数据库中的 access_token 和 create_time,避免多请求并发刷新导致 token 失效
调用 JOS 接口要用官方 SDK 或标准封装
不要手拼 JSON-RPC 请求。推荐使用京东官方 PHP-SDK(如 JdClient),或自行封装符合 JOS 协议的请求结构:
立即学习“PHP免费学习笔记(深入)”;
- 网关地址固定为
https://api.jd.com/routerjson - 必传参数包括:method(如
jd.item.get)、access_token、32位小写 sign(按 app_secret + 参数升序拼接再 MD5)、v(版本,如2.0)、format(json) - ThinkPHP 中可将 JdClient 实例化后注入控制器,或通过 Vendor 加载(如
Vendor('Jos.jd.JdClient')),注意自动加载路径与命名空间匹配 - 调用前校验 access_token 是否有效,无效则先刷新再重试一次,避免单次失败中断业务
安全细节不能妥协
OAuth2.0 流程中任何疏忽都可能导致 token 泄露或 CSRF 攻击:
- 所有涉及授权的接口(authorize / token)必须走 HTTPS,HTTP 会被京东拒绝
- state 参数必须生成随机字符串并存入 session,回调时比对一致才继续,防止跨站请求伪造
- client_secret 绝不能出现在前端代码、JS、HTML 或日志中;ThinkPHP 配置应放在
Conf/config.php或环境变量里,禁止硬编码 - 京东返回的用户信息(如 union_id、nick)仅作标识用途,不可直接用于权限判断,业务权限应由自身系统控制



















