# 支払い結果の検証

このページでは 支払い結果検証の実装方法について説明します。

# 署名の検証

mobage.ui.open() による支払い処理が完了すると 、コールバック関数の第二引数に result オブジェクトが渡されます。このresult オブジェクトの signedResponse プロパティに、支払い結果をJWT形式でエンコードされた文字列が格納されています。

このJWTはRS256 アルゴリズムを利用して署名されています。 RS256に対応した JWTライブラリを選択し、署名検証の実装を行なってください。

署名を検証する際にはMobageの環境ごとに異なる公開鍵が必要となります。 JWTの公開鍵 を参照し、環境に合った公開鍵を利用して検証を実装してください。

サンプルアプリケーションを実行する から配布している Java サンプルコードに Java JWT: JSON Web Token for Java and Android を利用した実装例があります。

# JWT Claims Set の検証

署名が正しいことを確認できた後、JWT の Claims Set と呼ばれるデータを検証します。 JWT Claims Set は下記のような構造をしています。

{
    "jti": "12123312" ,
    "iss": "https ://sb-widget.mobage.jp",
    "aud": "12000129-4" ,
    "sub": "12341234" ,
    "typ": "signed_extra",
    "extra ": {
        "service": "payment",
        "result": {
            "payment": {
                "id": "20EDBD5D-A858-38F7-BF65-A097394AC80C",
                "items": [
                    {
                        "item": {
                            "id": "item_1",
                            "name": "Sample item",
                            "price ": 100,
                            "description ": "This is a sample item",
                            "imageUrl ": "http://example.pf.mobage.jp/img/item_1.png"
                        },
                    "quantity": 4
                    }
                ],
                "state": "closed",
                "comment": "Purchase of four sample items",
                "published": "2014-01-27T11:58:01" ,
                "updated": "2014-01-27T11:59:35"
            },
            "order_id": "123456123"
        }
    },
    "iat": 1390791600
}

下記の観点でClaims Set に不正な値が含まれていないかを確認してください。

  • iss の値が下記表の値と一致するか
  • aud の値がアプリケーションのClient IDと一致しているか
  • iat の値が現在時刻よりも過去の日時を表すUNIXタイムスタンプ値となっているか
  • sub の値がログインユーザの Mobage ユーザー IDと一致するか
環境 iss の値
sandbox https://sb-widget.mobage.jp
service https://widget.mobage.jp

# 注文時の記録との一致の確認

signedResponseプロパティに格納された JWT 内の extra というフィールドに支払い結果情報が格納されています。

支払いダイアログの呼び出し時に開発者サーバーで発行した Order ID を渡すことにより、extra.result.order_id を参照して Order ID が取得可能です。

開発者サーバー上で Order ID に紐づけて記録した Transaction ID と JWT 上の extra.result.payment.id が一致していることを確認し、アイテムを付与します。

# 重複付与の防止

1つの支払い結果からアイテムを重複して付与してしまうことを防ぐため、アイテムの付与状態の確認を実装する必要があります。

この際、アイテムの付与状態の確認からアイテムの付与までの間、排他制御などにより他のプロセスによる付与は実行されないことを担保してください。

MIT Licensed | Copyright © 2020-present DeNA.Co., Ltd. All rights reserved.