WebPay APIでカード決済機能をWindowsストアアプリに実装するには2カ月で160本作った還暦開発者が送る10のアプリ開発ノウハウ(特別編)(3/4 ページ)

» 2013年12月17日 18時00分 公開
[薬師寺国安,PROJECT KySS]

WebPay APIに接続するConnection.vb

 まずは、WebPay APIに接続するための、リスト2の「Connection.vb」クラスのコードを記述する。ここでは、コードが長くなるため一部掲載を省略している。全てのコードを見る場合は、サンプルをダウンロードして「Connection.vb」ファイルを見ていただきたい。

‘ 今日のネットワークで使用される多くのプロトコルに対し、単純なプログラミング インターフェイスを提供する
‘ System.NET名前空間をインポートする。
Imports System.Net
‘ ASCII および Unicode の文字エンコーディングを表すクラス、文字ブロックとバイト ブロックの相互変換を行う
‘ 抽象基本クラス、および String の中間インスタンスを作成せずに String オブジェクトを操作し書式指定する
‘ ヘルパー クラスが含まれる、System.Text名前空間をインポートする。
Imports System.Text
‘ WebPayApplication.WebPay名前空間を定義する。
Namespace WebPayApplication.WebPay
    Class Connection
‘ 「テスト用APIキー」用のapikeyプロパティを定義する。
        Public Shared Property apiKey() As String
            Get
                Return m_apiKey
            End Get
            Set(value As String)
                m_apiKey = value
            End Set
        End Property
        Private Shared m_apiKey As String
‘ WebPayUriメンバー変数を宣言し、WebPay APIのURLを格納しておく。
        Private Shared WebPayUri As String = "https://api.webpay.jp/v1"
リスト2 Connection.vbの一部

リクエストを実行するためのDoRequest関数を定義

        Public Async Function DoRequest(path As String, method As String, data As String) As Task(Of String)
            Dim request = CreateRequest(path, method)
            Dim bodyBytes = Encoding.UTF8.GetBytes(data)
            Dim stream = Await request.GetRequestStreamAsync()
            stream.Write(bodyBytes, 0, bodyBytes.Length)
            Try
                Using response = Await request.GetResponseAsync()
                    Return ReadStream(response.GetResponseStream())
                End Using
            Catch exception As WebException
                If exception.Response IsNot Nothing Then
                    Dim statusCode = DirectCast(exception.Response, HttpWebResponse).StatusCode
                    Dim message = ReadStream(exception.Response.GetResponseStream())
                    Throw New WebPayException(statusCode, message)
                End If
                Throw
            End Try
        End Function
リスト3 Connection.vbの一部

 以降、上記コードの中身を詳細に見ていこう。

 まず、非同期処理で行われるためメソッドの先頭にAsyncを追加している。

 次に、変数requestに後ほど作成するCreateRequest関数をpathとmethodで初期化した値を参照しておく。変数bodyBytes変数に、指定した文字列に含まれる全ての文字をバイトシーケンスにエンコードして格納する。

GetRequestStreamAsyncメソッドでは、インターネットリソースデータ書き込みのSystem.IO.Streamを非同期操作として返し、その結果を変数streamで参照しておく。

GetResponseAsyncメソッドでは、インターネット要求への応答を非同期操作として受け取り、変数responseで参照しておく。インターネットリソースからデータストリームを返すresponse.GetResponseStreamメソッドを指定した、ReadStream関数の値を戻り値とする。ReadStream関数は後ほど作成する。

 例外処理が発生した場合は、応答のステータスや、例外処理のメッセージを表示して、例外をスルーする。

CreateRequest関数(リクエストを作成する関数)

        Private Function CreateRequest(path As String, method As String) As HttpWebRequest
            Dim request = WebRequest.CreateHttp(WebPayUri & path)
            request.Method = method
            SetBasicAuthHeader(request)
            request.ContentType = "application/json"
            Return request
        End Function
リスト4 Connection.vbの一部

 CreateHttpで指定したURI文字列である、変数WebPayUriと変数pathを連結して指定し、変数requestで参照しておく。

 Methodプロパティに要求に対して使用するメソッドを設定する。後ほど作成するSetBasicAuthHeader関数に変数requestを引数として渡して実行する。

 Cotent-Type HTTPヘッダーに「application/json」と指定する。

各種値の設定されたrequest変数を戻り値とする。

ReadStream関数(JSONデータを読み込む関数)

        Private Function ReadStream(stream As Stream) As String
            Using reader = New StreamReader(stream, Encoding.UTF8)
                JsonData = reader.ReadToEnd()
                Return JsonData
            End Using
        End Function
リスト5 Connection.vbの一部

 StreamとEncoding.UTF8で初期化された新しいStreamReaderのインスタンスreaderオブジェクトを作成する。

 後ほど作成するモジュール変数JsonDataに入力したデータによって返されるJSONデータを読み取って格納する。そのモジュール変数JsonDataを戻り値とする。

SetBasicAuthHeader関数(リクエストヘッダーを指定する関数)

        Private Sub SetBasicAuthHeader(request As WebRequest)
            Dim authInfo As String = "WebPayページで取得した「テスト用APIキー」"
            authInfo = Convert.ToBase64String(Encoding.UTF8.GetBytes(authInfo))
            request.Headers("Authorization") = "Basic " & authInfo
        End Sub
    End Class
End Namespace
リスト6 Connection.vbの一部

 変数authInfoにWebPayページで取得した「テスト用APIキー」を格納する。authInfoの格納している「テスト用APIキー」をUTF8にエンコードされた字列形式に変換してauthInfo変数に格納し、ToBase64Stringで8ビット符号なし整数の配列を、Base64の数字でエンコードされた等価の文字列に変換する。

 「Authorization」ヘッダーに文字列「Basic」と変数authInfoの値を連結して指定する。

JSONデータに返される各プロパティを設定するCard.vb

 JSONデータに返される各プロパティを設定するCard.vbクラスを作成する

‘ Jsonを使用するためのクラスの含まれる、Newtonsoft.Json名前空間をインポートする。
Imports Newtonsoft.Json
Namespace WebPayApplication.WebPay
    Class Card
‘ これ以後はJsonPropertyで各属性名を指定して、各プロパティを定義している。
        <JsonProperty("address_country")> _
        Public Property AddressCountry() As String
            Get
                Return m_AddressCountry
            End Get
            Set(value As String)
                m_AddressCountry = value
            End Set
        End Property
        Private m_AddressCountry As String
    End Class
End Namespace
リスト3 Card.vb

 プロパティを定義するコードは省略している。サンプルをダウンロードして参照してほしい。

各プロパティを定義しておくCardRequest.vb

 次に入力したデータと関連付けるJsonPropertyに各属性名を指定して、各プロパティを定義しておくCardRequest.vbクラスを作成する。

Imports Newtonsoft.Json
Namespace WebPayApplication.WebPay
‘ JasonObject属性にTitle:=”card”と指定して、これ以後のプロパティが「card」というTitleで
‘ ひとくくりされるよう指定しておく。
    <JsonObject(Title:="card")> _
    Class CardRequest
        <JsonProperty("number")> _
        Public Property Number() As String
            Get
                Return m_Number
            End Get
            Set(value As String)
                m_Number = value
            End Set
        End Property
        Private m_Number As String
        Friend Function JsonString() As String
            Return JsonConvert.SerializeObject(New With {.card = Me})
        End Function
    End Class
End Namespace
リスト4 CardRequest.vb

 各プロパティの定義は省略している。詳細はサンプルコードを参照してほしい。

 JsonConvert.SerializeObjectでは、Titleがcardにひとくくりにされているプロパティを、オブジェクトからJson文字列にシリアライズして、ネットワークで送受信が可能なように変換して、戻り値としている。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。