定期課金サービスは各取引について金額変更・キャンセルを行なうことができます。
それぞれCGIを提供させていただいております。
# 発行されたユーザーID(契約コード)を入力してください contract_code= '00000000' param = cgi.params item_code = param["item_code"][0] || "" item_price = param["item_price"][0] || "" user_id = param["user_id"][0] || "" come_from = param["come_from"][0]
http = Net::HTTP.new( api_url[mode].host,api_url[mode].port)
http.use_ssl = true # SSLを有効にします
http.open_timeout = 20 # セッション接続までのタイムアウト時間
http.read_timeout = 20 # 応答を待つまでのタイムアウト時間
# EPSILONに接続して送信
result = http.start do
http.request( post_data )
end
);
if !result.code == 200 then
# インターフェイスCGIの実行に失敗した場合
err_msg = "HTTPリクエストの送信に失敗しました。%s:%s"%[res.code,res.message]
order_form(err_msg,nil,nil,nil,nil)
exit
end
# 結果を読み込み
xml = REXML::Document.new(( result.body.gsub("x-sjis-cp932","Shift_JIS"))) # 文字コードをSJISとして読み込む(CP932はSJISの拡張なので基本はOK)
response = Hash.new
xml.elements.each("Epsilon_result/result") do |element|
element.attributes.each do |name, value|
# 1,文字列はエスケープ処理がされているので基に戻す
# 2,エラーメッセージはVer1系統の場合SJIS、Ver2系統で登録したものはUTF8で返されるので文字コードを変換する
response[name] = CGI.unescape(value).encode("UTF-8",xml.encoding )
end
end
if response['result'] != "1" then
# データ送信結果が失敗だった場合、オーダー入力画面に戻し、エラーメッセージを表示します。
err_msg = "%s:%s"%[response['err_code'],response['err_detail']]
result_page(err_msg)
exit 1
else
result_page(nil, response['result'] )
exit 0
end
// 契約番号(8桁) オンライン登録時に発行された契約番号を入力してください。 $contract_code = '00000000'; $user_id = $_REQUEST['user_id']; // ユーザID $item_code = $_REQUEST['item_code']; // 商品コード $item_price = $_REQUEST['item_price']; // メールアドレス
$api_url = array(
change => "https://beta.epsilon.jp/cgi-bin/order/regularly_amount_change.cgi",
cancel => "https://beta.epsilon.jp/cgi-bin/order/regularly_cancel.cgi",
);
// httpリクエスト用のオプションを指定
$option = array(
"timeout" => "20", // タイムアウトの秒数指定
// "allowRedirects" => true, // リダイレクトの許可設定(true/false)
// "maxRedirects" => 3, // リダイレクトの最大回数
);
// HTTP_Requestの初期化
$request = new HTTP_Request2($api_url[$mode], HTTP_Request2::METHOD_POST, $option);
$request->setConfig(array(
'ssl_verify_peer' => false,
# 'ssl_verify_peer' => true,
# 'ssl_cafile' => '/etc/ssl/certs/ca-bundle.crt', // ルートCA証明書ファイルを指定
));
// HTTPのヘッダー設定
//$http->addHeader("User-Agent", "xxxxx");
//$http->addHeader("Referer", "xxxxxx");
//set post data
$request->addPostParameter('contract_code', $contract_code);
$request->addPostParameter('user_id', $user_id);
$request->addPostParameter('item_code', $item_code);
$request->addPostParameter('charset', 'UTF8' );
$request->addPostParameter('version', '2' );
$request->addPostParameter('xml', '1');
if ( $mode == 'change' ){
$request->addPostParameter('item_price', $item_price);
}
// HTTPリクエスト実行
$response = $request->send();
if (!PEAR::isError($response)) {
// 応答内容(XML)の解析
$res_code = $response->getStatus();
$res_content = $response->getBody();
//xml unserializer
$temp_xml_res = str_replace("x-sjis-cp932", "UTF-8", $res_content);
$unserializer =& new XML_Unserializer();
$unserializer->setOption('parseAttributes', TRUE);
$unseriliz_st = $unserializer->unserialize($temp_xml_res);
if ($unseriliz_st === true) {
//xmlを解析
$res_array = $unserializer->getUnserializedData();
$is_xml_error = false;
$err_code = "";
$err_detail = "";
$result = "";
foreach($res_array['result'] as $uns_k => $uns_v){
//$debug_printj .= "
k=" . $uns_k;
list($result_atr_key, $result_atr_val) = each($uns_v);
//$debug_printj .= "
result_atr_key=" . $result_atr_key;
//$debug_printj .= "
result_atr_val=" . $result_atr_val;
switch ($result_atr_key) {
case 'result':
$result = mb_convert_encoding(urldecode($result_atr_val), "UTF-8" ,"auto");
break;
case 'err_code':
$err_code = mb_convert_encoding(urldecode($result_atr_val), "UTF-8" ,"auto");
break;
case 'err_detail':
$err_detail = mb_convert_encoding(urldecode($result_atr_val), "UTF-8" ,"auto");
break;
default:
break;
}
}
}else{
//xml parser error
$err_msg = "xml parser error
";
order_form();
exit(1);
}
}else{ //http error
$err_msg = "データの送信に失敗しました
";
$err_msg .= "
res_statusCd=" . $request->getResponseCode();
$err_msg .= "
res_status=" . $request->getResponseHeader('Status');
$err_msg .= "
ErrorMessage" . $response->getMessage();
order_form();
exit(1);
}
if ( $result != 1 ) {
# データ送信結果が失敗だった場合、オーダー入力画面に戻し、エラーメッセージを表示します。
$err_msg = sprintf("%s:%s", $err_code, $err_detail);
result_page();
exit(1);
}else{
result_page( $result );
exit(0);
}
}
param.add( new BasicNameValuePair("contract_code", this.getConfig().getContract_code() ));
param.add( new BasicNameValuePair("item_code", rsi.getItemCode() ));
param.add( new BasicNameValuePair("user_id", rsi.getUserId() ));
if( "change".equals(mode)){
param.add( new BasicNameValuePair("item_price", rsi.getItemPrice().toString()));
}
HttpPost post = new HttpPost();
HttpResponse res = null;
try {
post.setEntity(new UrlEncodedFormEntity(param,"UTF-8"));
//URI
URI uri = new URI(getConfig().getRegulary_url().get(mode));
post.setURI(uri);
res = client.execute(post);
}catch(Exception e){
e.printStackTrace();
return null;
}
RegularyResultInfo regularyResultInfo = new RegularyResultInfo();
if( res.getStatusLine().getStatusCode() == HttpStatus.SC_OK ){
// BODYを取得してXMLパーサー呼び出し
try{
String xml = EntityUtils.toString(res.getEntity());
System.out.println(xml);
InputStream body = new java.io.ByteArrayInputStream(xml.getBytes());
Document xmlDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(body);
NodeList resultList = xmlDoc.getElementsByTagName("result");
for( int i = 0; i < resultList.getLength(); i++) {
Node node = resultList.item(i);
NamedNodeMap namesNodeMap = node.getAttributes();
for( int j =0; j < namesNodeMap.getLength(); j++ ){
Node attr = namesNodeMap.item(j);
switch (attr.getNodeName()) {
case "result":
regularyResultInfo.setResult(attr.getNodeValue());
break;
case "item_code":
regularyResultInfo.setItemCode(attr.getNodeValue());
break;
case "item_price":
regularyResultInfo.setItemPrice(attr.getNodeValue());
break;
case "mission_code":
regularyResultInfo.setMissionCode(attr.getNodeValue());
break;
case "err_code":
regularyResultInfo.setErrCode(attr.getNodeValue());
break;
case "err_detail":
regularyResultInfo.setErrDetail(new String(URLDecoder.decode(attr.getNodeValue(),"UTF-8").getBytes("UTF-8"));
break;
case "user_id":
regularyResultInfo.setUserId(attr.getNodeValue());
}
}
}
}catch ( Exception e){
e.printStackTrace();
return null;
}
}else{
/ 応答が200以外の場合は不明
return null;
}
# 契約番号(8桁) オンライン登録時に発行された契約番号を入力してください。
my $contract_code = "00000000";
my $item_code = $q->param("item_code"); # 商品コード
my $user_id = $q->param("user_id"); # ユーザーID
my $item_price = $q->param("item_price"); # 価格
my %api_url = (
change => "https://beta.epsilon.jp/cgi-bin/order/regularly_amount_change.cgi",
cancel => "https://beta.epsilon.jp/cgi-bin/order/regularly_cancel.cgi",
);
contract_code => $contract_code, # 契約コード
user_id => $user_id,
item_code => $item_code,
);
$data{item_price} = $item_price if( $mode eq 'change' );
my $ua = LWP::UserAgent->new;
$ua->timeout(20);
$ua->ssl_opts( verify_hostname => 0 );
my $rq = POST $api_url{$mode}, [%data];
my $res = $ua->request($rq);
if ( $res->is_success ) {
# 応答内容(XML)の解析
my $xml = $res->content;
my $parser = new XML::DOM::Parser;
my $doc = $parser->parse($xml);
my $nodes = $doc->getElementsByTagName("Epsilon_result")->item(0)
->getElementsByTagName("result");
my $n = $nodes->getLength;
for ( my $i = 0; $i < $n; $i++ ) {
my $node = $nodes->item($i);
traverse($node);
}
sub traverse {
my ($node) = @_;
if ( $node->getNodeType == ELEMENT_NODE ) {
foreach my $child ( $node->getChildNodes() ) {
traverse($child);
}
foreach my $at ( $node->getAttributes ) {
# 値の取得
my $value = $at->item(0)->getNodeValue;
# URLデコード(値はURLエンコードされています)
$value =~ s/\+/ /g;
$value =~ s/%([a-fA-F0-9]{2})/ chr(hex($1))/ge;
# $value = Encode::decode('shiftjis',$value);
# 変数名と値を連想配列に格納
$response{ $at->item(0)->getNodeName } = $value;
}
}
}
}
else {
$err_msg
= sprintf "データの送信に失敗しました %s
",
$res->status_line;
order_form();
exit 1;
}
if ( !$response{'result'} ) {
# データ送信結果が失敗だった場合、オーダー入力画面に戻し、エラーメッセージを表示します。
$err_msg = sprintf "%s:%s", $response{'err_code'},
$response{'err_detail'};
order_form();
exit 1;
}
定期課金サービス金額変更 CGI(https://beta.epsilon.jp/cgi-bin/order/regularly_amount_change.cgi )に取引の情報をパラメータとして付与することで、定期課金の金額変更が可能になります。
当月中の金額変更が可能な期間は、毎月24日までとなります。
| № | 項目名 | パラメータ名 | 属性 | 例 | 説明 |
|---|---|---|---|---|---|
| 1 | 契約コード | contract_code | 半角数字 | 99999999 | イプシロンが加盟店様ごとに採番 申込時に弊社の申込完了画面及びメールにて通知 |
| 2 | ユーザーID | user_id | 半角英数字.-+/@ 64byte以下 | 0312345 | 金額変更対象となるユーザーのユーザID |
| 3 | 商品コード | item_code | 半角英数字.-+/ 64byte以下 | EP-0001 | 金額変更対象となる定期課金の商品コード |
| 4 | 価格 | item_price | 1~9999999 | 4725 | 変更後の金額 |
実行結果はXML形式にて返却します。
| № | 項目名 | パラメータ名 | 属性 | 例 | 説明 |
|---|---|---|---|---|---|
| 1 | 処理結果 | result | 半角数字 | 1 | 1:金額変更OK 2:金額変更NG |
| 2 | ユーザーID | user_id | 半角英数字.-+/@ 64byte以下 | 0312345 | 金額変更対象となるユーザーのユーザID |
| 3 | 商品コード | item_code | 半角英数字.-+/ 64byte以下 | EP-0001 | 金額変更対象となる定期課金の商品コード |
| 4 | 価格 | item_price | 1~9999999 | 4725 | 変更後の金額 |
| 5 | 課金区分 | mission_code | 半角数字 | 21 | 対象の定期課金に設定されている課金区分を返却 |
| 6 | エラーコード | err_code | 半角数字 | エラーコード | |
| 7 | エラーメッセージ | err_detail | 半角数字 | エラーメッセージ |
定期課金サービスキャンセル CGI(https://beta.epsilon.jp/cgi-bin/order/regularly_cancel.cgi)に取引の情報をパラメータとして付与することで、定期課金のキャンセルが可能になります。
当月中のキャンセルが可能な期間は、毎月24日までとなり、 25日以降にキャンセルCGI が実行された場合、解除月は翌月となります。
| № | 項目名 | パラメータ名 | 属性 | 例 | 説明 |
|---|---|---|---|---|---|
| 1 | 契約コード | contract_code | 半角数字 | 99999999 | イプシロンが加盟店様ごとに採番 申込時に弊社の申込完了画面及びメールにて通知 |
| 2 | ユーザーID | user_id | 半角英数字.-+/@ 64byte以下 | 0312345 | 金額変更対象となるユーザーのユーザID |
| 3 | 商品コード | item_code | 半角英数字.-+/ 64byte以下 | EP-0001 | 金額変更対象となる定期課金の商品コード |
受信パラメータは決済区分にてクレジットカード番号の変更有無の設定によって値が異なります。
実行結果はXML形式にて返却します。
| № | 項目名 | パラメータ名 | 属性 | 例 | 説明 |
|---|---|---|---|---|---|
| 1 | 処理結果 | result | 半角数字 | 1 | 1:金額変更OK 2:金額変更NG |
| 2 | ユーザーID | user_id | 半角英数字.-+/@ 64byte以下 | 0312345 | 金額変更対象となるユーザーのユーザID |
| 3 | 商品コード | item_code | 半角英数字.-+/ 64byte以下 | EP-0001 | 金額変更対象となる定期課金の商品コード |
| 4 | 価格 | item_price | 1~9999999 | 4725 | 変更後の金額 |
| 5 | 課金区分 | mission_code | 半角数字 | 21 | 対象の定期課金に設定されている課金区分を返却 |
| 6 | エラーコード | err_code | 半角数字 | エラーコード | |
| 7 | エラーメッセージ | err_detail | 半角数字 | エラーメッセージ |