Go言語向けのサーバサイドライブラリ、webpay-goをリリースしました

Go言語向けのサーバサイドライブラリ、webpay-goをリリースしました。 これまでRuby、PHP、Java、Python、Node.jsをサポートしていましたが、今後は加えてGo言語でWebPayを利用するサービスを構築できます。

今回のバージョン0.1.0のリリースはベータ版であり、バージョン1.0になるまで、非互換な変更を行う場合があります。 変更した場合、これまでの他の言語のライブラリのリリースと同様、このブログの記事でアナウンスします。 バージョンを更新する際は特に注意して動作確認をお願いします。

また、ベータ版であるため、公式サイトのドキュメントには掲載しておりません。 GoDocやソースコードをご確認ください。

このライブラリのいくつかの機能を確認するプログラムを次に示します。 Goのバージョン1.4で動作確認をしています。

まずライブラリをgo getで取得します。

1
$ go get github.com/webpay/webpay-go

次のようなサンプルプログラムを作成します。 WebPayのCheckoutHelperのテストページでトークンを作成し、そのトークンを使って顧客の作成、課金の作成、返金を行います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package main

import (
  "fmt"
  webpay "github.com/webpay/webpay-go"
)

func main() {
  // ログインして実行する際は自身のものに置き換えてください
  secretKey := "test_secret_eHn4TTgsGguBcW764a2KA8Yd"

  fmt.Println("https://webpay.jp/docs/checkout の「カードで支払う」ボタンでトークンを作成してください。")
  fmt.Println("表示された、 \"tok_\" で始まるトークン ID を入力してください。")

  var tokenId string
  _, err := fmt.Scanf("%s", &tokenId)
  if err != nil {
      panic(fmt.Sprintf("トークンを入力してください %v", err))
  }

  // クライアントライブラリのインスタンスを作ります
  client := webpay.NewWebPay(secretKey)
  client.SetAcceptLanguage("ja")

  // トークンの有効性を確認します
  // 頻繁に使う呼び出しは map を作らずに呼べます
  tokenObject, err := client.Token().RetrieveWithId(tokenId)
  if err != nil {
      panic(fmt.Sprintf("トークンの取得に失敗しました: %v", err))
  }
  if *tokenObject.Used() {
      panic("このトークンは使用済みです。再生成してください。")
  }

  // Ruby 等のライブラリと同様に、 map を引数に呼び出すこともできます
  customer, err := client.Customer().CreateWithMap(map[string]interface{}{
      "card":        tokenId,
      "description": "webpay-go で作成した顧客",
  })
  if err != nil {
      panic(fmt.Sprintf("顧客の作成に失敗しました: %v", err))
  }
  fmt.Printf("顧客を作成しました。 ID: %v\n", *customer.Id())
  charge, err := client.Charge().CreateWithMap(map[string]interface{}{
      "customer": *customer.Id(),
      "amount":   1200,
      "currency": "jpy",
  })
  if err != nil {
      panic(fmt.Sprintf("課金の作成に失敗しました: %v", err))
  }

  // ID に対して操作を用意し、さらに追加のパラメータを指定して操作を実行できます
  // 全レスポンスに共通するインタフェースである ResponseData 型が返ります
  // err == nil であれば、対応する Charge().Refund() の返り値型に必ずキャストできます
  res, err := client.Charge().RefundRequestWithId(*charge.Id()).WithAmount(200).Execute()
  if err != nil {
      panic(fmt.Sprintf("部分返金に失敗しました: %v", err))
  }
  refundedCharge := res.(*webpay.ChargeResponse)
  fmt.Printf("顧客 ID %s に %d 円を課金し、 %d 円を返金しました。\n",
      *refundedCharge.Customer(),
      *refundedCharge.Amount(),
      *refundedCharge.AmountRefunded())
}

コメントで説明しているように、このライブラリではいくつかの方法でAPI呼び出しが出来ます。 よく利用する呼び出しは簡単に行えるように工夫しています。

このライブラリは自動生成ツールを利用している関係上、GitHubでPull Requestを頂いても、残念ながらお断りせざるを得ません。 問題や改善案がありましたら、Issuesフォーラムにてご報告ください。

WebPayは今後も対応言語を増やし、どのような環境でも短期間で導入できるサービスを目指してまいります。