# Partner API SDK for Ruby ## Installation rubygemsからインストールすることができます。 ``` $ gem install pokepay_partner_ruby_sdk ``` ロードパスの通ったところにライブラリが配置されていれば、以下のようにロードできます。 ```ruby require "pokepay_partner_ruby_sdk" ``` ## Getting started 基本的な使い方は次のようになります。 - ライブラリをロード - 設定ファイル(後述)から `Pokepay::Client` オブジェクトを作る - リクエストオブジェクトを作り、`Pokepay::Client` オブジェクトの `send` メソッドに対して渡す - レスポンスオブジェクトを得る ```ruby require "pokepay_partner_ruby_sdk" client = Pokepay::Client.new("/path/to/config.ini") request = Pokepay::Request::SendEcho.new('hello') response = client.send(request) ``` レスポンスオブジェクト内にステータスコード、JSONをパースしたハッシュマップ、さらにレスポンス内容のオブジェクトが含まれています。 ## Settings 設定はINIファイルに記述し、`Pokepay::Client` のコンストラクタにファイルパスを指定します。 SDKプロジェクトルートに `config.ini.sample` というファイルがありますのでそれを元に必要な情報を記述してください。特に以下の情報は通信の安全性のため必要な項目です。これらはパートナー契約時にお渡ししているものです。 - `CLIENT_ID`: パートナーAPI クライアントID - `CLIENT_SECRET`: パートナーAPI クライアント秘密鍵 - `SSL_KEY_FILE`: SSL秘密鍵ファイルパス - `SSL_CERT_FILE`: SSL証明書ファイルパス この他に接続先のサーバURL情報が必要です。 - `API_BASE_URL`: パートナーAPI サーバURL また、この設定ファイルには認証に必要な情報が含まれるため、ファイルの管理・取り扱いに十分注意してください。 設定ファイル記述例(`config.ini.sample`) ``` CLIENT_ID = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx CLIENT_SECRET = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy API_BASE_URL = https://partnerapi-sandbox.pokepay.jp SSL_KEY_FILE = /path/to/key.pem SSL_CERT_FILE = /path/to/cert.pem ``` ## Overview ### APIリクエスト Partner APIへの通信はリクエストオブジェクトを作り、`Pokepay::Client.send` メソッドに渡すことで行われます。 リクエストクラスは名前空間 `Pokepay::Request` 以下に定義されています。 たとえば `Pokepay::Request::SendEcho` は送信した内容をそのまま返す処理です。 ```ruby request = Pokepay::Request::SendEcho.new('hello') response = client.send(request) # => # ``` 通信の結果として、レスポンスオブジェクトが得られます。 これはステータスコードとレスポンスボディ、各レスポンスクラスのオブジェクトをインスタンス変数に持つオブジェクトです。 ```ruby response.code # => 200 response.body # => {"status"=>"ok", "message"=>"hello"} response.object # => # response.object.message # => "hello" ``` 利用可能なAPI操作については [API Operations](#api-operations) で紹介します。 ### ページング API操作によっては、大量のデータがある場合に備えてページング処理があります。 その処理では以下のようなプロパティを持つレスポンスオブジェクトを返します。 - rows : 列挙するレスポンスクラスのオブジェクトの配列 - count : 全体の要素数 - pagination : 以下のインスタンス変数を持つオブジェクト - current : 現在のページ位置(1からスタート) - per_page : 1ページ当たりの要素数 - max_page : 最後のページ番号 - has_prev : 前ページを持つかどうかの真理値 - has_next : 次ページを持つかどうかの真理値 ページングクラスは `Pokepay::Response::Pagination` で定義されています。 以下にコード例を示します。 ```ruby request = Pokepay::Request::ListTransactions.new({ "page" => 1, "per_page" => 50 }) response = client.send(request) if response.object.pagination.has_next then next_page = response.object.pagination.current + 1 request = Pokepay::Request::ListTransactions.new({ "page" => next_page, "per_page" => 50 }) response = client.send(request) end ``` ### エラーハンドリング エラーの場合は `Net::HTTPBadRequest` などのエラーレスポンスオブジェクトが返ります。 エラーレスポンスもステータスコードとレスポンスボディを持ちます。 ```ruby request = Pokepay::Request::SendEcho.new(-1) response = client.send(request) # => # response.code # => 400 response.body # => {"type"=>"invalid_parameters", "message"=>"Invalid parameters", "errors"=>{"invalid"=>["message"]}} ``` ## API Operations ### Transaction #### 取引情報を取得する 取引を取得します。 ```ruby response = $client.send(Pokepay::Request::GetTransaction.new( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" // transaction_id: 取引ID )) ``` --- `transaction_id` 取引IDです。 フィルターとして使われ、指定した取引IDの取引を取得します。 --- 成功したときは[Transaction](#transaction)オブジェクトを返します #### チャージする チャージ取引を作成します。 ```ruby response = $client.send(Pokepay::Request::CreateTopupTransaction.new( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // shop_id: 店舗ID "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // customer_id: エンドユーザーのID "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // private_money_id: マネーID bear_point_shop_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // ポイント支払時の負担店舗ID money_amount: 8555, // マネー額 point_amount: 2302, // ポイント額 description: "初夏のチャージキャンペーン" // 取引履歴に表示する説明文 )) ``` --- `shop_id` 店舗IDです。 送金元の店舗を指定します。 --- `customer_id` エンドユーザーIDです。 送金先のエンドユーザーを指定します。 --- `private_money_id` マネーIDです。 マネーを指定します。 --- `bear_point_shop_id` ポイント支払時の負担店舗IDです。 ポイント支払い時に実際お金を負担する店舗を指定します。 --- `money_amount` マネー額です。 送金するマネー額を指定します。 --- `point_amount` ポイント額です。 送金するポイント額を指定します。 --- `description` 取引説明文です。 任意入力で、取引履歴に表示される説明文です。 --- 成功したときは[Transaction](#transaction)オブジェクトを返します #### 支払いする 支払取引を作成します。 支払い時には、エンドユーザーの残高のうち、ポイント残高から優先的に消費されます。 ```ruby response = $client.send(Pokepay::Request::CreatePaymentTransaction.new( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // shop_id: 店舗ID "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // customer_id: エンドユーザーID "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // private_money_id: マネーID 6077, // amount: 支払い額 description: "たい焼き(小倉)" // 取引履歴に表示する説明文 )) ``` --- `shop_id` 店舗IDです。 送金先の店舗を指定します。 --- `customer_id` エンドユーザーIDです。 送金元のエンドユーザーを指定します。 --- `private_money_id` マネーIDです。 マネーを指定します。 --- `amount` マネー額です。 送金するマネー額を指定します。 --- `description` 取引説明文です。 任意入力で、取引履歴に表示される説明文です。 --- 成功したときは[Transaction](#transaction)オブジェクトを返します #### 取引履歴を取得する 取引一覧を返します。 ```ruby response = $client.send(Pokepay::Request::ListTransactions.new( from: "2021-04-20T20:55:06.000000+09:00", // 開始日時 to: "2021-12-08T08:10:34.000000+09:00", // 終了日時 page: 1, // ページ番号 per_page: 50, // 1ページ分の取引数 shop_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // 店舗ID customer_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // エンドユーザーID customer_name: "太郎", // エンドユーザー名 terminal_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // 端末ID transaction_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // 取引ID organization_code: "pocketchange", // 組織コード private_money_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // マネーID is_modified: true, // キャンセルフラグ types: ["topup", "payment"] // 取引種別 (複数指定可)、チャージ=topup、支払い=payment )) ``` --- `from` 抽出期間の開始日時です。 フィルターとして使われ、開始日時以降に発生した取引のみ一覧に表示されます。 --- `to` 抽出期間の終了日時です。 フィルターとして使われ、終了日時以前に発生した取引のみ一覧に表示されます。 --- `page` 取得したいページ番号です。 --- `per_page` 1ページ分の取引数です。 --- `shop_id` 店舗IDです。 フィルターとして使われ、指定された店舗での取引のみ一覧に表示されます。 --- `customer_id` エンドユーザーIDです。 フィルターとして使われ、指定されたエンドユーザーでの取引のみ一覧に表示されます。 --- `customer_name` エンドユーザー名です。 フィルターとして使われ、入力された名前に部分一致するエンドユーザーでの取引のみ一覧に表示されます。 --- `terminal_id` 端末IDです。 フィルターとして使われ、指定された端末での取引のみ一覧に表示されます。 --- `transaction_id` 取引IDです。 フィルターとして使われ、指定された取引のみ一覧に表示されます。 --- `organization_code` 組織コードです。 フィルターとして使われ、指定された組織での取引のみ一覧に表示されます。 --- `private_money_id` マネーIDです。 フィルターとして使われ、指定したマネーでの取引のみ一覧に表示されます。 --- `is_modified` キャンセルフラグです。 これにtrueを指定するとキャンセルされた取引のみ一覧に表示されます。 デフォルト値はfalseで、キャンセルの有無にかかわらず一覧に表示されます。 --- `types` 取引の種類でフィルターします。 以下の種類を指定できます。 1. topup 店舗からエンドユーザーへの送金取引(チャージ) 2. payment エンドユーザーから店舗への送金取引(支払い) 3. exchange-outflow   他マネーへの流出 4. exchange-inflow 他マネーからの流入 --- 成功したときは[PaginatedTransaction](#paginated-transaction)オブジェクトを返します #### 返金する ```ruby response = $client.send(Pokepay::Request::RefundTransaction.new( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // transaction_id: 取引ID description: "返品対応のため" // 取引履歴に表示する返金事由 )) ``` 成功したときは[Transfer](#transfer)オブジェクトを返します ### チャージQRコード 店舗ユーザが発行し、エンドユーザがポケペイアプリから読み取ることでチャージ取引が発生するQRコードです。 チャージQRコードを解析すると次のようなURLになります(URLは環境によって異なります)。 `https://www-sandbox.pokepay.jp/checks/xxxxxxxx-xxxx-xxxxxxxxx-xxxxxxxxxxxx` QRコードを読み取る方法以外にも、このURLリンクを直接スマートフォン(iOS/Android)上で開くことによりアプリが起動して取引が行われます。(注意: 上記URLはsandbox環境であるため、アプリもsandbox環境のものである必要があります) 上記URL中の `xxxxxxxx-xxxx-xxxxxxxxx-xxxxxxxxxxxx` の部分がチャージQRコードのIDです。 #### チャージQRコードの発行 ```ruby response = $client.send(Pokepay::Request::CreateCheck.new( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // account_id: 送金元の店舗アカウントID money_amount: 5032, // 付与マネー額 point_amount: 1995, // 付与ポイント額 description: "test check", // 説明文(アプリ上で取引の説明文として表示される) is_onetime: false, // ワンタイムかどうか。真の場合1度読み込まれた時点でそのチャージQRは失効する(デフォルト値は真) usage_limit: 219, // ワンタイムでない場合、複数ユーザから読み取られ得る。その場合の最大読み取り回数 expires_at: "2024-10-18T00:20:49.000000+09:00", // チャージQR自体の失効日時 point_expires_at: "2019-07-04T01:50:46.000000+09:00", // チャージQRによって付与されるポイントの失効日時 point_expires_in_days: 60, // チャージQRによって付与されるポイントの有効期限(相対指定、単位は日) bear_point_account: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" // ポイント額を負担する店舗アカウントのID )) ``` `money_amount`と`point_amount`の少なくとも一方は指定する必要があります。 --- `is_onetime` チャージQRコードが一度の読み取りで失効するときに`true`にします。デフォルト値は`true`です。 `false`の場合、そのチャージQRコードは1ユーザについては1回きりですが、複数ユーザによって読み取り可能なQRコードになります。 --- `usage_limit` 複数ユーザによって読み取り可能なチャージQRコードの読み取り回数に制限をつけるために指定します。 省略すると無制限に読み取り可能なチャージQRコードになります。 チャージQRコードは管理画面からいつでも無効化(有効化)することができます。 --- 成功したときは[Check](#check)オブジェクトを返します #### チャージQRコードを読み取ることでチャージする 通常チャージQRコードはエンドユーザのアプリによって読み取られ、アプリとポケペイサーバとの直接通信によって取引が作られます。 もしエンドユーザとの通信をパートナーのサーバのみに限定したい場合、パートナーのサーバがチャージQRの情報をエンドユーザから代理受けして、サーバ間連携APIによって実際のチャージ取引をリクエストすることになります。 エンドユーザから受け取ったチャージ用QRコードのIDをエンドユーザIDと共に渡すことでチャージ取引が作られます。 ```ruby response = $client.send(Pokepay::Request::CreateTopupTransactionWithCheck.new( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // check_id: チャージ用QRコードのID "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" // customer_id: エンドユーザーのID )) ``` --- `check_id` チャージ用QRコードのIDです。 QRコード生成時に送金元店舗のウォレット情報や、送金額などが登録されています。 --- `customer_id` エンドユーザーIDです。 送金先のエンドユーザーを指定します。 --- 成功したときは[Transaction](#transaction)オブジェクトを返します ### Customer #### 新規エンドユーザーウォレットを追加する 指定したマネーのウォレットを作成し、同時にそのウォレットを保有するユーザも作成します。 ```ruby response = $client.send(Pokepay::Request::CreateCustomerAccount.new( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // private_money_id: マネーID user_name: "ポケペイ太郎", // ユーザー名 account_name: "ポケペイ太郎のアカウント" // アカウント名 )) ``` --- `private_money_id` マネーIDです。 これによって作成するウォレットのマネーを指定します。 --- `user_name` ウォレットと共に作成するユーザ名です。省略した場合は空文字となります。 --- `account_name` 作成するウォレット名です。省略した場合は空文字となります。 --- 成功したときは[AccountWithUser](#account-with-user)オブジェクトを返します #### エンドユーザーのウォレット情報を表示する ウォレットを取得します。 ```ruby response = $client.send(Pokepay::Request::GetAccount.new( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" // account_id: ウォレットID )) ``` --- `account_id` ウォレットIDです。 フィルターとして使われ、指定したウォレットIDのウォレットを取得します。 --- 成功したときは[AccountDetail](#account-detail)オブジェクトを返します #### エンドユーザーの残高内訳を表示する エンドユーザーの残高は有効期限別のリストとして取得できます。 ```ruby response = $client.send(Pokepay::Request::ListAccountBalances.new( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // account_id: ウォレットID page: 8855, // ページ番号 per_page: 14 // 1ページ分の取引数 )) ``` --- `account_id` ウォレットIDです。 フィルターとして使われ、指定したウォレットIDのウォレット残高を取得します。 --- `page` 取得したいページ番号です。 --- `per_page` 1ページ分のウォレット残高数です。 --- 成功したときは[PaginatedAccountBalance](#paginated-account-balance)オブジェクトを返します ### Organization #### 新規加盟店組織を追加する ```ruby response = $client.send(Pokepay::Request::CreateOrganization.new( "ox_supermarket", // code: 新規組織コード "oxスーパー", // name: 新規組織名 ["xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"], // private_money_ids: 加盟店組織で有効にするマネーIDの配列 "Rrnkhmqvwf@VE2D.com", // issuer_admin_user_email: 発行体担当者メールアドレス "1nKhvBTC3o@f9gR.com", // member_admin_user_email: 新規組織担当者メールアドレス bank_name: "XYZ銀行", // 銀行名 bank_code: "99X", // 銀行金融機関コード bank_branch_name: "ABC支店", // 銀行支店名 bank_branch_code: "99X", // 銀行支店コード bank_account_type: "saving", // 銀行口座種別 (普通=saving, 当座=current, その他=other) bank_account: 9999999, // 銀行口座番号 bank_account_holder_name: "フクザワユキチ", // 口座名義人名 contact_name: "佐藤清" // 担当者名 )) ``` 成功したときは[Organization](#organization)オブジェクトを返します ### Shop #### 新規店舗を追加する ```ruby response = $client.send(Pokepay::Request::CreateShop.new( "oxスーパー三田店", // shop_name: 店舗名 shop_postal_code: "7374764", // 店舗の郵便番号 shop_address: "東京都港区芝...", // 店舗の住所 shop_tel: "0550-6127", // 店舗の電話番号 shop_email: "nrkqiF5U2g@QPDC.com", // 店舗のメールアドレス shop_external_id: "3BmwEo", // 店舗の外部ID organization_code: "ox-supermarket" // 組織コード )) ``` 成功したときは[User](#user)オブジェクトを返します ### Private Money #### 決済加盟店の取引サマリを取得する ```ruby response = $client.send(Pokepay::Request::GetPrivateMoneyOrganizationSummaries.new( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // private_money_id: マネーID from: "2024-08-10T12:22:25.000000+09:00", // 開始日時(toと同時に指定する必要有) to: "2024-07-28T01:26:08.000000+09:00", // 終了日時(fromと同時に指定する必要有) page: 1, // ページ番号 per_page: 50 // 1ページ分の取引数 )) ``` `from`と`to`は同時に指定する必要があります。 成功したときは[PaginatedPrivateMoneyOrganizationSummaries](#paginated-private-money-organization-summaries)オブジェクトを返します ## Responses ## AccountWithUser * `id (string)`: * `name (string)`: * `is_suspended (boolean)`: * `private_money (PrivateMoney)`: * `user (User)`: `private_money`は [PrivateMoney](#private-money) オブジェクトを返します。 `user`は [User](#user) オブジェクトを返します。 ## AccountDetail * `id (string)`: * `name (string)`: * `is_suspended (boolean)`: * `balance (double)`: * `money_balance (double)`: * `point_balance (double)`: * `private_money (PrivateMoney)`: `private_money`は [PrivateMoney](#private-money) オブジェクトを返します。 ## Check * `id (string)`: チャージQRコードのID * `amount (double)`: チャージマネー額 (deprecated) * `money_amount (double)`: チャージマネー額 * `point_amount (double)`: チャージポイント額 * `description (string)`: チャージQRコードの説明文(アプリ上で取引の説明文として表示される) * `user (User)`: 送金元ユーザ情報 * `is_onetime (boolean)`: 使用回数が一回限りかどうか * `is_disabled (boolean)`: 無効化されているかどうか * `expires_at (string)`: チャージQRコード自体の失効日時 * `private_money (PrivateMoney)`: 対象マネー情報 * `usage_limit (integer)`: 一回限りでない場合の最大読み取り回数 * `usage_count (double)`: 一回限りでない場合の現在までに読み取られた回数 * `token (string)`: チャージQRコードを解析したときに出てくるURL `user`は [User](#user) オブジェクトを返します。 `private_money`は [PrivateMoney](#private-money) オブジェクトを返します。 ## User * `id (string)`: ユーザー (または店舗) ID * `name (string)`: ユーザー (または店舗) 名 * `is_merchant (boolean)`: 店舗ユーザーかどうか ## Organization * `code (string)`: 組織コード * `name (string)`: 組織名 ## Transaction * `id (string)`: 取引ID * `type (string)`: 取引種別 (チャージ=topup, 支払い=payment) * `is_modified (boolean)`: 返金された取引かどうか * `sender (User)`: 送金者情報 * `sender_account (Account)`: 送金ウォレット情報 * `receiver (User)`: 受取者情報 * `receiver_account (Account)`: 受取ウォレット情報 * `amount (double)`: 決済総額 (マネー額 + ポイント額) * `money_amount (double)`: 決済マネー額 * `point_amount (double)`: 決済ポイント額 * `done_at (string)`: 取引日時 * `description (string)`: 取引説明文 `receiver`と`sender`は [User](#user) オブジェクトを返します。 `receiver_account`と`sender_account`は [Account](#account) オブジェクトを返します。 ## Transfer * `id (string)`: * `sender_account (AccountWithoutPrivateMoneyDetail)`: * `receiver_account (AccountWithoutPrivateMoneyDetail)`: * `amount (double)`: * `money_amount (double)`: * `point_amount (double)`: * `done_at (string)`: * `type (string)`: * `description (string)`: * `transaction_id (string)`: `receiver_account`と`sender_account`は [AccountWithoutPrivateMoneyDetail](#account-without-private-money-detail) オブジェクトを返します。 ## PaginatedPrivateMoneyOrganizationSummaries * `rows (array of PrivateMoneyOrganizationSummaries)`: * `count (integer)`: * `pagination (Pagination)`: `rows`は [PrivateMoneyOrganizationSummary](#private-money-organization-summary) オブジェクトの配列を返します。 `pagination`は [Pagination](#pagination) オブジェクトを返します。 ## PaginatedTransaction * `rows (array of Transactions)`: * `count (integer)`: * `pagination (Pagination)`: `rows`は [Transaction](#transaction) オブジェクトの配列を返します。 `pagination`は [Pagination](#pagination) オブジェクトを返します。 ## PaginatedAccountBalance * `rows (array of AccountBalances)`: * `count (integer)`: * `pagination (Pagination)`: `rows`は [AccountBalance](#account-balance) オブジェクトの配列を返します。 `pagination`は [Pagination](#pagination) オブジェクトを返します。 ## PrivateMoney * `id (string)`: マネーID * `name (string)`: マネー名 * `unit (string)`: マネー単位 (例: 円) * `is_exclusive (boolean)`: 会員制のマネーかどうか * `description (string)`: マネー説明文 * `oneline_message (string)`: マネーの要約 * `organization (Organization)`: マネーを発行した組織 * `max_balance (double)`: ウォレットの上限金額 * `transfer_limit (double)`: マネーの取引上限額 * `type (string)`: マネー種別 (自家型=own, 第三者型=third-party) * `expiration_type (string)`: 有効期限種別 (チャージ日起算=static, 最終利用日起算=last-update, 最終チャージ日起算=last-topup-update) * `enable_topup_by_member (boolean)`: 加盟店によるチャージが有効かどうか * `account_image (string)`: マネーの画像URL `organization`は [Organization](#organization) オブジェクトを返します。 ## Account * `id (string)`: ウォレットID * `name (string)`: ウォレット名 * `is_suspended (boolean)`: ウォレットが凍結されているかどうか * `private_money (PrivateMoney)`: 設定マネー情報 `private_money`は [PrivateMoney](#private-money) オブジェクトを返します。 ## AccountWithoutPrivateMoneyDetail * `id (string)`: * `name (string)`: * `is_suspended (boolean)`: * `private_money_id (string)`: * `user (User)`: `user`は [User](#user) オブジェクトを返します。 ## PrivateMoneyOrganizationSummary * `organization_code (string)`: * `topup (OrganizationSummary)`: * `payment (OrganizationSummary)`: `payment`と`topup`は [OrganizationSummary](#organization-summary) オブジェクトを返します。 ## Pagination * `current (integer)`: * `per_page (integer)`: * `max_page (integer)`: * `has_prev (boolean)`: * `has_next (boolean)`: ## AccountBalance * `expires_at (string)`: * `money_amount (double)`: * `point_amount (double)`: