SoftBank 920Pの挙動に注意する

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"")) ;
?>

結果をまとめてみる。

dcm SH905i au W44K SoftBank 705SH SoftBank 920P
[0] ×(表示されない)
[1] ×(表示されない) ×(表示されない)
[2] ×(化ける) ×(化ける)
[3] ×(化ける) ×(化ける) ×(化ける) ×(化ける)

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

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

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

表2.2.1-1. mailto で指定できるトークン
トークン 説明
to to トークンが存在するとmailto:直後のアドレスは無効になる。
cc cc(Carbon Copy)
bcc bcc(Blind Carbon Copy)
subject subject
body 本文である。ISO-2022-JP をescaped encoding で表記すること。

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

Leave a comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です