ヤフーショッピングAPIの「注文に関するAPI」のうち、orderList、orderInfo、orderChange
はリフレッシュトークンの有効期限が12時間です。(その他は4週間です。)
証明書認証を行うことで、12時間の有効期限を4週間に延長できます。
(参考:ヤフーショッピング 本番環境の注文APIの証明書による認証の有効期限延長の意味)
スポンサーリンク
「ヤフーショッピング 本番環境の注文APIの証明書による認証の有効期限延長の意味」をに記述しましたが、アクセストークンを取得するときに、ヤフーショッピングAPIのクライアント証明書を使用する必要はありません。
当時、勘違いしていたので、以下の記事を書きました。
何かの参考になるかもしれないので、一応、記事は残しておきますが、実際に、ヤフーショッピングAPIの「注文に関するAPI」で、有効期限を4週間にしたい場合は、orderList、orderInfo、orderChangeを使用する時に、クライアント証つかってください。
以下、実際には必要のない処理です。
今回は、VB.netでヤフーショッピングAPIのクライアント証明書を使用してアクセストークンを取得する方法を紹介します。
まず、クライアント証明書を取得するためには、ヤフーに申請する必要があります。
→ヤフーショッピングAPIのクライアント証明書を申請しました。
クライアント証明書を取得したら、VB.netのHttpWebRequestでリクエストを送信するわけですが、その前に、秘密鍵(keyファイル) とSSLクライアント証明書(crtファイル)を1つにまとめて、PKCS#12形式に変換する必要があります。
→Windows用のOpenSSLをインストールしてみました。
次に、アクセストークンを取得する時にしようしたコードを元に書き換えます。
元のコードはこちらです。
→VB.net でYahoo APIのアクセストークンを取得してみました。
「System.Security.Cryptography.X509Certificates」をインポートしておきます。
VB.netでヤフーショッピングAPIのクライアント証明書を使用してアクセストークンを取得するコード
Dim sアプリケーションID As String
Dim sシークレット As String
Dim sCredentials As String
Dim bBytes() As Byte
Dim sBase64 As String
Dim sAuthorization As String
Dim webReq As Net.HttpWebRequest
Dim webRes As Net.HttpWebResponse
Dim sトークンエンドポイント As String
Dim s認可コード As String
Dim sリダイレクトURL As String
Dim reqStream As Stream
Dim resStream As Stream
Dim resStreamReader As StreamReader
Dim sJSON As String
sアプリケーションID = "アプリケーションID "
sシークレット = "シークレット "
s認可コード = "認可コード "
sリダイレクトURL = " リダイレクトURL"
Dim sPKCS12Path As String
Dim sPKCS12Password As String
Dim bPKCS12() As Byte
Dim fsPKCS12 As FileStream
Dim x509 As New X509Certificate2
sPKCS12Path = "PKCS12ファイルのパス"
sPKCS12Password = "PKCS12ファイルを生成した時のパスワード"
'PKCS12ファイルをバイト配列に読み込みます。
fsPKCS12 = New FileStream(sPKCS12Path, FileMode.Open, FileAccess.Read)
ReDim bPKCS12(fsPKCS12.Length - 1)
fsPKCS12.Read(bPKCS12, 0, bPKCS12.Length)
fsPKCS12.Close()
'X509Certificate2を使用して、証明書ファイルを読み込みます。
x509 = New X509Certificate2(bPKCS12, sPKCS12Password, X509KeyStorageFlags.MachineKeySet)
'アプリケーションIDとシークレットを「:」(コロン)でつなぎ
sCredentials = sアプリケーションID & ":" & sシークレット
'Base64でエンコード
bBytes = System.Text.Encoding.ASCII.GetBytes(sCredentials)
sBase64 = Convert.ToBase64String(bBytes)
sAuthorization = String.Concat("Basic ", sBase64)
'Tokenエンドポイント
sトークンエンドポイント = "https://auth.login.yahoo.co.jp/yconnect/v1/token"
'POSTするデータを設定
Dim ht As New Hashtable
ht("grant_type") = "authorization_code"
ht("code") = s認可コード
'リダイレクトURLは空欄でも動作しました。
ht("redirect_uri") = sリダイレクトURL
Dim param As String = ""
For Each k As String In ht.Keys
param += String.Format("{0}={1}&", k, ht(k))
Next
Dim data As Byte()
data = System.Text.Encoding.ASCII.GetBytes(param)
'WebRequestを使用し、Authorizationヘッダーに乗せてアクセス
webReq = DirectCast(System.Net.WebRequest.Create(sトークンエンドポイント), System.Net.HttpWebRequest)
webReq.Method = "POST"
webReq.ContentType = "application/x-www-form-urlencoded"
webReq.ContentLength = data.Length
webReq.Headers("Authorization") = sAuthorization
'読み込んだ証明書ファイルをリクエストに乗っけます。
webReq.ClientCertificates.Add(x509)
'RequestStreamを取得
reqStream = webReq.GetRequestStream()
reqStream.Write(data, 0, data.Length)
reqStream.Close()
'RequestStreamを取得
webRes = webReq.GetResponse()
resStream = webRes.GetResponseStream()
resStreamReader = New StreamReader(resStream, Encoding.UTF8)
'レスポンスはJSON形式です。
sJSON = resStreamReader.ReadToEnd
resStreamReader.Close()
resStream.Close()
webRes.Close()
以上です。