WebPay APIでカード決済機能をWindowsストアアプリに実装するには:2カ月で160本作った還暦開発者が送る10のアプリ開発ノウハウ(特別編)(3/4 ページ)
開発者向けクレジットカード決済サービスWebPayのAPIの使い方をサンプルアプリとともに解説する。
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"
リクエストを実行するための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
以降、上記コードの中身を詳細に見ていこう。
まず、非同期処理で行われるためメソッドの先頭に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
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
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
変数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
プロパティを定義するコードは省略している。サンプルをダウンロードして参照してほしい。
各プロパティを定義しておく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
各プロパティの定義は省略している。詳細はサンプルコードを参照してほしい。
JsonConvert.SerializeObjectでは、Titleがcardにひとくくりにされているプロパティを、オブジェクトからJson文字列にシリアライズして、ネットワークで送受信が可能なように変換して、戻り値としている。
Copyright © ITmedia, Inc. All Rights Reserved.