Appearance
M-Pesa 手机号验证(Mobile Number Validation)接口整理
文档信息
- 来源:Safaricom Developer Portal(Daraja),官方地址 https://developer.safaricom.co.ke/apis/MobileNumberValidation
- 整理自本地文档
Mpesa_Mobile_Number_Validation_API.md(2026 年版) - 厂商页:M-Pesa(Safaricom)
1. 功能定位
实时校验服务:用 手机号(MSISDN)+ 证件类型 + 证件号码 三要素,验证该手机号是否真实注册在 Safaricom 数据库中、且注册信息与提交证件一致。
| 项目 | 说明 |
|---|---|
| 验证方式 | MSISDN + idType + idNumber 三重匹配 |
| 返回结果 | 布尔 true / false,不返回任何个人敏感数据 |
| 同步/异步 | 同步,实时返回 |
| 是否收费 | 商业 API,按调用量阶梯计费(不含 VAT),仅成功调用(4000/4001)计费 |
| 隐私 | 仅 True/False,符合肯尼亚《数据保护法 2019》 |
| 运营商限制 | 仅限 Safaricom 号码,不覆盖 Airtel / Telkom |
典型场景:数字开户(手机号与身份信息匹配核验)、OTP 之外的二次身份核验、冒名注册识别、联系人数据清洗、营销对象有效性校验。
2. 接入前提
- 注册 Daraja 开发者账号:https://developer.safaricom.co.ke
- 创建 Sandbox 应用,获取
Consumer Key/Consumer Secret。 - 在 Simulator 区域获取沙盒测试手机号、证件号。
- 正式使用前联系
apisupport@safaricom.co.ke签署商业协议。 - Go Live:绑定真实 Paybill / Till 号码,OTP 验证后获取生产凭证。
3. 认证:OAuth 2.0 client_credentials
http
GET https://sandbox.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials
Authorization: Basic Base64(ConsumerKey:ConsumerSecret)成功响应:
json
{
"access_token": "SGWcJPtNtYNPGm1DqBNqZZZZZZ",
"expires_in": "3599"
}- Token 有效期约 3600 秒,建议服务端缓存、50 分钟左右自动刷新,避免每请求取新 Token。
- 生产环境域名换成
api.safaricom.co.ke。
4. 验证接口
| 项目 | 值 |
|---|---|
| 路径 | POST /v1/KYC-validation/validateID |
| 沙盒 | https://sandbox.safaricom.co.ke/v1/KYC-validation/validateID |
| 生产 | https://api.safaricom.co.ke/v1/KYC-validation/validateID |
| Content-Type | application/json |
| 认证 | Authorization: Bearer {access_token} |
入参
json
{
"requestRefID": "83a2-4b44-aaffcb3f93",
"shortCode": "12345",
"msisdn": "254710860780",
"idType": "01",
"idNumber": "454353453"
}| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
requestRefID | String | 是 | 商户生成的唯一请求标识,用于幂等与追踪,建议 UUID 或时间戳+随机数 |
shortCode | String | 是 | 组织关联的 Paybill / Till 号码 |
msisdn | String | 是 | 手机号,必须 254 开头 12 位纯数字,不支持 +254 / 07xx |
idType | String | 是 | 证件类型编码,见枚举 |
idNumber | String | 是 | 证件号码 |
idType 枚举:
| 编码 | 证件类型 |
|---|---|
01 | National ID(肯尼亚国民身份证) |
02 | Military ID(军人证) |
05 | Passport(护照) |
响应
匹配(HTTP 200):
json
{
"responseRefID": "1771929697",
"responseCode": "4000",
"responseMessage": "Details match successfully",
"status": "true"
}不匹配(HTTP 200):
json
{
"responseRefID": "1771929733",
"responseCode": "4001",
"responseMessage": "Details do not match",
"status": "false"
}| 字段 | 说明 |
|---|---|
responseRefID | API 网关生成的请求标识 |
responseCode | 4000 匹配 / 4001 不匹配 |
responseMessage | 描述信息 |
status | 核心结果:"true" / "false"(字符串,注意非布尔类型) |
错误码
| HTTP | errorCode | 含义 | 排查 |
|---|---|---|---|
403 | 403.001 subscription_not_available | 订阅不可用 | 检查商业协议签署与上线状态 |
400 | 400 Invalid MSISDN | 手机号格式非法 | 必须 2547 开头、纯数字 |
401 | 401.001 Invalid access token | Token 无效/过期 | 重新获取 Token,核对 Key/Secret |
500 | 500 Invalid parameter input | 参数无效 | 检查必填字段完整性 |
错误体示例:
json
{
"responseId": "83a2-aa8bfffcb3f939",
"errorCode": "403.001",
"errorMessage": "subscription_not_available"
}5. 沙盒测试数据
| 场景 | msisdn | idType | idNumber | 预期 |
|---|---|---|---|---|
| 匹配 | 254710860780 | 01 | 454353453 | status:"true", code 4000 |
| 不匹配 | 254710860780 | 01 | 999999999 | status:"false", code 4001 |
| 非法手机号 | 0712345678 | 01 | 454353453 | HTTP 400 |
| Token 过期 | 254710860780 | 01 | 454353453 | HTTP 401 |
沙盒不查真实库,按预置规则返回固定结果。
6. 调用示例(cURL)
bash
# Step 1: 获取 Access Token
curl -X GET \
"https://sandbox.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials" \
-H "Authorization: Basic Base64(YourConsumerKey:YourConsumerSecret)"
# Step 2: 三要素核验
curl -X POST \
https://sandbox.safaricom.co.ke/v1/KYC-validation/validateID \
-H "Authorization: Bearer SGWcJPtNtYNPGm1DqBNqZZZZZZ" \
-H "Content-Type: application/json" \
-d "{\"requestRefID\":\"req-001\",\"shortCode\":\"12345\",\"msisdn\":\"254710860780\",\"idType\":\"01\",\"idNumber\":\"454353453\"}"7. 生产上线清单
| 步骤 | 事项 |
|---|---|
| 1 | 签署商业协议(apisupport@safaricom.co.ke) |
| 2 | 准备活跃的 Paybill / Till 收款号码 |
| 3 | 联系 M-PESABusiness@Safaricom.co.ke 创建 Business Administrator |
| 4 | Daraja 门户 Go Live:填组织短码、组织名称、M-Pesa 用户名 |
| 5 | OTP 验证(发送至 Safaricom 安全手机号) |
| 6 | 邮件接收生产 Consumer Key / Secret |
| 7 | URL 由 sandbox.safaricom.co.ke 换成 api.safaricom.co.ke |
| 8 | 小额真实交易端到端验证 |
8. 资费(不含 VAT,仅成功调用计费)
| 月调用量 | 单价(KES/次) |
|---|---|
| 0 – 200,000 | 4.50 |
| 200,001 – 500,000 | 4.28 |
| 500,001 – 1,000,000 | 3.94 |
| 1,000,001 – 5,000,000 | 3.60 |
| 5,000,000 以上 | 3.15 |
9. 最佳实践
- 手机号入库前统一转
254xxxxxxxxx,拒绝+254/07xx。 - Token 服务端缓存,约 50 分钟自动刷新。
requestRefID保证唯一(UUID),用于幂等与对账追踪。status是字符串"true"/"false",解析时勿按布尔强转。- 对 401(刷新 Token 后重试)、403(订阅告警)、500(参数排查)分类处理。
- HTTP 超时建议 10–30 秒,避免阻塞开户主流程。
- 非 Safaricom 号码走兜底渠道(如 SmileID 手机号验证)。
接入待确认
- 商业协议进度与生产凭证;组织短码(shortCode)申请值。
- 与 SmileID / Softnet / YesID 等 KYC 源的编排顺序与降级策略。
- 肯尼亚之外市场的同类运营商源(如坦桑尼亚见 通信能力 厂商)。