トークン決済はカード情報を入力する画面が加盟店様側の画面となるため、加盟店様のシステムにてカード情報非保持、非通過に対応するためのシステム設計上の難易度も高くなってまいります。 トークン決済の利用を希望される場合はシステム構築の観点も含め、十分に検討をお願いいたします。
トークン取得のためのJavascriptのリンクは以下になります。
【本番環境】 https://static.secure.epsilon.jp/js/token.js
【テスト環境】 https://static.beta.epsilon.jp/js/token.js
<!DOCTYPE html> <html><head> <meta charset="UTF-8"> <!--本番環境をご利用の場合は本番環境のURLを設定してください--> <script src= 'https://static.beta.epsilon.jp/js/token.js'></script> <title>加盟店様購入画面</title> <script> <!--トークン結果取得--> function execTrade ( response ) { if( response.resultCode != 000 ){ window.alert( ‘購入処理中にエラーが発生しました’ ) }else{ //カード情報は念のため値を除去 document.getElementById(‘cardno’).value=””; document.getElementById(‘expire_year’).value=”” document.getElementById(‘expire_month’).value=”” document.getElementById(‘securitycode’).value=”” //予め購入フォームに用意したtokenフィールドに、値を設定 document.getElementById(‘token’).value = response.tokenObject.token; //スクリプトからフォームをsubmit document.getEmentsById(‘purchaseForm’).submit() } } <!--トークン発行--> function postForm( calltype ) { var cardObj = {}; cardObj.cardno = document.getElementById('cardno').value; cardObj.expire = document.getElementById('expire_year').value + document.getElementById('expire_month').value; cardObj.securitycode = document.getElementById('securitycode').value; cardObj.holdername = document.getElementById('holdername').value; EpsilonToken.init(document.getElementById("contract_code").value); if( calltype == 'string') { EpsilonToken.getToken( cardObj , "execTrade" ); }else{ EpsilonToken.getToken( cardObj , execTrade ); } } </script> </head> <body> <form id='getTokenForm'> <p> カード番号:<input type='text' value='' name='cardno' id='cardno' /> </p> <p> カード有効期限:<input type='text' value='' name='expire_year' id='expire_year' />/ <input type='text' value='' name='expire_month' id='expire_month' /> </p> <p> セキュリティコード:<input type='text' value='' name='securitycode' id='securitycode' /> </p> <p> 名義人:<input type='text' value='' name='holdername' id='holdername' /> </p> <p> <!--結果をオブジェクトで受け取る場合--> <input type='button' value='購入する(object)' onclick="postForm('object')" /> <!--結果を一覧で受け取る場合--> <input type='button' value='購入する(string)' onclick="postForm('string')" /> </p> </form> <form id='purchaseForm' action='(加盟店様URL)' method='post'> <p> <input type='hidden' value='' name='kameitenn_chumon_bango' /> <!-- 加盟店での注文番号等、決済を特定できる情報 --> <input type='hidden' value='' name='token' /> <!-- 取得したトークンを設定するプレースホルダ --> </p> </form> <p> </body> </html>
// 課金区分 (1:一回のみ 21~32:定期課金) // 定期課金について契約がない場合は利用できません。また、定期課金を設定した場合決済区分はクレジットカード決済のみとなります。 $mission_code = $_REQUEST['mission_code'];
$request->addPostParameter('version', '2' ); $request->addPostParameter('contract_code', $contract_code); $request->addPostParameter('user_id', $user_id); $request->addPostParameter('user_name', mb_convert_encoding($user_name, "UTF-8", "auto")); $request->addPostParameter('user_mail_add', $user_mail_add); $request->addPostParameter('item_code', $item_code); $request->addPostParameter('item_name', mb_convert_encoding($item_name, "UTF-8", "auto")); $request->addPostParameter('order_number', $order_number); $request->addPostParameter('st_code', $st_code[$st]); $request->addPostParameter('mission_code', $mission_code); $request->addPostParameter('item_price', $item_price); $request->addPostParameter('process_code', $process_code); $request->addPostParameter('memo1', $memo1); $request->addPostParameter('memo2', $memo2); $request->addPostParameter('xml', '1'); $request->addPostParameter('character_code', 'UTF8' );
※オーダー情報送信先 CGIへPOST、応答内容の解析は、都度課金と同様。
SettlementSendInfo si = this.getSettlmentSendInfo(); Listparam = new ArrayList (); Integer processCode = si.getProcessCode(); ~ switch (processCode){ case 1: case 2: // 初回/登録済み課金 param.add( new BasicNameValuePair("version", si.getVersion().toString())); param.add( new BasicNameValuePair("contract_code", this.getConfig().getContract_code() )); param.add( new BasicNameValuePair("user_id", si.getUserId())); param.add( new BasicNameValuePair("user_name", si.getUserName())); param.add( new BasicNameValuePair("user_mail_add", si.getUserMailAdd())); param.add( new BasicNameValuePair("item_code", si.getItemCode())); param.add( new BasicNameValuePair("item_name", si.getItemName())); param.add( new BasicNameValuePair("order_number", si.getOrderNumber())); param.add( new BasicNameValuePair("st_code", si.getStCode())); param.add( new BasicNameValuePair("mission_code",si.getMissionCode().toString())); param.add( new BasicNameValuePair("item_price", si.getItemPrice().toString())); param.add( new BasicNameValuePair("process_code", si.getProcessCode().toString())); param.add( new BasicNameValuePair("memo1", si.getMemo1())); param.add( new BasicNameValuePair("memo2", si.getMemo2())); param.add( new BasicNameValuePair("character_code", si.getCharacterCode())); param.add( new BasicNameValuePair("xml", si.getXml().toString()));
※オーダー情報送信先 CGIへPOST、応答内容の解析は、都度課金と同様。
# 課金区分 (1:一回のみ 21~32:定期課金) # 定期課金について契約がない場合は利用できません。また、定期課金を設定した場合決済区分はクレジットカード決済のみとなります。 my $mission_code = $q->param("mission_code") || 1;
my %data = (); %data = ( version => "2", # バージョン contract_code => $contract_code, # 契約コード user_id => $user_id, # ユーザーID user_name => $user_name, # ユーザー名 user_mail_add => $user_mail_add, # ユーザーメールアドレス item_code => $item_code, # 商品コード item_name => $item_name, # 商品名 order_number => $order_number, # 注文番号 st_code => $select_st_code{$st}, # 決済区分 mission_code => $mission_code, # 課金区分 item_price => $item_price, # 価格 process_code => $process_code, # 処理区分 memo1 => $memo1, # 追加情報1 memo2 => $memo2, # 追加情報2 character_code => "UTF8", # 文字コード xml => '1' # 応答形式 (0:html 1:XML) );
※オーダー情報送信先 CGIへPOST、応答内容の解析は、都度課金と同様。
No. | 項目名 | パラメータ名 | 属性 | 例 | 必須 | 説明 |
---|---|---|---|---|---|---|
1 | 契約コード | contract_code | 半角英数字 8byte(固定) |
12345600 | ○ | イプシロンが加盟店様ごとに採番 します。 申込時にイプシロンの申込完了画面及びメールにて通知します。 |
2 | イプシロンオブジェクト | cardObj | オブジェクト | cardObj | ○ | 以下のプロパティ(cardno、expire、securitycode、holdername)を持つJavascriptオブジェクト形式です。 |
3 | カード番号 | cardno | 半角数字 10桁~16桁以内 |
4111111111111110 | ○ | イプシロンオブジェクト内のプロパティです。 トークン生成対象のカード番号を設定してください。 |
4 | 有効期限 | expire | 半角数字 6桁 |
202012 | ○ | イプシロンオブジェクト内のプロパティです。 トークン生成対象のカード有効期限を設定してください。 |
5 | セキュリティコード | securitycode | 半角数字 3-4桁 |
123 | イプシロンオブジェクト内のプロパティです。 トークン生成対象のカードセキュリティコードを設定してください。 |
|
6 | カード名義人 | holdername | 半角文字 | EPSILON TAROU | イプシロンオブジェクト内のプロパティです。 トークン生成対象のカード名義人を設定してください。 指定いただいたカード名義人情報は3Dセキュア認証に使用されます。 3Dセキュア認証精度向上のため、カード名義人の確認必須化がカード会社にて検討されています。 早い段階でのカード名義人対応をお願いいたします。 |
No. | 項目名 | パラメータ名 | 属性 | 例 | 必須 | 説明 |
---|---|---|---|---|---|---|
1 | トークン生成結果 | resultCode | 半角数値 3桁 | 000 | ○ | エラーについては「イプシロン決済システム仕様書」末尾のエラーコード一覧をご参照ください。 |
2 | トークンオブジェクト | tokenObject | オブジェクト | tokenObject | 以下のプロパティ(toBeExpiredAt、token、maskedCardNo、isSecurityCodeSet、cardExpire)を持つJavascriptオブジェクト形式です。 | |
3 | トークン有効期限 | toBeExpiredAt | yyyy-MM-dd-HH-mm-ss形式 | 2017-12-15-10-30-00 | トークンオブジェクト内のプロパティです。トークンの有効期限が設定されています。 | |
4 | トークン | token | 半角英数字 | vn409tqrq3jqf4r0qdpowqpweqj3 | トークンオブジェクト内のプロパティです。生成したトークンが設定されています。 | |
5 | マスクしたカード情報 | maskedCardNo | 頭1桁と下4桁以外を マスクしたハイフンありの形式 |
4***-****-****-1234 | トークンオブジェクト内のプロパティです。トークン生成対象のカード情報がマスクされた形式で設定されています。 | |
6 | セキュリティコード設定有無 | isSecurityCodeSet | 半角文字 | true | トークンオブジェクト内のプロパティです。トークン生成対象のカードのセキュリティコード設定有無がbool値で設定されています。 | |
7 | カード有効期限 | cardExpire | 半角数字6桁 | 202012 | トークンオブジェクト内のプロパティです。トークン生成に使用したカードの有効期限が設定されています。 |
トークン決済(API版)を利用する場合には、当社から接続に必要な情報である『公開鍵』および『ハッシュ値』の個別発行する必要がございます。
発行には時間を要しますので、お早めに個別発行依頼のご連絡を営業担当もしくはカスタマーサポートまでお願いいたします。
トークン取得のための接続先URLは以下になります。
※テスト環境と本番環境でURLが異なります。ご注意ください。
【本番環境】 https://secure.epsilon.jp/cgi-bin/order/token_api.cgi
【テスト環境】https://beta.epsilon.jp/cgi-bin/order/token_api.cgi
各種サンプルプログラムは下記よりダウンロード可能です。
【Android(Java)】 サンプルプログラムをダウンロード
【iOS(Swift)】サンプルプログラムをダウンロード
No. | 項目名 | パラメータ名 | 属性 | 例 | 必須 | 説明 |
---|---|---|---|---|---|---|
1 | 公開鍵 | Encrypted | 半角文字 | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuuJP6R/qMgyn1Ir1k53JhA0nr/d7lZ7cEeAjSNSy/uT4xMBo5JtLO4nIMW26d4LMuiUC+DHrT7XMyY6qy2e2d5VbL+b5gFgJjKERvg3MZUwX5ZHA3tkD8D0onYxIdubEl9MovM4uDxhWfS83W2/7QiYXYEiQhG5whWr2+HMDcrqMZWWjjagO9H68sMvrSiF5y47ymX47j1OL968uus69zcC+MCBsT9P2uudJEvO1F5LhFxxFvAuJR9kwV7Jw3UNb9CCPruEcV4lTTCERsrwwRjtItJIrNR9eXqeja5cSFsdxq+rx/QxOvphH4T4SSFXs9diUAJOjBVtq/+oCJCA/awIDAQAB | カード情報を公開鍵で暗号化した情報 カード番号等の情報をEncrypted作成手順に基づき、作成した値を設定してください。※1 |
|
2 | 契約番号 | ShopID | 半角数字 8桁 | 11111111 | イプシロン契約番号 半角数字 | |
3 | ハッシュ値 | KeyHash | 半角文字 | 520bDrCZHv8g2p5HjFPic3alyYtKpcKxv3Ziuf0JdOk | 事前に共有している公開鍵のハッシュ値 |
【Encryptedに暗号化されているカード情報】
下記項目をJSON形式にした情報が暗号化されている
No. | 項目名 | パラメータ名 | 属性 | 例 | 必須 | 説明 |
---|---|---|---|---|---|---|
1 | カード番号 | cardno | 半角数字 10桁~16桁以内 | 4111111111111110 | ○ | Json形式のカード情報を公開鍵で暗号化 |
2 | 有効期限 | expire | 半角数字 6桁 | 202012 | ○ | YYMM又はYYYYMM |
3 | セキュリティコード | securitycode | 半角数字 3-4桁 | 123 | セキュリティコード | |
4 | カード名義 | holdername | 半角文字 | EPSILON TAROU | カード名義 指定いただいたカード名義人情報は3Dセキュア認証に使用されます。 3Dセキュア認証精度向上のため、カード名義人の確認必須化がカード会社にて検討されています。 早い段階でのカード名義人対応をお願いいたします。 |
【Encrypted作成手順】
(1) カード情報はjson形式で構築します。
例:{"cardNo":"4111111111111111","expire":"2001","securityCode":"123","holderName":"TAROYAMADA}
(2) (1)をイプシロンから提供された公開鍵を使ってRSA方式(2048bit)で暗号化します。
(3) BASE64でエンコードします。
『公開鍵』 BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6pJNbUB3uG9Qaj/ku4zU tgdwJbY94s0IARfM8c7kUTXGFqaZociqU+3Llrlq7nfTXX+MbPo0IkGoWNaD+9yb SxT/GjcOq+7APhTIqV3BjU0kFMYcH7S0UfTIIOmPWRsV1v+XTPc3dkPvJFCAB0w6 bK5iK9lMWTNV9u9gKHEgqQ3+0mfstwuWL+bjafSixYWW7rnVfz2TMu8dIWSPEGCR 6wp7M2pAEUfKwDs0sL+E40wFVsFSaW8KD+koO05VGNymU07UolymnwA+cBQEuFFN w8ekhIMbeKxdiNRuPHDB2hGL29+TyhgGSxt6h9YdQkUxUtTA7YXOoV04c8EHK0sT CwIDAQAB END PUBLIC KEY----- 『ハッシュ値』 pTKZebKSpnlPcWTEk4y2XjimkRfxqcUYNwFXokI03J4
// 課金区分 (1:一回のみ 21~32:定期課金) // 定期課金について契約がない場合は利用できません。また、定期課金を設定した場合決済区分はクレジットカード決済のみとなります。 $mission_code = $_REQUEST['mission_code'];
$request->addPostParameter('version', '2' ); $request->addPostParameter('contract_code', $contract_code); $request->addPostParameter('user_id', $user_id); $request->addPostParameter('user_name', mb_convert_encoding($user_name, "UTF-8", "auto")); $request->addPostParameter('user_mail_add', $user_mail_add); $request->addPostParameter('item_code', $item_code); $request->addPostParameter('item_name', mb_convert_encoding($item_name, "UTF-8", "auto")); $request->addPostParameter('order_number', $order_number); $request->addPostParameter('st_code', $st_code[$st]); $request->addPostParameter('mission_code', $mission_code); $request->addPostParameter('item_price', $item_price); $request->addPostParameter('process_code', $process_code); $request->addPostParameter('memo1', $memo1); $request->addPostParameter('memo2', $memo2); $request->addPostParameter('xml', '1'); $request->addPostParameter('character_code', 'UTF8' );
※オーダー情報送信先 CGIへPOST、応答内容の解析は、都度課金と同様。
SettlementSendInfo si = this.getSettlmentSendInfo(); Listparam = new ArrayList (); Integer processCode = si.getProcessCode(); ~ switch (processCode){ case 1: case 2: // 初回/登録済み課金 param.add( new BasicNameValuePair("version", si.getVersion().toString())); param.add( new BasicNameValuePair("contract_code", this.getConfig().getContract_code() )); param.add( new BasicNameValuePair("user_id", si.getUserId())); param.add( new BasicNameValuePair("user_name", si.getUserName())); param.add( new BasicNameValuePair("user_mail_add", si.getUserMailAdd())); param.add( new BasicNameValuePair("item_code", si.getItemCode())); param.add( new BasicNameValuePair("item_name", si.getItemName())); param.add( new BasicNameValuePair("order_number", si.getOrderNumber())); param.add( new BasicNameValuePair("st_code", si.getStCode())); param.add( new BasicNameValuePair("mission_code",si.getMissionCode().toString())); param.add( new BasicNameValuePair("item_price", si.getItemPrice().toString())); param.add( new BasicNameValuePair("process_code", si.getProcessCode().toString())); param.add( new BasicNameValuePair("memo1", si.getMemo1())); param.add( new BasicNameValuePair("memo2", si.getMemo2())); param.add( new BasicNameValuePair("character_code", si.getCharacterCode())); param.add( new BasicNameValuePair("xml", si.getXml().toString()));
※オーダー情報送信先 CGIへPOST、応答内容の解析は、都度課金と同様。
# 課金区分 (1:一回のみ 21~32:定期課金) # 定期課金について契約がない場合は利用できません。また、定期課金を設定した場合決済区分はクレジットカード決済のみとなります。 my $mission_code = $q->param("mission_code") || 1;
my %data = (); %data = ( version => "2", # バージョン contract_code => $contract_code, # 契約コード user_id => $user_id, # ユーザーID user_name => $user_name, # ユーザー名 user_mail_add => $user_mail_add, # ユーザーメールアドレス item_code => $item_code, # 商品コード item_name => $item_name, # 商品名 order_number => $order_number, # 注文番号 st_code => $select_st_code{$st}, # 決済区分 mission_code => $mission_code, # 課金区分 item_price => $item_price, # 価格 process_code => $process_code, # 処理区分 memo1 => $memo1, # 追加情報1 memo2 => $memo2, # 追加情報2 character_code => "UTF8", # 文字コード xml => '1' # 応答形式 (0:html 1:XML) );
※オーダー情報送信先 CGIへPOST、応答内容の解析は、都度課金と同様。
No. | 項目名 | パラメータ名 | 属性 | 例 | 必須 | 説明 |
---|---|---|---|---|---|---|
1 | トークン生成結果 | resultCode | 半角数値 3桁 | 000 | ○ | エラーについては「イプシロン決済システム仕様書」末尾のエラーコード一覧をご参照ください。 |
2 | トークンオブジェクト | tokenObject | オブジェクト | tokenObject | 以下のプロパティ(toBeExpiredAt、token、maskedCardNo、isSecurityCodeSet、cardExpire)を持つJavascriptオブジェクト形式です。 | |
3 | トークン有効期限 | toBeExpiredAt | yyyy-MM-dd-HH-mm-ss形式 | 2017-12-15-10-30-00 | トークンオブジェクト内のプロパティです。トークンの有効期限が設定されています。 | |
4 | トークン | token | 半角英数字 | vn409tqrq3jqf4r0qdpowqpweqj3 | トークンオブジェクト内のプロパティです。生成したトークンが設定されています。 | |
5 | マスクしたカード情報 | maskedCardNo | 頭1桁と下4桁以外を マスクしたハイフンありの形式 |
4***-****-****-1234 | トークンオブジェクト内のプロパティです。トークン生成対象のカード情報がマスクされた形式で設定されています。 | |
6 | セキュリティコード設定有無 | isSecurityCodeSet | 半角文字 | true | トークンオブジェクト内のプロパティです。トークン生成対象のカードのセキュリティコード設定有無がbool値で設定されています。 | |
7 | カード有効期限 | cardExpire | 半角数字6桁 | 202012 | トークンオブジェクト内のプロパティです。トークン生成に使用したカードの有効期限が設定されています。 |
{ resultCode:"000", tokenObject:{ token:"a33c8bec609ffc75726249d8d82286d529bd1deb973119cf497eeb54610ab9d2", toBeExpiredAt:"2016-09-26-17-56-38", maskedCardNo:"411111*******111", isSecurityCodeSet:true } }
// 課金区分 (1:一回のみ 21~32:定期課金) // 定期課金について契約がない場合は利用できません。また、定期課金を設定した場合決済区分はクレジットカード決済のみとなります。 $mission_code = $_REQUEST['mission_code'];
$request->addPostParameter('version', '2' ); $request->addPostParameter('contract_code', $contract_code); $request->addPostParameter('user_id', $user_id); $request->addPostParameter('user_name', mb_convert_encoding($user_name, "UTF-8", "auto")); $request->addPostParameter('user_mail_add', $user_mail_add); $request->addPostParameter('item_code', $item_code); $request->addPostParameter('item_name', mb_convert_encoding($item_name, "UTF-8", "auto")); $request->addPostParameter('order_number', $order_number); $request->addPostParameter('st_code', $st_code[$st]); $request->addPostParameter('mission_code', $mission_code); $request->addPostParameter('item_price', $item_price); $request->addPostParameter('process_code', $process_code); $request->addPostParameter('memo1', $memo1); $request->addPostParameter('memo2', $memo2); $request->addPostParameter('xml', '1'); $request->addPostParameter('character_code', 'UTF8' );
※オーダー情報送信先 CGIへPOST、応答内容の解析は、都度課金と同様。
SettlementSendInfo si = this.getSettlmentSendInfo(); Listparam = new ArrayList (); Integer processCode = si.getProcessCode(); ~ switch (processCode){ case 1: case 2: // 初回/登録済み課金 param.add( new BasicNameValuePair("version", si.getVersion().toString())); param.add( new BasicNameValuePair("contract_code", this.getConfig().getContract_code() )); param.add( new BasicNameValuePair("user_id", si.getUserId())); param.add( new BasicNameValuePair("user_name", si.getUserName())); param.add( new BasicNameValuePair("user_mail_add", si.getUserMailAdd())); param.add( new BasicNameValuePair("item_code", si.getItemCode())); param.add( new BasicNameValuePair("item_name", si.getItemName())); param.add( new BasicNameValuePair("order_number", si.getOrderNumber())); param.add( new BasicNameValuePair("st_code", si.getStCode())); param.add( new BasicNameValuePair("mission_code",si.getMissionCode().toString())); param.add( new BasicNameValuePair("item_price", si.getItemPrice().toString())); param.add( new BasicNameValuePair("process_code", si.getProcessCode().toString())); param.add( new BasicNameValuePair("memo1", si.getMemo1())); param.add( new BasicNameValuePair("memo2", si.getMemo2())); param.add( new BasicNameValuePair("character_code", si.getCharacterCode())); param.add( new BasicNameValuePair("xml", si.getXml().toString()));
※オーダー情報送信先 CGIへPOST、応答内容の解析は、都度課金と同様。
# 課金区分 (1:一回のみ 21~32:定期課金) # 定期課金について契約がない場合は利用できません。また、定期課金を設定した場合決済区分はクレジットカード決済のみとなります。 my $mission_code = $q->param("mission_code") || 1;
my %data = (); %data = ( version => "2", # バージョン contract_code => $contract_code, # 契約コード user_id => $user_id, # ユーザーID user_name => $user_name, # ユーザー名 user_mail_add => $user_mail_add, # ユーザーメールアドレス item_code => $item_code, # 商品コード item_name => $item_name, # 商品名 order_number => $order_number, # 注文番号 st_code => $select_st_code{$st}, # 決済区分 mission_code => $mission_code, # 課金区分 item_price => $item_price, # 価格 process_code => $process_code, # 処理区分 memo1 => $memo1, # 追加情報1 memo2 => $memo2, # 追加情報2 character_code => "UTF8", # 文字コード xml => '1' # 応答形式 (0:html 1:XML) );
※オーダー情報送信先 CGIへPOST、応答内容の解析は、都度課金と同様。
「イプシロン決済システム仕様書」は管理画面にてダウンロードいただけます。
▼仕様書のダウンロードはこちら
管理画面【サポート】⇒【各種資料ダウンロード】