SoftBank 920PはPanasonicの"Vieraケータイ"。コイツがいろいろ(2点ほど)困った挙動をしているので調査してみた。

●POSTメソッドでリダイレクトする

とある決済サービスを利用できないことが判明した。

リクエストフローはこんな感じ。


Request


  1. 端末で「購入する」ボタンを押す(http POST)
  2. リクエストを受けたうちのサーバがCGIプログラムをexec
  3. 結果(例:“Location: https://sysmem.example.com/settlement?foo=bar&hoge=piyo")を標準出力から受け取る
  4. そのまま端末に返す(header関数)
  5. 決済システムのサーバにリダイレクト

リダイレクト先でエラーが発生しているのでサポートに連絡。「ログを確認したらPOSTメソッドでリクエストされている」と説明される。…なんでだ?

エラーそのものは「購入確認画面」のフォームを作り直してmethod=“GET"にすることで解決した。しかし、他の端末では問題なく動いていたものを理由もわからず修正したのが気分が悪い。そこで、リダイレクト先を自前のサーバにしてテストしてみた。

結果、以下の条件を満たすとLocationヘッダによるリダイレクトがPOSTでリクエストされることが判明した。

  • 1.のフォームのmethodが"POST”
  • 1.と5.の遷移のどちらか一方がSSL(https)
    →どちらもhttps / どちらもhttpなら"GET"でリクエストされる

ああ苦労した。

●aタグによるメーラ起動の挙動

携帯サイトではmailtoによるメーラ起動を行うことがよくある。その際に件名と本文をセットしたくなることもよくある。3Gの端末は3キャリアとも以下の書式でsubject / bodyを指定することができるのだが…

<a href="mailto:kwappa@example.com?subject={$subject}&body={$body}">メール作成</a>

今まで動いていたmailtoリンクが機能しない、という報告が来たので検証してみた。

<?php
// 文字コードはSJIS
// [0] URLエンコードなしで出力
$subject  = "たいとる" ;
$body     = "ほんぶん" ;
// [1] URLエンコードして出力
$subject1 = rawurlencode($subject) ;
$body1    = rawurlencode($body) ;
// [2] UTF-8に変換してからURLエンコード
$subject2 = rawurlencode(mb_convert_encoding($subject, "UTF-8")) ;
$body2    = rawurlencode(mb_convert_encoding($body,    "UTF-8")) ;
// [3] ISO-2022-JPに変換してからURLエンコード
$subject3 = rawurlencode(mb_convert_encoding($subject, "ISO-2022-JP")) ;
$body3    = rawurlencode(mb_convert_encoding($body,    "ISO-2022-JP"")) ;
?>

結果をまとめてみる。

<th>
  dcm SH905i
</th>

<th>
  au W44K
</th>

<th>
  SoftBank 705SH
</th>

<th>
  SoftBank 920P
</th>
<td>
  ○
</td>

<td>
  ○
</td>

<td>
  ○
</td>

<td>
  <strong><span style="color: #ff0066;">×(表示されない)</span></strong>
</td>
<td>
  ○
</td>

<td>
  ○
</td>

<td>
  ×(表示されない)
</td>

<td>
  ×(表示されない)
</td>
<td>
  ×(化ける)
</td>

<td>
  ×(化ける)
</td>

<td>
  ○
</td>

<td>
  ○
</td>
<td>
  ×(化ける)
</td>

<td>
  ×(化ける)
</td>

<td>
  ×(化ける)
</td>

<td>
  ×(化ける)
</td>
[0]
[1]
[2]
[3]

というわけで、SoftBankならUTF-8、他キャリアはSJISをURLエンコードするのが正解。

で、その正解がもう2年も前にエントリしてあるという…。私が担当する前に書かれていたコードはすべて、SoftBank端末には[0]の方法を用いていたのだ。このコードでも「あらかた」動いていたのだが…。こんなところにも素敵な負の遺産。

ちなみにSoftBankの開発ガイドには…

<th>
  説明
</th>
<td>
  to トークンが存在するとmailto:直後のアドレスは無効になる。
</td>
<td>
  cc(Carbon Copy)
</td>
<td>
  bcc(Blind Carbon Copy)
</td>
<td>
  subject
</td>
<td>
  本文である。<u><span style="color: #ff99cc;"><strong>ISO-2022-JP をescaped encoding で表記</strong></span></u>すること。
</td>
表2.2.1-1. mailto で指定できるトークン
トークン
to
cc
bcc
subject
body

…と書いてある。ウソを書くのは勘弁してほしいものである。