京东健康API调用失败主因是签名与时间戳:timestamp须调用/api/v1/common/time获取,参数按字典序排序并rawurlencode,签名公式为md5(app_key+timestamp+nonce+secret+sorted_params)。

京东健康 OpenAPI 认证失败:invalid_sign 或 timestamp_expired
调用京东健康 API 时,90% 的首次失败都卡在签名和时间戳上。它不接受系统本地时间,必须用京东服务器校准后的时间(误差不能超 5 分钟),且签名算法对参数顺序、编码、拼接方式极其敏感。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
-
timestamp必须调用京东提供的/api/v1/common/time接口获取,不能用time()或date('U') - 签名前所有参数要按字典序升序排列(注意是字符串 key 排序,不是值),再拼成
key1=value1&key2=value2形式 - value 需做
rawurlencode()(不是urlencode()),空值也要参与拼接,写成key= - 最终签名串是
md5(app_key + timestamp + nonce + secret + sorted_params),secret 是京东后台分配的,不是 access_token
PHP 同步问诊记录:调用 jdhs.order.get 返回空或 order_not_found
问诊记录本质是“服务订单”,不是普通商品订单,必须用京东健康特有的订单号(以 JHS 或 JHSV 开头),且接口权限需单独开通——普通 POP 商家接口权限默认不包含问诊类。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 确认你在京东健康开放平台已申请并审核通过
jdhs.order.get和jdhs.consultation.detail两个接口权限 - 订单号不能从京东 POP 后台抄,必须从问诊完成回调通知里取
order_id字段,或从jdhs.consultation.list接口查出后再拉详情 - 该接口不支持批量查,一次只能传一个
order_id;若要同步多条,必须循环调用,但要注意频率限制(默认 10 次/分钟) - 返回字段中
consultation_status为3才代表问诊完成可同步,1是进行中,2是已取消
药品订单同步失败:jd.order.detail.get 查不到健康频道订单
京东健康频道产生的药品订单,不会出现在标准 POP 订单接口 jd.order.detail.get 中。这类订单走的是独立的健康供应链体系,订单号结构、状态码、发货逻辑全都不一样。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 必须改用健康专属订单接口:
jdhs.order.get(查单) +jdhs.order.shipping(发货) - 健康药品订单号以
JHSO开头,不是SO或JD,前端埋点或回调里才能拿到真实单号 - 订单状态字段名是
order_status,但含义和 POP 不同:比如60表示“已出库”,70是“已签收”,不能直接映射 POP 的30/40 - 发货时
logistics_code必须填京东健康认可的快递编码(如JD、YD),填错会返回logistics_not_supported
PHP 回调验签总失败:verify_sign_failed
京东健康所有服务端回调(问诊完成、药品发货、处方审核等)都强制验签,但它的签名规则和主动调用 API 不一致:不拼接 timestamp,也不含 nonce,只用 app_key + body_json_string + secret 做 md5。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 不要用你封装好的主动调用签名函数去验回调,body 是原始 JSON 字符串(不含空格、换行),不能先
json_decode再拼 - PHP 接收时用
file_get_contents('php://input')拿原始体,别用$_POST—— 回调是 POST JSON,不是表单 - 验签前确保 body 字符串 UTF-8 编码无 BOM,否则 md5 结果偏差;可用
mb_convert_encoding($body, 'UTF-8', 'auto')强制转 - 京东回调可能重试多次,务必在验签通过后先查数据库是否已处理过该
notify_id,避免重复入库
最常被忽略的一点:京东健康所有接口的 access_token 有效期只有 2 小时,且刷新接口 jdhs.token.refresh 本身也依赖旧 token 和 timestamp,一旦 token 过期又没及时刷新,后续所有请求都会静默失败——得在每次调用前检查 expires_in,别等到报 invalid_access_token 才处理。











