#!/usr/bin/perl #サーバーに合わせて(/usr/local/bin/perlなどに)設定。 # ########################################################################### # # Hal Shopping Cart System(shop_hal_proA3_4) # # スクリプト名:send.cgi(2003/2/28) # 本スクリプトはハル・ネットワークスが書いたものです。 # 本スクリプトついての質問は下記へお願いします。 # info@hal9800.com http://www.hal9800.com/ # # 2002/10/14 同じ頃に同じ商品を買うと在庫数が減らないバグを修正。 # ########################################################################### ####初期設定####################### #トップページへのリンクを指定 $top="./frontpage.cgi"; #jcode.plへのパス require './jcode.pl'; #config.plへのパス require './config.pl'; #library.plへのパス require './library.pl'; #souryou.plへのパスを指定。 require './souryou.pl'; #mimew.pl require './mimew.pl'; #基本設定読み込み &config; #地域別送料読み込み。 &souryou; #ショップに届くメールのタイトル $title='注文メール'; #ショップに届くメールのヘッダ $mail_head='以下の注文をお受けしました。'; $text_bg="#ffffcc";#確認文の背景色 $text_border="#8fbc8f";#確認文のボーダーカラー #テーブルカラー等はお好みに合わせて設定してください。 $table_bg_dark="#669966";#項目名の欄の背景色 $table_bg_dark2="#669966";#入力フォーム項目欄の背景色 $table_bg_light="#edf2db";#各項目表示部の背景色 $font2="#ffffff";#白文字 #######初期設定ここまで################################################# #&decode; $LENGTH=$ENV{'CONTENT_LENGTH'}; if($LENGTH>"4096"){&error("入力データが大きすぎます");} if($ENV{'REQUEST_METHOD'}eq"POST"){ read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); }else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); # $value =~ s/&/&/g; # $value =~ s//>/g; # $value =~ s/"/"/g; $value =~ s/,/,/g; $value =~ s/\'/’/g; $value =~ s/\"/”/g; $value =~ s/\r\n/
/g; $value =~ s/\r/
/g; $value =~ s/\n/
/g; $in{$name} = $value; } #商品記録ファイルを設定 $cart_id = $ENV{'REMOTE_ADDR'}; $cart = "$cart_dir/$cart_id.cart"; $mode = "$in{'mode'}"; $subtotal = "$in{'subtotal'}"; $tax = "$in{'tax'}"; $tesuryou = "$in{'tesuryou'}"; $souryou = "$in{'souryou'}"; $total = "$in{'total'}"; $namae = "$in{'namae'}"; $furigana =$_furigana= "$in{'furigana'}"; $post = "$in{'post'}"; $pref = "$in{'pref'}"; $address = "$in{'address'}"; $phone = "$in{'phone'}"; $email = "$in{'email'}"; $shiharai = "$in{'shiharai'}"; $comment = $comment2 = "$in{'comment'}"; #$comment =~ s//>/g; #$comment =~ s/\r\n/\n/g; #$comment =~ s/\r/\n/g; #$comment2 = $comment; #$comment2 =~ s/\n/
/g; $dat_mail = "$in{'dat_mail'}"; $dat_csv = "$in{'dat_csv'}"; $log = "$in{'log'}"; $namae2 = $_namae2="$in{'namae2'}"; $furigana2 =$_furigana2= "$in{'furigana2'}"; $post2 = $_post2="$in{'post2'}"; $pref2 = $_pref2="$in{'pref2'}"; $address2 = $_address2="$in{'address2'}"; $phone2 = $_phone2="$in{'phone2'}"; $kibou_m = "$in{'kibou_m'}"; $kibou_d = "$in{'kibou_d'}"; $kibou_t = "$in{'kibou_t'}"; #配送先の県名を得る if ($pref2){$pref3="$pref2";} else {$pref3="$pref";} if ( $mode eq 'kakunin2' ) { &kakunin2; exit; } if ($zaiko_kanri eq "ON"){ &zaiko_check; } &sendmail1; if($mailto2){&sendmail_add2;} if($mailto3){&sendmail_add3;} &sendmail2; &csv; if ($zaiko_kanri eq "ON"){ &change_zaiko; } &del_cart; if ($shiharai eq "クレジットカード"){&sent_credit;exit;} else{&sent;exit;} exit; ############################################################ #確認画面表示サブルーチン ############################################################ sub kakunin2{ if ($namae eq "") { &error("名前が入力されていません");} if ($post eq "") { &error("郵便番号が入力されていません");} if ($post !~ /^\d{3}-\d{4}$/) { &error("郵便番号の入力が不正です"); } if ($pref eq "") { &error("県名が入力されていません");} if ($address eq "") { &error("住所が入力されていません");} if ($phone eq "") { &error("電話番号が入力されていません");} if ($phone!~ /^\d{2,5}-\d{1,4}-\d{4}$/) { &error("電話番号は半角数字でハイフォンで区切って入力して下さい"); } if ($email eq "") { &error("メールアドレスが入力されていません");} if ($email =~ /\s|\,/) { &error("メールアドレスの入力が不正です");} if ($email !~ /\b[-\w.]+@[-\w.]+\.[-\w]+\b/) { &error("メールアドレスは半角で正しくご入力ください");} #if ($email !~ /(.+)\@(.+)\.(.+)/) { &error("メールアドレスの入力が不正です");} if ($shiharai eq "") { &error("支払方法が選択されていません");} if ($post2){ if ($post2 !~ /^\d{3}-\d{4}$/) { &error("お届け先郵便番号の入力が不正です"); } } if ($phone2) { if ($phone2!~ /^\d{2,5}-\d{1,4}-\d{4}$/) { &error("電話番号は半角数字でハイフォンで区切って入力して下さい"); } } if (!$_furigana){$_furigana="--";} if (!$comment){$comment="--";} if (!$comment2){$comment2="--";} if (!$kibou_m){$kibou_m="--";} if (!$kibou_d){$kibou_d="--";} if (!$kibou_t){$kibou_t="--";} if (!$_namae2){$_namae2="--";} if (!$_furigana2){$_furigana2="--";} if (!$_post2){$_post2="--";} if (!$_pref2){$_pref2="--";} if (!$_address2){$_address2="--";} if (!$_phone2){$_phone2="--";} open(CART,$cart) || &error("$cartを開けません"); @lines = ; close(CART); #送信前に買い物カゴをチェック、空ならエラーを表示(2003/04/11) #修正ここから $count = @lines; if ( $count==0 ) { &header("Empty"); print <<"EOF";
 
買い物かごの中が空です。
 

 

EOF &footer; exit; } #修正ここまで foreach $line (@lines){ ($code,$category,$name,$price,$zaiko,$kazu,$option1,$option2,$option3) = split (/<>/, $line); # chop $option3;#行末を<>で終わるようにした(02/09/10) $shoukei=$price*$kazu; #メール送信用および確認画面用商品データの処理 $order1="[$category] $name $option1 $option2 $option3 $price円× $kazu= $shoukei円"; push(@NEW1,$order1); } #確認画面用データ $dat_kakunin=join("
",@NEW1); #メール送信用データ $dat_mail=join("\%",@NEW1); #&get_date; &header; #買い物かごの中身を表示する print <<"EOF";
home
$shop

 ●●●●●最終確認


以下の内容で送信いたします。ご確認の上注文ボタンを押してください。



EOF foreach $line (@lines){ ($code,$category,$name,$price,$zaiko,$kazu,$option1,$option2,$option3) = split (/<>/, $line); $unit_subtotal = int($price*$kazu); $subtotal = $subtotal+$unit_subtotal; print <<"EOF"; EOF } #送料処理 if ($souryou_type eq 2){ if ($muryou eq 0){$souryou=$souryou_list{"$pref3"};} else{ if ($subtotal>=$muryou) {$souryou=0;} else {$souryou=$souryou_list{"$pref3"};} } }else { if ($muryou eq 0){$souryou=$souryou_same;} else{ if ($subtotal>=$muryou) {$souryou=0;} else {$souryou=$souryou_same;} } } #if ($souryou_type eq 2){ # # if ($subtotal>=$muryou) {$souryou=0;} else {$souryou=$souryou_list{"$pref"};#} #}else{ # # if ($subtotal>=$muryou) {$souryou=0;} else {$souryou=$souryou;} # #} $tax = int($tax_rate*$subtotal/100); $tesuryou=0; #代引き手数料処理 if ($shiharai eq "代金引換"){ if ($subtotal < $daihiki_limit) { $tesuryou=$daihiki_charge; } } #コンビニ手数料処理 if ($shiharai eq "コンビニ決済"){ if ($subtotal < $conv_limit) { $tesuryou=$conv_charge; } } #クロネコペイメント/eコレクト手数料処理 $total_kuro= $subtotal+$tax+$souryou; if ($shiharai eq "クレジットカード"){ if ($subtotal<$kuro_limit){ if ($kuro_type eq "1"){ $tesuryou=$kuro_charge; }else{ $tesuryou=int($kuro_rate*$total_kuro/100); } } } #eコレクト手数料処理 if ($shiharai eq "e-コレクト"){ if ($subtotal<$ecol_limit){ if ($ecol_type eq "1"){ $tesuryou=$ecol_charge; }else{ $tesuryou=int($ecol_rate*$total_kuro/100); } } } $total= $subtotal+$tax+$souryou+$tesuryou; print <<"EOF";
お買い上げ商品
商品名 備考 単価 金額
$name $option1 $option2 $option3 \\$price $kazu \\$unit_subtotal
小計 \\$subtotal
消費税 \\$tax
送料 \\$souryou
手数料 \\$tesuryou
合計 \\$total
EOF print <<"EOF";



お客様情報
お名前$namae様
ふりがな$_furigana様
郵便番号$post
都道府県$pref
ご住所$address
電話番号$phone
Email$email
コメント$comment2
支払方法
支払い方法$shiharai
配送希望日時
配送希望日$kibou_m月$kibou_d日
配送希望時間$kibou_t
お届け先
お名前$_namae2様
ふりがな$_furigana2様
郵便番号$_post2
都道府県$_pref2
住所$_address2
電話番号$_phone2



前の画面に戻る
EOF print << "EFG";

EFG &footer; } ############################## #在庫数再チェックサブルーチン# ############################## sub zaiko_check{ @lines=(); @goods=(); open(DATA,"$datafile") || &error("データファイルを開けません"); @lines = ; close(DATA); open(CART,$cart) || &error("カートファイルを開けません"); @goods = ; close(CART); foreach $line (@lines){ ($database_id,$category,$name,$price,$zaiko,$description,$shohinpage,$picture,$option1,$option2,$option3)=split(/,/,$line); $description =~ s/\n//g; # chop $option3;#行末を<>で終わるようにした(02/09/08) foreach $goods (@goods){ ($t_code,$t_category,$t_name,$t_price,$t_zaiko,$t_kazu,$t_option1,$t_optin2,$t_optin3) = split(/<>/,$goods); # chop $t_option3;#行末を<>で終わるようにした(02/09/10) if($database_id eq $t_code){ if ($zaiko ne OK && $zaiko<$t_kazu){&zaiko_error("\"$t_name\"の在庫数に不足が生じました。");} } } } } ################################################## #CSVデータ処理サブルーチン ################################################## sub csv{ &get_date; ######################### #購買商品データ更新処理 ######################### open(SHOHIN,"$logfile2") || &error("$logfile2を開けません"); @shohins = ; close(SHOHIN); ($s_no,$s_serial,$s_date,$s_year,$s_mon,$s_code,$s_shohin,$s_kazu,$s_sum,$s_namae,$s_email) = split(/,/,$shohins[0]); $count=$s_no; open(CART,$cart) || &error("$cartを開けません"); @lines = ; close(CART); foreach $line (@lines){ $count++; ($code,$category,$shohin,$price,$zaiko,$kazu,$option1,$option2,$option3) = split (/<>/, $line); # chop $option3;#行末を<>で終わるようにした(02/09/10) $sum=$price*$kazu; $work="$count,$serial,$date,$year,$mon,$code,$shohin$option1$option2$option3,$kazu,$sum,$namae,$email,\n";#行末に「,」を挿入(02/09/10) unshift(@shohins,$work); } &lock; open(SHOHIN,"+< $logfile2") || &error("データファイルに書き込めません","unlock"); truncate(SHOHIN,0); seek(SHOHIN,0,0); print SHOHIN @shohins; close(SHOHIN); &unlock; ######################### #顧客データ更新処理 ######################### open(LOG,"$logfile1") || &error("$logfile1を開けません"); @logs = ; close(LOG); @new=(); $exist=0; foreach $log (@logs){ $flag=0; ($c_serial,$c_date,$c_namae,$c_post,$c_pref,$c_address,$c_phone,$c_email,$c_subtotal) = split(/,/,$log); # chop $c_subtotal; if($email eq $c_email){ $flag=1; $exist=1; $subtotal=$subtotal+$c_subtotal; $cdata = "$serial,$date,$namae,$post,$pref,$address,$phone,$email,$subtotal,\n"; unshift(@new,$cdata); } if ($flag==0){ unshift(@new,$log); } } if ($exist==0){ $cdata3 = "$serial,$date,$namae,$post,$pref,$address,$phone,$email,$subtotal,\n"; unshift(@new,$cdata3); } &lock; open(LOG, "+< $logfile1") || &error("$logfile1に書き込めません","unlock"); truncate(LOG,0); seek(LOG,0,0); print LOG @new; close(LOG); &unlock; } ###################################################### #メール送信サブルーチン ###################################################### sub sendmail1 { open(CART,$cart) || &error("$cartを開けません"); close(CART); &get_date; $order_date="$year\/$w_mon\/$w_mday ($hour:$min)"; $order_no=$w_mday.$hour.$min.$sec.$$; if (!$_furigana){$_furigana="--";} if (!$_namae2){$_namae2="--";} if (!$_furigana2){$_furigana2="--";} if (!$_post2){$_post2="--";} if (!$_pref2){$_pref2="--";} if (!$_address2){$_address2="--";} if (!$_phone2){$_phone2="--";} $comment2 =~ s/
/\n/g; $dat_mail=~ s/%/\n/g; #$dat_mail=~ s/
/\n/g; #&jcode'convert(*dat_mail,'jis'); $mail_data1 = <; close(DATA); open(CART,$cart) || &error("カートファイルを開けません"); @goods = ; close(CART); foreach $line (@lines){ ($database_id,$category,$name,$price,$zaiko,$description,$shohinpage,$picture,$option1,$option2,$option3)=split(/,/,$line); $description =~ s/\n//g; # chop $option3;#行末を<>で終わるようにした(02/09/08) $flag=0; foreach $goods (@goods){ ($t_code,$t_category,$t_name,$t_price,$t_zaiko,$t_kazu,$t_option1,$t_option2,$t_option3) = split(/<>/,$goods); # chop $t_option3;#行末を<>で終わるようにした(02/09/10) if($database_id eq $t_code){ $flag=1; if ($zaiko eq 'OK'){$new_zaiko=$zaiko;} else{$new_zaiko=$zaiko-$t_kazu;} $data1 = "$database_id,$category,$name,$price,$new_zaiko,$description,$shohinpage,$picture,$option1,$option2,$option3,EOD\n"; push(@new,$data1); last; } } if (!$flag==1){ push(@new,$line); } } #@new = sort(@new); &lock; open(DATA,"+< $datafile") || &error("$datafileに書き込めません","unlock"); truncate(DATA,0); seek(DATA,0,0); print DATA @new; close(DATA); &unlock; } ################################################## #買い物かご消去 ################################################## sub del_cart { #open (TEMP, ">$tempfile") || &open_error($tempfile); #close (TEMP); #rename ($tempfile, $cart); #chmod 0777, $cart; unlink($cart); } ################################################## #送信完了メッセージ ################################################## sub sent{ print "Content-type: text/html\n"; &setcookie; print "\n"; print "\n"; print "送信完了\n"; print << "EOM";

送信完了

ご注文ありがとうございました。$email宛てに確認メールを送信いたしました。

買い物カゴは消去しました。買い物を続ける場合はいったんトップページにお戻りください。

>>トップページに戻る

EOM } #クロネコペイメント用送信完了画面 sub sent_credit{ print "Content-type: text/html\n"; &setcookie; print "\n"; print "\n"; print "送信完了\n"; print << "EOM";


送信完了

ご注文ありがとうございました。$email宛てに確認メールを送信いたしました。

続けてクロネコ@ペイメントの決済手続きを行ってください。

(注文番号は$order_noです。確認メールに記されています。)

クロネコ@ペイメントから送られてくるURLと加盟店コードを設定する必要があります。

>>トップページに戻る

EOM } #他のクレジット決済用 sub sent_credit_old{ print "Content-type: text/html\n"; &setcookie; print "\n"; print "\n"; print "送信完了\n"; print << "EOM";

送信完了

ご注文ありがとうございました。$email宛てに確認メールを送信いたしました。

買い物カゴは消去しました。買い物を続ける場合はいったんトップページにお戻りください。

引き続きクレジットカード決済をお済ませください。
(注)ご契約のクレジット決済会社へのリンクを張リます。
>>トップページに戻る

EOM } #顧客情報クッキー発行 sub setcookie { ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 365*24*60*60); @mong = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @weekg = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'); $date_gmt = sprintf("%s, %02d\-%s\-%04d %02d\:%02d\:%02d GMT", $weekg[$wdayg],$mdayg,$mong[$mong],$yearg+1900,$hourg,$ming,$secg); $cook = "namae\:$namae\,furigana\:$furigana\,post\:$post\,address\:$address\,phone\:$phone\,email\:$email\,pref\:$pref,shiharai\:$shiharai\,namae2\:$namae2\,furigana2\:$furigana2\,post2\:$post2\,address2\:$address2\,phone2\:$phone2\,pref2\:$pref2"; print "Set-Cookie: SHOP_HAL_PROA=$cook; expires=$date_gmt\n"; } sub zaiko_error{ &header; print<<"EOF";


$_[0]

商品トップページに戻って、改めて買い物を始めてください。

商品トップに戻る

EOF &footer; exit; }