カード情報オブジェクト作成ガイド
Web APIで利用するパラメーターencryptedDataはカード情報を暗号化した文字列です。 作成の手順を説明します。
カード情報データの用意
お客様が入力した値からネイティブアプリ内で以下のカード情報データをJSON形式で用意します。
| 項目 | 説明 | |
|---|---|---|
| card required | object | |
| cardNumber required | string | |
| cardholderName | string | |
| expiryMonth required | string | |
| expiryYear required | string | |
| securityCode | string | |
以下はカード情報データのサンプルです。
{
"card": {
"cardNumber":"4111111111111111",
"cardholderName":"HOLDER NAME",
"expiryMonth":"05",
"expiryYear":"24",
"securityCode":"123"
}
}
暗号化とBase64エンコード
前述のカード情報データのJSON文字列を管理画面からダウンロードした公開鍵を用いてRSA方式(2048bit)で暗号化します。公開鍵についてはカード情報トークン化の認証情報を参照ください。 暗号化後の文字列をBase64エンコードした文字列を「カード情報オブジェクト」としてトークン発行リクエストパラメーターに設定します。
サンプルコード
JavaとSwiftのコードスニペットです。変数の保持方法や例外処理は適切に変更してください
Java
public String createEncryptedData() throws Exception {
// 管理画面からダウンロードした公開鍵
String publicKeyString = "MIIBIjA...";
// カード情報データのJSON文字列
String cardInfoJson = "{\"card\":{\"cardNumber\":\"4111111111111111\",\"cardholderName\":\"HOLDERNAME\",\"expiryMonth\":\"05\",\"expiryYear\":\"24\",\"securityCode\":\"123\"}}";
// 公開鍵から公開鍵オブジェクトを作成
byte[] decodedPublicKey = Base64.getDecoder().decode(publicKeyString.getBytes(StandardCharsets.UTF_8));
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decodedPublicKey));
// カード情報データを暗号化
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedByte = cipher.doFinal(cardInfoJson.getBytes());
// Base64エンコード
String encryptedData = Base64.getEncoder().encodeToString(encryptedByte);
return encryptedData;
}
Swift
func makeCardInfoData() -> String? {
do{
let publicKeyString = "MIIBIjA..."
let cardInfoJson = "{\"card\":{\"cardNumber\":\"4111111111111111\",\"cardholderName\":\"HOLDERNAME\",\"expiryMonth\":\"05\",\"expiryYear\":\"24\",\"securityCode\":\"123\"}}"
// 公開鍵から公開鍵オブジェクトを作成
let data:Data = Data(base64Encoded: publicKeyString, options: Data.Base64DecodingOptions.ignoreUnknownCharacters)!
let keyDict:[NSObject:NSObject] = [kSecAttrKeyType: kSecAttrKeyTypeRSA,
kSecAttrKeyClass: kSecAttrKeyClassPublic,
kSecAttrKeySizeInBits: NSNumber(value: 2048),
kSecReturnPersistentRef: true as NSObject
]
let publicKey = SecKeyCreateWithData(data as CFData, keyDict as CFDictionary, nil)
// カード情報データを暗号化
let plainBuffer = [UInt8](cardInfoJson.utf8)
var cipherBufferSize : Int = Int(SecKeyGetBlockSize(publicKey!))
var cipherBuffer = [UInt8](repeating:0, count:Int(cipherBufferSize))
let status = SecKeyEncrypt(publicKey!, SecPadding.PKCS1, plainBuffer, plainBuffer.count, &cipherBuffer, &cipherBufferSize)
if (status != errSecSuccess) {
// 失敗時の処理
}
// Base64エンコード
let mudata = NSData(bytes: &cipherBuffer, length: cipherBufferSize)
let encryption = mudata.base64EncodedString(options: NSData.Base64EncodingOptions.lineLength64Characters)
return encryption
} catch {
return nil
}
}