はかますたいる!きょろの技的雑記

井上恭輔(@kyoro353)の私的かつ技的な日記です。米国サンフランシスコで暮らすエンジニアです。

WebPayLiteを使ってiOSから簡単に決済用トークンを作成する

この投稿はWebPay Advent Calendar 2013の18日目の記事です。

WebPayLiteを改良してみた

こんにちは!WebPayアドベントカレンダー3日目で「WebPayLiteを使ってiOSから簡単にクレジットカード決済する」という記事を書いたところ、シークレットキーを使ってクライアントサイドで決済させる実装が良くなかったのか、なんか記事が干されてしまった感に地味に落ち込んでいる、きょろです。( ;⌓;)

とはいえ、落ち込んでいても仕方ないので、今回は私の作った「WebPayLite」というObjective-C向けの軽量WebPayクライアント・ライブラリを改良し、クライアントサイドでのトークン化に特化させる実装に変更しましたので紹介しようと思います。

f:id:kyoro353:20131218044102p:plain

WebPayLiteの使い方

WebPayやWebPayLiteの紹介は前回と変更がありませんので、WebPayLiteを使ってiOSから簡単にクレジットカード決済するをご参考下さい。 それでは、WebPayLiteを使ってカード情報をクライアントアプリサイドでトークン化する方法を紹介します。 WebPayLiteにはサンプルのiPhoneアプリのプロジェクトが付随していますので、そちらを参考にしながら読み進めて下さい。

1. ファイルをプロジェクトに追加します。

WebPayLiteをGithubから入手して、「WebPayLite.h」と「WebPayLite.m」をあなたのプロジェクトに追加します。ツリーのルートに突っ込むだけでOK、ビルドターゲットへの設定を忘れずに!

2. ViewController.hに、インポート宣言とデリゲート宣言、クラス変数の定義を追加します。

トークン化機能を実装するViewControllerのヘッダファイルに、WebPayLiteのインポート宣言、コールバックのデリゲートを受け取るためのデリゲート宣言、WebPayLiteのインスタンスを格納するクラス変数の定義を追加してください。

#import "WebPayLite.h"

@interface ViewController : UIViewController <WebPayLiteDelegate>{
    WebPayLite *wpl;
}

3.初期化処理

ViewController.mの実装ファイル側に、初期化処理を追加します。 大抵の場合、viewDidLoadedとかに追加すれば問題ないと思います。 内容はインスタンスの作成、デリゲートの登録、WebPayの公開可能鍵の登録です。 公開可能鍵のハードコーディングが気になる場合は、キーチェーンなどを利用して適切に保護してください。 鍵を設定するプロパティは、secretKeyからapiKeyに変更になっているのでご注意ください。

//WebPayLite Initialize
wpl = [[WebPayLite alloc] init];
wpl.delegate = self;
wpl.apiKey = @"YOUR_PUBLIC_KEY";

4.トークン化

ここまですれば後はトークン作成メソッドを呼ぶだけです。createTokenメソッドでトークンの作成ができます。基本的にはWebPayのAPI呼び出し時のパラメータをそのままNSDictionaryで与えればいいだけの薄いラッパなので、WebPayのAPIドキュメントを見ながら自由に呼び出してください。

NSDictionary *params = @{ @"card[number]" : @"4242424242424242",
                              @"card[exp_month]" : @"12",
                              @"card[exp_year]" : @"18" ,
                              @"card[cvc]" : @"123",
                              @"card[name]" : @"KYOSUKE INOUE",
                              @"description" : @"Test Tokenize"
                              };
[wpl createToken:params];

5. コールバックの実装

必要に応じてWebPayLiteDelegateの各種コールバックをViewControllerに実装してください。引数として渡されるjsonはNSStringですので、NSJSONSerializationなどを使って必要なキーを読み取って下さい。戻り値なども基本的にはWebPayのAPIドキュメントの通りです。 ここでは、WebPayLiteDelegateCompletedを受け取って、作成したトークンを取得してみます。

- (void)WebPayLiteDelegateCompleted:(NSString *)jsonBody {
    NSDictionary *jsonObject = [NSJSONSerialization
                                JSONObjectWithData: [jsonBody dataUsingEncoding:NSUTF8StringEncoding]
                                options: NSJSONReadingAllowFragments
                                error:nil];
    NSString *token = [jsonObject objectForKey:@"id"];
    UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:@"Succeed!"
                          message:[NSString stringWithFormat:@"Token: %@",token]
                          delegate:self
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil];

    [alert show]; 
}

6. トークンをサーバに送信し、サーバーから秘密鍵で課金する。

ここまでくれば後は簡単です。WebPayLiteで作成したトークンをあなたのサーバに送信し、秘密鍵を使って顧客の作成や課金などを行って下さい。WebPayにはRubyPHPPythonなどの各種言語バインディングがありますので、サーバーサイドの課金の実装はとても簡単です。詳しくは他のWebPayアドベントカレンダーをご参考ください。

みんなで楽しくトークン決済!

こんな感じで、皆さん、できるだけトークン決済を行うように心がけましょう。トークン決済はお客さんの決済情報を守るだけでなく、アプリを作るあなた自身の不安を取り除き、楽しく決済機能を実装できるようになります。 WebPayLiteはGithubで、MITライセンスにて公開中です。ご自由にお使い下さい&プルリクエスト歓迎です。

それでは!