目録へ戻る

実装例

VB.NET呼び出し例

SampleCode.txt

ShopServe API連携EXE VB.NET呼び出し例

この資料は、販売管理システムからShopServe API連携EXEを呼び出す場合の実装例です。
実際の画面処理、バッチ処理、ログ出力方法に合わせて調整して使用してください。

各EXEは、終了コードと標準出力の意味が少しずつ異なります。
そのため、EXEを起動する処理は共通化し、取得した結果の解釈はEXEごとに分ける形を想定しています。


1. 共通の起動処理例

Imports System.Diagnostics
Imports System.Text

Public Class ExeResult
    Public Property ExitCode As Integer
    Public Property StandardOutput As String
    Public Property StandardError As String
    Public Property Timeout As Boolean
End Class

Private Function RunShopServeExe(exePath As String,
                                 arguments As String,
                                 Optional timeoutMilliseconds As Integer = 60000) As ExeResult

    Dim result As New ExeResult()

    Dim psi As New ProcessStartInfo()
    psi.FileName = exePath
    psi.Arguments = arguments
    psi.WorkingDirectory = IO.Path.GetDirectoryName(exePath)
    psi.UseShellExecute = False
    psi.CreateNoWindow = True
    psi.RedirectStandardOutput = True
    psi.RedirectStandardError = True
    psi.StandardOutputEncoding = Encoding.UTF8
    psi.StandardErrorEncoding = Encoding.UTF8

    Using proc As New Process()
        proc.StartInfo = psi
        proc.Start()

        Dim outputTask = proc.StandardOutput.ReadToEndAsync()
        Dim errorTask = proc.StandardError.ReadToEndAsync()

        If proc.WaitForExit(timeoutMilliseconds) Then
            result.ExitCode = proc.ExitCode
            result.StandardOutput = outputTask.Result
            result.StandardError = errorTask.Result
            result.Timeout = False
        Else
            Try
                proc.Kill()
            Catch
            End Try

            result.ExitCode = 9
            result.StandardOutput = ""
            result.StandardError = "ShopServe API連携EXEの実行がタイムアウトしました。"
            result.Timeout = True
        End If
    End Using

    Return result
End Function


2. GetWebData.exe の呼び出し例

GetWebData.exe は、標準出力を使用しません。
正常終了、異常終了は終了コードで判定し、取り込み結果の詳細はログ、またはDBの注文関連テーブルを確認します。

Private Sub SampleGetWebData()
    Dim exePath = "C:\ShopServe\GetWebData.exe"
    Dim result = RunShopServeExe(exePath, "")

    If result.ExitCode = 0 Then
        ' 正常終了
        ' 取り込み結果はログ、またはDBの注文関連テーブルを確認します。
    Else
        ' 異常終了
        ' GetWebData.exe は標準出力を使用しないため、詳細はログを確認します。
        Dim message = result.StandardError
    End If
End Sub


3. PutPoint.exe / PutShipping.exe の呼び出し例

PutPoint.exe と PutShipping.exe は、正常終了時は標準出力を出力しません。
ExitCode が 0 以外の場合、標準出力にエラー理由が出力されます。

Private Sub SamplePutPoint()
    Dim exePath = "C:\ShopServe\PutPoint.exe"
    Dim args = "uid=testuser addpoint=200 note=""連携にて加算"""
    Dim result = RunShopServeExe(exePath, args)

    If result.ExitCode = 0 Then
        ' 正常終了
    Else
        ' 異常終了
        Dim errorMessage = result.StandardOutput
        If String.IsNullOrWhiteSpace(errorMessage) Then
            errorMessage = result.StandardError
        End If
    End If
End Sub

Private Sub SamplePutShipping()
    Dim exePath = "C:\ShopServe\PutShipping.exe"
    Dim args = "serial_code=989819 delivery_no=1 shipping_status=Sent delivery_company_label=YamatoTransport contact_number=1234-5678-9012"
    Dim result = RunShopServeExe(exePath, args)

    If result.ExitCode = 0 Then
        ' 正常終了
    Else
        ' 異常終了
        Dim errorMessage = result.StandardOutput
        If String.IsNullOrWhiteSpace(errorMessage) Then
            errorMessage = result.StandardError
        End If
    End If
End Sub


4. GetPoint.exe の呼び出し例

GetPoint.exe は、ExitCode=0 の場合でも標準出力の結果行が OK とは限りません。
ExitCode は「EXEが結果を作成できたか」、標準出力の OK/NG は「指定した会員IDの取得結果」として扱います。

Private Sub SampleGetPoint()
    Dim exePath = "C:\ShopServe\GetPoint.exe"
    Dim result = RunShopServeExe(exePath, "uid=testuser")

    If result.ExitCode <> 0 Then
        ' DB接続エラー、API通信エラー、JSON解析エラーなどの内部エラー
        Dim errorMessage = result.StandardOutput
        If String.IsNullOrWhiteSpace(errorMessage) Then
            errorMessage = result.StandardError
        End If
        Return
    End If

    Dim line = result.StandardOutput.Trim()
    If line = "" Then
        ' 想定外:結果行なし
        Return
    End If

    Dim cols = line.Split(ControlChars.Tab)
    If cols.Length < 5 Then
        ' 想定外:項目数不足
        Return
    End If

    Dim uid = cols(0)
    Dim status = cols(1)
    Dim validPoint = cols(2)
    Dim expireDate = cols(3)
    Dim message = cols(4)

    If status = "OK" Then
        ' 会員ポイント取得成功
    Else
        ' 会員IDが見つからない、会員ID不正など
        ' EXE自体は正常に結果を返しているため、ExitCode は 0 です。
    End If
End Sub


5. GetPaymentStatus.exe / ReqPayment.exe の呼び出し例

GetPaymentStatus.exe と ReqPayment.exe は、1回の起動で複数件の結果を返す場合があります。
ExitCode=0 の場合でも、標準出力の明細行には OK と NG が混在することがあります。

Private Sub SampleGetPaymentStatus()
    Dim exePath = "C:\ShopServe\GetPaymentStatus.exe"
    Dim result = RunShopServeExe(exePath, "serial_codes=98a01b,98a01a,98zzzz")

    If result.ExitCode <> 0 Then
        ' DB接続エラー、API通信エラー、JSON解析エラーなどの内部エラー
        Dim errorMessage = result.StandardOutput
        If String.IsNullOrWhiteSpace(errorMessage) Then
            errorMessage = result.StandardError
        End If
        Return
    End If

    For Each line In result.StandardOutput.Split({vbCrLf, vbLf}, StringSplitOptions.RemoveEmptyEntries)
        Dim cols = line.Split(ControlChars.Tab)
        If cols.Length < 4 Then
            ' 想定外:項目数不足
            Continue For
        End If

        Dim serialCode = cols(0)
        Dim status = cols(1)
        Dim paymentStatus = cols(2)
        Dim message = cols(3)

        If status = "OK" Then
            ' 決済状況取得成功
        Else
            ' 指定した注文管理番号が見つからない等、明細単位のNG
            ' EXE自体は正常に結果を返しているため、ExitCode は 0 です。
        End If
    Next
End Sub

Private Sub SampleReqPayment()
    Dim exePath = "C:\ShopServe\ReqPayment.exe"
    Dim result = RunShopServeExe(exePath, "serial_codes=98a01b,98a01a")

    If result.ExitCode <> 0 Then
        ' DB接続エラー、API通信エラー、JSON解析エラーなどの内部エラー
        Dim errorMessage = result.StandardOutput
        If String.IsNullOrWhiteSpace(errorMessage) Then
            errorMessage = result.StandardError
        End If
        Return
    End If

    For Each line In result.StandardOutput.Split({vbCrLf, vbLf}, StringSplitOptions.RemoveEmptyEntries)
        Dim cols = line.Split(ControlChars.Tab)
        If cols.Length < 4 Then
            ' 想定外:項目数不足
            Continue For
        End If

        Dim serialCode = cols(0)
        Dim status = cols(1)
        Dim apiMessage = cols(2)
        Dim description = cols(3)

        If status = "OK" Then
            ' 決済依頼成功
        Else
            ' 決済方法または決済ステータスの状態により更新できない等、明細単位のNG
            ' EXE自体は正常に結果を返しているため、ExitCode は 0 です。
        End If
    Next
End Sub


6. 連続して呼び出す場合の例

短時間に何度も連続して呼び出すと、ShopServe側でアクセス制限がかかる可能性があります。
販売管理システム側でループ処理などにより連続実行する場合は、0.5秒程度の待機を入れてください。

Private Sub SampleLoopGetPoint()
    Dim exePath = "C:\ShopServe\GetPoint.exe"
    Dim userIds = New String() {"user001", "user002", "user003"}

    For Each uid In userIds
        Dim result = RunShopServeExe(exePath, "uid=" & uid)

        ' 結果判定は SampleGetPoint と同様です。

        Threading.Thread.Sleep(500)
    Next
End Sub


7. 複数件をまとめて指定する例

GetPaymentStatus.exe と ReqPayment.exe は、注文管理番号をカンマ区切りで複数指定できます。
複数件を処理する場合は、可能な範囲で1回の起動にまとめて指定してください。

Private Sub SampleBulkReqPayment()
    Dim exePath = "C:\ShopServe\ReqPayment.exe"
    Dim serialCodes = New String() {"98a01b", "98a01a", "98a01c"}
    Dim args = "serial_codes=" & String.Join(",", serialCodes)

    Dim result = RunShopServeExe(exePath, args)

    ' 結果判定は SampleReqPayment と同様です。
End Sub

Other Documents

他のEXE別解説

EXE別解説

GetWebData.exe

ShopServeから注文情報を取得し、DBへ取り込みます。

詳細を開く

EXE別解説

PutPoint.exe

ShopServe会員のポイントを加算、または減算します。

詳細を開く

EXE別解説

GetPoint.exe

ShopServe会員のポイント情報を取得し、有効ポイントとポイント有効期限を標準出力に出力します。

詳細を開く

EXE別解説

PutShipping.exe

ShopServe注文のお届け先発送情報を更新します。

詳細を開く

EXE別解説

GetPaymentStatus.exe

ShopServe注文の決済状況を取得し、決済ステータスの日本語表記を含めて標準出力に出力します。

詳細を開く

EXE別解説

GetUnimportedOrders.exe

ShopServeから指定会員の注文を検索し、DBに存在しない未取り込み注文を取得します。

詳細を開く

EXE別解説

ReqPayment.exe

ShopServe注文の決済依頼を行い、処理結果を標準出力にタブ区切りで出力します。

詳細を開く