定期課金サービスは各取引について金額変更・キャンセルを行なうことができます。
それぞれ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 | 半角数字 | エラーメッセージ |