请求方式:POST
Content-Type:application/json
通知地址:下单时传入的notifyUrl参数
通知内容:JSON字符串,结构见下方示例
eSIM生成失败时(notifyType=3),系统会推送该通知,同时订单已支付金额将退回买家账户余额,订单状态变更为已退款。
* 填写回调通知地址,系统会向该地址POST发送一条示例通知内容(与实际通知方式一致,含 eventId、clientOrderNo 与真实签名),用于验证地址是否可正常接收通知
{
"sn": "231013169",
"clientOrderNo": "your-order-no-001",
"eventId": "E20260810120000A1B2C3D4",
"notifyType": 1,
"activationStatus": "activated",
"iccid": "89852070322460401234",
"lpa": "LPA:1$xxx.prod.xxxxxxxxxxx.com$TEST1234567890",
"number": "86866878",
"verifyCode": "123456",
"qrcode": "data:image/png;base64,...",
"time": "20260810120000",
"sign": "3a1f9c2d1e4b85f6a7c8d9e0f1a2b3c4"
}
示例中的 sign 值为占位示意;实际 sign 需用你收到的通知 body 与你的 API token 计算得到。可点上方“发送测试”接收带真实签名的样例进行验签自测。
| 字段 | 类型 | 说明 |
|---|---|---|
| sn | string |
订单号 |
| clientOrderNo | string |
客户订单号(下单时传入的clientOrderNo原样回显,仅传了才返回) |
| eventId | string |
事件唯一ID,全局唯一且贯穿该事件的所有重发投递(同一事件多次重试 eventId 不变)。格式:E+YmdHis+8位十六进制随机。回调接收方应据此做幂等去重与问题追溯;参与签名。 |
| notifyType | number |
【通知类型】 1 - 开卡成功 2 - 退订 3 - 生成失败 |
| activationStatus | string |
【eSim开通状态】 activated - 已开通 unsubscribed - 已退订 failed - 生成失败 |
| iccid | string |
eSim卡ICCID |
| lpa | string |
eSim配置(用于生成二维码),仅开卡成功通知返回 |
| number | string |
eSim卡号码,仅开卡成功通知返回 |
| verifyCode | string |
eSim配置验证码,仅开卡成功通知返回 |
| qrcode | string |
eSim配置二维码(base64格式),仅开卡成功通知返回 |
| time | string |
通知时间(YmdHis,东八区 UTC+8 标准时间) |
| sign | string |
通知签名,用于回调方校验请求来源与内容完整性;算法见下方“签名验证”。 |
通知内容包含 sign 字段,回调接收方应校验签名以确保请求来源可信、内容未被篡改。
签名算法:
1、将通知 JSON 解码为关联数组;
2、取出并保存 sign 字段值,然后从数组中移除 sign;
3、将本账号的 API token(开发者中心可见)作为 token 键加入数组;
4、按 key 降序排序(krsort)后用 http_build_query 拼接成查询串;
5、对上一步结果取 md5,与第 2 步保存的 sign 比对;不一致请拒绝处理该通知。
说明:token 仅参与签名计算,不会随通知外发;sign 本身不参与签名。
重要:上述算法对通知 body 中实际存在的全部字段计算签名(不固定字段清单),因此平台后续新增字段(如 eventId、clientOrderNo)时,按此实现的验签逻辑无需改动即可自动兼容。若你此前按固定字段清单实现验签,请务必将 eventId(以及回显时的 clientOrderNo)纳入参与签名的字段集合,否则会校验失败。
<?php
// 1、通知以 Content-Type: application/json POST,必须读取原始请求体,不能用 $_POST
$rawBody = file_get_contents('php://input');
$payload = json_decode($rawBody, true);
if (!is_array($payload)) {
http_response_code(400);
exit('invalid json');
}
// 2、取出并移除 sign(sign 不参与自身签名)
$sign = $payload['sign'] ?? '';
unset($payload['sign']);
// 3、加入本账号 API token(开发者中心可见,仅参与签名、不随通知外发)
$payload['token'] = $myApiToken;
// 4、按 key 降序排序后拼接,分隔符固定使用 '&'(必须与平台算法保持一致)
krsort($payload);
$expected = md5(http_build_query($payload, '', '&'));
// 5、比对签名,不一致直接拒绝处理
if (!hash_equals($expected, $sign)) {
http_response_code(400);
exit('sign invalid');
}
// 6、验签通过后按 eventId 幂等去重(同一事件多次重试只处理一次),再执行业务
$eventId = $payload['eventId'] ?? '';
// TODO:查本地记录,若该 eventId 已处理过则直接返回 200,避免重复发货/重复对账
// 7、处理完成务必返回 HTTP 200,系统据此判定通知投递成功
http_response_code(200);
echo 'OK';
1、收到通知后请返回HTTP状态码200,系统以此判断通知成功。
2、返回非200或地址不可达时,系统会按间隔递增重试,最多通知3次(首次失败后约5分钟重试第2次,第2次失败后约10分钟重试第3次)。
3、3次通知均失败后不再重试,可通过订单详情接口查询最新开通状态;同一事件可能因重试收到多条通知,请依据 eventId 去重。
4、收到开卡成功通知后,可调用订单详情接口获取完整的eSim卡信息(lpa、二维码、号码等)。