首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 透過 CMWAP 獲取用戶手機號碼 (x-up-calling-line-id)

     編輯:J2ME

原理

中國移動 CMWAP 閘道在轉發 HTTP 請求時,會在請求頭中注入用戶手機號碼,Header 名稱為 x-up-calling-line-id。MIDlet 只需在建立 HttpConnection 後讀取該 Header 即可。

代碼示例

HttpConnection hc = (HttpConnection) Connector.open(url);
String msisdn = hc.getHeaderField("x-up-calling-line-id");
// 返回格式範例:"8613800138000" (含國家碼 86)
if (msisdn != null && msisdn.startsWith("86")) {
    msisdn = msisdn.substring(2); // 去掉國家碼
}
System.out.println("用戶手機號:" + msisdn);

適用條件與限制

  • 網絡制式:僅限中國移動 2G/3G CMWAP 接入點(CMNET 不注入此 Header)。
  • 協議:HTTP/HTTPS 均可,但 HTTPS 需閘道支援 SNI 解密後才能注入,實際成功率較低。
  • 隱私合規:屬於個人敏感信息,需在隱私政策說明並獲取用戶授權;中國《個人信息保護法》要求最小化收集原則。
  • 設備/閘道差異:部分省份閘道可能使用 x-nokia-msisdn、x-up-subno 等非標準 Header,建議兼容多鍵值輪詢。

兼容性寫法

private static final String[] MSISDN_HEADERS = {
    "x-up-calling-line-id", "x-nokia-msisdn", "x-up-subno", "msisdn"
};

public static String extractMsisdn(HttpConnection hc) {
    for (String h : MSISDN_HEADERS) {
        String v = hc.getHeaderField(h);
        if (v != null && !v.isEmpty()) return normalize(v);
    }
    return null;
}

private static String normalize(String raw) {
    raw = raw.trim();
    if (raw.startsWith("+86")) raw = raw.substring(3);
    else if (raw.startsWith("86")) raw = raw.substring(2);
    return raw;
}

替代方案

若無法獲取 Header(如用戶使用 WiFi、CMNET、或虛擬運營商),可引導用戶手動輸入並發送驗證碼校驗,或接入運營商 OAuth/OneID 體系(需企業資質)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved