携帯会員サイトについて - PHPプロ!Q&A掲示板

2692

  • 0P

携帯会員サイトについて

質問日時 / 2010年4月26日 10:50    回答数 / 7件

Questioner:  crie2001  このエントリーをはてなブックマークに追加 

キーワード / au    携帯   

携帯で会員サイトを作っています。端末を判断して簡単にログインできるようにデバイスインフォを取得して、登録しているのですが、auと一部SOFTBANKのデバイスインフォを取得できません。DOCOMOはできています。以下の関数でユーザーエージェントから取得しているのですが原因が不明です。どなたかわかる方ご教授ください。

  1. function getMobileDeviceInfo()
  2. {
  3.     // 変数初期化
  4.     $ret = array( 'carrier' => '' );
  5.     $user_agent = getRequestHeader('HTTP_USER_AGENT');
  6.     
  7.     if (preg_match("/^DoCoMo\/2\.0 (.*)$/", $user_agent, $m)) {
  8.         // docomo FOMA
  9.         if (preg_match("/^(.*?)\((.*)\)$/", $m[1], $n)) {
  10.             $ret['carrier'] = CARRIER_DOCOMO;
  11.             $ret['device']  = $n[1];
  12.             if (preg_match("/(ser[0-9a-zA-Z]+)(?:;(icc[0-9a-zA-Z]+))?/", $n[2], $s)) {
  13.                 $ret['docomo_utn']         = $s[1];
  14.                 $ret['docomo_fomacard_id'] = isset($s[2]) ? $s[2] : "";
  15.             }
  16.             $ret['docomo_imode_id'] = str_replace(" ", "", getRequestHeader('HTTP_X_DCMGUID'));
  17.         }
  18.     } else if (preg_match("/^DoCoMo\/1\.0\/(.*)$/", $user_agent, $m)) {
  19.         // docomo MOVA
  20.         if (preg_match("/^(.*?)\/(.*)$/", $m[1], $n)) {
  21.             $ret['carrier'] = CARRIER_DOCOMO;
  22.             $ret['device']  = $n[1];
  23.  
  24.             if (preg_match("/(ser[0-9a-zA-Z]+)(?:;(icc[0-9a-zA-Z]+))?/", $n[2], $s)) {
  25.                 $ret['docomo_subscriber_id'] = $s[1];
  26.                 $ret['docomo_fomacard_id']   = isset($s[2]) ? $s[2] : "";
  27.             }
  28.             $ret['docomo_imode_id'] = str_replace(" ", "", getRequestHeader('HTTP_X_DCMGUID'));
  29.         }
  30.     } else if (preg_match("/^KDDI-(.*)$/", $user_agent, $m)) {
  31.         // au WAP2
  32.         if (preg_match("/^(.*?) UP.Browser/", $m[1], $n)) {
  33.             $ret['carrier']          = CARRIER_EZWEB;
  34.             $ret['device']           = $n[1];
  35.             $ret['au_subscriber_id'] = getRequestHeader('HTTP_X_UP_SUBNO');
  36.         }
  37.     } else if (preg_match("/^UP.Browser\/(.*?)-(.*?) UP\.Link\/(.*)$/", $user_agent, $m)) {
  38.         // au WAP1
  39.         $ret['carrier']          = CARRIER_EZWEB;
  40.         $ret['device']           = $m[2];
  41.         $ret['au_subscriber_id'] = getRequestHeader('HTTP_X_UP_SUBNO');
  42.     } else if (preg_match("/^SoftBank\/(.*)$/", $user_agent, $m)) {
  43.         // Softbank
  44.         if (preg_match("/^(.*?)\/(.*?)\/(.*?)(\/(SN.*?))? /", $m[1], $n)) {
  45.             $ret['carrier']      = CARRIER_SOFTBANK;
  46.             $ret['device']       = $n[2];
  47.             $ret['softbank_utn'] = isset($n[5]) ? $n[5] : "";
  48.             $ret['jphone_id']    = getRequestHeader('HTTP_X_JPHONE_UID');
  49.         }
  50.     } else if (preg_match("/^Vodafone\/(.*)$/", $user_agent, $m)) {
  51.         // Vodafone
  52.         if (preg_match("/^(.*?)\/(.*?)\/(.*?)(\/(SN.*?))? /", $m[1], $n)) {
  53.             $ret['carrier']      = CARRIER_SOFTBANK;
  54.             $ret['device']       = $n[2];
  55.             $ret['softbank_utn'] = isset($n[5]) ? $n[5] : "";
  56.             $ret['jphone_id']    = getRequestHeader('HTTP_X_JPHONE_UID');
  57.         }
  58.     } else if (preg_match("/^J-PHONE\/(.*)$/", $user_agent, $m)) {
  59.         // J-PHONE 1g/2g
  60.         if (preg_match("/^(.*?)\/(.*?)(\/(SN.*?))? /", $m[1], $n)) {
  61.             $ret['carrier']      = CARRIER_SOFTBANK;
  62.             $ret['device']       = $n[2];
  63.             $ret['softbank_utn'] = isset($n[4]) ? $n[4] : "";
  64.             $ret['jphone_id']    = getRequestHeader('HTTP_X_JPHONE_UID');
  65.         }
  66.     } else if (preg_match("/^MOT-(V980|C980)(.*)/", $user_agent, $m)) {
  67.         // Vodafone Motorola
  68.         $ret['carrier'] = CARRIER_SOFTBANK;
  69.         $ret['device']  = $m[1];
  70.     }
  71.  
  72.     return $ret;
  73. }

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01shimix  http://ja.wikipedia.org/wiki/%E5%A5%91%E7%B4%8
 ┗A01-1crie2001shimix様 お返事有り難うございます。 おおざっ
  ┗A01-1-1shimixあー・・。元ソースの読解が甘かったですね。とりあえ
   ┗A01-1-1-1crie2001有り難うございます。 再度見直してみました。質問
    ┗A01-1-1-1-1shimixデコメの質問(http://www.phppro.jp/qa/2673)のとき
     ┗A01-1-1-1-1-1crie2001shimix様 お返事有り難うございます。 >それ以
      ┗A01-1-1-1-1-1-1win_phpISO-2022-JPではsoftbankで文字化けする機種があるの

回答一覧

並び替え:

A01
answerershimix [4月26日 11:57] (最終編集:4月26日 12:05)

  http://ja.wikipedia.org/wiki/%E5%A5%91%E7%B4%84%E8%80%85%E5%9B%BA%E6%9C%89ID

>preg_match("/^KDDI-(.*)$/", $user_agent, $m)
>$ret['device']           = $n[1];

>preg_match("/^UP.Browser\/(.*?)-(.*?) UP\.Link\/(.*)$/", $user_agent, $m)
>$ret['device']           = $m[2];

ほとんどが最初でmatchすると思いますが、KDDI-に続くのはデバイスID(機種固有)ではありませんか?端末固有番号を取得するのであればHTTPヘッダのHTTP_X_UP_SUBNOを取得するのが確実だと思います。

  http://www.au.kddi.com/ezfactory/tec/spec/4_4.html

また、DoCoMoも今ならiモードID(HTTP_X_DCMGUID)の方が楽じゃないかと思います。

  http://www.nttdocomo.co.jp/service/imode/make/content/ip/index.html#imodei

あと・・。「一部SOFTBANK」ですが、ユーザID通知がONなのか確認されていますか?こちらも「C」を切り捨てていいのならHTTPヘッダ(HTTP_X_JPHONE_UID)が使えるようですが。



(蛇足)
下記質問の状態ですが、「解決済み」にしたのだから何もレスしなくていいだろうというお考えでしょうか?

  http://www.phppro.jp/qa/2674

#今後の参考にしたいので・・。

この意見に回答する

ツリーへ TOPへ

A01-1
replyercrie2001 [4月26日 19:38]

shimix様

お返事有り難うございます。

おおざっぱな仕組みとして

  1. if (DoCoMo\/2\.0 (.*)$/", )) { //docomo FOMAなら
  2. $ret['carrier'] = CARRIER_DOCOMO;
  3. $ret['device']  = $n[1];
  4. $ret['docomo_imode_id'] = str_replace(" ", "", getRequestHeader('HTTP_X_DCMGUID'));
  5. 中略
  6.  
  7. else if (preg_match("/^DoCoMo\/1\.0\/(.*)$/", $user_agent, $m)) { // docomo MOVAなら
  8. $ret['carrier'] = CARRIER_DOCOMO;
  9. $ret['device']  = $n[1];
  10. $ret['docomo_imode_id'] = str_replace(" ", "", getRequestHeader('HTTP_X_DCMGUID'));
  11. 中略
  12.  
  13. } else if (preg_match("/^KDDI-(.*)$/", $user_agent, $m)) { // au WAP2なら 
  14. $ret['carrier']          = CARRIER_EZWEB;
  15. $ret['device']           = $n[1];
  16. $ret['au_subscriber_id'] = getRequestHeader('HTTP_X_UP_SUBNO');
  17. 中略
  18.  
  19.  } else if (preg_match("/^UP.Browser\/(.*?)-(.*?) UP\.Link\/(.*)$/", $user_agent, $m)) { // au WAP1なら
  20. $ret['carrier']          = CARRIER_EZWEB;
  21. $ret['device']           = $m[2]; 
  22. $ret['au_subscriber_id'] = getRequestHeader('HTTP_X_UP_SUBNO');
  23. 中略
  24.  
  25.  } else if (preg_match("/^SoftBank\/(.*)$/", $user_agent, $m)) { // Softbankなら
  26.  $ret['carrier']      = CARRIER_SOFTBANK;
  27.  $ret['device']       = $n[2];
  28. $ret['softbank_utn'] = isset($n[5]) ? $n[5] : "";
  29. $ret['jphone_id']    = getRequestHeader('HTTP_X_JPHONE_UID');
  30. 中略
  31.  
  32.  } else if (preg_match("/^Vodafone\/(.*)$/", $user_agent, $m)) {  // Vodafoneなら
  33. $ret['carrier']      = CARRIER_SOFTBANK;
  34. $ret['device']       = $n[2];
  35. ret['softbank_utn'] = isset($n[5]) ? $n[5] : "";
  36. $ret['jphone_id']    = getRequestHeader('HTTP_X_JPHONE_UID');
  37. 中略
  38.  
  39.  } else if (preg_match("/^J-PHONE\/(.*)$/", $user_agent, $m)) {  // J-PHONE 1g/2g
  40.  $ret['carrier']      = CARRIER_SOFTBANK;
  41.  $ret['device']       = $n[2];
  42.  $ret['softbank_utn'] = isset($n[4]) ? $n[4] : "";
  43. $ret['jphone_id']    = getRequestHeader('HTTP_X_JPHONE_UID');
  44.  中略
  45.  
  46.    } else if (preg_match("/^MOT-(V980|C980)(.*)/", $user_agent, $m)) { // Vodafone Motorolaなら
  47.         $ret['carrier'] = CARRIER_SOFTBANK;
  48.         $ret['device']  = $m[1];
  49.     }

となり、各キャリア、新旧をジャッシして、各if文に当てはまる場合,それぞれでキャリア、デバイス、そしてgetRequestHeader関数で端末固有番号を取得する様にしています。
※今後各キャリアごとに変える時の為に
 
getRequestHeaderの関数は以下の通りです。
  1. function getRequestHeader($key)
  2. {
  3.     if (array_key_exists($key, $_SERVER)) {
  4.         return $_SERVER[$key];
  5.     }
  6.     return "";
  7. }

(蛇足)
下記質問の状態ですが、「解決済み」にしたのだから何もレスしなくていいだろうというお考えでしょうか?

すいません。この時間にしか、いつもゆっくり確認したり返事が書けないので、「解決済みにしておかないと・・」と、とりあえずしておいたのがいけませんでした。もちろん、お返事書いておきます。

この意見に回答する

ツリーへ TOPへ

A01-1-1 参考になった
replyershimix [4月27日 10:42]

あー・・。元ソースの読解が甘かったですね。とりあえずソース上は問題ないようです。試した限りではdocomo(P02A)でもAU(CA002)でも取得出来ました。ということで

>auと一部SOFTBANK

こちらではAUでも取得出来ているのですが(汗

∴ 取得出来ない機種の情報がないと調べようがないように思います。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyercrie2001 [4月27日 15:44]

有り難うございます。

再度見直してみました。質問させて頂いた内容に問題はないようでした。

一連の流れとして

空メールを送る

ユーザー情報入力フォーム自動返信&メールアドレスDB登録

フォームアクセス&入力

ユーザー情報&携帯端末番号DB登録


という流れになっておるのですが、質問させて頂いたソースは最後の処理でフォームから端末番号を受取処理する形になっており、ログインの確認を端末番号で行っているのですが

今回質問させて頂いた経緯として、auユーザが「登録が完了したのにログインができない」という声から、DBを見てみた所、端末番号のカラムがauユーザのみ登録されていなかったので、てっきり、端末番号の取得ができていないものと、早とちりをしていました。(当方ドコモ&SOFTBANKユーザーのため、実機での確認ができなかったため)
自動返信メールに本来、フォームアドレス(登録されたメールアドレス変数を含む)が記載されていて、そこからフォームにアクセスするのですが、
結論から言いますとauユーザにはそのメール本文が「認識できない形式のメールの為」という表示でフォームにアクセスできていないという結論でした。その為、フォームから本来取得するはずの端末番号が取得できていないという事です。

そこで、質問を変えさせて頂きます。

自動返信メールのソースは以下のソースです。

  1. //件名.本文
  2. 中略
  3. $subject = "会員登録完了";
  4. $message   = "会員登録が完了しました。こちらにアクセスしてユーザー情報を入力して下さい。\n"
  5.       . " <a href='変数持ちアドレス'>アドレス</a> ";
  6. 中略
  7.  
  8. //送信処理
  9. mb_language("Japanese");
  10. mb_internal_encoding("utf-8");
  11. mb_detect_order("ASCII, JIS, UTF-8, EUC-JP, SJIS");
  12.  
  13. $header = "MIME-Version: 1.0\r\n";
  14. $header .= "Content-Type:text/html; multipart/alternative; charset=ISO-2022-JP\r\n";
  15. $header .= 'From:'.$FromName.'<info@zimotto.net>' . "\r\n";
  16.  
  17. $encoding = mb_detect_encoding($message, "SJIS,EUC-JP,JIS,UTF-8");
  18. if ($encoding != "JIS") {
  19. $subject = mb_convert_encoding($subject, "JIS", $encoding);
  20. $message = mb_convert_encoding($message, "JIS", $encoding);
  21. }
  22. $subject = base64_encode($subject);
  23. $subject = '=?ISO-2022-JP?B?' . $subject . '?=';
  24. mail($mail,$subject,mb_convert_encoding($message,"JIS","auto"),$header)

DoCoMo&ソフトバンクではメール受信&表示確認済み
①auではHTML形式のメールを受け取るには、各携帯で設定を変更しないと受け取る方法はないのでしょうか?
②キャリア別に変えないと行けないのでしょうか?
③上記ソースを変える事で3端末共通で受信する方法があるのでしょうか?

ご教授頂けますでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1 参考になった
replyershimix [4月27日 16:34] (最終編集:4月27日 16:38)

デコメの質問(http://www.phppro.jp/qa/2673)のときに調べた限りでは、相当に難儀でしたね。

  http://www.cpa-lab.com/tech/0126

携帯に送る話はこちら(http://www.phppro.jp/qa/1518)とか・・。Qdmailが便利そうです。各キャリア対応だそうです(つまりキャリア別に構成を変えているということですね)。

  http://hal456.net/qdmail/


それ以前に、そういう大事なメールをわざわざHTMLメールにする意図がわかりません。私なら確実性を優先してtext/plainなメールにします。

(登録のためのメールを)どうしてもHTMLメールで送る必要がある・・というのであれば、その理由を書いていただけると代替案があるかもしれません(ないかもしれません)。私にはHTMLメールを使う理由が思い当たりません。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1
replyercrie2001 [4月27日 19:58]

shimix様

お返事有り難うございます。

>それ以前に、そういう大事なメールをわざわざHTMLメールにする意図がわかりません。私なら確実性を優先してtext/plainなメールにします。

text/plain形式の存在を知らず、変数を持たせたフォームアドレスとリンクの生成にHTML形式にしていました。
そこでtext/plainにしてやってみた所、auにも送信ができました。有り難うございます!。

デバイスや端末番号など、最初に質問したソースで3キャリアとも対応できました。
早とちりなど、分かりにくい説明と大変お手数おかけ致しました。

ご回答頂きました内容から解決に至りました。本当に有り難うございました。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1
replyerwin_php [4月30日 01:25]

ISO-2022-JPではsoftbankで文字化けする機種があるのでshift_jisに統一したほうが
よろしいかと。

また、キャリア分けしてプログラムを用意しておいたほうが無難です。

携帯は文字コード周りで、機種依存のバグもまれにあり、アップデートで解消したりします。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)