From fdd48bee4b83c02ec0326c737f0162913349d29c Mon Sep 17 00:00:00 2001 From: Novalnet Date: Wed, 10 Nov 2021 14:02:29 +0100 Subject: [PATCH] first commit --- admin/images/ELV_Logo.png | Bin 0 -> 1168 bytes admin/images/MC_Logo.png | Bin 0 -> 2469 bytes admin/images/NN_Logo.png | Bin 0 -> 438 bytes admin/images/NN_Logo_T.png | Bin 0 -> 10345 bytes admin/images/Sofort_Logo_t.jpg | Bin 0 -> 2442 bytes admin/images/Thumbs.db | Bin 0 -> 23040 bytes admin/images/VI_Logo.png | Bin 0 -> 1207 bytes admin/images/cc_mastercard.jpg | Bin 0 -> 3361 bytes admin/images/cc_visa.jpg | Bin 0 -> 2841 bytes admin/images/creditcard_small.jpg | Bin 0 -> 2228 bytes admin/images/nn_logo_small.jpg | Bin 0 -> 16699 bytes admin/images/novaltel_logo.png | Bin 0 -> 5340 bytes admin/images/novaltel_reciever.png | Bin 0 -> 2632 bytes callback_novalnet2zencart.php | 257 ++++++ images/.directory | 3 + images/ELV_Logo.png | Bin 0 -> 1168 bytes images/MC_Logo.png | Bin 0 -> 2469 bytes images/NN_Logo_T.png | Bin 0 -> 10345 bytes images/Sofort_Logo_t.jpg | Bin 0 -> 2442 bytes images/Thumbs.db | Bin 0 -> 20992 bytes images/VI_Logo.png | Bin 0 -> 1207 bytes images/acdc_info.png | Bin 0 -> 54999 bytes images/cc_mastercard.jpg | Bin 0 -> 3361 bytes images/cc_visa.jpg | Bin 0 -> 2841 bytes images/creditcard_small.jpg | Bin 0 -> 2228 bytes images/nn_paypal_klein.png | Bin 0 -> 2218 bytes images/novalnet_loading_img.gif | Bin 0 -> 5955 bytes images/novaltel_logo.png | Bin 0 -> 5340 bytes images/novaltel_reciever.png | Bin 0 -> 2632 bytes .../english/modules/payment/novalnet_cc.php | 65 ++ .../english/modules/payment/novalnet_cc3d.php | 83 ++ .../modules/payment/novalnet_cc_pci.php | 68 ++ .../modules/payment/novalnet_elv_at.php | 73 ++ .../modules/payment/novalnet_elv_at_pci.php | 78 ++ .../modules/payment/novalnet_elv_de.php | 94 +++ .../modules/payment/novalnet_elv_de_pci.php | 84 ++ .../payment/novalnet_instantbanktransfer.php | 84 ++ .../modules/payment/novalnet_invoice.php | 89 +++ .../modules/payment/novalnet_paypal.php | 101 +++ .../modules/payment/novalnet_prepayment.php | 69 ++ .../english/modules/payment/novalnet_tel.php | 67 ++ .../german/modules/payment/novalnet_cc.php | 78 ++ .../german/modules/payment/novalnet_cc3d.php | 84 ++ .../modules/payment/novalnet_cc_pci.php | 78 ++ .../modules/payment/novalnet_elv_at.php | 76 ++ .../modules/payment/novalnet_elv_at_pci.php | 66 ++ .../modules/payment/novalnet_elv_de.php | 95 +++ .../modules/payment/novalnet_elv_de_pci.php | 66 ++ .../payment/novalnet_instantbanktransfer.php | 79 ++ .../modules/payment/novalnet_invoice.php | 89 +++ .../modules/payment/novalnet_paypal.php | 91 +++ .../modules/payment/novalnet_prepayment.php | 70 ++ .../german/modules/payment/novalnet_tel.php | 67 ++ .../header_php.php | 63 ++ includes/modules/payment/novalnet_cc.php | 663 +++++++++++++++ includes/modules/payment/novalnet_cc3d.php | 553 +++++++++++++ includes/modules/payment/novalnet_cc_pci.php | 655 +++++++++++++++ includes/modules/payment/novalnet_elv_at.php | 483 +++++++++++ .../modules/payment/novalnet_elv_at_pci.php | 661 +++++++++++++++ includes/modules/payment/novalnet_elv_de.php | 719 +++++++++++++++++ .../modules/payment/novalnet_elv_de_pci.php | 700 ++++++++++++++++ .../payment/novalnet_instantbanktransfer.php | 723 +++++++++++++++++ includes/modules/payment/novalnet_invoice.php | 755 ++++++++++++++++++ includes/modules/payment/novalnet_paypal.php | 750 +++++++++++++++++ .../modules/payment/novalnet_prepayment.php | 507 ++++++++++++ includes/modules/payment/novalnet_tel.php | 593 ++++++++++++++ ...checkout_novalnet_confirmation_default.php | 32 + 67 files changed, 10011 insertions(+) create mode 100644 admin/images/ELV_Logo.png create mode 100644 admin/images/MC_Logo.png create mode 100644 admin/images/NN_Logo.png create mode 100644 admin/images/NN_Logo_T.png create mode 100644 admin/images/Sofort_Logo_t.jpg create mode 100644 admin/images/Thumbs.db create mode 100644 admin/images/VI_Logo.png create mode 100644 admin/images/cc_mastercard.jpg create mode 100644 admin/images/cc_visa.jpg create mode 100644 admin/images/creditcard_small.jpg create mode 100644 admin/images/nn_logo_small.jpg create mode 100644 admin/images/novaltel_logo.png create mode 100644 admin/images/novaltel_reciever.png create mode 100644 callback_novalnet2zencart.php create mode 100644 images/.directory create mode 100644 images/ELV_Logo.png create mode 100644 images/MC_Logo.png create mode 100644 images/NN_Logo_T.png create mode 100644 images/Sofort_Logo_t.jpg create mode 100644 images/Thumbs.db create mode 100644 images/VI_Logo.png create mode 100644 images/acdc_info.png create mode 100644 images/cc_mastercard.jpg create mode 100644 images/cc_visa.jpg create mode 100644 images/creditcard_small.jpg create mode 100644 images/nn_paypal_klein.png create mode 100644 images/novalnet_loading_img.gif create mode 100644 images/novaltel_logo.png create mode 100644 images/novaltel_reciever.png create mode 100644 includes/languages/english/modules/payment/novalnet_cc.php create mode 100644 includes/languages/english/modules/payment/novalnet_cc3d.php create mode 100644 includes/languages/english/modules/payment/novalnet_cc_pci.php create mode 100644 includes/languages/english/modules/payment/novalnet_elv_at.php create mode 100644 includes/languages/english/modules/payment/novalnet_elv_at_pci.php create mode 100644 includes/languages/english/modules/payment/novalnet_elv_de.php create mode 100644 includes/languages/english/modules/payment/novalnet_elv_de_pci.php create mode 100644 includes/languages/english/modules/payment/novalnet_instantbanktransfer.php create mode 100644 includes/languages/english/modules/payment/novalnet_invoice.php create mode 100644 includes/languages/english/modules/payment/novalnet_paypal.php create mode 100644 includes/languages/english/modules/payment/novalnet_prepayment.php create mode 100644 includes/languages/english/modules/payment/novalnet_tel.php create mode 100644 includes/languages/german/modules/payment/novalnet_cc.php create mode 100644 includes/languages/german/modules/payment/novalnet_cc3d.php create mode 100644 includes/languages/german/modules/payment/novalnet_cc_pci.php create mode 100644 includes/languages/german/modules/payment/novalnet_elv_at.php create mode 100644 includes/languages/german/modules/payment/novalnet_elv_at_pci.php create mode 100644 includes/languages/german/modules/payment/novalnet_elv_de.php create mode 100644 includes/languages/german/modules/payment/novalnet_elv_de_pci.php create mode 100644 includes/languages/german/modules/payment/novalnet_instantbanktransfer.php create mode 100644 includes/languages/german/modules/payment/novalnet_invoice.php create mode 100644 includes/languages/german/modules/payment/novalnet_paypal.php create mode 100644 includes/languages/german/modules/payment/novalnet_prepayment.php create mode 100644 includes/languages/german/modules/payment/novalnet_tel.php create mode 100644 includes/modules/pages/checkout_novalnet_confirmation/header_php.php create mode 100644 includes/modules/payment/novalnet_cc.php create mode 100644 includes/modules/payment/novalnet_cc3d.php create mode 100644 includes/modules/payment/novalnet_cc_pci.php create mode 100644 includes/modules/payment/novalnet_elv_at.php create mode 100644 includes/modules/payment/novalnet_elv_at_pci.php create mode 100644 includes/modules/payment/novalnet_elv_de.php create mode 100644 includes/modules/payment/novalnet_elv_de_pci.php create mode 100644 includes/modules/payment/novalnet_instantbanktransfer.php create mode 100644 includes/modules/payment/novalnet_invoice.php create mode 100644 includes/modules/payment/novalnet_paypal.php create mode 100644 includes/modules/payment/novalnet_prepayment.php create mode 100644 includes/modules/payment/novalnet_tel.php create mode 100644 includes/templates/template_default/templates/tpl_checkout_novalnet_confirmation_default.php diff --git a/admin/images/ELV_Logo.png b/admin/images/ELV_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..74d9052e4a082e3795ab76457ec5acf1fd18e74f GIT binary patch literal 1168 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 D$x&Su literal 0 HcmV?d00001 diff --git a/admin/images/Thumbs.db b/admin/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..a50c4e24dd9641be43ac1f332db1003ba418173f GIT binary patch literal 23040 zcmeI)2UHW=!YJU-LFq+0s352`X;K8DB3(d0MY;$`?;QeB5s)q*prAzQNben_qXdm&poyX3w6w+suz1n(0qPEHjXQ2yzet2o^^M zA^w}+@xb>}zXWOs1Rs1M0I)b5?$;k75b*WS@CVug7_hE1VCT^Sga8q6y3a`fQh*FN z1DplO0SbT;paQ@l0HFge0$cz+zyO>B7y%}L8DIfe0XBdg-~c#*^S}jw8#q0NPF(`u zc>rGEGH?aB3h)7^fB!T5-`xV*5J&LO4eSdAhy$3qK)k`0{?EfXaK!w!MyJQme-*yO zaK*?>cH*60Ga#zJ#uWaqX7~^OMhL;j`z`&`>3=ZGFHuTQ4`>iXex3a8&(rizuZgF5 z`cKmr0&)9KPcRTff1Uj9&)<`OO^}-HU(!Ea_usDLzvuk_?b>mA9r(TH|8Lii)9b*0 zb^h~%zY73@!0EN%8kn9QKd1ZfbUTUx;=px40+0lx0BPU`AOpw(asU*#3ETp11M^*a4^MI)JGo-~>1WE`TfG2Dk$rfG6MuoSw}-fG+?8 z`~ZId4m<-+uj!}9Ko&S3a6fU=5NcIL6-5XhIH(_=t{`pY84BEX& zZqX+$FUZcEV`O4xxx~YJ`N~x>@#_+jQquBw6cm+|RaABEKX|D7NKfC)+~TRFm9>ql zo4bdnm$y&A%fO)ES0SM>v2Wty6W+c{Oi4{k&&bTm{#;yAT2@|BSykQC+|t_C-tqNY zU;n`1(D2WZ(V5w~`Gv)$<&{;`_Rj9!{sH>%=rmt=5Q1N`_1B#JL%wK0zVHbN2?$9} z^M!}+2@uc_5?v4`roE*_V(LtHQRF!({q5*aMU7-!qS{D?Coa8b&T)&)Ttb~@?U$VW zXBm6(yK?r|jQ#I?jY7x?@W9R^paCZ!Mkgh78y<;+uv|b}q=l*RYvxY~ZKe`9hr@l@ zzph^<_>7ur6{0$kDHr-|OjSzrrYvkRx`DEJeE8*RLm4zgM#=4mm*#C&*T5(BW)dF> zXI$4sY`-q_CuvtwaoatD$_r^P)L(Z?vcZd=C+E5xXp$UDL(L=>gGZ(ZnE zHF}ar%3xXk{I(UEtnIeh4DwZ!H25d^RRrgw;>O*Ur&N0b=KR+0&fSmn^}bXV^FvMK z?T9Cl(eZG^^ku`n^U;$vs}_~t?k#;_zO>xU^pr_8cHb%I+_4d-JM0D~9VR|!89BPq zP%MOi@OK@T%XN*R3XI5^@JY{alWv(L8=oov;f{k)uF|X&)*ZYufBx`F{yZu9wshdO z)6aW|8#m-s2%wic3M|k9sHTG^ZT)5ci?spwdlxU+i}OjR3avDEc9aKkj+P@g$iR&q3ZuR#%X|$MJE#cK>N%_;~cAoT-@HlhGxE82r~4b^GU|4*Tz?pqE7gF+2P5~ z<8!>pr7bEb`C0$$*&Dn4{7)-GRXUQ^V&t|%qUK8nT9s!=rqeJg z1wSRXOcPrLdz;5DtdpK=sfuxWO_V52MHiY@IP&;WuwJk8{FvNI?t6!O(ri?>$q0RXIix4l z+BwHEy8YxP1w=I?CBv`pZ+4R@jOKqIk8kfp+$6C{%iDj^c9Ya!`Dia+S6L@xa#h+9 zdFyhF(18hJkpf0Vzu<=Kixdnkjx8|~s>AwV+J7RG?RDrgU*vC2=OYa4Emtz9=KWt_ zI~!=JLQk$8DSS`LxBH<+tjTlHsS^k8OJ9vhZ1#`P68jHPqRTi4jaX$TL#S_n&7ADR z`;SR5Cy%0LOuTiMmX_NC{YQjL5v2FBx+fHQpqhfJ=!@R2XEA)cHFE`ltZmS`QbyRN zJ^uXWvEQxp!^;KhaFh#_^F&6IYD$&W;D?!kr!G`%Xo4$tieO%D+GltvuKNQt5T^Or zO84u6CjC~aup9S%XqcN+fK9PPPRZkI#(U>F_Uj=IuDS}cZbwo#St~L@q`x514_+X@yftdJZ!;h!@btK~o~hJ!;^Ip9 zaJ&=wSNjW6mJitP?Mcpanzg@1GtM}MV$bJBd|a+zEK-!SPNHc?-0XU$S?2cv>A9bb ztY|e*wkxm*lSh%=E4DsxeEH@;SZbzm_qe&g&X*!D?VOhPLu8up{D-0}0^S(gMMmmH zW+S1`Ppo}Wy%J-4+t$h9+vJp%x@%%K`m_^*I7nuy(jrG{>J%ETgHRvHyHwOrVIMR0 zy+%*-aEU9=Ikua#b@Z*)hu3#<{kGc~_9QlHa=cvHTM{jHCCZoXmzPD0b4SIp;FDXR zrV{4zg*QyZy`W!wuyr#z2)bKO1+_Ofz85xMEG_TId2M01Krblw^vl;&Xct#RClY1T zpHMq&Yvk9H8Qt1Ea;H!)`J(kCwPE&wL*H>N2}Cz(mN>AG4F|E+bK8IS2pej< z>ru~&d0oqMR1jG@mKpxmu1{U{whz^tR;oo~d2rAbRPpWf?>;9bC*?Yiyj2h)CwU@) zg9K{MEe(7Zk_Zs@uuL9EIKELxuElfzd^O)|j|28dVH1akN};s^8R#DQsy=rE_sWtF zPPf>y*T4DF+~iDz(#f$a_qhzUA6)gQVV0_KiWbK9CjGNYme+$#eeI!*g_x-4{H9ej z@92qcJjX%Im&BLqxvG0y7? zBjtSjv2K@ACu9+O^WJaAtAnJke=ggskSU&AC5z>|SlR8hVGxB1e)xkQ+m?KF@Xj6k za~{KeMUIa{Rj_f{&@Xu+wr9i8+z*3oMQ)5_D~#FGFFbvHeE?ebQ~E`7g?%6z`Vsw9 zE$~>o)7>%C(1us@YSCeez&EoA4yUmu2}2R7Q5O;apoVj^w(@b>p?;GME^wqKK7!nI zPR{y%T#W#fuDkZejI7yg=BvCXl}aTgkyv`nq0(^2O<^`E z9K^y02PxIByB*3$;FJ=28LwC|RuR<^imJT&t@(Vw0FANHEDkbK(df^oYqg%F{2|g) zk7i*BTXpR+6mmJ`nauv&{D5ow&T5 z^6U&)J`^|dTS519`dj(E9n|Ok2<7*S5b;0D@4wVb{_y4ZBgDQZCRvW$(EmH)?B0g& zjOVjWo}|X32YcA`EH96)`RLJZo)|rDtL^VCF^^(YxD$~*AtsD+kQLp&5wy@WZ}Wup zlP8&4waBu>n`l|B+r(T`7t3L~S?Jg{&JwCGCPDS*jQS_h1ZsnO479Hf3=}Llzo~4* znMI;oVK_+c2?r`6cs)-r-|cKh&}^?`OMK_z;l1~PLQyq8-g8un??}Z<(2%*9&aPK@ zKp)QtvVU`?p9}4>$+w1yZP`mpto_*CB08}~i?}nTqCD48$XPyON#8u)rhVU3j&ybn zxb#6DTpg2?x9e+AcXoQ}nR~Y2ES*wGQ@L_z=5b34rQfrHNH@noxy#j#}DmJ2-&roeZd{MmM9U*Ff=?hl)R<*83DS=^});wKZd z?d30y?D5DA*<%!HAz7`&>z?VY{k6;gy#mgwu&CGz~oGzY``KRm^iXY>k zcS8@yeOpcEmlTX|9LX)Mo(Rcb?6UsM96oN-e&;YZam68YOticY2eDztD^pVnQy*9u zU|Ae8$XTnp5a@W<=_{S+$4fNNoI0c8-YMS9^OKlkAM7qk3z^?0aDtLDpzAf$38 z8L530r!5p`L?A^}+1;Pa*LHH@Sl~nx<&aI0>rXe}7APoTWHVH3pv2kmy$brQAhQ5& zQ9$D*dgq0jUVn@3C6du_YSQ$H@rzl93FA8^0+DT&oVs!P)U`gxnRV|L-b*A5MzFY7 zWnM~IwCBqc?5miy@N#Ttk$9P6WhZvFq+FL+DP~*@m7vJlEkZfS7dXAgJ(vUK=$eJN zEtNE2`)ecZ<)qANC>&P!j}J=CH>XMirB)&(bCckKSfQ%7caoV02BW+M*cnkzgpF5_ z3Dal1JQN0HZqm+aaUDGD{O)9#&5KSt)D4Uq?smPx4=tI`DD~fnF{&Ne@s422#ADR! z>h@z4-#k9znvOyX$R)cWD6l={ym@6Ad1N@qvyAu9bcR$Mgy>tiB7#s$kwLK>!nr@A z;NL^Kt)NtN2t$ayuR$aqX>LfMf^YWamUfBGHbjbTT>nO2URF|yVxPa)NPGEy1dTb~ zgZsZURi3H9K`6{n4cIW=7OIo0LJjB*`Uf$b$RQ{z4zgSfyNQD|r5xiRk-h&M?;hSi z{r0bBRDif7OQVbCqCz=MagdjtZN}$Ojz2vyvB#eGlMmL9_qVoBhV5(0d7Q&H40q|Z z6d>@wzrFwMt^Qwr|Ly*7^5^~k&-S~2*D(42ru}ZmB#iT%8|TPYBRDJFKJZRQHJMPe zTh7#nn!Z`IosJ$2Bq?T*^WbAT^S$`RloGt>2K}fu3*A@~qG}O#$f4UzfIT|Yn({m@+c3>B9cMEVwB`!3 z@f=6HVp$)KVI$_Ip;+oU93<-W9x(pMASl&75i_{H?dcT>Pb$dd-pE8t9`g`a05!EU#qsTf!)8^$S7=l;6ncO_^MlH^7@Tk!j=yU}pj`B0H_T*X>SD8cg_^Hdg?Lzb zNB^0RC8CevKB0#zWmm38F6Z!Zra+6|JoE2_6CapyB7>Hvj^rs|n#YdVE)zQJ73@&C z(6l|DRvGdj)Xl)2>%s6w!u2ABCFpxz$IU?HBukVXxZl>fHY&B^AjlMdaDy;~+hYQ- z4Etd<$I$L=SWj{00W@rLa2%$_*WdaU2dPLz^J}sUd=oCa+)Q?5ObuZaG*dZO_#==1 z4p&!iordOY#rj5$Ehh)mvL~2@@nsniT5VcVSe9oBj-!N4B&(lL7B-F2a_+ZzdML50ZCVA1O#|p5gn3UZqrbo;A z?$xjx#Q}HwHf5a8w%TS*92z(XT@3NxU-6W#I2P6|fH#WPbE1c5Jey5emy@M_IF_EB zLMty+J{O!Dq5q6hs!D;j)Wp@>`1@bNK?X)}kXSLZSv}63>zpTK+1axKs->8iFX~D^ zxEhf!tLiJLY7g77XJ31AzIeOfoM(oEa9_@sz@F*BWXW;D@Im2DcR$D-gM-*lEY5Wm zkJWfWJstJ=HVfk>d8srS1gc^@Hr!xwHpWf4E5`fwCX28KX;@G;V%(*;+N0Koy^0=F z@8|!d=4-&GNn@-)PIEEv&K*6-gVU}w2or-VmZf3N6LSs^lP2e#K~IPI_f zpM>Aj|NR;y_>$`iN`O+J3@8UGfJ&eW zs0M0)TA&W72O5AcKqJruGy^R_E6@hC1E=fo6->VYoxpdX3+M)VfFD3F&4wwfPfJNXm?PV}s0ak%EU>(>1Hi0bw37~*& zUYWoJp}i_nI5_m15|moWxBUxh8N7B z>2Y+&lvsNfyEIMDV+t>9I#Q@j+I@GwXywV?`8Q3Lsv~x?b6ezEPrUKdQTC#(=ea(a>$|DQz=UM;Jgi| zK_Qa<#C?qa&bSO8O8zd2ztcfp-!M7k3X|if{9a|5;Vx>g8!a4e_7pFBCE;=1#C?>a z?~jImaL^C%47l-G=R=Nf5^=Yye{+IsnW!`~4~YtEe~Jvy*3YyxJlT=_GJ`CRxXZuA z*mqDg*H9|4VUptCeH8!BI@h`)Vdi)N%j9SB zoX|tsx~bW%_1@{ID4&S3;V=Qg%}f0wbI-<%Y9-0(-*3ol6Tup0qefz3LDlTV?EcCZsNL1mA;CXBm?d z@ZKDv_H70wD7JJQB>1Bj_uh}aa2#Z~7JlMU3)M!uBOR4(4+i`>Y=>4dmrcehqIoL# z)Er`zX-9dOX6DJm75(pNrn`?St@j|Cre^AvB4lpOTzS%;Rvu(@LCl0s#p__F^L6>O z9jnO=C1y^Eq5_qf;*ODOm*JyLr_bo)6K7dcc%vqa_M2;p?HTxJxhD38$phF`)I2Ah z3`06Pv5zOHN2fyVEv>@nYPbjic{JivL9`qpwhad%!HU9U`(aw3CWb9am-oth1ur-H zR^9Qf^M~8m(eO_Ml?-FX$qi&zLeTEZXt6F4`tk}r6JJ8DHccOtE79|p-q*6TdGmU7 zh*2)E!BJ=5M~9vJkwY*Y(2LqPwY;6{qfsvL^+K>S9TDj_&EwB$e)_fbCZji66UZ~B zAAS2ad++XDIscna2=IDewaX{Fnz(yqHYMtY?dt7L=y%`flnOc{*-iCCmZ}bh`Rw1C zC@{EIkC;8%$;5<%WXCWh5d3`aUsceJs^oXP5zk`0wo-JQf2&20(5bh1aaa4j+u}ll zgzcEY&+Uz~a|a>f=kB|gTlWsmQKz2o#>Wgkrn=QQTPM_x)xE@vwNcbg_&ATLB{P~ko^o7)( z_y(4?&|czp+4KD^vZ^Ky2@VY?-J@hWv}HQlVcu}lcC6^Y{4M#FeTLD`L?rn2vB56y zJt+4|&b;sU6&!On>Ivu)ertH=jgwR9!>y|CHvS@gC!((0K5>0xU%3OLNqM``oRllk7V{MrNa z^g%rwBzj@Lo}#W-e2Uff$TO@~$S=n$NsG$aG3TcmKYlCM2tz$y2Uj@qR;%kI9wvFW zff5rltb>lA*H_OQY|Ep_2#RocJ*Bq&;(0S3oAv9|*m$10#s_ zMRu3HtIUf<1`F+i3r^RXrC6&D3herYE;fXZ-(2Gt33PK`{t`*ybpqyVi5XL2S#zY5 z-k5wH(YYyAa37f;I!YO4`M8fcqExtfv4Utniy5lF>vE!D8=9@H7k7zD@xxTdY}-sB zlb6C{8!4Za!_*i=(w>*QRKe^~X)9_6iuR z60o#=T_r2~J1TV0{X6%#5?%`Huyxk9{p9C@oaB=YVO~4RiNaXXBr{YLdT4ngqS$Y)I z?HY;yK*6A?SAV|u95N--7n~fPQ9W*3N!zFpEXYqpsKXxj!7gN@OeNvU z@y-u&ldD(Eu6PLKK7Q$!+7)f~Nbq8$6#YhIeKgWw^()e(kw66{n3po8GD9K9YBlpC zGTnkT$qjQ%80`Iq{8_z2V<3OH2#X`R^)Tv0A7vRTqn2f2lgPD7GvQ^a%)we4y}Pwb zDv%bJ9)oY@*XcoH`V)U*oYDI3=fV>Q!7C4vv^6$X@)M8zmByy$CzyE8TTAfK2$+>s#X;0jRDlKg4tCtdMa306_GRkqX0OxJYcGtS&Aw?#e*Z?` zSY5Gh-&84YSm{_#fE*8K2kume5crVZP?$V)O>U6%csnKEMTxnKVIKxPhb%5W*4$QV zab`;?a;`b%+p%1nYBxC)n4)f2e=-2y%}||LPH9kThT|hrPNKd!!?zfqEjWniaD#cl zp`_3m9As6m3ue(&Mjy>c=7IZ7Ez^-5yps0p#y#MmDd|EsEkHT-)ZywS=%Juut z@gKjAOaJ4K|5)2^!4wKKSmsHy)5(XjtF;ZIyo(ehg!S&Y5EkPN#83`yz0iaZpR}Ns z+Mui_>I2-hC}_x@fUy$yp{wDwK-riJFK?}XJaZ651EWQ8Zph}_An1as9PzyZT6KW;VM`c8ElMSmiNxtzy<={#IfbFUHCb9dP5QAF3AmXzzu+_@t;E}+bLZML z#V*H{o9B!6sG?ymZL>*<0rM*k6T8ryO6>$nbFtLm50Ct8H>#`#3M}at%yV~DWbG!a z-zzoaAQ2qWXw$4#&lxzqjlMxD!Mu``75BbZ(&f3I0VY0Z(f!UL>{Ty~W=#=;6^@IM zQ~s&@ObfS{B)>6gRfL;gv7#DrJ16^-^RM+}_=fd*>^+ zGq-_W>SVFPPU^MCQjKg;dVMD(a{_!V+FPJ!pj{_Sy-ZzWNkZRlKhMtSM>%@o!WXM~ z!VCOoIQZs7-&)#I@$;M!XB0WUYV2dpSXV8ERWkOJWBop#Bh~k2ra(drRf~6tR8M!QMBD6)x9<;Ql=T`!jiO%EUt7b{RE5h9B*rIGa`Y{9I%7LI?qib&0}7TC zjh}y3NY$L>W7_6NF|*w;nrgQdBq9dcYxxG`x)E zdqKmnnXIh2K{{Znr!v>2)eiN($xL(;`mTB?I1BBngU}ev6?E&mO*|%$H?B@!giw44 z3Eg$}4iY62Ct>(j&uCeZhl3PUV%md?H8^HrLPM!ne695cqC^@b9`ND|smMpX0$S=BdhN=jo_u8yPdO~N4W|*k z!sX2Nq2cmM;-SpkE7AAY&w0IPqtlxF;n1TdyWwyoS|B#_KKM$uW^!ijuGX7ahta&f z@&ZSVj@2?pR{1P6=m33CfyAbp@?>XDD!7Jq>KPAhDuwh;PqALPea?J*t) zduX*2B4|iMZ#Gb|%Qn2gq#@jGoBq5}E4X&5h6(CjzUAj$x3|6aX*+J4tv=ycgD0(S zuqJ+JEHiq{i?1mgr8vS}Sd^gLznjFTetmLiRw1@idG0Es*Gy5=tpP3Lo#_IS5j5BB z0QFM-V?~R&>JH2pd&3vJ(NIk4*+%qT^-CsVfot8{ACeR7YlJTO!lJrzP!v87*k$PR zRIh8*@2d{`*CY+15>Du$*jp@`$H9la3Vs=8*bPw!^3zHymG0p=9Ar8fzAa$WuvxHE zP^hVTIWqwVsks?>4MbSv8uV8_gtx=DrN81JM({j8x*5(xMtwqQm!5 zHL)G@=8*xht^WRK##UF*sZLVs`O&z8t9Wo@wz80XZZVPX)yq(l?1v;Va!bqwpHB2r ztg$?p&oT@dtNRa+l9REF<3knBAzZu|t`C{vNU44Le6A^8RAiu|b>>88{z~Df4Q00F zjfwMWF+Tiu29%n1Pcx)9 zvv+6-|CX6?O>*rf$4t6c!0n+ep;8R=QOQ95`k4J-En^t}>ucPm1HxBbNE_SF_m@uS z+!=D%%5%fq?mJp+J;|xG&%YDpaL8r%j4k`nARschuU-f9POv}>5t=Bl&{a2@8RlmD zb<&zG+F5#{18Zx3(xUj$64T&n9C0j#gM58}9tJ}w%5ae01bV#nbE5@8nJ9{(FpB+m z*Q?HuS@yRq9|&hdf~?q# z^p%ZzRV(XD^v2k4ApYp3V4>1`M;F!w6W3P3I4}SJf{xV=(Cj-gO0{9!u`n$y8l3ay zgv2n=Y&+q}P`)UXqkja0qLKr146P7UDagIFbvuWRG73t*>s5D&n|b8i=H2Jc56Am= zO;Y{9uk6S-G1VC4$Zqxa=E@wqUniD3 zQ0E7iUy%}1eDu>`%CJd=+u{K4aOl2tc@A;PP-lgf!sD}7r~S<`=kya2u?fU=)+vTv z5x2K_5}AyzUtRs+Z)Z=E-R5$Wx2TnZv3-=MB)2@yQVd~*LA@%aj2VxZu-UO&f|k)4ZX%draze2chQGHEM2g z%IeF6W=1-_tj+c<`tk!^-;`IHY`!mTOYM#NVw9xX=k$D(+R^@`Fnx4NtW~iM z4l=6${Uv=BjkmvH%u#l?C-#k&vXXq3m$c9;XekcT)D+q((4Xt#k#!o@kJb|$=Q@@hc66I;UIm{ zyY1_k<9h}t-oxVR(wtOksjRH-l_Dx0JX7&w;e>{|;z;66S?F9v`&xDgb)z?7{>`sv zC>o(3Q$iP7v;)a>1H~;Y4pTF!^xfwa-PtFm=DSN;Xs2u%sGp$JBgXmCt@Z1I5@c&V z+Baz9!^025zYubclJJ!-JwCsm4I`N2sX_-^%!nu7k_)sDPse0Nv)+l}qY}LT=Gl^u zYpD~YaWRzdi|pJ#-md?tP2jitcRBIzyMIgm(-QxCKY;NEzq~7i49o_)tieh5e-29^ zN)uS$(;)Thk~X({!6;2 zX`hDwWajfA{WjqLR`@mLUqAo5%RGH-9v?UzZ$Jp9L;x{B0+0e^z!~5yKn_p=H~{c``!8u;0Mm;A7r+f%0(byk;B=k-4F7Mp z!2j>}H~d+C|LwgLfB5!4jHn4G+CiOT>4A|$$I4Kjw~i5+V#k!^XnWCD2Emd!3aaKI zr-@acvh;}3pW6$`k3a47Gq0H-hI}w>vC~4YSj5K&3x_Oh!$g{c;#ps_QNgZ31AX&z zKK=9>-VZ}Y2IuQ5WUmN&nRThDJ+HooHJLoSc9T?G3>~udCTC1RO1w#v#LKFr+ zbHK6&2N+Cl5+J_SDK(9L_vc1$&2F6&&5a-B41OFcMLMI_a>r7i}lkw3HC9Q;wiCi&qkELBGplU;6_8y!2Lv2{Tu`phm@pkf>aDLZk<47-P9IWVA zK&+aorA8{lg(P&>TAY^3laXo)^8+fqOEpsFjN+Z6zDF$XRRbT^H#YsTe|<=ds{sBa z=_lo9uATZe3(R8AmYFP{pd-7N2nE|}pRLE0OtP-*Y6;F7+VBO@{q{^WUOfgg(MOn(^E9NKA?8*(;Psy}XmTf9nhqXmy^HQ9CF{`mMSX!)ADSm!l; z{|&2;>Qu-~&$Ty~BwKA+vFGHv`%nC)Kj`-zt#-CNl(@csnY${6uQvCp2A+c#!?`%r z*+%KbbfTblvpH&ED_O(b!mBKUuII;?+X)!Dv-%g34?+g_Li6wM zmqw+TsMpB96(_^njg~+2J;10TXm_-Wc7mo2oujd2R2*d-p!~XFjOS%{PE>-Gpxs+hsUdz3@wvPdTir{rjqT+OteJ7Q#V?ZKk~qZK)>YWJ_q z!pbv`Eahr6XN*6gSd7$W5?ZK8VT$TEj&<*{u&ngmj^%fV5rNhDL@LnVBVKBP26=*E z+$BpPx#Cu-p?;nly0#D}tbR4@*=uLS8-rp1U0u(>A^GivH}e$-4e~1m&*2<-a(pJn z*72ikN4h`rh7{vfXaeTvo|ScBd+6Y1Uj1|88y$RvKF!}%w>^U1BwtRc;_HtPvS->i zc{g@D?XxeLTFpt+%{t$lDTeDMXWRFc9rM)GT8V z&yS^{*cKMsm1`;sYOspSrV(gXy^?3%Y`*=qN}v&f0%UPeNrZ^#-raw9o3;=Qoki(IvW z6=&OMtK!u{!9202R_k}am55O0(z`}diKEIQ!O1u-PUPTOMb;HUiLvQX9 zctZny3Ig1J%IF>6L^rfHQ)DhDb5Wcec zL&wL)CdfEw$q28JaJ^QNixYg8Yvr@CfcX%(m$x^B;EnSn7bUUcRPQ>Kk zc4jM_-U!XO-<8zjymTzxHrWO4!uXT-mER&hIr)Fo6@qhH?(5F}N zBeb3OA`jHm;AQv(kDq^7i%#|(#yh?S9vN>yme*hI!i1PEE*~}JzsEr=4M)j4gqhnr zzib$826BIvaGP5hSbnftp)q7*oY}W+mHY9nP`;_$R;7PgoPCbX>s7_!g#j7^qFyKA zJ%&`zSy>S(T74_gD(S!hAsMYVmsAT3lb`K<*$P;BP-?WTr&z& z%@nTF`whgO{IX;RiWJ=KU8PGsQtlgdGObs+_RC)W;m@YS)Zjsj#&b_wk*CqVH@k7+LS*OD|USjBF3VDbdGs8mYc#FBJ{S>|OoV`o=qL zn&4zPrE0BB?8Bp5dV2m=%c)oH?`tR3)SN`t=mu*KoH)s-5Zoz0rymg!bLZ>vkPb6> zW5r{t-L{T4jZr!F)dP=up1u?D%IFOJ33*@EJ1@Ck+%$8K-C|!=Iq&?Xn}S~Vwa?PO zZ$_d9tv9D_H;@0~I+%j0H>j}3N5P+W;yHkJ5szQmN8G@>3GKjp3x91XaRhH+bOLV- z{k6^HbT0hAnad2k&(H*759V_Ptt%Gb4TWaly9;>3p&)phq0?XHx(enX_@}u%z&j6J zLF~VcDFb2={#{HLuvBvp)9tTIHUV>;rf3KL{q4N`U_LOo@vk{j0Pk^p2-fcIFD*WQ zpO4cu`lVs&FS%C-?L+@Q<}Xc1e~GC9-U|7zW1emsFgWM0={ta}_P@8{zgufTFvID7 X`E5V^{qjw~yC(m3`=3Vqec^urYUw_Y literal 0 HcmV?d00001 diff --git a/admin/images/VI_Logo.png b/admin/images/VI_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a494e1cffe48d921d188e556eeb9793b6f1481 GIT binary patch literal 1207 zcmV;o1W5adP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOW2 z3^f>4CE^P#af)ZeuE-umBM<*%AgLgn)Bw zN?5XGGnzPc_<>{v6dW66W_B=5jEk^c$h^QYJ{&C@V+oNiVw5{PSspsk!;*;Nd%XFs;s52tbJ7wh&*4FU0qFTkbE(Nzp;o|B{oU|HXIs z(2m20b_Dhx4kt73T-0b3G)-<)zsH%)?r3W2@9ezmho2;gJz4ReRK3K%>h2!?>OwC~ zQ;iKrj=g<(YU(eALfmC~k069Mx`*n|_Y4nP0Zz+nq*Zx0~?*n44oZsvmDD$vS?)vK+to{EJ&w zn`6snb@B16uN(S!XMTR7+wC#bngFQP@>@NnayjjCE#2%H*Seu3;qt^DG-Y(K3Fmty*ndze0*kMVF`fG$9gbtG7ugv zjfx5f;AR5ECt68xmh}Uutm^Q3+5EiinVE6-?#&L5SOM(GiW7?|oi0Km5dm;Gn7#YH z92l5*^c=$(Gs|+t$FnwXR`dF;IoYj`PqfO%b(-#4ZjZ@i^r`BX0hqf6SAx48fJ!Aj zXDp;B0>H$?>??&Au3sPGH&`rVy}hGat@5>_>1wqcfYnss+efklP&fK4#IY5#^0OqdW`2@<(O9ar~aYw6FrloEb3I%S) zD-Z|(Bql^IE_%-zZ}9C&6)puZZFf#iJq#G%YW@KzDoRa#VGFqC7M7$^QCiy8lJ~P?V>gvov}rVo zw~l4-aQyXxKhV2Yec*(?#UD^(SX3Grut7%|UeYC8a!HXnqdyh4}vW_c!H>#<0}tVCpZjWj=}`Y7C~}6px~azX7*^ VECikks;2+|002ovPDHLkV1hDvJtF`B literal 0 HcmV?d00001 diff --git a/admin/images/cc_mastercard.jpg b/admin/images/cc_mastercard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b8930ca3a4cbf522121c8c5145736049ceaa68b GIT binary patch literal 3361 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 G6aN8MR_SE` literal 0 HcmV?d00001 diff --git a/admin/images/creditcard_small.jpg b/admin/images/creditcard_small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b98f4e01facc10ce9c6e4b1751b1fa5d698ef4f1 GIT binary patch literal 2228 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 D7g#~1 literal 0 HcmV?d00001 diff --git a/admin/images/novaltel_logo.png b/admin/images/novaltel_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d1cb6723ef264fe856fbf3bf5296d362c0de66c7 GIT binary patch literal 5340 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 $value){ + $t2 = explode('=', $value); + $_POST[$t2[0]] = $t2[1]; + } + #echo'

'; print_r($_POST);echo'
';exit; + } + ### /TEST ### + + ### BASIC AND CONFIGURATION DATA ### + $tid = ''; + $status = ''; + $today = date("d.m.Y"); + ### DATA FOR DATABASE ### + $mysqlhost = "localhost"; // MySQL-Host angeben + $mysqluser = "root"; // MySQL-User angeben + $mysqlpwd = ""; // Passwort angeben + $mysqldb = ""; // Gewuenschte Datenbank angeben + $order_table = 'orders'; # DB - ORDER Table to be updated + $order_history_table = 'orders_status_history'; # DB - ORDER HISTORY Table + $status_2b_set = '3'; # The Order Status which is to be set + $max_status = '3'; # The Status till where the order status can be changed + + $caller_ip = getRealIpAddr(); + + ### NOVALNET DATA ### + $vendor = '4'; # vendor id at novalnet + $product = '99'; # product id at novalnet + $ip_allowed = '195.143.189.210'; ## NOVALNET IP + if ($test) {$caller_ip = $ip_allowed;} + + ### get params ### + $aryCaptureParams = array(); + # passing/packing the parameters passed from the last page, in to an array + $aryParams = array_merge($_POST,$_GET); + # looping through the array and passing the parameters and values as variables + + if (!$aryParams){ + echo'Error: no parameters received!'; + exit; + } + + foreach($aryParams as $blub=>$value){ + #echo $blub."=$value
"; + if($value!="") + { + $blub = remove_string($blub); + $value = remove_string($value); + eval("\$$blub=\"$value\";"); + $aryCaptureParams[$blub] = $value; + } + } + $comments = "Bestellstatus aenderung: Gutschrifteingang bei Novalnet am $today"; # The comment to be entered on order history table + $from = ''; # email from which the notice email to be sent to technic + $reply_to = ''; # email where the reply to notice email to be sent + $email = ''; # email adress where the notice email to be sent + $copy_to = ''; # copy email where the notice email to be sent + + $subject = 'FEHLER beim Aufruf zencart Novalnet Schnittstelle'; # subject of the email + $body = "Sehr geehrte Damen und Herren,\n\nfolgender Aufruf der Status Aenderung fuer TID '".$aryCaptureParams['tid']."' konnte nicht erfolgreich bearbeitet werden!\n\nBei Fragen wenden Sie sich bitte an Novalnet\n\ncaller_ip = $caller_ip\n\nnovalnet/callback_novalnet2zencart.php"; # body of the email + #var_dump($aryCaptureParams); + + if(!isset($aryCaptureParams['reference'])) {$aryCaptureParams['reference']='';} + if(!isset($aryCaptureParams['vendor_id'])) {$aryCaptureParams['vendor_id']='';} + if(!isset($aryCaptureParams['product_id'])) {$aryCaptureParams['product_id']='';} + if(!isset($aryCaptureParams['tid'])) {$aryCaptureParams['tid']='';} + if(!isset($aryCaptureParams['tid_payment'])) {$aryCaptureParams['tid_payment']='';} #for payment types: invoice ans prepayment + if(!isset($aryCaptureParams['payment_type'])){$aryCaptureParams['tid_payment']='';} + if(isset($aryCaptureParams['status'])){ + $status = $aryCaptureParams['status']; + if ($status == 100){ + echo 'Status ok'; + }else{ + echo 'Status not ok; Error msg: '.$aryCaptureParams['status_message']; + exit; + } + }else{ + echo 'Param status n/a!'; + exit; + } + + # we update the db only if status is available and has the value 100 + $tid = $aryCaptureParams['tid']; + if (!empty($aryCaptureParams['payment_type']) and $aryCaptureParams['payment_type'] == 'INVOICE_CREDIT')#Zahlungseingang bei Vprkasse/Rechnung + { + $tid = $aryCaptureParams['tid_payment'];#tid_payment is the original tid + } + + if($caller_ip == $ip_allowed && /*$aryCaptureParams['reference'] &&*/ $tid && $aryCaptureParams['vendor_id'] == $vendor){ + ### MAKE DB CONNECTION ### + $connection = mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die("Database connection failed!"); + mysql_select_db($mysqldb, $connection) or die("Can't select the Database!"); + + $qry = "show tables like '$order_table'"; + $res = mysql_query($qry) or die("
".mysql_errno().";".mysql_error()."

\n"); + list ($table) = mysql_fetch_array($res, MYSQL_NUM); + + if($table){ + + $qry = "select ot.customers_name, ot.customers_email_address, ot.orders_status, ot.date_purchased, ot.orders_id from $order_table as ot, $order_history_table as oht where ot.orders_id=oht.orders_id and oht.comments like '%$tid%'"; + $res = mysql_query($qry) or die("
".mysql_errno().";".mysql_error()."

\n"); + list ($customers_name, $customers_email_address, $orders_status, $date_purchased, $orders_id) = mysql_fetch_array($res, MYSQL_NUM); + + if (!mysql_num_rows($res)){ + echo'No order found for comments with tid: '.$tid; + exit; + } + if($customers_name && $orders_status < $status_2b_set){ # && $orders_status!=$status_2b_set + $qry = "update $order_table set orders_status = '$status_2b_set', last_modified = now() where orders_id = '$orders_id'"; + $res = mysql_query($qry) or die("
".mysql_errno().";".mysql_error()."

\n"); + $updated = mysql_affected_rows(); + + if($updated){ + $qry = "show tables like '$order_history_table'"; + $res = mysql_query($qry) or die("
".mysql_errno().";".mysql_error()."

\n"); + list ($table) = mysql_fetch_array($res, MYSQL_NUM); + + if($table){ + ### INSERT HISTORY RECORDS ### + $qry = "insert into $order_history_table (orders_id, orders_status_id, date_added, customer_notified, comments) values ('".$aryCaptureParams['reference']."', '$status_2b_set', now(), '1', '$comments')"; + $res = mysql_query($qry) or die("
".mysql_errno().";".mysql_error()."

\n"); + } + else{ + echo "table order_history_table n/a!"; + } + } + else{ + echo'Error: status update failed or already updated for status ($status_2b_set)for orders_id: '.$orders_id; + exit; + } + } + else{ + echo"Nothing to update because order status ($orders_status) less or equal to new status ($status_2b_set)"; + } + } + else{ + echo 'Error: order table n/a!'; + } + if ($test){ + echo'
Fertig!'; + } + } + else{ + print "important params (tid/vendor_id) missing!\r\n"; + ### ERRONEOUS CALL, SO SEND EMAIL TO TECHNIC + + if($from){ + header('Content-Type: text/html; charset=iso-8859-1'); + $headers = 'From: ' . $from . "\r\n"; + if($reply_to)$headers .= 'Reply-To: ' . $reply_to . "\r\n"; + else$headers .= 'Reply-To: ' . $from . "\r\n"; + + if($copy_to)$headers .= 'Cc: ' . $copy_to . "\r\n"; + + // calling the standard PHP Mail function + $mailOk = mail($email, $subject, $body, $headers); + } + } + + function isPublicIP($value) + { + if(!$value || count(explode('.',$value))!=4) return false; + return !preg_match('~^((0|10|172\.16|192\.168|169\.254|255|127\.0)\.)~', $value); + } + + function getRealIpAddr() + { + if(isPublicIP($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR']; + if($iplist=explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])) + { + if(isPublicIP($iplist[0])) return $iplist[0]; + } + if (isPublicIP($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP']; + if (isPublicIP($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; + if (isPublicIP($_SERVER['HTTP_FORWARDED_FOR']) ) return $_SERVER['HTTP_FORWARDED_FOR']; + + return $_SERVER['REMOTE_ADDR']; + } + + ########################################### + # Function to remove unwanted string + ########################################### + function remove_string($string) + { + #$aryUnwantedString = ('"','^','`'); + $string = str_replace("'", "", $string); + $string = str_replace('"', '', $string); + $string = str_replace('^', '', $string); + $string = str_replace('`', '', $string); + + return $string; + } + +/* +######### Note for Prepayment Invoice ############################################### +BEMERKUNG: Da bei Vorkasse/per Rechnung der eigentliche Zahlungseingang erst später erfolgt, muss man das Vendor Skript einsetzen (es auf Ihrem Webserver unterbringen und den Link im Novalnet-Admin-Tool eintragen via https://admin.novalnet.de -> Angebote -> Das entsprechend Angebot auswählen bzw. anklicken -> Händlerskript URL), an das bei jeder Transaktion eine Rückmeldung vom Novalnet-Server gesendet wird. Hier ein Beispiel, wenn ein Endkunde im Shop per Vorkasse/Rechnung bezahlt und später das Geld überwiesen hat, das +dann auf dem Novalnet-Konto eingegangen ist: + +test_mode=0&product_id=316&product=Testshop&marker=&payment_type=INVOICE_CREDIT&tid=12112700001500028¤cy=EUR&amount=2995&status=100&subs_billing=&tariff_id=582&status_message=erfolgreich&paid_until=&signup_tid=&signup_date=&signup_time=&login=&password=&firstname=xxx&lastname=xxx&street=xxx&house_no=10&zip=12345&city=xxx&email=xxx@xxx.com&birthday=&country=Deutschland&country_code=DE&tid_payment=12112700001429137&reference=&vendor_id=229 + +Der Parameter payment_type=INVOICE_CREDIT bedeutet, dass ein Geldeingang erfolgt ist. Der Parameter tid_payment stellt die Original-TID (als der Endkunde im Shop bestellt hat) dar, der Parameter tid die Folge-TID (als der Endkunde das Geld überwiesen/bezahlt hat). Anhand der tid_payment läßt sich dann die tid zuordnen. +######### /Note for Prepayment Invoice ############################################### + +######### Overview Payment Types ############################### + 'DIRECT_DEBIT_DE'; #german direct debit + 'DIRECT_DEBIT_AT'; #Austrian direct debit + 'CREDITCARD'; + 'PAYSAFECARD'; + 'INVOICE_START'; #Invoice/Prepayment transaction request + 'NOVALTEL_DE'; #telephone payment + 'ONLINE_TRANSFER'; # payment per online bank transfer + + ### TYPE OF CHARGEBACKS AVAILABLE ### + 'RETURN_DEBIT_DE'; #german return debit + 'RETURN_DEBIT_AT'; #Austrian return debit + 'CREDITCARD_CHARGEBACK'; + 'COLLECTION_REVERSAL_DE'; #return debit of a collection (Inkasso RLS) + 'NOVALTEL_DE_CHARGEBACK'; #chargeback of a telephone payment + + ### TYPE OF PAYMENT COLLECTIONS AVAILABLE ### + 'DEBT_COLLECTION_DE'; #durch Inkasso beigetreibene ELV-DE + 'DEBT_COLLECTION_AT'; #durch Inkasso beigetreibene ELV-AT + 'INVOICE_CREDIT'; # Gutschrift Eingang (Vorkasse/Rechnung) + 'CREDIT_ENTRY_DE'; # Gutschrift Eingang DE (Endkunden Üerweisung) + 'CREDIT_ENTRY_AT'; # Gutschrift Eingang AT (Endkunden Üerweisung) + 'NOVALTEL_DE_COLLECTION'; #durch Inkasso beigetreibene telephone payment + 'NOVALTEL_DE_CB_REVERSAL'; #reclamation of a credit card chargeback +######### /Overview Payment Types ############################### +*/ + +?> diff --git a/images/.directory b/images/.directory new file mode 100644 index 0000000..d2c3e07 --- /dev/null +++ b/images/.directory @@ -0,0 +1,3 @@ +[Dolphin] +ShowPreview=true +Timestamp=2010,9,8,13,4,18 diff --git a/images/ELV_Logo.png b/images/ELV_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..74d9052e4a082e3795ab76457ec5acf1fd18e74f GIT binary patch literal 1168 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 D$x&Su literal 0 HcmV?d00001 diff --git a/images/Thumbs.db b/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..5aac790c0ec81dea097a805534943a697f677349 GIT binary patch literal 20992 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 literal 0 HcmV?d00001 diff --git a/images/VI_Logo.png b/images/VI_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a494e1cffe48d921d188e556eeb9793b6f1481 GIT binary patch literal 1207 zcmV;o1W5adP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOW2 z3^f>4CE^P#af)ZeuE-umBM<*%AgLgn)Bw zN?5XGGnzPc_<>{v6dW66W_B=5jEk^c$h^QYJ{&C@V+oNiVw5{PSspsk!;*;Nd%XFs;s52tbJ7wh&*4FU0qFTkbE(Nzp;o|B{oU|HXIs z(2m20b_Dhx4kt73T-0b3G)-<)zsH%)?r3W2@9ezmho2;gJz4ReRK3K%>h2!?>OwC~ zQ;iKrj=g<(YU(eALfmC~k069Mx`*n|_Y4nP0Zz+nq*Zx0~?*n44oZsvmDD$vS?)vK+to{EJ&w zn`6snb@B16uN(S!XMTR7+wC#bngFQP@>@NnayjjCE#2%H*Seu3;qt^DG-Y(K3Fmty*ndze0*kMVF`fG$9gbtG7ugv zjfx5f;AR5ECt68xmh}Uutm^Q3+5EiinVE6-?#&L5SOM(GiW7?|oi0Km5dm;Gn7#YH z92l5*^c=$(Gs|+t$FnwXR`dF;IoYj`PqfO%b(-#4ZjZ@i^r`BX0hqf6SAx48fJ!Aj zXDp;B0>H$?>??&Au3sPGH&`rVy}hGat@5>_>1wqcfYnss+efklP&fK4#IY5#^0OqdW`2@<(O9ar~aYw6FrloEb3I%S) zD-Z|(Bql^IE_%-zZ}9C&6)puZZFf#iJq#G%YW@KzDoRa#VGFqC7M7$^QCiy8lJ~P?V>gvov}rVo zw~l4-aQyXxKhV2Yec*(?#UD^(SX3Grut7%|UeYC8a!HXnqdyh4}vW_c!H>#<0}tVCpZjWj=}`Y7C~}6px~azX7*^ VECikks;2+|002ovPDHLkV1hDvJtF`B literal 0 HcmV?d00001 diff --git a/images/acdc_info.png b/images/acdc_info.png new file mode 100644 index 0000000000000000000000000000000000000000..58e776c5128de867f3f34f62032ec6c1790811e2 GIT binary patch literal 54999 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�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 G6aN8MR_SE` literal 0 HcmV?d00001 diff --git a/images/creditcard_small.jpg b/images/creditcard_small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b98f4e01facc10ce9c6e4b1751b1fa5d698ef4f1 GIT binary patch literal 2228 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 literal 0 HcmV?d00001 diff --git a/images/novalnet_loading_img.gif b/images/novalnet_loading_img.gif new file mode 100644 index 0000000000000000000000000000000000000000..d88e4e5b129c3b90d8b942ca1b63862bcc86cc58 GIT binary patch literal 5955 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 literal 0 HcmV?d00001 diff --git a/images/novaltel_logo.png b/images/novaltel_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d1cb6723ef264fe856fbf3bf5296d362c0de66c7 GIT binary patch literal 5340 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
Payment - Novalnet AG  Credit Card StandardPayment - Novalnet AG Payment - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_BOOKING_INFO', '

The amount will be booked immediatley from your credit card
with $BOOKINFO note.'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_JS_NN_MISSING', '* Basic Paramater Missing!'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_ERROR', 'Credit card data Error:'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_ORDERNO', 'Order no. '); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_ORDERDATE', 'Order date '); + define('MODULE_PAYMENT_NOVALNET_CC_TEST_MODE', 'Test Mode'); + define('MODULE_PAYMENT_NOVALNET_CC_TEST_MODE_TITLE', 'Enable Test Mode'); + define('MODULE_PAYMENT_NOVALNET_CC_TEST_MODE_DESC', 'Do you want to activate test mode?'); + define('MODULE_PAYMENT_NOVALNET_CC_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_CC_PROXY_DESC', 'If you use a Proxy Server, enter the Proxy Server IP with port here (e.g. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_CC_TEST_ORDER_MESSAGE'," TESTORDER \n"); +?> diff --git a/includes/languages/english/modules/payment/novalnet_cc3d.php b/includes/languages/english/modules/payment/novalnet_cc3d.php new file mode 100644 index 0000000..17544d7 --- /dev/null +++ b/includes/languages/english/modules/payment/novalnet_cc3d.php @@ -0,0 +1,83 @@ +Payment - Novalnet AG Credit Card 3DSecure'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_DESCRIPTION', 'Pay safe and easy through Novalnet AG
Before activating please enter the required Novalnet IDs in Edit mode!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_LANG', 'EN'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_CC3D_STATUS_TITLE', 'Enable CC Module'); + define('MODULE_PAYMENT_NOVALNET_CC3D_STATUS_DESC', 'Do you want to activate the Credit card Method(CC) of Novalnet AG?'); + define('MODULE_PAYMENT_NOVALNET_CC3D_VENDOR_ID_TITLE', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_CC3D_VENDOR_ID_DESC', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_CC3D_AUTH_CODE_TITLE', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_CC3D_AUTH_CODE_DESC', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID_TITLE', 'Your Novalnet Product ID'); + define('MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID_DESC', 'Your Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID_TITLE', 'Your Novalnet Tariff ID'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID_DESC', 'the Tariff ID of the product'); + define('MODULE_PAYMENT_NOVALNET_CC3D_MANUAL_CHECK_LIMIT_TITLE', 'Manual checking amount in cents'); + define('MODULE_PAYMENT_NOVALNET_CC3D_MANUAL_CHECK_LIMIT_DESC', 'Please enter the amount in cents'); + define('MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID2_TITLE', 'Your second Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID2_TITLE', 'the Tariff ID of the second product'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_CC3D_BOOK_REF_TITLE', 'Your Booking Reference at Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC3D_BOOK_REF_DESC', 'Your Booking Reference at Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC3D_ORDER_STATUS_ID_TITLE', 'Set Order Status'); + define('MODULE_PAYMENT_NOVALNET_CC3D_ORDER_STATUS_ID_DESC', 'Set the status of orders made with this payment module to this value'); + define('MODULE_PAYMENT_NOVALNET_CC3D_SORT_ORDER_TITLE', 'Sort order of display.'); + define('MODULE_PAYMENT_NOVALNET_CC3D_SORT_ORDER_DESC', 'Sort order of display. Lowest is displayed first.'); + define('MODULE_PAYMENT_NOVALNET_CC3D_ZONE_TITLE', 'Payment Zone'); + define('MODULE_PAYMENT_NOVALNET_CC3D_ZONE_DESC', 'If a zone is selected, only enable this payment method for that zone.'); + define('MODULE_PAYMENT_NOVALNET_CC3D_ALLOWED_TITLE', 'Allowed zones'); + define('MODULE_PAYMENT_NOVALNET_CC3D_ALLOWED_DESC', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_PUBLIC_TITLE', '
Credit card 3DSecurePayment - Novalnet AG Payment - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CARD_OWNER', 'Credit card holder:'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CARD_OWNER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CC_NO', 'Credit card number:'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CC_NO_LENGTH', '12'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_EXP_MONTH', 'Month:'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_EXP_MONTH_LENGTH', '2'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_EXP_YEAR', ' Year:'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_EXP_YEAR_LENGTH', '2'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_SELECT', 'Please select'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CVC', 'CVC (Verification Code):
 
 
 
 
 
'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CVC_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CVC2', '
* On Visa-, Master- and Eurocard you will find the 3 digit CVC-Code
near the signature field at the rearside of the creditcard.'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_BOOKING_INFO', '

The amount will be booked immediatley from your credit card
with $BOOKINFO note.'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_NN_MISSING', '* Basic Paramater Missing!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_CARD_OWNER', '* Credit card holder should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_CC_NO', '* Credit card number should be atleast 12 digits long!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_EXP_MONTH', '* Credit card expiry month should be atleast 2 digits long!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_EXP_YEAR', '* Credit card expiry year should be atleast 2 digits long!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_CVC', '* CVC (Verification Code) should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_CVC2', '* Invalid CVC!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_ERROR', 'Credit card data Error:'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_ORDERNO', 'Order no. '); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_ORDERDATE', 'Order date '); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEST_MODE', 'Test Mode'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEST_MODE_TITLE', 'Enable Test Mode'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEST_MODE_DESC', 'Do you want to activate test mode?'); + define('MODULE_PAYMENT_NOVALNET_CC3D_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_CC4D_PROXY_DESC', 'If you use a Proxy Server, enter the Proxy Server IP with port here (e.g. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEST_ORDER_MESSAGE',"TESTORDER
"); +?> diff --git a/includes/languages/english/modules/payment/novalnet_cc_pci.php b/includes/languages/english/modules/payment/novalnet_cc_pci.php new file mode 100644 index 0000000..deac922 --- /dev/null +++ b/includes/languages/english/modules/payment/novalnet_cc_pci.php @@ -0,0 +1,68 @@ +Payment - Novalnet AG Credit Card PCI Standard'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_DESCRIPTION', 'Pay safe and easy through Novalnet AG
Before activating please enter the required Novalnet IDs in Edit mode!'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_LANG', 'EN'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_STATUS_TITLE', 'Enable CC Module'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_STATUS_DESC', 'Do you want to activate the Credit Card Method(CC) of Novalnet AG?'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_VENDOR_ID_TITLE', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_VENDOR_ID_DESC', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_AUTH_CODE_TITLE', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_AUTH_CODE_DESC', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID_TITLE', 'Your Novalnet Product ID'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID_DESC', 'Your Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID_TITLE', 'Your Novalnet Tariff ID'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID_DESC', 'the Tariff ID of the product'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_MANUAL_CHECK_LIMIT_TITLE', 'Manual checking amount in cents'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_MANUAL_CHECK_LIMIT_DESC', 'Please enter the amount in cents'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID2_TITLE', 'Your second Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID2_TITLE', 'the Tariff ID of the second product'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_BOOK_REF_TITLE', 'Your Booking Reference at Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_BOOK_REF_DESC', 'Your Booking Reference at Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_ORDER_STATUS_ID_TITLE', 'Set Order Status'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_ORDER_STATUS_ID_DESC', 'Set the status of orders made with this payment module to this value'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_SORT_ORDER_TITLE', 'Sort order of display.'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_SORT_ORDER_DESC', 'Sort order of display. Lowest is displayed first.'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_ZONE_TITLE', 'Payment Zone'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_ZONE_DESC', 'If a zone is selected, only enable this payment method for that zone.'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_ALLOWED_TITLE', 'Allowed zones'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_ALLOWED_DESC', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_PUBLIC_TITLE', '
Payment - Novalnet AG  Credit Card PCI StandardPayment - Novalnet AG Payment - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_BOOKING_INFO', '

The amount will be booked immediatley from your credit card
with $BOOKINFO note.'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_JS_NN_MISSING', '* Basic Paramater Missing!'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_ERROR', 'Credit card data Error:'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_ORDERNO', 'Order no. '); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_ORDERDATE', 'Order date '); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_MODE', 'Test Mode'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_MODE_TITLE', 'Enable Test Mode'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_MODE_DESC', 'Do you want to activate test mode?'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PROXY_DESC', 'If you use a Proxy Server, enter the Proxy Server IP with port here (e.g. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_HASH_ERROR', 'checkHash failed'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PASSWORD_TITLE', 'Enter Password'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PASSWORD_DESC', 'Enter Passwort'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_ORDER_MESSAGE',"TESTORDER \n"); +?> diff --git a/includes/languages/english/modules/payment/novalnet_elv_at.php b/includes/languages/english/modules/payment/novalnet_elv_at.php new file mode 100644 index 0000000..7ec5a3e --- /dev/null +++ b/includes/languages/english/modules/payment/novalnet_elv_at.php @@ -0,0 +1,73 @@ +Payment - Novalnet AG Austrian Direct Debit'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_DESCRIPTION', 'Pay safe and easy through Novalnet AG
Before activating please enter the required Novalnet IDs in Edit mode'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_LANG', 'EN'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_STATUS_TITLE', 'Enable ELV-AT Module'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_STATUS_DESC', 'Do you want to activate the Austrian Direct Debit Method(ELV-AT) of Novalnet AG?'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_VENDOR_ID_TITLE', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_VENDOR_ID_DESC', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_AUTH_CODE_TITLE', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_AUTH_CODE_DESC', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID_TITLE', 'Your Novalnet Product ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID_DESC', 'Your Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID_TITLE', 'Your Novalnet Tariff ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID_DESC', 'the Tariff ID of the product'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_MANUAL_CHECK_LIMIT_TITLE', 'Manual checking amount in cents'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_MANUAL_CHECK_LIMIT_DESC', 'Please enter the amount in cents'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID2_TITLE', 'Your second Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID2_TITLE', 'the Tariff ID of the second product'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_INFO_TITLE', 'Information to the Customer'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_INFO_DESC', 'will be shown on the payment formula'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_ORDER_STATUS_ID_TITLE', 'Set Order Status'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_ORDER_STATUS_ID_DESC', 'Set the status of orders made with this payment module to this value'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_SORT_ORDER_TITLE', 'Sort order of display.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_SORT_ORDER_DESC', 'Sort order of display. Lowest is displayed first.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_ZONE_TITLE', 'Payment Zone'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_ZONE_DESC', 'If a zone is selected, only enable this payment method for that zone.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_ALLOWED_TITLE', 'Allowed zones'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_ALLOWED_DESC', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_PUBLIC_TITLE', '
Austrian Direct DebitPayment - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_ACCOUNT_OWNER', 'Account holder:'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_ACCOUNT_OWNER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_ACCOUNT_NUMBER', 'Account number:'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_ACCOUNT_NUMBER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_CODE', 'Bankcode:'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_CODE_LENGTH', '5'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_JS_NN_MISSING', '* Basic Paramater Missing!'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_JS_BANK_ACCOUNT_OWNER', '* Austrian Direct Debit Account holder should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_JS_BANK_ACCOUNT_NUMBER', '* Austrian Direct Debit Account number should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_JS_BANK_CODE', '* Austrian Direct Debit Bankcode should be atleast 8 digits long!'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_ERROR', 'Account data Error:'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_CUST_INFORM', ''); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_ORDERNO', 'Order no. '); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_ORDERDATE', 'Order date '); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_MODE', 'Test Mode'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_MODE_TITLE', 'Enable Test Mode'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_MODE_DESC', 'Do you want to activate test mode?'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PROXY_DESC', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_ORDER_MESSAGE',"TESTORDER
"); + +?> diff --git a/includes/languages/english/modules/payment/novalnet_elv_at_pci.php b/includes/languages/english/modules/payment/novalnet_elv_at_pci.php new file mode 100644 index 0000000..0f3d7ed --- /dev/null +++ b/includes/languages/english/modules/payment/novalnet_elv_at_pci.php @@ -0,0 +1,78 @@ +Payment - Novalnet AG Austrian Direct Debit PCI Standard'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_DESCRIPTION', 'Pay safe and easy through Novalnet AG
Before activating please enter the required Novalnet IDs in Edit mode'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_LANG', 'EN'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_STATUS_TITLE', 'Enable ELV-AT Module'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_STATUS_DESC', 'Do you want to activate the Austrian Direct Debit Method(ELV-AT) of Novalnet AG?'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_VENDOR_ID_TITLE', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_VENDOR_ID_DESC', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_AUTH_CODE_TITLE', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_AUTH_CODE_DESC', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID_TITLE', 'Your Novalnet Product ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID_DESC', 'Your Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID_TITLE', 'Your Novalnet Tariff ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID_DESC', 'the Tariff ID of the product'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_MANUAL_CHECK_LIMIT_TITLE', 'Manual checking amount in cents'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_MANUAL_CHECK_LIMIT_DESC', 'Please enter the amount in cents'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID2_TITLE', 'Your second Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID2_TITLE', 'the Tariff ID of the second product'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_INFO_TITLE', 'Information to the Customer'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_INFO_DESC', 'will be shown on the payment formula'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ORDER_STATUS_ID_TITLE', 'Set Order Status'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ORDER_STATUS_ID_DESC', 'Set the status of orders made with this payment module to this value'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_SORT_ORDER_TITLE', 'Sort order of display.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_SORT_ORDER_DESC', 'Sort order of display. Lowest is displayed first.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ZONE_TITLE', 'Payment Zone'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ZONE_DESC', 'If a zone is selected, only enable this payment method for that zone.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ALLOWED_TITLE', 'Allowed zones'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ALLOWED_DESC', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_PUBLIC_TITLE', '
Payment - Novalnet AG  Austrian Direct Debit PCI Standard Payment - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_BANK_ACCOUNT_OWNER', 'Account holder:'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_BANK_ACCOUNT_OWNER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_BANK_ACCOUNT_NUMBER', 'Account number:'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_BANK_ACCOUNT_NUMBER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_BANK_CODE', 'Bankcode:'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_BANK_CODE_LENGTH', '5'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_JS_NN_MISSING', '* Basic Paramater Missing!'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_JS_BANK_ACCOUNT_OWNER', '* Austrian Direct Debit Account holder should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_JS_BANK_ACCOUNT_NUMBER', '* Austrian Direct Debit Account number should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_JS_BANK_CODE', '* Austrian Direct Debit Bankcode should be atleast 8 digits long!'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_ERROR', 'Account data Error:'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_CUST_INFORM', ''); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_ORDERNO', 'Order no. '); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_ORDERDATE', 'Order date '); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_MODE', 'Test Mode'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_MODE_TITLE', 'Enable Test Mode'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_MODE_DESC', 'Do you want to activate test mode?'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PROXY_DESC', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_BOOK_REF_TITLE', 'Your Booking Reference at Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_BOOK_REF_DESC', 'Your Booking Reference at Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_HASH_ERROR', 'checkHash failed'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PASSWORD_TITLE', 'Enter Password'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PASSWORD_DESC', 'Enter Password'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_ORDER_MESSAGE'," TESTORDER \n"); + +?> diff --git a/includes/languages/english/modules/payment/novalnet_elv_de.php b/includes/languages/english/modules/payment/novalnet_elv_de.php new file mode 100644 index 0000000..0c77b1d --- /dev/null +++ b/includes/languages/english/modules/payment/novalnet_elv_de.php @@ -0,0 +1,94 @@ +Payment - Novalnet AG German Direct Debit'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_DESCRIPTION', 'Pay safe and easy through Novalnet AG
Before activating please enter the required Novalnet IDs in Edit mode!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_LANG', 'DE'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_STATUS_TITLE', 'Enable ELV-DE Module'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_STATUS_DESC', 'Do you want to activate the German Direct Debit Method(ELV-DE) of Novalnet AG?'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_VENDOR_ID_TITLE', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_VENDOR_ID_DESC', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_AUTH_CODE_TITLE', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_AUTH_CODE_DESC', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID_TITLE', 'Your Novalnet Product ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID_DESC', 'Your Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID_TITLE', 'Your Novalnet Tariff ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID_DESC', 'the Tariff ID of the product'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_MANUAL_CHECK_LIMIT_TITLE', 'Manual checking amount in cents'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_MANUAL_CHECK_LIMIT_DESC', 'Please enter the amount in cents'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID2_TITLE', 'Your second Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID2_TITLE', 'the Tariff ID of the second product'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_INFO_TITLE', 'Information to the Customer'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_INFO_DESC', 'will be shown on the payment formula'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ACDC_TITLE', 'Enable ACDC Control'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ACDC_DESC', 'Do you want to activate the ACDC Control?'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ORDER_STATUS_ID_TITLE', 'Set Order Status'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ORDER_STATUS_ID_DESC', 'Set the status of orders made with this payment module to this value'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_SORT_ORDER_TITLE', 'Sort order of display.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_SORT_ORDER_DESC', 'Sort order of display. Lowest is displayed first.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ZONE_TITLE', 'Payment Zone'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ZONE_DESC', 'If a zone is selected, only enable this payment method for that zone.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ALLOWED_TITLE', 'Allowed zones'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ALLOWED_DESC', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_PUBLIC_TITLE', '
Payment - Novalnet AG German Direct DebitPayment - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_ACCOUNT_OWNER', 'Account holder:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_ACCOUNT_OWNER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_ACCOUNT_NUMBER', 'Account number:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_ACCOUNT_NUMBER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_CODE', 'Bankleitzahl:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_CODE_LENGTH', '8'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ACDC_INFO', "Der acdc-Check Accepted"); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ACDC_DIV', ""); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_JS_NN_MISSING', '* Basic Paramater Missing!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_JS_BANK_ACCOUNT_OWNER', '* German Direct Debit Account holder should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_JS_BANK_ACCOUNT_NUMBER', '* German Direct Debit Account number should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_JS_BANK_CODE', '* German Direct Debit Bankcode should be atleast 8 digits long!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_JS_ACDC', '* Please accept the acdc-Check or select other payment method!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_JS_ACDC', '* Please accept the acdc-Check or select other payment method!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_ERROR', 'Account data Error:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_CUST_INFORM', 'We will obtain an evaluation of your credit rating before processing your order, as we can only process your order when your credit rating in positive. You will be debited when the goods are shipped. In case of a return debit note/revocation we will charge an amount of 10 Euro for our time and effort and the whole process will be handed over to debt collection immediately.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_ORDERNO', 'Order no. '); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_ORDERDATE', 'Order date '); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_MODE', 'Test Mode'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_MODE_TITLE', 'Enable Test Mode'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_MODE_DESC', 'Do you want to activate test mode?'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PROXY_DESC', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)'); + + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_TITLE', 'PIN by Callback/SMS'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_DESC', 'When activated by PIN Callback / SMS the customer to enter their phone / mobile number requested. By phone or SMS, the customer receives from the AG Novalnet a PIN, which he must enter before ordering. If the PIN is valid, the payment process has been completed successfully, otherwise the customer will be prompted again to enter the PIN. This service is only available for customers from Germany. This service is only available for German customers. '); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_TEL', 'Phone Number:*'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_PIN', 'PIN:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_NEW_PIN', 'Forgot PIN? [New PIN Request]'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_TEL_NOTVALID', 'The telephone number entered is not valid!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_PIN_NOTVALID', 'The entered PIN is incorrect or blank!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_CALL_MESSAGE', 'You will shortly receive a PIN via phone / SMS. Please enter the PIN in the appropriate text box.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_MIN_LIMIT_TITLE', 'Minimum Amount Limit for PIN by Callback'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_MIN_LIMIT_DESC', 'Please enter minimum amount limit to enable "Pin by CallBack" modul (In Cents, e.g. 100,200)'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_INPUT_REQUEST_DESC',"Please Enter PIN number"); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SESSION_ERROR',"Your PIN session has expired, Please try again"); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TID_MESSAGE',". Novalnet Transaction ID : "); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_AMOUNT_VARIATION_MESSAGE',"You have changed the cart amount after getting PIN number, please try again with new call"); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_ORDER_MESSAGE',"TESTORDER
"); +?> diff --git a/includes/languages/english/modules/payment/novalnet_elv_de_pci.php b/includes/languages/english/modules/payment/novalnet_elv_de_pci.php new file mode 100644 index 0000000..26bc763 --- /dev/null +++ b/includes/languages/english/modules/payment/novalnet_elv_de_pci.php @@ -0,0 +1,84 @@ +Payment - Novalnet AG German Direct Debit PCI Standard'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_DESCRIPTION', 'Pay safe and easy through Novalnet AG
Before activating please enter the required Novalnet IDs in Edit mode!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_LANG', 'EN'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_STATUS_TITLE', 'Enable ELV-DE Module'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_STATUS_DESC', 'Do you want to activate the German Direct Debit Method(ELV-DE) of Novalnet AG?'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_VENDOR_ID_TITLE', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_VENDOR_ID_DESC', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_AUTH_CODE_TITLE', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_AUTH_CODE_DESC', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID_TITLE', 'Your Novalnet Product ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID_DESC', 'Your Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID_TITLE', 'Your Novalnet Tariff ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID_DESC', 'the Tariff ID of the product'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_MANUAL_CHECK_LIMIT_TITLE', 'Manual checking amount in cents'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_MANUAL_CHECK_LIMIT_DESC', 'Please enter the amount in cents'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID2_TITLE', 'Your second Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID2_TITLE', 'the Tariff ID of the second product'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_INFO_TITLE', 'Information to the Customer'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_INFO_DESC', 'will be shown on the payment formula'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ACDC_TITLE', 'Enable ACDC Control'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ACDC_DESC', 'Do you want to activate the ACDC Control?'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ORDER_STATUS_ID_TITLE', 'Set Order Status'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ORDER_STATUS_ID_DESC', 'Set the status of orders made with this payment module to this value'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_SORT_ORDER_TITLE', 'Sort order of display.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_SORT_ORDER_DESC', 'Sort order of display. Lowest is displayed first.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ZONE_TITLE', 'Payment Zone'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ZONE_DESC', 'If a zone is selected, only enable this payment method for that zone.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ALLOWED_TITLE', 'Allowed zones'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ALLOWED_DESC', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_PUBLIC_TITLE', '
Payment - Novalnet AG German Direct Debit PCI StandardPayment - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_BANK_ACCOUNT_OWNER', 'Account holder:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_BANK_ACCOUNT_OWNER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_BANK_ACCOUNT_NUMBER', 'Account number:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_BANK_ACCOUNT_NUMBER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_BANK_CODE', 'Bankcode:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_BANK_CODE_LENGTH', '8'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ACDC_INFO', "acdc-Check Accepted"); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ACDC_DIV', ""); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_JS_NN_MISSING', '* Basic Paramater Missing!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_JS_BANK_ACCOUNT_OWNER', '* German Direct Debit Account holder should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_JS_BANK_ACCOUNT_NUMBER', '* German Direct Debit Account number should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_JS_BANK_CODE', '* German Direct Debit Bankcode should be atleast 8 digits long!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_JS_ACDC', '* Please accept the acdc-Check or select other payment method!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_ERROR', 'Account data Error:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_CUST_INFORM', ''); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_ORDERNO', 'Order no. '); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_ORDERDATE', 'Order date '); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_MODE', 'Test Mode'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_MODE_TITLE', 'Enable Test Mode'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_MODE_DESC', 'Do you want to activate test mode?'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PROXY_DESC', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_BOOK_REF_TITLE', 'Your Booking Reference at Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_BOOK_REF_DESC', 'Your Booking Reference at Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_HASH_ERROR', 'checkHash failed'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PASSWORD_TITLE', 'Enter Password'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PASSWORD_DESC', 'Enter Password'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_ORDER_MESSAGE',"TESTORDER \n"); + +?> diff --git a/includes/languages/english/modules/payment/novalnet_instantbanktransfer.php b/includes/languages/english/modules/payment/novalnet_instantbanktransfer.php new file mode 100644 index 0000000..c457a01 --- /dev/null +++ b/includes/languages/english/modules/payment/novalnet_instantbanktransfer.php @@ -0,0 +1,84 @@ +Payment - Novalnet AG  Instant Bank TransferPayment - Novalnet AG '); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_DESCRIPTION', 'Pay safe and easy through Novalnet AG
Before activating please enter the required Novalnet IDs in Edit mode!'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_LANG', 'EN'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_STATUS_TITLE', 'Enable Instant Bank Transfer Module'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_STATUS_DESC', 'Do you want to activate the instant bank transfer module of Novalnet AG?'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_VENDOR_ID_TITLE', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_VENDOR_ID_DESC', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_AUTH_CODE_TITLE', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_AUTH_CODE_DESC', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PRODUCT_ID_TITLE', 'Your Novalnet Product ID'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PRODUCT_ID_DESC', 'Your Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TARIFF_ID_TITLE', 'Your Novalnet Tariff ID'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TARIFF_ID_DESC', 'the Tariff ID of the product'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_MANUAL_CHECK_LIMIT_TITLE', 'Manual checking amount in cents'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_MANUAL_CHECK_LIMIT_DESC', 'Please enter the amount in cents'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PRODUCT_ID2_TITLE', 'Your second Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PRODUCT_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TARIFF_ID2_TITLE', 'the Tariff ID of the second product'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TARIFF_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_INFO_TITLE', 'Information to the Customer'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_INFO_DESC', 'will be shown on the payment formula'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ACDC_TITLE', 'Enable ACDC Control'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ACDC_DESC', 'Do you want to activate the ACDC Control?'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ORDER_STATUS_ID_TITLE', 'Set Order Status'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ORDER_STATUS_ID_DESC', 'Set the status of orders made with this payment module to this value'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_SORT_ORDER_TITLE', 'Sort order of display.'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_SORT_ORDER_DESC', 'Sort order of display. Lowest is displayed first.'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ZONE_TITLE', 'Payment Zone'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ZONE_DESC', 'If a zone is selected, only enable this payment method for that zone.'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ALLOWED_TITLE', 'Allowed zones'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ALLOWED_DESC', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_PUBLIC_TITLE', '
Payment - Novalnet AG Instant Bank TransferPayment - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_BANK_ACCOUNT_OWNER', 'Account holder:'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_BANK_ACCOUNT_OWNER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_BANK_ACCOUNT_NUMBER', 'Account number:'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_BANK_ACCOUNT_NUMBER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_BANK_CODE', 'Bankcode:'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_BANK_CODE_LENGTH', '8'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ACDC_INFO', "acdc-Check Accepted"); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ACDC_DIV', ""); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_JS_NN_MISSING', '* Basic Parameter Missing!'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_JS_BANK_ACCOUNT_OWNER', '* German Account holder should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_JS_BANK_ACCOUNT_NUMBER', '* German Account number should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_JS_BANK_CODE', '* German Bankcode should be atleast 8 digits long!'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_JS_ACDC', '* Please accept the acdc-Check or select other payment method!'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_ERROR', 'Account data Error:'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_CUST_INFORM', ''); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_ORDERNO', 'Order no. '); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_ORDERDATE', 'Order date '); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE', 'Test Mode'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE_TITLE', 'Enable Test Mode'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE_DESC', 'Do you want to activate test mode?'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_HASH_ERROR', 'checkHash failed'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PASSWORD_TITLE', 'Enter Password'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PASSWORD_DESC', 'Enter Passwort'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PROXY_DESC', 'If you use a Proxy Server, enter the Proxy Server IP with port here (e.g. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_ORDER_MESSAGE',"TESTORDER
"); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TID_MESSAGE',". Novalnet Transaction ID : "); +?> diff --git a/includes/languages/english/modules/payment/novalnet_invoice.php b/includes/languages/english/modules/payment/novalnet_invoice.php new file mode 100644 index 0000000..a499b57 --- /dev/null +++ b/includes/languages/english/modules/payment/novalnet_invoice.php @@ -0,0 +1,89 @@ +Payment - Novalnet AG Invoice'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DESCRIPTION', 'Pay safe and easy through Novalnet AG
Before activating please enter the required Novalnet IDs in Edit mode!'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_LANG', 'EN'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_INVOICE_STATUS_TITLE', 'Enable INVOICE Module'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_STATUS_DESC', 'Do you want to activate the Invoice Method of Novalnet AG?'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_VENDOR_ID_TITLE', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_VENDOR_ID_DESC', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_AUTH_CODE_TITLE', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_AUTH_CODE_DESC', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PRODUCT_ID_TITLE', 'Your Novalnet Product ID'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PRODUCT_ID_DESC', 'Your Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TARIFF_ID_TITLE', 'Your Novalnet Tariff ID'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TARIFF_ID_DESC', 'the Tariff ID of the product'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_DURATION_TITLE', 'Payment duration'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_DURATION_DESC', 'will be shown on the payment formula'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_INFO_TITLE', 'Information to the Customer'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_INFO_DESC', 'will be shown on the payment formula'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_ORDER_STATUS_ID_TITLE', 'Set Order Status'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_ORDER_STATUS_ID_DESC', 'Set the status of orders made with this payment module to this value'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_SORT_ORDER_TITLE', 'Sort order of display.'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_SORT_ORDER_DESC', 'Sort order of display. Lowest is displayed first.'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_ZONE_TITLE', 'Payment Zone'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_ZONE_DESC', 'If a zone is selected, only enable this payment method for that zone.'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_ALLOWED_TITLE', 'Allowed zones'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_ALLOWED_DESC', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_PUBLIC_TITLE', '
Payment - Novalnet AG Invoice
'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_ACCOUNT_OWNER', 'Account holder:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_ACCOUNT_NUMBER', 'Account number:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_CODE', 'Bankcode:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_IBAN', 'IBAN:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_BIC', 'SWIFT / BIC:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_BANK', 'Bank:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_CITY', 'City:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_AMOUNT', 'Amount:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_REFERENCE', 'Reference:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_REFERENCE_INFO', 'Please note that the Transfer can only be identified with the above mentioned Reference.'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_TRANSFER_INFO', 'Please transfer the amount to following account:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_INFO', 'The Bank details will be emailed to you soon after the completion of checkout process'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DURATION_INFO', 'Payment duration:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DURATION_INFO_DAYS', 'days'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DURATION_LIMIT_INFO', 'Please transfer the amount at the latest, untill'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DURATION_LIMIT_END_INFO', 'to following account:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_JS_NN_MISSING', '* Basic Paramater Missing!'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_ORDERNO', 'Order no. '); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_ORDERDATE', 'Order date '); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEST_MODE', 'Test Mode'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEST_MODE_TITLE', 'Enable Test Mode'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEST_MODE_DESC', 'Do you want to activate test mode?'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PROXY_DESC', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)'); + + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_TITLE', 'PIN by Callback/SMS'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_DESC', 'When activated by PIN Callback / SMS the customer to enter their phone / mobile number requested. By phone or SMS, the customer receives from the AG Novalnet a PIN, which he must enter before ordering. If the PIN is valid, the payment process has been completed successfully, otherwise the customer will be prompted again to enter the PIN. This service is only available for customers from Germany. '); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_TEL', 'Phone Number:*'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_PIN', 'PIN:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_NEW_PIN', 'Forgot PIN? [New PIN Request]'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_TEL_NOTVALID', 'The telephone number entered is not valid!'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_PIN_NOTVALID', 'The entered PIN is incorrect or blank!'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_CALL_MESSAGE', 'You will shortly receive a PIN via phone / SMS. Please enter the PIN in the appropriate text box.'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_MIN_LIMIT_TITLE', 'Minimum Amount Limit for PIN by Callback'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_MIN_LIMIT_DESC', 'Please enter minimum amount limit to enable "Pin by CallBack" modul (In Cents, e.g. 100,200)'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_INPUT_REQUEST_DESC',"Please Enter PIN number"); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SESSION_ERROR',"Your PIN session has expired, Please try again"); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEST_ORDER_MESSAGE',"TESTORDER
"); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TID_MESSAGE',". Novalnet Transaction ID : "); + define('MODULE_PAYMENT_NOVALNET_INVOICE_AMOUNT_VARIATION_MESSAGE',"You have changed the cart amount after getting PIN number, please try again with new call"); +?> diff --git a/includes/languages/english/modules/payment/novalnet_paypal.php b/includes/languages/english/modules/payment/novalnet_paypal.php new file mode 100644 index 0000000..9918a45 --- /dev/null +++ b/includes/languages/english/modules/payment/novalnet_paypal.php @@ -0,0 +1,101 @@ +Payment - Novalnet AG Novalnet-Paypal'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_DESCRIPTION', 'Pay safe and easy through Novalnet AG
Before activating please enter the required Novalnet IDs in Edit mode!
You must have an Paypal Trader Account in order to use this module.'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_LANG', 'EN'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_STATUS_TITLE', 'Enable Novalnet Paypal Module'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_STATUS_DESC', 'Do you want to activate the Paypal Module of Novalnet AG?'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_VENDOR_ID_TITLE', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_VENDOR_ID_DESC', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_AUTH_CODE_TITLE', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_AUTH_CODE_DESC', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PRODUCT_ID_TITLE', 'Your Novalnet Product ID'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PRODUCT_ID_DESC', 'Your Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TARIFF_ID_TITLE', 'Your Novalnet Tariff ID'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TARIFF_ID_DESC', 'the Tariff ID of the product'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_MANUAL_CHECK_LIMIT_TITLE', 'Manual checking amount in cents'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_MANUAL_CHECK_LIMIT_DESC', 'Please enter the amount in cents'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PRODUCT_ID2_TITLE', 'Your second Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PRODUCT_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TARIFF_ID2_TITLE', 'the Tariff ID of the second product'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TARIFF_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_INFO_TITLE', 'Information to the Customer'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_INFO_DESC', 'will be shown on the payment formula'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ACDC_TITLE', 'Enable ACDC Control'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ACDC_DESC', 'Do you want to activate the ACDC Control?'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ID_TITLE', 'Set Order Status'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ID_DESC', 'Set the status of orders made with this payment module to this value'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_SORT_ORDER_TITLE', 'Sort order of display.'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_SORT_ORDER_DESC', 'Sort order of display. Lowest is displayed first.'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ZONE_TITLE', 'Payment Zone'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ZONE_DESC', 'If a zone is selected, only enable this payment method for that zone.'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ALLOWED_TITLE', 'Allowed zones'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ALLOWED_DESC', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_PUBLIC_TITLE', '
Payment - Novalnet AG Novalnet-PaypalPayment - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_BANK_ACCOUNT_OWNER', 'Account holder:'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_BANK_ACCOUNT_OWNER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_BANK_ACCOUNT_NUMBER', 'Account number:'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_BANK_ACCOUNT_NUMBER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_BANK_CODE', 'Bankcode:'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_BANK_CODE_LENGTH', '8'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_JS_NN_MISSING', '* Basic Parameter Missing!'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_JS_BANK_ACCOUNT_OWNER', '* German Account holder should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_JS_BANK_ACCOUNT_NUMBER', '* German Account number should be atleast 3 digits long!'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_JS_BANK_CODE', '* German Bankcode should be atleast 8 digits long!'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_JS_ACDC', '* Please accept the acdc-Check or select other payment method!'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_ERROR', 'Account data Error:'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_CUST_INFORM', ''); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_ORDERNO', 'Order no. '); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_ORDERDATE', 'Order date '); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_MODE', 'Test Mode'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_MODE_TITLE', 'Enable Test Mode'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_MODE_DESC', 'Do you want to activate test mode?'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_HASH_ERROR', 'checkHash failed'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PASSWORD_TITLE', 'Enter Password'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PASSWORD_DESC', 'Enter Passwort'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PROXY_DESC', 'If you use a Proxy Server, enter the Proxy Server IP with port here (e.g. www.proxy.de:80)'); + + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_USER_TITLE', 'PAYPAL API User Name'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_USER_DESC', 'Enter Your PAYPAL API User Name'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_USER', 'PAYPAL API User'); + + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_PASSWORD_TITLE', 'PAYPAL API Password'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_PASSWORD_DESC', 'Enter Your PAYPAL API Password'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_PASSWORD', 'PAYPAL API Password'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_ORDER_MESSAGE',"Test Order
"); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_SIGNATURE_TITLE', 'PAYPAL API Signature'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_SIGNATURE_DESC', 'Enter Your PAYPAL API Signature'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_SIGNATURE', 'PAYPAL API Signature'); + define('MODULE_PAYMENT_PAYPAL_TEXT_INFO',''); + + #define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ABORT_ID_TITLE', 'Order Status "Paypal Cancelled"'); + #define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ABORT_ID_DESC', 'Set Order Status for Cancelation (e.g. PayPal cancelled)'); + #define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_PENDING_ID_TITLE', 'Order Status "Open PP pending"'); + #define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_PENDING_ID_DESC', 'Set Order Status for pending Transaction (e.g. Open PP pending)'); + #define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_REJECTED_ID_TITLE', 'Order Status "Paypal rejected"'); + #define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_REJECTED_ID_DESC', 'Set Order Status for rejected Transaction (e.g. PayPal rejected)'); + +?> diff --git a/includes/languages/english/modules/payment/novalnet_prepayment.php b/includes/languages/english/modules/payment/novalnet_prepayment.php new file mode 100644 index 0000000..f72a72c --- /dev/null +++ b/includes/languages/english/modules/payment/novalnet_prepayment.php @@ -0,0 +1,69 @@ +Payment - Novalnet AG Prepayment'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_DESCRIPTION', 'Pay safe and easy through Novalnet AG
Before activating please enter the required Novalnet IDs in Edit mode!'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_LANG', 'EN'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_STATUS_TITLE', 'Enable PREPAYMENT Module'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_STATUS_DESC', 'Do you want to activate the Prepayment Method of Novalnet AG?'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_VENDOR_ID_TITLE', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_VENDOR_ID_DESC', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_AUTH_CODE_TITLE', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_AUTH_CODE_DESC', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_PRODUCT_ID_TITLE', 'Your Novalnet Product ID'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_PRODUCT_ID_DESC', 'Your Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TARIFF_ID_TITLE', 'Your Novalnet Tariff ID'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TARIFF_ID_DESC', 'the Tariff ID of the product'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_INFO_TITLE', 'Information to the Customer'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_INFO_DESC', 'will be shown on the payment formula'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_ORDER_STATUS_ID_TITLE', 'Set Order Status'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_ORDER_STATUS_ID_DESC', 'Set the status of orders made with this payment module to this value'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_SORT_ORDER_TITLE', 'Sort order of display.'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_SORT_ORDER_DESC', 'Sort order of display. Lowest is displayed first.'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_ZONE_TITLE', 'Payment Zone'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_ZONE_DESC', 'If a zone is selected, only enable this payment method for that zone.'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_ALLOWED_TITLE', 'Allowed zones'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_ALLOWED_DESC', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_PUBLIC_TITLE', '
Prepayment
'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_ACCOUNT_OWNER', 'Account holder:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_ACCOUNT_NUMBER', 'Account number:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_CODE', 'Bankcode:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_IBAN', 'IBAN:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_BIC', 'SWIFT / BIC:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_BANK', 'Bank:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_CITY', 'City:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_REFERENCE', 'Reference:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_REFERENCE_INFO', 'Please note that the Transfer can only be identified with the above mentioned Reference.'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_AMOUNT', 'Amount:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_TRANSFER_INFO', 'Please transfer the amount to following account:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_INFO', 'The Bank details will be emailed to you soon after the completion of checkout process'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_JS_NN_MISSING', '* Basic Paramater Missing!'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_ORDERNO', 'Order no. '); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_ORDERDATE', 'Order date '); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_MODE', 'Test Mode'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_MODE_TITLE', 'Enable Test Mode'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_MODE_DESC', 'Do you want to activate test mode?'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_PROXY_DESC', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_ORDER_MESSAGE',"TESTORDER
"); + +?> diff --git a/includes/languages/english/modules/payment/novalnet_tel.php b/includes/languages/english/modules/payment/novalnet_tel.php new file mode 100644 index 0000000..8a42def --- /dev/null +++ b/includes/languages/english/modules/payment/novalnet_tel.php @@ -0,0 +1,67 @@ +Payment - Novalnet AG Telephone Payment - Pay by callPayment - Novalnet AG'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_DESCRIPTION', 'Pay safe and easy through Novalnet AG
Before activating please enter the required Novalnet IDs in Edit mode'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_LANG', 'EN'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_TEL_STATUS_TITLE', 'Enable TEL Module'); + define('MODULE_PAYMENT_NOVALNET_TEL_STATUS_DESC', 'Do you want to activate the Telephone Payment(TEL) of Novalnet AG?'); + define('MODULE_PAYMENT_NOVALNET_TEL_VENDOR_ID_TITLE', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_TEL_VENDOR_ID_DESC', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_TEL_AUTH_CODE_TITLE', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_TEL_AUTH_CODE_DESC', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_TEL_PRODUCT_ID_TITLE', 'Your Novalnet Product ID'); + define('MODULE_PAYMENT_NOVALNET_TEL_PRODUCT_ID_DESC', 'Your Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_TEL_TARIFF_ID_TITLE', 'Your Novalnet Tariff ID'); + define('MODULE_PAYMENT_NOVALNET_TEL_TARIFF_ID_DESC', 'the Tariff ID of the product'); + define('MODULE_PAYMENT_NOVALNET_TEL_INFO_TITLE', 'Information to the Customer'); + define('MODULE_PAYMENT_NOVALNET_TEL_INFO_DESC', 'will be shown on the payment formula'); + define('MODULE_PAYMENT_NOVALNET_TEL_ORDER_STATUS_ID_TITLE', 'Set Order Status'); + define('MODULE_PAYMENT_NOVALNET_TEL_ORDER_STATUS_ID_DESC', 'Set the status of orders made with this payment module to this value'); + define('MODULE_PAYMENT_NOVALNET_TEL_SORT_ORDER_TITLE', 'Sort order of display.'); + define('MODULE_PAYMENT_NOVALNET_TEL_SORT_ORDER_DESC', 'Sort order of display. Lowest is displayed first.'); + define('MODULE_PAYMENT_NOVALNET_TEL_ZONE_TITLE', 'Payment Zone'); + define('MODULE_PAYMENT_NOVALNET_TEL_ZONE_DESC', 'If a zone is selected, only enable this payment method for that zone.'); + define('MODULE_PAYMENT_NOVALNET_TEL_ALLOWED_TITLE', 'Allowed zones'); + define('MODULE_PAYMENT_NOVALNET_TEL_ALLOWED_DESC', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_PUBLIC_TITLE', '
Payment - Novalnet AGTelephone PaymentPayment - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP_INFO', 'Following steps are required to complete the telephone payment process:'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP1', 'Step 1:'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP2', 'Step 2:'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP1_DESC', 'Please dial the following number:'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP2_DESC', 'Please wait for the Signal ton and hangup the reciever.
Please click on continue after your successive call.'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_COST_INFO', '* This call costs '); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_TAX_INFO', '€ (inclusive tax) and is only possible from German Landline Telefon connection! *'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_AMOUNT_ERROR1', 'Amount below 0.90 Euro and above 10.00 Euro is not accepted!'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_AMOUNT_ERROR2', 'Amount below 0.90 Euro is not accepted!'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_ERROR', 'Telephone Payment not possible!'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_JS_NN_MISSING', '* Basic Paramater Missing!'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_ORDERNO', 'Order no. '); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_ORDERDATE', 'Order date '); + define('MODULE_PAYMENT_NOVALNET_TEL_TEST_MODE', 'Test Mode'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEST_ORDER_MESSAGE'," TESTORDER
"); + define('MODULE_PAYMENT_NOVALNET_TEL_TEST_MODE_TITLE', 'Enable Test Mode'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEST_MODE_DESC', 'Do you want to activate test mode?'); + define('MODULE_PAYMENT_NOVALNET_TEL_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_TEL_PROXY_DESC', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)'); + +?> diff --git a/includes/languages/german/modules/payment/novalnet_cc.php b/includes/languages/german/modules/payment/novalnet_cc.php new file mode 100644 index 0000000..cfaf1d6 --- /dev/null +++ b/includes/languages/german/modules/payment/novalnet_cc.php @@ -0,0 +1,78 @@ +Bezahlung - Novalnet AG Kreditkarten Bezahlung'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_DESCRIPTION', 'Schnell und Sicher bezahlen über Novalnet AG
Bitte vor aktivierung alle noetige IDs in Bearbeitungmodus eingeben!'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_LANG', 'DE'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_CC_STATUS_TITLE', 'Kreditkarten Modul aktivierung'); + define('MODULE_PAYMENT_NOVALNET_CC_STATUS_DESC', 'Wollen Sie das Kreditkarten Modul des Novalnet AG aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_CC_VENDOR_ID_TITLE', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_CC_VENDOR_ID_DESC', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_CC_AUTH_CODE_TITLE', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_CC_AUTH_CODE_DESC', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID_TITLE', 'Novalnet Angebots-ID'); + define('MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID_DESC', 'Ihre Angebots-ID bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID_TITLE', 'Novalnet Tarif-ID'); + define('MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID_DESC', 'die Tarif-ID des Angebots'); + define('MODULE_PAYMENT_NOVALNET_CC_MANUAL_CHECK_LIMIT_TITLE', 'Manuelle Überprüfung der Zahlung ab'); + define('MODULE_PAYMENT_NOVALNET_CC_MANUAL_CHECK_LIMIT_DESC', 'Bitte den Betrag in Cent eingeben'); + define('MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID2_TITLE', 'Zweite Angebots-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID2_TITLE', 'Zweite Tarif-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_CC_BOOK_REF_TITLE', 'Ihr hinterlegter Verwendungszweck bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_BOOK_REF_DESC', 'Ihr hinterlegter Verwendungszweck bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_ORDER_STATUS_ID_TITLE', 'Bestellungsstatus'); + define('MODULE_PAYMENT_NOVALNET_CC_ORDER_STATUS_ID_DESC', 'Der Bestellstatus des CC Modul'); + define('MODULE_PAYMENT_NOVALNET_CC_SORT_ORDER_TITLE', 'Sortierung nach.'); + define('MODULE_PAYMENT_NOVALNET_CC_SORT_ORDER_DESC', 'Sortierungsansicht.'); + define('MODULE_PAYMENT_NOVALNET_CC_ZONE_TITLE', 'Zahlungsgebiet'); + define('MODULE_PAYMENT_NOVALNET_CC_ZONE_DESC', 'Wenn ein Zone ausgewählt ist dann wird dieser Modul nur für ausgew&aauml;hlte Zone aktiviert.'); + define('MODULE_PAYMENT_NOVALNET_CC_ALLOWED_TITLE', 'erlaubte Zonen'); + define('MODULE_PAYMENT_NOVALNET_CC_ALLOWED_DESC', 'Bitte die gewünschten Zonen mit komma getrennt eingeben(Zb:AT,DE) oder einfach leer lassen'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_PUBLIC_TITLE', '
Bezahlung - Novalnet AG Kreditkarte Standard Bezahlung StandardBezahlung - Novalnet AG Bezahlung - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_CARD_OWNER', 'Kreditkarteninhaber:'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_CARD_OWNER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_CC_NO', 'Kartennummer:'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_CC_NO_LENGTH', '12'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_EXP_MONTH', ' Monat:'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_EXP_MONTH_LENGTH', '2'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_EXP_YEAR', ' Jahr:'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_EXP_YEAR_LENGTH', '2'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_SELECT', 'Bitte waehlen'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_CVC', 'CVC (Pruefziffer):
 
 
 
 
 
 
'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_CVC_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_CVC2', '
* Bei Visa-, Master- und Eurocard besteht der CVC-Code
aus den drei letzten Ziffern im Unterschriftenfeld auf der
Rueckseite der Kreditkarte.'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_BOOKING_INFO', '

Der Betrag wird von Ihrer Kreditkarte mit dem
Verwendungszweck $BOOKINFO sofort abgebucht.'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_JS_NN_MISSING', '*Der zugrundeliegende Parameter fehlt.'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_ERROR', 'Kartendaten Fehler:'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_ORDERNO', 'Best.-Nr.: '); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_ORDERDATE', 'Best.-Datum: '); + define('MODULE_PAYMENT_NOVALNET_CC_TEST_MODE', 'Testmodus'); + define('MODULE_PAYMENT_NOVALNET_CC_TEST_MODE_TITLE', 'Test-Modus-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_CC_TEST_MODE_DESC', 'Wollen Sie den Test-Modus aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_CC_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_CC_PROXY_DESC', 'Wenn Sie ein Proxy einsetzen, tragen Sie hier Ihre Proxy-IP ein (z.B. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_CC_TEST_ORDER_MESSAGE',"TESTBESTELLUNG \n"); + +?> diff --git a/includes/languages/german/modules/payment/novalnet_cc3d.php b/includes/languages/german/modules/payment/novalnet_cc3d.php new file mode 100644 index 0000000..41d27be --- /dev/null +++ b/includes/languages/german/modules/payment/novalnet_cc3d.php @@ -0,0 +1,84 @@ +Bezahlung - Novalnet AG Kreditkarten 3DSecure Bezahlung'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_DESCRIPTION', 'Schnell und Sicher bezahlen über Novalnet AG
Bitte vor aktivierung alle noetige IDs in Bearbeitungmodus eingeben!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_LANG', 'DE'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_CC3D_STATUS_TITLE', 'Kreditkarten Modul aktivierung'); + define('MODULE_PAYMENT_NOVALNET_CC3D_STATUS_DESC', 'Wollen Sie das Kreditkarten Modul des Novalnet AG aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_CC3D_VENDOR_ID_TITLE', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_CC3D_VENDOR_ID_DESC', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_CC3D_AUTH_CODE_TITLE', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_CC3D_AUTH_CODE_DESC', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID_TITLE', 'Novalnet Angebots-ID'); + define('MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID_DESC', 'Ihre Angebots-ID bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID_TITLE', 'Novalnet Tarif-ID'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID_DESC', 'die Tarif-ID des Angebots'); + define('MODULE_PAYMENT_NOVALNET_CC3D_MANUAL_CHECK_LIMIT_TITLE', 'Manuelle Überprüfung der Zahlung ab'); + define('MODULE_PAYMENT_NOVALNET_CC3D_MANUAL_CHECK_LIMIT_DESC', 'Bitte den Betrag in Cent eingeben'); + define('MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID2_TITLE', 'Zweite Angebots-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID2_TITLE', 'Zweite Tarif-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_CC3D_BOOK_REF_TITLE', 'Ihr hinterlegter Verwendungszweck bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC3D_BOOK_REF_DESC', 'Ihr hinterlegter Verwendungszweck bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC3D_ORDER_STATUS_ID_TITLE', 'Bestellungsstatus'); + define('MODULE_PAYMENT_NOVALNET_CC3D_ORDER_STATUS_ID_DESC', 'Der Bestellstatus des CC Modul'); + define('MODULE_PAYMENT_NOVALNET_CC3D_SORT_ORDER_TITLE', 'Sortierung nach.'); + define('MODULE_PAYMENT_NOVALNET_CC3D_SORT_ORDER_DESC', 'Sortierungsansicht.'); + define('MODULE_PAYMENT_NOVALNET_CC3D_ZONE_TITLE', 'Zahlungsgebiet'); + define('MODULE_PAYMENT_NOVALNET_CC3D_ZONE_DESC', 'Wenn ein Zone ausgewählt ist dann wird dieser Modul nur für ausgew&aauml;hlte Zone aktiviert.'); + define('MODULE_PAYMENT_NOVALNET_CC3D_ALLOWED_TITLE', 'erlaubte Zonen'); + define('MODULE_PAYMENT_NOVALNET_CC3D_ALLOWED_DESC', 'Bitte die gewünschten Zonen mit komma getrennt eingeben(Zb:AT,DE) oder einfach leer lassen'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_PUBLIC_TITLE', '
Bezahlung - Novalnet AG Kreditkarten 3DSecure BezahlungBezahlung - Novalnet AG Bezahlung - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CARD_OWNER', 'Kreditkarteninhaber:'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CARD_OWNER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CC_NO', 'Kartennummer:'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CC_NO_LENGTH', '12'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_EXP_MONTH', ' Monat:'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_EXP_MONTH_LENGTH', '2'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_EXP_YEAR', ' Jahr:'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_EXP_YEAR_LENGTH', '2'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_SELECT', 'Bitte waehlen'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CVC', 'CVC (Pruefziffer): '); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CVC_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CVC2', '
* Bei Visa-, Master- und Eurocard besteht der CVC-Code
aus den drei letzten Ziffern im Unterschriftenfeld auf der
Rueckseite der Kreditkarte.'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_BOOKING_INFO', '

Der Betrag wird von Ihrer Kreditkarte mit dem
Verwendungszweck $BOOKINFO sofort abgebucht.'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_NN_MISSING', '* Der zugrundeliegende Parameter fehlt.'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_CARD_OWNER', '* Kreditkarteninhaber muss mindestens 3 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_CC_NO', '* Kreditkartennummer muss mindestens 12 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_EXP_MONTH', '* Monat sollte mindestens 2 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_EXP_YEAR', '* Jahr sollte mindestens 2 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_CVC', '* CVC (Pruefziffer) sollte mindestens 3 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_JS_CVC2', '* ungueltige CVC (Pruefziffer)!'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_ERROR', 'Kartendaten Fehler:'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_ORDERNO', 'Best.-Nr.: '); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEXT_ORDERDATE', 'Best.-Datum: '); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEST_MODE', 'Testmodus'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEST_MODE_TITLE', 'Test-Modus-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEST_MODE_DESC', 'Wollen Sie den Test-Modus aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_CC3D_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_CC3D_PROXY_DESC', 'Wenn Sie ein Proxy einsetzen, tragen Sie hier Ihre Proxy-IP ein (z.B. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_CC3D_TEST_ORDER_MESSAGE',"TESTBESTELLUNG
"); + +?> diff --git a/includes/languages/german/modules/payment/novalnet_cc_pci.php b/includes/languages/german/modules/payment/novalnet_cc_pci.php new file mode 100644 index 0000000..ca7c637 --- /dev/null +++ b/includes/languages/german/modules/payment/novalnet_cc_pci.php @@ -0,0 +1,78 @@ +Bezahlung - Novalnet AG Kreditkarten PCI Standard Bezahlung'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_DESCRIPTION', 'Schnell und Sicher bezahlen über Novalnet AG
Bitte vor aktivierung alle noetige IDs in Bearbeitungmodus eingeben!'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_LANG', 'DE'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_STATUS_TITLE', 'Kreditkarten Modul aktivierung'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_STATUS_DESC', 'Wollen Sie das Kreditkarten Modul des Novalnet AG aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_VENDOR_ID_TITLE', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_VENDOR_ID_DESC', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_AUTH_CODE_TITLE', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_AUTH_CODE_DESC', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID_TITLE', 'Novalnet Angebots-ID'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID_DESC', 'Ihre Angebots-ID bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID_TITLE', 'Novalnet Tarif-ID'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID_DESC', 'die Tarif-ID des Angebots'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_MANUAL_CHECK_LIMIT_TITLE', 'Manuelle Überprüfung der Zahlung ab'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_MANUAL_CHECK_LIMIT_DESC', 'Bitte den Betrag in Cent eingeben'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID2_TITLE', 'Zweite Angebots-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID2_TITLE', 'Zweite Tarif-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_BOOK_REF_TITLE', 'Ihr hinterlegter Verwendungszweck bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_BOOK_REF_DESC', 'Ihr hinterlegter Verwendungszweck bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_ORDER_STATUS_ID_TITLE', 'Bestellungsstatus'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_ORDER_STATUS_ID_DESC', 'Der Bestellstatus des CC Modul'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_SORT_ORDER_TITLE', 'Sortierung nach.'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_SORT_ORDER_DESC', 'Sortierungsansicht.'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_ZONE_TITLE', 'Zahlungsgebiet'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_ZONE_DESC', 'Wenn ein Zone ausgewählt ist dann wird dieser Modul nur für ausgew&aauml;hlte Zone aktiviert.'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_ALLOWED_TITLE', 'erlaubte Zonen'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_ALLOWED_DESC', 'Bitte die gewünschten Zonen mit komma getrennt eingeben(Zb:AT,DE) oder einfach leer lassen'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_PUBLIC_TITLE', '
Bezahlung - Novalnet AG Kreditkarten PCI Standard Bezahlung StandardBezahlung - Novalnet AG Bezahlung - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_CARD_OWNER', 'Kreditkarteninhaber:'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_CARD_OWNER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_CC_NO', 'Kartennummer:'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_CC_NO_LENGTH', '12'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_EXP_MONTH', ' Monat:'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_EXP_MONTH_LENGTH', '2'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_EXP_YEAR', ' Jahr:'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_EXP_YEAR_LENGTH', '2'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_SELECT', 'Bitte waehlen'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_CVC', 'CVC (Pruefziffer):
 
 
 
 
 
 
'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_CVC_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_CVC2', '
* Bei Visa-, Master- und Eurocard besteht der CVC-Code
aus den drei letzten Ziffern im Unterschriftenfeld auf der
Rueckseite der Kreditkarte.'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_BOOKING_INFO', '

Der Betrag wird von Ihrer Kreditkarte mit dem
Verwendungszweck $BOOKINFO sofort abgebucht.'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_JS_NN_MISSING', '*Der zugrundeliegende Parameter fehlt.'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_ERROR', 'Kartendaten Fehler:'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_ORDERNO', 'Best.-Nr.: '); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_ORDERDATE', 'Best.-Datum: '); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_MODE', 'Testmodus'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_MODE_TITLE', 'Test-Modus-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_MODE_DESC', 'Wollen Sie den Test-Modus aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_PROXY_DESC', 'Wenn Sie ein Proxy einsetzen, tragen Sie hier Ihre Proxy-IP ein (z.B. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_ORDER_MESSAGE',"TESTBESTELLUNG \n"); + +?> diff --git a/includes/languages/german/modules/payment/novalnet_elv_at.php b/includes/languages/german/modules/payment/novalnet_elv_at.php new file mode 100644 index 0000000..87bc9e6 --- /dev/null +++ b/includes/languages/german/modules/payment/novalnet_elv_at.php @@ -0,0 +1,76 @@ +Bezahlung - Novalnet AG Lastschriftverfahren Österreich'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_DESCRIPTION', 'Schnell und Sicher bezahlen über Novalnet AG
Bitte vor aktivierung alle noetige IDs in Bearbeitungmodus eingeben!'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_LANG', 'DE'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_STATUS_TITLE', 'ELV-AT Modul aktivierung'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_STATUS_DESC', 'Wollen Sie das Österreichische Lastschriftverfahren Modul des Novalnet AG aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_VENDOR_ID_TITLE', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_VENDOR_ID_DESC', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_AUTH_CODE_TITLE', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_AUTH_CODE_DESC', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID_TITLE', 'Novalnet Angebots-ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID_DESC', 'Ihre Angebots-ID bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID_TITLE', 'Novalnet Tarif-ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID_DESC', 'die Tarif-ID des Angebots'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_MANUAL_CHECK_LIMIT_TITLE', 'Manuelle Überprüfung der Zahlung ab'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_MANUAL_CHECK_LIMIT_DESC', 'Bitte den Betrag in Cent eingeben'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID2_TITLE', 'Zweite Angebots-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID2_TITLE', 'Zweite Tarif-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_INFO_TITLE', 'Information an Endkunden'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_INFO_DESC', 'wird im Bezahlformular erscheinen'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_ORDER_STATUS_ID_TITLE', 'Bestellungsstatus'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_ORDER_STATUS_ID_DESC', 'Der Bestellstatus des ELV-AT Modul'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_SORT_ORDER_TITLE', 'Sortierung nach.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_SORT_ORDER_DESC', 'Sortierungsansicht.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_ZONE_TITLE', 'Zahlungsgebiet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_ZONE_DESC', 'Wenn ein Zone ausgewählt ist dann wird dieser Modul nur für ausgew&aauml;hlte Zone aktiviert.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_ALLOWED_TITLE', 'erlaubte Zonen'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_ALLOWED_DESC', 'Bitte die gewünschten Zonen mit komma getrennt eingeben(Zb:AT,DE) oder einfach leer lassen'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_PUBLIC_TITLE', '
Bezahlung - Novalnet AG Lastschriftverfahren ÖsterreichBezahlung - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_ACCOUNT_OWNER', 'Kontoinhaber:'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_ACCOUNT_OWNER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_ACCOUNT_NUMBER', 'Kontonummer:'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_ACCOUNT_NUMBER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_CODE', 'Bankleitzahl:'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_CODE_LENGTH', '5'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_JS_NN_MISSING', '* Der zugrundeliegende Parameter fehlt.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_JS_BANK_ACCOUNT_OWNER', '* Kontoinhaber von Lastschriftverfahren Oesterreich, muss mindestens 3 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_JS_BANK_ACCOUNT_NUMBER', '* Kontonummer von Lastschriftverfahren Oesterreich, muss mindestens 3 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_JS_BANK_CODE', '* Bankleitzahl von Lastschriftverfahren Oesterreich, sollte mindestens 5 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_ERROR', 'Kontodaten Fehler:'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_CUST_INFORM', '"Wir holen zuvor eine Bonitätsauskunft ein, denn nur bei positiver Auskunft können wir die Bestellung durchführen und die Abbuchung erfolgt mit dem Warenversand. Bei Nichteinlösung/Widerruf berechnen wir eine Aufwandspauschale von 10,00 Euro und der Vorgang wird sofort dem Inkasso-Verfahren übergeben."'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_ORDERNO', 'Best.-Nr. '); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_ORDERDATE', 'Best.-Datum '); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_MODE', 'Testmodus'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_MODE_TITLE', 'Test-Modus-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_MODE_DESC', 'Wollen Sie den Test-Modus aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PROXY_DESC', 'Wenn Sie ein Proxy einsetzen, tragen Sie hier Ihre Proxy-IP ein (z.B. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_ORDER_MESSAGE'," TESTBESTELLUNG
"); + + +?> diff --git a/includes/languages/german/modules/payment/novalnet_elv_at_pci.php b/includes/languages/german/modules/payment/novalnet_elv_at_pci.php new file mode 100644 index 0000000..fd430e7 --- /dev/null +++ b/includes/languages/german/modules/payment/novalnet_elv_at_pci.php @@ -0,0 +1,66 @@ +Bezahlung - Novalnet AG Lastschriftverfahren Österreich PCI Standard'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_DESCRIPTION', 'Schnell und Sicher bezahlen über Novalnet AG
Bitte vor aktivierung alle noetige IDs in Bearbeitungmodus eingeben!'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_LANG', 'DE'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_STATUS_TITLE', 'ELV-AT Modul aktivierung'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_STATUS_DESC', 'Wollen Sie das Österreichische Lastschriftverfahren Modul des Novalnet AG aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_VENDOR_ID_TITLE', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_VENDOR_ID_DESC', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_AUTH_CODE_TITLE', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_AUTH_CODE_DESC', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID_TITLE', 'Novalnet Angebots-ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID_DESC', 'Ihre Angebots-ID bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID_TITLE', 'Novalnet Tarif-ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID_DESC', 'die Tarif-ID des Angebots'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_MANUAL_CHECK_LIMIT_TITLE', 'Manuelle Überprüfung der Zahlung ab'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_MANUAL_CHECK_LIMIT_DESC', 'Bitte den Betrag in Cent eingeben'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID2_TITLE', 'Zweite Angebots-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID2_TITLE', 'Zweite Tarif-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_BOOK_REF_TITLE', 'Ihr hinterlegter Verwendungszweck bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_BOOK_REF_DESC', 'Ihr hinterlegter Verwendungszweck bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ORDER_STATUS_ID_TITLE', 'Bestellungsstatus'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ORDER_STATUS_ID_DESC', 'Der Bestellstatus des ELV-AT Modul'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_SORT_ORDER_TITLE', 'Sortierung nach.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_SORT_ORDER_DESC', 'Sortierungsansicht.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ZONE_TITLE', 'Zahlungsgebiet'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ZONE_DESC', 'Wenn ein Zone ausgewählt ist dann wird dieser Modul nur für ausgew&aauml;hlte Zone aktiviert.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ALLOWED_TITLE', 'erlaubte Zonen'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ALLOWED_DESC', 'Bitte die gewünschten Zonen mit komma getrennt eingeben(Zb:AT,DE) oder einfach leer lassen'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_PUBLIC_TITLE', '
Bezahlung - Novalnet AG Lastschriftverfahren Österreich PCI StandardBezahlung - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_BOOKING_INFO', '

Der Betrag wird von Ihrer Kreditkarte mit dem
Verwendungszweck $BOOKINFO sofort abgebucht.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_JS_NN_MISSING', '* Der zugrundeliegende Parameter fehlt.'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_ERROR', 'Kartendaten Fehler:'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_ORDERNO', 'Best.-Nr.: '); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_ORDERDATE', 'Best.-Datum: '); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_MODE', 'Testmodus'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_MODE_TITLE', 'Test-Modus-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_MODE_DESC', 'Wollen Sie den Test-Modus aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PROXY_DESC', 'Wenn Sie ein Proxy einsetzen, tragen Sie hier Ihre Proxy-IP ein (z.B. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_ORDER_MESSAGE',"TESTBESTELLUNG \n"); + +?> diff --git a/includes/languages/german/modules/payment/novalnet_elv_de.php b/includes/languages/german/modules/payment/novalnet_elv_de.php new file mode 100644 index 0000000..079fe2b --- /dev/null +++ b/includes/languages/german/modules/payment/novalnet_elv_de.php @@ -0,0 +1,95 @@ +Bezahlung - Novalnet AG Lastschriftverfahren Deutschland'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_DESCRIPTION', 'Schnell und Sicher bezahlen über Novalnet AG
Bitte vor aktivierung alle noetige IDs in Bearbeitungmodus eingeben!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_LANG', 'DE'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_STATUS_TITLE', 'ELV-DE Modul aktivierung'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_STATUS_DESC', 'Wollen Sie das Deutsche Lastschriftverfahren Modul des Novalnet AG aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_VENDOR_ID_TITLE', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_VENDOR_ID_DESC', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_AUTH_CODE_TITLE', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_AUTH_CODE_DESC', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID_TITLE', 'Novalnet Angebots-ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID_DESC', 'Ihre Angebots-ID bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID_TITLE', 'Novalnet Tarif-ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID_DESC', 'die Tarif-ID des Angebots'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_MANUAL_CHECK_LIMIT_TITLE', 'Manuelle Überprüfung der Zahlung ab'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_MANUAL_CHECK_LIMIT_DESC', 'Bitte den Betrag in Cent eingeben'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID2_TITLE', 'Zweite Angebots-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID2_TITLE', 'Zweite Tarif-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID2_DESC', 'zur manuallen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_INFO_TITLE', 'Information an Endkunden'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_INFO_DESC', 'wird im Bezahlformular erscheinen'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ACDC_TITLE', 'ACDC Control Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ACDC_DESC', 'Wollen Sie ACDC Control aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ORDER_STATUS_ID_TITLE', 'Bestellungsstatus'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ORDER_STATUS_ID_DESC', 'Der Bestellstatus des ELV-DE Modul'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_SORT_ORDER_TITLE', 'Sortierung nach.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_SORT_ORDER_DESC', 'Sortierungsansicht.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ZONE_TITLE', 'Zahlungsgebiet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ZONE_DESC', 'Wenn ein Zone ausgewählt ist dann wird dieser Modul nur für ausgew&aauml;hlte Zone aktiviert.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ALLOWED_TITLE', 'erlaubte Zonen'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ALLOWED_DESC', 'Bitte die gewünschten Zonen mit komma getrennt eingeben(Zb:AT,DE) oder einfach leer lassen'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_PUBLIC_TITLE', '
Bezahlung - Novalnet AG Lastschriftverfahren DeutschlandBezahlung - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_ACCOUNT_OWNER', 'Kontoinhaber:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_ACCOUNT_OWNER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_ACCOUNT_NUMBER', 'Kontonummer:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_ACCOUNT_NUMBER_LENGTH', '3'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_CODE', 'Bankleitzahl:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_CODE_LENGTH', '8'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ACDC_INFO', "Der acdc-Check wird akzeptiert"); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_ACDC_DIV', ""); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_JS_NN_MISSING', '* Der zugrundeliegende Parameter fehlt.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_JS_BANK_ACCOUNT_OWNER', '* Deutsche Lastschrift Kontoinhaber muss mindestens 3 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_JS_BANK_ACCOUNT_NUMBER', '* Deutsche Lastschrift Kontonummer muss mindestens 3 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_JS_BANK_CODE', '* Deutsche Lastschrift Bankleitzahl sollte mindestens 8 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_JS_ACDC', '* Bitte den acdc-Check akzeptieren oder eine andere Zahlungsart auswaehlen!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_JS_ACDC', '* Bitte den acdc-Check akzeptieren oder eine andere Zahlungsart auswaehlen!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_ERROR', 'Kontodaten Fehler:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_CUST_INFORM', '"Wir holen zuvor eine Bonitätsauskunft ein, denn nur bei positiver Auskunft können wir die Bestellung durchführen und die Abbuchung erfolgt mit dem Warenversand. Bei Nichteinlösung/Widerruf berechnen wir eine Aufwandspauschale von 10,00 Euro und der Vorgang wird sofort dem Inkasso-Verfahren übergeben."'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_ORDERNO', 'Best.-Nr.: '); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_ORDERDATE', 'Best.-Datum: '); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_MODE', 'Testmodus'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_MODE_TITLE', 'Test-Modus-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_MODE_DESC', 'Wollen Sie den Test-Modus aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PROXY_DESC', 'Wenn Sie ein Proxy einsetzen, tragen Sie hier Ihre Proxy-IP ein (z.B. www.proxy.de:80)'); + + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_TITLE', 'PIN by Callback/SMS'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_DESC', 'Wenn Sie PIN by Callback bzw. PIN by SMS aktiviert haben, wird Ihr Kunde gebeten, seine Telefon-/Mobiltelefonnumer einzugeben. Er erhält dann per Telefon/SMS von der Novalnet AG eine PIN, die er eingeben muss, bevor die Bestellung angenommen wird. '); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_TEL', 'Telefonnummer:*'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_PIN', 'PIN:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_NEW_PIN', 'PIN vergessen? [Neue PIN anfordern]'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_TEL_NOTVALID', 'Die eingegebene Telefonnummer ist nicht gültig!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_PIN_NOTVALID', 'Die eingegebene PIN ist inkorrekt oder leer!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_CALL_MESSAGE', 'Sie werden in kürze eine PIN per Telefon/SMS erhalten. Bitte geben Sie die PIN in das entsprechende Textfeld ein.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_MIN_LIMIT_TITLE', 'Mindestbetrag für PIN by Callback.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_MIN_LIMIT_DESC', 'Bitte geben Sie einen Mindestbetrag in Cent an (z.B. 100, 200), um PIN by Callback in Betrieb zu nehmen.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_INPUT_REQUEST_DESC',"Bitte geben Sie Ihre PIN ein."); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SESSION_ERROR',"Ihre PIN-Session ist abgelaufen. Bitte versuchen Sie es noch einmal."); + + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TID_MESSAGE',". Novalnet-Transaktions-ID: "); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_AMOUNT_VARIATION_MESSAGE',"Sie haben den Betrag in Ihrem Warenkorb geändert, nachdem Sie Ihre PIN erhalten haben. Bitte rufen Sie noch einmal an, um eine neue PIN zu erhalten."); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_ORDER_MESSAGE'," TESTBESTELLUNG
"); +?> diff --git a/includes/languages/german/modules/payment/novalnet_elv_de_pci.php b/includes/languages/german/modules/payment/novalnet_elv_de_pci.php new file mode 100644 index 0000000..c1f333e --- /dev/null +++ b/includes/languages/german/modules/payment/novalnet_elv_de_pci.php @@ -0,0 +1,66 @@ +Bezahlung - Novalnet AG Lastschriftverfahren Deutschland PCI Standard'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_DESCRIPTION', 'Schnell und Sicher bezahlen über Novalnet AG
Bitte vor aktivierung alle noetige IDs in Bearbeitungmodus eingeben!'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_LANG', 'DE'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_STATUS_TITLE', 'ELV-DE Modul aktivierung'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_STATUS_DESC', 'Wollen Sie das Deutsche Lastschriftverfahren Modul des Novalnet AG aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_VENDOR_ID_TITLE', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_VENDOR_ID_DESC', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_AUTH_CODE_TITLE', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_AUTH_CODE_DESC', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID_TITLE', 'Novalnet Angebots-ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID_DESC', 'Ihre Angebots-ID bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID_TITLE', 'Novalnet Tarif-ID'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID_DESC', 'die Tarif-ID des Angebots'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_MANUAL_CHECK_LIMIT_TITLE', 'Manuelle Überprüfung der Zahlung ab'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_MANUAL_CHECK_LIMIT_DESC', 'Bitte den Betrag in Cent eingeben'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID2_TITLE', 'Zweite Angebots-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID2_TITLE', 'Zweite Tarif-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_BOOK_REF_TITLE', 'Ihr hinterlegter Verwendungszweck bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_BOOK_REF_DESC', 'Ihr hinterlegter Verwendungszweck bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ORDER_STATUS_ID_TITLE', 'Bestellungsstatus'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ORDER_STATUS_ID_DESC', 'Der Bestellstatus des ELV-AT Modul'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_SORT_ORDER_TITLE', 'Sortierung nach.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_SORT_ORDER_DESC', 'Sortierungsansicht.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ZONE_TITLE', 'Zahlungsgebiet'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ZONE_DESC', 'Wenn ein Zone ausgewählt ist dann wird dieser Modul nur für ausgew&aauml;hlte Zone aktiviert.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ALLOWED_TITLE', 'erlaubte Zonen'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ALLOWED_DESC', 'Bitte die gewünschten Zonen mit komma getrennt eingeben(Zb:AT,DE) oder einfach leer lassen'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_PUBLIC_TITLE', '
Bezahlung - Novalnet AG Lastschriftverfahren Deutschland PCI StandardBezahlung - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_BOOKING_INFO', '

Der Betrag wird von Ihrer Kreditkarte mit dem
Verwendungszweck $BOOKINFO sofort abgebucht.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_JS_NN_MISSING', '* Der zugrundeliegende Parameter fehlt.'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_ERROR', 'Kartendaten Fehler:'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_ORDERNO', 'Best.-Nr.: '); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_ORDERDATE', 'Best.-Datum: '); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_MODE', 'Testmodus'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_MODE_TITLE', 'Test-Modus-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_MODE_DESC', 'Wollen Sie den Test-Modus aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PROXY_DESC', 'Wenn Sie ein Proxy einsetzen, tragen Sie hier Ihre Proxy-IP ein (z.B. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_ORDER_MESSAGE',"TESTBESTELLUNG \n"); + +?> diff --git a/includes/languages/german/modules/payment/novalnet_instantbanktransfer.php b/includes/languages/german/modules/payment/novalnet_instantbanktransfer.php new file mode 100644 index 0000000..3413a14 --- /dev/null +++ b/includes/languages/german/modules/payment/novalnet_instantbanktransfer.php @@ -0,0 +1,79 @@ +Bezahlung - Novalnet AG Sofortüberweisung'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_DESCRIPTION', 'Schnell und Sicher bezahlen über Novalnet AG
Bitte vor der Aktivierung alle noetigen IDs im Bearbeitungsmodus eingeben!'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_LANG', 'DE'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_STATUS_TITLE', 'Sofortüberweisungsmodul-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_STATUS_DESC', 'Wollen Sie das Deutsche Sofortüberweisungmodul der Novalnet AG aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_VENDOR_ID_TITLE', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_VENDOR_ID_DESC', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_AUTH_CODE_TITLE', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_AUTH_CODE_DESC', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PRODUCT_ID_TITLE', 'Novalnet Angebots-ID'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PRODUCT_ID_DESC', 'Ihre Angebots-ID bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TARIFF_ID_TITLE', 'Novalnet Tarif-ID'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TARIFF_ID_DESC', 'die Tarif-ID des Angebots'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_MANUAL_CHECK_LIMIT_TITLE', 'Manuelle Überprüfung der Zahlung ab'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_MANUAL_CHECK_LIMIT_DESC', 'Bitte den Betrag in Cent eingeben'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PRODUCT_ID2_TITLE', 'Zweite Angebots-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PRODUCT_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TARIFF_ID2_TITLE', 'Zweite Tarif-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TARIFF_ID2_DESC', 'zur manuallen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_INFO_TITLE', 'Information an Endkunden'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_INFO_DESC', 'wird im Bezahlformular erscheinen'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ACDC_TITLE', 'ACDC Control Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ACDC_DESC', 'Wollen Sie ACDC Control aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ORDER_STATUS_ID_TITLE', 'Bestellungsstatus'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ORDER_STATUS_ID_DESC', 'Der Bestellstatus des Sofortüberweisungsmoduls'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_SORT_ORDER_TITLE', 'Sortierung nach.'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_SORT_ORDER_DESC', 'Sortierungsansicht.'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ZONE_TITLE', 'Zahlungsgebiet'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ZONE_DESC', 'Wenn eine Zone ausgewählt ist dann wird dieses Modul nur für die ausgew&aauml;hlte Zone aktiviert.'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ALLOWED_TITLE', 'erlaubte Zonen'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ALLOWED_DESC', 'Bitte die gewünschten Zonen kommagetrennt eingeben(z.B:AT,DE) oder einfach leer lassen'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_PUBLIC_TITLE', '
Bezahlung - Novalnet AGSofortüberweisungBezahlung - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ACDC_INFO', "Der acdc-Check wird akzeptiert"); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ACDC_DIV', ""); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_JS_NN_MISSING', '* Der zugrundeliegende Parameter fehlt.'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_JS_BANK_ACCOUNT_OWNER', '* Deutscher Kontoinhaber muss mindestens 3 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_JS_BANK_ACCOUNT_NUMBER', '* Deutsche Kontonummer muss mindestens 3 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_JS_BANK_CODE', '* Deutsche Bankleitzahl sollte mindestens 8 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_JS_ACDC', '* Bitte den acdc-Check akzeptieren oder eine andere Zahlungsart auswaehlen!'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_ERROR', 'Kontodaten Fehler:'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_CUST_INFORM', '"Wir holen zuvor eine Bonitätsauskunft ein, denn nur bei positiver Auskunft können wir die Bestellung durchführen und die Abbuchung erfolgt mit dem Warenversand. Bei Nichteinlösung/Widerruf berechnen wir eine Aufwandspauschale von 10,00 Euro und der Vorgang wird sofort dem Inkasso-Verfahren übergeben."'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_ORDERNO', 'Best.-Nr.: '); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_ORDERDATE', 'Best.-Datum: '); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE', 'Testmodus'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE_TITLE', 'Test-Modus-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE_DESC', 'Wollen Sie den Test-Modus aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_HASH_ERROR', 'checkHash fehlgeschlagen'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PASSWORD_TITLE', 'Passwort'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PASSWORD_DESC', 'Passwort eingeben'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PROXY_DESC', 'Wenn Sie ein Proxy einsetzen, tragen Sie hier Ihre Proxy-IP ein (z.B. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_ORDER_MESSAGE'," TESTBESTELLUNG
"); + define('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TID_MESSAGE',". Novalnet-Transaktions-ID : "); +?> diff --git a/includes/languages/german/modules/payment/novalnet_invoice.php b/includes/languages/german/modules/payment/novalnet_invoice.php new file mode 100644 index 0000000..857f719 --- /dev/null +++ b/includes/languages/german/modules/payment/novalnet_invoice.php @@ -0,0 +1,89 @@ +Bezahlung - Novalnet AG per Rechnung'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DESCRIPTION', 'Schnell und Sicher bezahlen über Novalnet AG
Bitte vor aktivierung alle noetige IDs in Bearbeitungmodus eingeben!'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_LANG', 'DE'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_INVOICE_STATUS_TITLE', 'INVOICE Modul aktivierung'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_STATUS_DESC', 'Wollen Sie das Rechnungseingang Modul des Novalnet AG aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_VENDOR_ID_TITLE', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_VENDOR_ID_DESC', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_AUTH_CODE_TITLE', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_AUTH_CODE_DESC', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PRODUCT_ID_TITLE', 'Novalnet Angebots-ID'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PRODUCT_ID_DESC', 'Ihre Angebots-ID bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TARIFF_ID_TITLE', 'Novalnet Tarif-ID'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TARIFF_ID_DESC', 'die Tarif-ID des Angebots'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_DURATION_TITLE', 'Zahlungsfrist in tagen'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_DURATION_DESC', 'wird im Bezahlformular erscheinen'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_INFO_TITLE', 'Information an Endkunden'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_INFO_DESC', 'wird im Bezahlformular erscheinen'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_ORDER_STATUS_ID_TITLE', 'Bestellungsstatus'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_ORDER_STATUS_ID_DESC', 'Der Bestellstatus des INVOICE Modul'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_SORT_ORDER_TITLE', 'Sortierung nach.'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_SORT_ORDER_DESC', 'Sortierungsansicht.'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_ZONE_TITLE', 'Zahlungsgebiet'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_ZONE_DESC', 'Wenn ein Zone ausgewählt ist dann wird dieser Modul nur für ausgew&aauml;hlte Zone aktiviert.'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_ALLOWED_TITLE', 'erlaubte Zonen'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_ALLOWED_DESC', 'Bitte die gewünschten Zonen mit komma getrennt eingeben(Zb:AT,DE) oder einfach leer lassen'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_PUBLIC_TITLE', '
Bezahlung - Novalnet AG per Rechnung
'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_ACCOUNT_OWNER', 'Kontoinhaber:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_ACCOUNT_NUMBER', 'Kontonummer:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_CODE', 'Bankleitzahl:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_IBAN', 'IBAN:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_BIC', 'SWIFT / BIC:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_BANK', 'Bank:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_CITY', 'Stadt:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_AMOUNT', 'Betrag:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_REFERENCE', 'Verwendungszweck:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_REFERENCE_INFO', 'Bitte beachten Sie, dass die Ueberweisung nur bearbeitet werden kann, wenn der oben angegebene Verwendungszweck verwendet wird.'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_TRANSFER_INFO', 'Bitte ueberweisen Sie den Betrag auf folgendes Konto:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_INFO', 'Die Bankverbindung wird Ihnen nach Abschluss Ihrer Bestellung per E-Mail zugeschickt!'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DURATION_INFO', 'Zahlungsfrist:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DURATION_INFO_DAYS', 'Tage'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DURATION_LIMIT_INFO', 'Bitte ueberweisen Sie den Betrag spaetestens bis zum'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DURATION_LIMIT_END_INFO', 'auf folgendes Konto:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_JS_NN_MISSING', '* Der zugrundeliegende Parameter fehlt.'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_ORDERNO', 'Best.-Nr. '); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_ORDERDATE', 'Best.-Datum '); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEST_MODE', 'Testmodus'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEST_MODE_TITLE', 'Test-Modus-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEST_MODE_DESC', 'Wollen Sie den Test-Modus aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PROXY_DESC', 'Wenn Sie ein Proxy einsetzen, tragen Sie hier Ihre Proxy-IP ein (z.B. www.proxy.de:80)'); + + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_TITLE', 'PIN by Callback/SMS'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_DESC', 'Wenn Sie PIN by Callback bzw. PIN by SMS aktiviert haben, wird Ihr Kunde gebeten, seine Telefon-/Mobiltelefonnumer einzugeben. Er erhält dann per Telefon/SMS von der Novalnet AG eine PIN, die er eingeben muss, bevor die Bestellung angenommen wird. '); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_TEL', 'Telefonnummer:*'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_PIN', 'PIN:'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_NEW_PIN', 'PIN vergessen? [Neue PIN anfordern]'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_TEL_NOTVALID', 'Die eingegebene Telefonnummer ist nicht gültig!'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_PIN_NOTVALID', 'Die eingegebene PIN ist inkorrekt oder leer!'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_CALL_MESSAGE', 'Sie werden in kürze eine PIN per Telefon/SMS erhalten. Bitte geben Sie die PIN in das entsprechende Textfeld ein.'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_MIN_LIMIT_TITLE', 'Mindestbetrag für PIN by Callback.'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_MIN_LIMIT_DESC', 'Bitte geben Sie einen Mindestbetrag in Cent an (z.B. 100, 200), um PIN by Callback in Betrieb zu nehmen.'); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_INPUT_REQUEST_DESC',"Bitte geben Sie Ihre PIN ein."); + define('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SESSION_ERROR',"Ihre PIN-Session ist abgelaufen. Bitte versuchen Sie es noch einmal."); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TEST_ORDER_MESSAGE',"TESTBESTELLUNG
"); + define('MODULE_PAYMENT_NOVALNET_INVOICE_TID_MESSAGE',". Novalnet-Transaktions-ID: "); + define('MODULE_PAYMENT_NOVALNET_INVOICE_AMOUNT_VARIATION_MESSAGE',"Sie haben den Betrag in Ihrem Warenkorb geändert, nachdem Sie Ihre PIN erhalten haben. Bitte rufen Sie noch einmal an, um eine neue PIN zu erhalten."); +?> diff --git a/includes/languages/german/modules/payment/novalnet_paypal.php b/includes/languages/german/modules/payment/novalnet_paypal.php new file mode 100644 index 0000000..a058798 --- /dev/null +++ b/includes/languages/german/modules/payment/novalnet_paypal.php @@ -0,0 +1,91 @@ +Payment - Novalnet AG Novalnet-Paypal'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_DESCRIPTION', 'Schnell und Sicher bezahlen über Novalnet AG
Bitte vor der Aktivierung alle noetigen IDs im Bearbeitungsmodus eingeben!
Sie müssen über ein Paypal-Händlerkonto verfügen, bevor Sie dieses Modul einsetzen können.'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_LANG', 'DE'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_STATUS_TITLE', 'Novalnet-Paypal-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_STATUS_DESC', 'Wollen Sie das Paypalmodul der Novalnet AG aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_VENDOR_ID_TITLE', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_VENDOR_ID_DESC', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_AUTH_CODE_TITLE', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_AUTH_CODE_DESC', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PRODUCT_ID_TITLE', 'Novalnet Produkt-ID'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PRODUCT_ID_DESC', 'Ihre Produkt-ID bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TARIFF_ID_TITLE', 'Novalnet Tarif-ID'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TARIFF_ID_DESC', 'die Tarif-ID des Angebots'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_MANUAL_CHECK_LIMIT_TITLE', 'Manuelle Überprüfung der Zahlung ab'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_MANUAL_CHECK_LIMIT_DESC', 'Bitte den Betrag in Cent eingeben'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PRODUCT_ID2_TITLE', 'Zweite Angebots-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PRODUCT_ID2_DESC', 'zur manuellen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TARIFF_ID2_TITLE', 'Zweite Tarif-ID Novalnet'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TARIFF_ID2_DESC', 'zur manuallen Überprüfung'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_INFO_TITLE', 'Information an Endkunden'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_INFO_DESC', 'wird im Bezahlformular erscheinen'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ID_TITLE', 'Bestellungsstatus'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ID_DESC', 'Der Bestellstatus des Paypalmoduls'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_SORT_ORDER_TITLE', 'Sortierung nach.'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_SORT_ORDER_DESC', 'Sortierungsansicht.'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ZONE_TITLE', 'Payment Zone'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ZONE_DESC', 'Wenn eine Zone ausgewählt ist dann wird dieses Modul nur für die ausgew&aauml;hlte Zone aktiviert.'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ALLOWED_TITLE', 'erlaubte Zonen'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_ALLOWED_DESC', 'Bitte die gewünschten Zonen kommagetrennt eingeben(z.B:AT,DE) oder einfach leer lassen'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_PUBLIC_TITLE', '
Payment - Novalnet AGNovalnet-Paypal (Sie müssen über ein Paypal-Händler-Konto verfügen)Payment - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_JS_NN_MISSING', '* Basisparameter fehlen!'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_JS_BANK_ACCOUNT_OWNER', '* Deutscher Kontoinhaber muss mindestens 3 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_JS_BANK_ACCOUNT_NUMBER', '* Deutsche Kontonummer muss mindestens 3 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_JS_BANK_CODE', '* Deutsche Bankleitzahl sollte mindestens 8 stellig sein!'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_JS_ACDC', '* Bitte den acdc-Check akzeptieren oder eine andere Zahlungsart auswaehlen!'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_ERROR', 'Kontodaten Fehler:'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_CUST_INFORM', '"Wir holen zuvor eine Bonitätsauskunft ein, denn nur bei positiver Auskunft können wir die Bestellung durchführen und die Abbuchung erfolgt mit dem Warenversand. Bei Nichteinlösung/Widerruf berechnen wir eine Aufwandspauschale von 10,00 Euro und der Vorgang wird sofort dem Inkasso-Verfahren übergeben."'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_ORDERNO', 'Best.-Nr.: '); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_ORDERDATE', 'Best.-Datum: '); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_MODE', 'Test Mode'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_MODE_TITLE', 'Test-Modus-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_MODE_DESC', 'Wollen Sie den Test-Modus aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_HASH_ERROR', 'checkHash fehlgeschlagen'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PASSWORD_TITLE', 'Passwort'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PASSWORD_DESC', 'Passwort eingeben'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_PROXY_DESC', 'Wenn Sie ein Proxy einsetzen, tragen Sie hier Ihre Proxy-IP ein (z.B. www.proxy.de:80)'); + + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_USER_TITLE', 'PAYPAL Benutzername'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_USER_DESC', 'Geben Sie Ihren PAYPAL API Benutzernamen ein'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_USER', 'PAYPAL API Benutzername'); + + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_PASSWORD_TITLE', 'PAYPAL API Passwort'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_PASSWORD_DESC', 'Geben Sie Ihr PAYPAL API Passwort ein'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_PASSWORD', 'PAYPAL API Passwort'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_ORDER_MESSAGE',"Testbuchung
"); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_SIGNATURE_TITLE', 'PAYPAL API Signatur'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_SIGNATURE_DESC', 'Geben Sie Ihre PAYPAL API Signatur ein'); + define('MODULE_PAYMENT_NOVALNET_PAYPAL_API_SIGNATURE', 'PAYPAL API Signatur'); + define('MODULE_PAYMENT_PAYPAL_TEXT_INFO',''); + + #define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ABORT_ID_TITLE', 'Bestellstatus "Paypal Abbruch"'); + #define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ABORT_ID_DESC', 'Bestellstatus bei Abbruch (z.B. PayPal Abbruch)'); + #define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_PENDING_ID_TITLE', 'Bestellstatus "Offen PP wartend"'); + #define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_PENDING_ID_DESC', 'Bestellstatus bei anhängiger Transaktion (z.B. Offen PP wartend)'); + #define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_REJECTED_ID_TITLE', 'Bestellstatus "Paypal abgelehnt"'); + #define('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_REJECTED_ID_DESC', 'Bestellstatus bei Ablehnung (z.B. PayPal abgelehnt)'); +?> diff --git a/includes/languages/german/modules/payment/novalnet_prepayment.php b/includes/languages/german/modules/payment/novalnet_prepayment.php new file mode 100644 index 0000000..cf1b349 --- /dev/null +++ b/includes/languages/german/modules/payment/novalnet_prepayment.php @@ -0,0 +1,70 @@ +Bezahlung - Novalnet AG Vorkasse'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_DESCRIPTION', 'Schnell und Sicher bezahlen über Novalnet AG
Bitte vor aktivierung alle noetige IDs in Bearbeitungmodus eingeben!'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_LANG', 'DE'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_STATUS_TITLE', 'Prepayment Modul aktivierung'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_STATUS_DESC', 'Wollen Sie das Vorkasse Modul des Novalnet AG aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_VENDOR_ID_TITLE', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_VENDOR_ID_DESC', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_AUTH_CODE_TITLE', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_AUTH_CODE_DESC', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_PRODUCT_ID_TITLE', 'Novalnet Angebots-ID'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_PRODUCT_ID_DESC', 'Ihre Angebots-ID bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TARIFF_ID_TITLE', 'Novalnet Tarif-ID'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TARIFF_ID_DESC', 'die Tarif-ID des Angebots'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_INFO_TITLE', 'Information an Endkunden'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_INFO_DESC', 'wird im Bezahlformular erscheinen'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_ORDER_STATUS_ID_TITLE', 'Bestellungsstatus'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_ORDER_STATUS_ID_DESC', 'Der Bestellstatus des Prepayment Modul'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_SORT_ORDER_TITLE', 'Sortierung nach.'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_SORT_ORDER_DESC', 'Sortierungsansicht.'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_ZONE_TITLE', 'Zahlungsgebiet'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_ZONE_DESC', 'Wenn ein Zone ausgewählt ist dann wird dieser Modul nur für ausgew&aauml;hlte Zone aktiviert.'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_ALLOWED_TITLE', 'erlaubte Zonen'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_ALLOWED_DESC', 'Bitte die gewünschten Zonen mit komma getrennt eingeben(Zb:AT,DE) oder einfach leer lassen'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_PUBLIC_TITLE', '
Bezahlung - Novalnet AG Vorkasse
'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_ACCOUNT_OWNER', 'Kontoinhaber:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_ACCOUNT_NUMBER', 'Kontonummer:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_CODE', 'Bankleitzahl:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_IBAN', 'IBAN:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_BIC', 'SWIFT / BIC:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_BANK', 'Bank:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_CITY', 'Stadt:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_AMOUNT', 'Betrag:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_REFERENCE', 'Verwendungszweck:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_REFERENCE_INFO', 'Bitte beachten Sie, dass die Ueberweisung nur bearbeitet werden kann, wenn der oben angegebene Verwendungszweck verwendet wird.'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_TRANSFER_INFO', 'Bitte ueberweisen sie den Betrag auf folgendes Konto:'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_INFO', 'Die Bankdaten werden Ihnen bald nach Beendigung des Checkout-Prozesses per Email zugeschickt werden'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_JS_NN_MISSING', '* Der zugrundeliegende Parameter fehlt.'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_ORDERNO', 'Best.-Nr.: '); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_ORDERDATE', 'Best.-Datum: '); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_MODE', 'Testmodus'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_MODE_TITLE', 'Test-Modus-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_MODE_DESC', 'Wollen Sie den Test-Modus aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_PROXY_DESC', 'Wenn Sie ein Proxy einsetzen, tragen Sie hier Ihre Proxy-IP ein (z.B. www.proxy.de:80)'); + define('MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_ORDER_MESSAGE'," TESTBESTELLUNG
"); + + +?> \ No newline at end of file diff --git a/includes/languages/german/modules/payment/novalnet_tel.php b/includes/languages/german/modules/payment/novalnet_tel.php new file mode 100644 index 0000000..ca330c1 --- /dev/null +++ b/includes/languages/german/modules/payment/novalnet_tel.php @@ -0,0 +1,67 @@ +Bezahlung - Novalnet AG Telefonpayment - Pay by call'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_DESCRIPTION', 'Schnell und Sicher bezahlen über Novalnet AG
Bitte vor aktivierung alle noetige IDs in Bearbeitungmodus eingeben!'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_LANG', 'DE'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_TEL_STATUS_TITLE', 'TEL Modul aktivierung'); + define('MODULE_PAYMENT_NOVALNET_TEL_STATUS_DESC', 'Wollen Sie das Telefonpayment Modul des Novalnet AG aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_TEL_VENDOR_ID_TITLE', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_TEL_VENDOR_ID_DESC', 'Novalnet Händler ID'); + define('MODULE_PAYMENT_NOVALNET_TEL_AUTH_CODE_TITLE', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_TEL_AUTH_CODE_DESC', 'Novalnet Händler Authorisierungsschlüssel'); + define('MODULE_PAYMENT_NOVALNET_TEL_PRODUCT_ID_TITLE', 'Novalnet Angebots-ID'); + define('MODULE_PAYMENT_NOVALNET_TEL_PRODUCT_ID_DESC', 'Ihre Angebots-ID bei Novalnet'); + define('MODULE_PAYMENT_NOVALNET_TEL_TARIFF_ID_TITLE', 'Novalnet Tarif-ID'); + define('MODULE_PAYMENT_NOVALNET_TEL_TARIFF_ID_DESC', 'die Tarif-ID des Angebots'); + define('MODULE_PAYMENT_NOVALNET_TEL_INFO_TITLE', 'Information an Endkunden'); + define('MODULE_PAYMENT_NOVALNET_TEL_INFO_DESC', 'wird im Bezahlformular erscheinen'); + define('MODULE_PAYMENT_NOVALNET_TEL_ORDER_STATUS_ID_TITLE', 'Bestellungsstatus'); + define('MODULE_PAYMENT_NOVALNET_TEL_ORDER_STATUS_ID_DESC', 'Der Bestellstatus des TEL Modul'); + define('MODULE_PAYMENT_NOVALNET_TEL_SORT_ORDER_TITLE', 'Sortierung nach.'); + define('MODULE_PAYMENT_NOVALNET_TEL_SORT_ORDER_DESC', 'Sortierungsansicht.'); + define('MODULE_PAYMENT_NOVALNET_TEL_ZONE_TITLE', 'Zahlungsgebiet'); + define('MODULE_PAYMENT_NOVALNET_TEL_ZONE_DESC', 'Wenn ein Zone ausgewählt ist dann wird dieser Modul nur für ausgew&aauml;hlte Zone aktiviert.'); + define('MODULE_PAYMENT_NOVALNET_TEL_ALLOWED_TITLE', 'erlaubte Zonen'); + define('MODULE_PAYMENT_NOVALNET_TEL_ALLOWED_DESC', 'Bitte die gewünschten Zonen mit komma getrennt eingeben(Zb:AT,DE) oder einfach leer lassen'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_PUBLIC_TITLE', '
Bezahlung - Novalnet AG Telefonpayment - Pay by callBezahlung - Novalnet AG
'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP_INFO', 'Folgende Schritte sind noetig um Ihre Zahlung abzuschliessen:'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP1', 'Schritt 1:'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP2', 'Schritt 2:'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP1_DESC', 'Bitte rufen Sie die angezeigte Telefonnummer an:'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP2_DESC', 'Bitte warten Sie auf den Signalton und legen Sie dann den Hoerer auf.
Nach Ihrem erfolgreichen Anruf klicken Sie bitte unten auf Weiter.'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_COST_INFO', '* Dieser Anruf kostet einmalig '); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_TAX_INFO', '€ (inkl. MwSt) und ist nur vom Deutschen Festnetzanschluss moeglich! *'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_AMOUNT_ERROR1', 'Betraege unter 0,90 Euro und ueber 10,00 Euro koennen nicht verarbeitet werden bzw. werden nicht akzeptiert!'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_AMOUNT_ERROR2', 'Betraege unter 0,90 Euro koennen nicht verarbeitet werden bzw. werden nicht akzeptiert!'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_ERROR', 'Zahlung nicht moeglich!'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_JS_NN_MISSING', '* Der zugrundeliegende Parameter fehlt.'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_ORDERNO', 'Best.-Nr.: '); + define('MODULE_PAYMENT_NOVALNET_TEL_TEXT_ORDERDATE', 'Best.-Datum: '); + define('MODULE_PAYMENT_NOVALNET_TEL_TEST_MODE', 'Testmodus'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEST_MODE_TITLE', 'Test-Modus-Aktivierung'); + define('MODULE_PAYMENT_NOVALNET_TEL_TEST_MODE_DESC', 'Wollen Sie den Test-Modus aktivieren?'); + define('MODULE_PAYMENT_NOVALNET_TEL_PROXY_TITLE', 'Proxy'); + define('MODULE_PAYMENT_NOVALNET_TEL_PROXY_DESC', 'Wenn Sie ein Proxy einsetzen, tragen Sie hier Ihre Proxy-IP ein (z.B. www.proxy.de:80)'); + +?> diff --git a/includes/modules/pages/checkout_novalnet_confirmation/header_php.php b/includes/modules/pages/checkout_novalnet_confirmation/header_php.php new file mode 100644 index 0000000..d1367da --- /dev/null +++ b/includes/modules/pages/checkout_novalnet_confirmation/header_php.php @@ -0,0 +1,63 @@ +notify('NOTIFY_HEADER_START_CHECKOUT_CONFIRMATION'); + +// if there is nothing in the customers cart, redirect them to the shopping cart page +if ($_SESSION['cart']->count_contents() <= 0) { + zen_redirect(zen_href_link(FILENAME_TIME_OUT)); +} + +// if the customer is not logged on, redirect them to the login page + if (!$_SESSION['customer_id']) { + $_SESSION['navigation']->set_snapshot(array('mode' => 'SSL', 'page' => FILENAME_CHECKOUT_PAYMENT)); + zen_redirect(zen_href_link(FILENAME_LOGIN, '', 'SSL')); + } else { + // validate customer + if (zen_get_customer_validate_session($_SESSION['customer_id']) == false) { + $_SESSION['navigation']->set_snapshot(); + zen_redirect(zen_href_link(FILENAME_LOGIN, '', 'SSL')); + } + } + +// avoid hack attempts during the checkout procedure by checking the internal cartID +if (isset($_SESSION['cart']->cartID) && $_SESSION['cartID']) { + if ($_SESSION['cart']->cartID != $_SESSION['cartID']) { + zen_redirect(zen_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL')); + } +} + +// load the selected payment module +require(DIR_WS_CLASSES . 'payment.php'); + +$payment_modules = new payment($_SESSION['payment']); + +if ($messageStack->size('checkout_payment') > 0) { + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL')); +} + +if (isset($_GET['payment_error']) && is_object(${$_GET['payment_error']}) && ($error = ${$_GET['payment_error']}->get_error())) { + //print $error; + $messageStack->add('checkout_payment', $error['error'], 'error'); +} +// This should be last line of the script: +$zco_notifier->notify('NOTIFY_HEADER_END_CHECKOUT_CONFIRMATION'); +?> \ No newline at end of file diff --git a/includes/modules/payment/novalnet_cc.php b/includes/modules/payment/novalnet_cc.php new file mode 100644 index 0000000..004fe8c --- /dev/null +++ b/includes/modules/payment/novalnet_cc.php @@ -0,0 +1,663 @@ +key = MODULE_PAYMENT_NOVALNET_CC_PASSWORD; + $this->code = 'novalnet_cc'; + $this->title = MODULE_PAYMENT_NOVALNET_CC_TEXT_TITLE; + $this->public_title = MODULE_PAYMENT_NOVALNET_CC_TEXT_PUBLIC_TITLE; + $this->description = MODULE_PAYMENT_NOVALNET_CC_TEXT_DESCRIPTION; + $this->sort_order = MODULE_PAYMENT_NOVALNET_CC_SORT_ORDER; + $this->enabled = ((MODULE_PAYMENT_NOVALNET_CC_STATUS == 'True') ? true : false); + $this->proxy = MODULE_PAYMENT_NOVALNET_CC_PROXY; + $this->implementation = 'PHP_PCI'; + + $this->checkReturnedData(); + + if ((int)MODULE_PAYMENT_NOVALNET_CC_ORDER_STATUS_ID > 0){ + $this->order_status = MODULE_PAYMENT_NOVALNET_CC_ORDER_STATUS_ID; + } + if (is_object($order)) $this->update_status(); + $error = $this->get_error(); + if($_POST['session'] && $_SESSION['payment'] == $this->code){ + $this->checkSecurity(); + } + + } + + ### calculate zone matches and flag settings to determine whether this module should display to customers or not ### + function update_status(){ + global $order, $db; + + if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_NOVALNET_CC_ZONE > 0) ){ + $check_flag = false; + $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_NOVALNET_CC_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id"); + + while (!$check->EOF){ + if ($check->fields['zone_id'] < 1){ + $check_flag = true; + break; + }elseif ($check->fields['zone_id'] == $order->billing['zone_id']) { + $check_flag = true; + break; + } + $check->MoveNext(); + } + + if ($check_flag == false){ + $this->enabled = false; + } + } + } + + ### JS validation which does error-checking of data-entry if this module is selected for use ### + ### the fields to be cheked are (Bank Owner, Bank Account Number and Bank Code Lengths) ### + ### currently this function is not in use ### + // @return string + function javascript_validation() { + return false; + } + + ### Builds set of input fields for collecting Bankdetail info ### + // @return array + function selection() { + global $order, $HTTP_POST_VARS, $_POST, $HTTP_GET_VARS, $_GET; + $onFocus = ''; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + $selection = array('id' => $this->code, + 'module' => $this->public_title, + 'fields' => array(array()) + ); + + if(function_exists(get_percent)){ + $selection['module_cost'] = $GLOBALS['ot_payment']->get_percent($this->code); + } + + return $selection; + } + + ### Precheck to Evaluate the Bank Datas ### + function pre_confirmation_check(){ + global $HTTP_POST_VARS, $_POST,$messageStack; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + $error = ''; + + if(!MODULE_PAYMENT_NOVALNET_CC_VENDOR_ID || !MODULE_PAYMENT_NOVALNET_CC_AUTH_CODE || !MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID || !MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID || !MODULE_PAYMENT_NOVALNET_CC_PASSWORD){ + $error = MODULE_PAYMENT_NOVALNET_CC_TEXT_JS_NN_MISSING; + } + + if (defined('MODULE_PAYMENT_NOVALNET_CC_MANUAL_CHECK_LIMIT') and MODULE_PAYMENT_NOVALNET_CC_MANUAL_CHECK_LIMIT){ + if ( (!defined('MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID2') or !MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID2)) or (!defined('MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID2') or !MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID2))) { + $error = 'Product-ID2 and/or Tariff-ID2 missing'; + } + } + + if($error!=''){ + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', $error . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + } + + ### Display Information on the Checkout Confirmation Page ### + // @return array + function confirmation(){ + global $HTTP_POST_VARS, $_POST, $order; + $_SESSION['nn_total'] = $order->info['total']; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + return $confirmation; + } + + ### Build the data and actions to process when the "Submit" button is pressed on the order-confirmation screen. ### + ### These are hidden fields on the checkout confirmation page ### + // @return string + function process_button(){ + return false; + } + + ### Insert the Novalnet Transaction ID in DB ### + function before_process(){ + global $HTTP_POST_VARS, $_POST, $order, $db, $currencies, $messageStack, $insert_id; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + if($_POST['tid'] && $_POST['status'] == '100'){ + if( $this->order_status ) { + $order->info['order_status'] = $this->order_status; + } + if($_POST['test_mode'] && $_POST['test_mode'] == '1'){ + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_CC_TEST_ORDER_MESSAGE; + }else if (strtolower(MODULE_PAYMENT_NOVALNET_CC_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_CC_TEST_MODE == '1'){ + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_CC_TEST_ORDER_MESSAGE; + } + $_SESSION['tid'] = $_POST['tid']; + $order->info['comments'] .= '. Novalnet TID : '.$_POST['tid']; + + }else { + + #Get the required additional customer details from DB + $customer_values = $db->Execute("SELECT customers_gender, customers_dob, customers_fax FROM ". TABLE_CUSTOMERS . " WHERE customers_id='". (int)$_SESSION['customer_id'] ."'"); + + while(!$customer_values->EOF) { + $customer_values->MoveNext(); + } + + list($customer_values->fields['customers_dob'], $extra) = explode(' ', $customer_values->fields['customers_dob']); + + if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status_add_tax_ot'] == 1) { + $totalamount=$order->info['total'] + $order->info['tax']; + } else { + $totalamount=$order->info['total']; + } + + $amount =sprintf('%.2f', $totalamount); + + if (preg_match('/[^\d\.]/', $amount) or !$amount){ + ### $amount contains some unallowed chars or empty ### + $err = '$amount ('.$amount.') is empty or has a wrong format'; + $order->info['comments'] .= 'Novalnet Error Message : '.$err; + $payment_error_return = 'payment_error='.$this->code; + $messageStack->add_session('checkout_payment', $err . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + + $amount = preg_replace('/^0+/', '', $amount); + $amount = sprintf('%0.2f', $amount); + $amount = str_replace('.', '', $amount); + #echo __CLASS__.' : '.$order->info['total']." <=> $amount
"; + + $product_id = MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID; + $manual_check_limit = trim(MODULE_PAYMENT_NOVALNET_CC_MANUAL_CHECK_LIMIT); + $manual_check_limit = str_replace(',', '', $manual_check_limit); + $manual_check_limit = str_replace('.', '', $manual_check_limit); + + if($manual_check_limit && $amount>=$manual_check_limit){ + $product_id = MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID2; + $tariff_id = MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID2; + } + + $uniqid = uniqid(); + + //print $amount; exit; + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_CC_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_CC_TEST_MODE == '1')? 1: 0; + + list($auth_code, $product_id, $tariff_id, $amount, $test_mode, $uniqid, $hash) = $this->encodeParams($auth_code=MODULE_PAYMENT_NOVALNET_CC_AUTH_CODE, $product_id, $tariff_id, $amount, $test_mode, $uniqid); + + $user_ip = $this->getRealIpAddr(); + + $checkout_url = zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'); + + + if(strstr($checkout_url, '?')){ + $checkout_url = str_replace(' ', '', $checkout_url); + if(substr($checkout_url,-1)=='?')$error_url = $checkout_url.'payment_error=novalnet_cc&error=$ERROR_MESSAGE ($STATUS)'; + else $error_url = $checkout_url.'&payment_error=novalnet_cc&error=$ERROR_MESSAGE ($STATUS)'; + + } + + else $error_url = $checkout_url.'?payment_error=novalnet_cc&error=$ERROR_MESSAGE ($STATUS)'; + + $_SESSION['order_status_id_value']=$this->order_status; + $oldreturnurl=zen_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL'); + $old_value=explode(':',$oldreturnurl); + $new_protocol_value=(empty($_SERVER["HTTPS"])) ? 'http' : 'https'; + $return_url=$new_protocol_value.':'.$old_value[1]; + + $data = array('iframe_field'=>( + array( + 'vendor_id' => MODULE_PAYMENT_NOVALNET_CC_VENDOR_ID, + 'product_id' => $product_id, + 'payment_id' => '6', + 'tariff_id' => $tariff_id, + 'vendor_authcode' => $auth_code, + 'is_iframe' => '1', + 'uniqid' => $uniqid, + 'hash' => $hash, + 'currency' => $order->info['currency'], + 'amount' => $amount, + 'firstname' => $this->html_to_utf8($order->customer['firstname']), + 'lastname' => $this->html_to_utf8($order->customer['lastname']), + 'gender' => 'u', + 'email' => $order->customer['email_address'], + 'street' => $this->html_to_utf8($order->customer['street_address']), + 'search_in_street' => 1, + 'city' => $this->html_to_utf8($order->customer['city']), + 'zip' => $order->customer['postcode'], + 'country_code' => $order->customer['country']['iso_code_2'], + 'session' => zen_session_id(), + 'remote_ip' => $user_ip, + 'lang' => MODULE_PAYMENT_NOVALNET_CC_TEXT_LANG, + 'return_url' => $return_url, + 'return_method' => 'POST', + 'error_return_url' => $error_url, + 'error_return_method' => 'POST', + 'test_mode' => $test_mode, + 'implementation' => strtoupper($this->implementation) + ))); + $_SESSION['iFrame_params']= $data; + if(zen_session_id()) zen_redirect(zen_href_link('checkout_novalnet_confirmation', $payment_error_return, 'SSL', true, false)); + else zen_redirect(xtc_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + + } + } + + function isPublicIP($value){ + if(!$value || count(explode('.',$value))!=4) return false; + return !preg_match('~^((0|10|172\.16|192\.168|169\.254|255|127\.0)\.)~', $value); + } + + ### get the real Ip Adress of the User ### + function getRealIpAddr(){ + if($this->isPublicIP($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR']; + if($iplist=explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])){ + if($this->isPublicIP($iplist[0])) return $iplist[0]; + } + if ($this->isPublicIP($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_FORWARDED_FOR']) ) return $_SERVER['HTTP_FORWARDED_FOR']; + + return $_SERVER['REMOTE_ADDR']; + } + + ### Send the order detail to Novalnet ### + function after_process() { + unset($_SESSION['iFrame_params']['iframe_field']); + global $insert_id, $_POST; + + $product_id = MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID; + if($_POST['tid']){ + ### Pass the Order Reference to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_CC_VENDOR_ID.'&product='.$product_id.'&key=6&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_CC_AUTH_CODE.'&status=100&tid='.$_POST['tid'].'&reference=BNR-'.$insert_id.'&vwz2='.MODULE_PAYMENT_NOVALNET_CC_TEXT_ORDERNO.''.$insert_id.'&vwz3='.MODULE_PAYMENT_NOVALNET_CC_TEXT_ORDERDATE.''.date('Y-m-d H:i:s'); + $urlparam .= '&order_no='.$insert_id; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + $_POST['tid'] = ''; + ### Implement here the Emailversand and further functions, incase if you want to send a own email ### + } + return false; + } + + ### Used to display error message details ### + // @return array + function get_error() { + global $HTTP_GET_VARS, $_GET; + if(count($HTTP_GET_VARS)==0 || $HTTP_GET_VARS==''){ + $HTTP_GET_VARS = $_GET; + } + $error = array('title' => MODULE_PAYMENT_NOVALNET_CC_TEXT_ERROR, + 'error' => stripslashes(urldecode($HTTP_GET_VARS['error']))); + return $error; + } + + ### Check to see whether module is installed ### + // @return boolean + function check() { + global $db; + if (!isset($this->_check)) { + $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_NOVALNET_CC_STATUS'"); + $this->_check = $check_query->RecordCount(); + } + return $this->_check; + } + + ### Install the payment module and its configuration settings ### + function install() { + global $db; + $db->Execute("alter table ".TABLE_ORDERS." modify payment_method varchar(250)"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Allowed zones', 'MODULE_PAYMENT_NOVALNET_CC_ALLOWED', '', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))', '6', '0', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable CC Module', 'MODULE_PAYMENT_NOVALNET_CC_STATUS', 'True', 'Do you want to activate the Credit Card Method(CC) of Novalnet AG?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Test Mode', 'MODULE_PAYMENT_NOVALNET_CC_TEST_MODE', 'True', 'Do you want to enable the test mode?', '6', '2', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Please contact sales@novalnet.de if you do not have any of the following Novalnet IDs!

Wenn Sie keine oder irgendeine der folgenden Novalnet IDs nicht haben sollten, bitte sich an sales@novalnet.de wenden!

Novalnet Merchant ID', 'MODULE_PAYMENT_NOVALNET_CC_VENDOR_ID', '', 'Your Merchant ID of Novalnet', '6', '3', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Authorisation Code', 'MODULE_PAYMENT_NOVALNET_CC_AUTH_CODE', '', 'Your Authorisation Code of Novalnet', '6', '4', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Product ID', 'MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID', '', 'Your Product ID of Novalnet', '6', '5', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Tariff ID', 'MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID', '', 'Your Tariff ID of Novalnet', '6', '6', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Manual checking amount in cents', 'MODULE_PAYMENT_NOVALNET_CC_MANUAL_CHECK_LIMIT', '', 'Please enter the amount in cents', '6', '8', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your second Product ID in Novalnet', 'MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID2', '', 'for the manual checking', '6', '9', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('The Tariff ID of the second product', 'MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID2', '', 'for the manual checking', '6', '10', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Enter password here', 'MODULE_PAYMENT_NOVALNET_CC_PASSWORD', '', 'for the manual checking', '6', '11', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your Booking Reference at Novalnet', 'MODULE_PAYMENT_NOVALNET_CC_BOOK_REF', '', 'Your Booking Reference at Novalnet', '6', '12', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_NOVALNET_CC_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '13', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_NOVALNET_CC_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '14', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_NOVALNET_CC_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '15', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Proxy', 'MODULE_PAYMENT_NOVALNET_CC_PROXY', '0', 'If you use a Proxy Server, enter the Proxy Server IP with port here (e.g. www.proxy.de:80)', '6', '16', now())"); + + } + + ### Remove the module and all its settings ### + function remove(){ + global $db; + $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')"); + } + + ### Internal list of configuration keys used for configuration of the module ### + // @return array + function keys() { + return array('MODULE_PAYMENT_NOVALNET_CC_ALLOWED', 'MODULE_PAYMENT_NOVALNET_CC_STATUS', 'MODULE_PAYMENT_NOVALNET_CC_TEST_MODE', 'MODULE_PAYMENT_NOVALNET_CC_VENDOR_ID', 'MODULE_PAYMENT_NOVALNET_CC_AUTH_CODE', 'MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID', 'MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID', 'MODULE_PAYMENT_NOVALNET_CC_MANUAL_CHECK_LIMIT', 'MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID2', 'MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID2','MODULE_PAYMENT_NOVALNET_CC_PASSWORD', 'MODULE_PAYMENT_NOVALNET_CC_BOOK_REF', 'MODULE_PAYMENT_NOVALNET_CC_SORT_ORDER', 'MODULE_PAYMENT_NOVALNET_CC_ORDER_STATUS_ID', 'MODULE_PAYMENT_NOVALNET_CC_ZONE', 'MODULE_PAYMENT_NOVALNET_CC_PROXY'); + } + + ### replace the Special German Charectors ### + function ReplaceSpecialGermanChars($string){ + $what = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß"); + $how = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss"); + + $string = str_replace($what, $how, $string); + + return $string; + } + function html_to_utf8 ($data){ + return preg_replace("/\\&\\#([0-9]{3,10})\\;/e", '$this->_html_to_utf8("\\1")', $data); + } + + function _html_to_utf8 ($data){ + if ($data > 127){ + $i = 5; + while (($i--) > 0){ + if ($data != ($a = $data % ($p = pow(64, $i)))){ + $ret = chr(base_convert(str_pad(str_repeat(1, $i + 1), 8, "0"), 2, 10) + (($data - $a) / $p)); + for ($i; $i > 0; $i--) + $ret .= chr(128 + ((($data % pow(64, $i)) - ($data % ($p = pow(64, $i - 1)))) / $p)); + break; + } + } + }else{ + $ret = "&#$data;"; + } + return $ret; + } + + ### Realtime accesspoint for communication to the Novalnet paygate ### + function perform_https_request($nn_url, $urlparam){ + $debug = 0;#set it to 1 if you want to activate the debug mode + + if($debug) print "
perform_https_request: $nn_url
\n\r\n"; + if($debug) print "perform_https_request: $urlparam
\n\r\n"; + + ## some prerquisites for the connection + $ch = curl_init($nn_url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + + if ($this->proxy){ + curl_setopt($ch, CURLOPT_PROXY, $this->proxy); + } + + ## establish connection + $data = curl_exec($ch); + $data = $this->ReplaceSpecialGermanChars($data); + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug){ + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + } + + #close connection + curl_close($ch); + + ## read and return data from novalnet paygate + if($debug) print "
\n\n" . $data . "\n
\n\n"; + + return array ($errno, $errmsg, $data); + } + + + function debug2($object, $filename, $debug = false) + { + if (!$debug){return;} + $fh = fopen("/tmp/$filename", 'a+'); + fwrite($fh, date('Y-m-d H:i:s').' '.print_r($object, true)); + fwrite($fh, "


\n"); + fclose($fh); + } + + function checkSecurity() { + global $_POST, $order, $insert_id, $messageStack; + + if(strlen(trim($_POST['tid']))==17 && $_POST['status']==100 && $_POST['session']== zen_session_id()){ + #xtc_redirect(zen_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL')); + }else{ + if($_POST['status_desc']){ + $error_status = $_POST['status_desc']; + }else { + $error_status = "There was an error and your payment could not be completed "; + } + $err = $error_status." (".$_POST['status'].")"; + #'session missing or returned session is wrong'; + $order->info['comments'] .= '. Novalnet Error Message : '.$err; + $payment_error_return = 'payment_error='.$this->code/*.'&error='.$err*/; + $messageStack->add_session('checkout_payment', $err . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + } + + function encode($data){ + $data = trim($data); + if ($data == '') return'Error: no data'; + if (!function_exists('base64_encode') or !function_exists('pack') or !function_exists('crc32')){return'Error: func n/a';} + + try { + $crc = sprintf('%u', crc32($data));# %u is a must for ccrc32 returns a signed value + $data = $crc."|".$data; + $data = bin2hex($data.$this->key); + $data = strrev(base64_encode($data)); + }catch (Exception $e){ + echo('Error: '.$e); + } + return $data; + } + + function decode($data) { + + $data = trim($data); + if ($data == '') { + return'Error: no data'; + } + if (!function_exists('base64_decode') or !function_exists('pack') or !function_exists('crc32')){ + return'Error: func n/a'; + } + + try { + $data = base64_decode(strrev($data)); + $data = pack("H".strlen($data), $data); + $data = substr($data, 0, stripos($data, $this->key)); + $pos = strpos($data, "|"); + if ($pos === false) + { + return("Error: CKSum not found!"); + } + $crc = substr($data, 0, $pos); + $value = trim(substr($data, $pos+1)); + if ($crc != sprintf('%u', crc32($value))) { + return("Error; CKSum invalid!"); + } + return $value; + }catch (Exception $e){ + echo('Error: '.$e); + } + } + + function hash($h){ #$h contains encoded data + global $amount_zh; + if (!$h) return'Error: no data'; + if (!function_exists('md5')){return'Error: func n/a';} + return md5($h['auth_code'].$h['product_id'].$h['tariff'].$h['amount'].$h['test_mode'].$h['uniqid'].strrev($this->key)); + } + + function checkHash($request) { + if (!$request) return false; #'Error: no data'; + $h['auth_code'] = $request['vendor_authcode'];#encoded + $h['product_id'] = $request['product_id'];#encoded + $h['tariff'] = $request['tariff_id'];#encoded + $h['amount'] = $request['amount'];#encoded + $h['test_mode'] = $request['test_mode'];#encoded + $h['uniqid'] = $request['uniqid'];#encoded + if ($request['hash2']!= $this->hash($h)){ + return false; + } + return true; + } + + function checkHash4java($request) { + if (!$request) return false; #'Error: no data'; + $h['auth_code'] = $request['auth_code'];#encoded + $h['product_id'] = $request['product_id'];#encoded + $h['tariff'] = $request['tariff_id'];#encoded + $h['amount'] = $request['amount'];#encoded + $h['test_mode'] = $request['test_mode'];#encoded + $h['uniqid'] = $request['uniqid'];#encoded + if ($request['hash2'] != $this->hash($h)){ + return false; + } + return true; + } + + function encode4java($data = '', $func = '') { + + echo"encode4java"; exit; + $salt = 1010; + if (!isset($data) or trim($data) == '' or !$func){ + return'Error: missing arguments: $str and/or $func!'; + } + + if ($func != 'decbin' and $func != 'bindec'){ + return'Error: $func has wrong value!'; + } + + if ($func == 'decbin'){ + return decbin(intval($data) + intval($salt)); + }else{ + return bindec($data) - intval($salt); + } + } + + + function checkReturnedData(){ + if ($_POST['hash2'] && $_SESSION['payment'] == $this->code){ + if (strtoupper($this->implementation) == 'JAVA_PCI'){ + #Java encoded + if( $_POST['vendor_authcode'] != md5(MODULE_PAYMENT_NOVALNET_CC_PCI_AUTH_CODE.strrev($this->key)) ){ + $err = MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_HASH_ERROR.'; wrong auth_code!'; + $payment_error_return = 'payment_error=novalnet_cc_pci&error='.$_POST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + $_POST['auth_code'] = MODULE_PAYMENT_NOVALNET_CC_PCI_AUTH_CODE;#todo: check? + $_POST['product_id'] = $this->encode4java($_POST['product_id'], 'bindec'); + $_POST['tariff_id'] = $this->encode4java($_POST['tariff_id'], 'bindec'); + $_POST['amount'] = $this->encode4java($_POST['amount'], 'bindec'); + $_POST['test_mode'] = $this->encode4java($_POST['test_mode'], 'bindec'); + $_POST['uniqid'] = $this->encode4java($_POST['uniqid'], 'bindec'); + + if (!$this->checkHash4java($_POST)){ #PHP encoded + $err = MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_HASH_ERROR; + $payment_error_return = 'payment_error=novalnet_cc_pci&error='.$_POST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + }else{ #PHP encoded + if (!$this->checkHash($_POST)){ + $err = MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_HASH_ERROR; + $payment_error_return = 'payment_error=novalnet_cc_pci&error='.$_POST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + }else{ + $_POST['test_mode'] = $this->decode($_POST['test_mode']); + } + } + } + } + + function encodeParams($auth_code, $product_id, $tariff_id, $amount, $test_mode, $uniqid){ + if (strtoupper($this->implementation) == 'JAVA_PCI'){ + $uniqid = time();#must ne a long integer + $hash = md5($auth_code.$product_id.$tariff_id.$amount.$test_mode.$uniqid.strrev($this->key)); + $auth_code = md5($auth_code.strrev($this->key)); + $product_id = $this->encode4java($product_id, 'decbin'); + $tariff_id = $this->encode4java($tariff_id, 'decbin'); + $amount = $this->encode4java($amount, 'decbin'); + $test_mode = $this->encode4java($test_mode, 'decbin'); + $uniqid = $this->encode4java($uniqid, 'decbin'); + }else{ + $auth_code = $this->encode($auth_code); + $product_id = $this->encode($product_id); + $tariff_id = $this->encode($tariff_id); + $amount = $this->encode($amount); + $test_mode = $this->encode($test_mode); + $uniqid = $this->encode($uniqid); + $hash = $this->hash(array('auth_code' => $auth_code, 'product_id' => $product_id, 'tariff' => $tariff_id, 'amount' => $amount, 'test_mode' => $test_mode, 'uniqid' => $uniqid)); + } + return array($auth_code, $product_id, $tariff_id, $amount, $test_mode, $uniqid, $hash); + } + +} + /* + flow of functions: + selection -> $order-info['total'] wrong, cause shipping_cost is net + pre_confirmation_check -> $order-info['total'] wrong, cause shipping_cost is net + confirmation -> $order-info['total'] right, cause shipping_cost is gross + process_button -> $order-info['total'] right, cause shipping_cost is gross + before_process -> $order-info['total'] wrong, cause shipping_cost is net + after_process -> $order-info['total'] right, cause shipping_cost is gross + --------------- + */ + +?> diff --git a/includes/modules/payment/novalnet_cc3d.php b/includes/modules/payment/novalnet_cc3d.php new file mode 100644 index 0000000..8d6d1fc --- /dev/null +++ b/includes/modules/payment/novalnet_cc3d.php @@ -0,0 +1,553 @@ +code = 'novalnet_cc3d'; + $this->title = MODULE_PAYMENT_NOVALNET_CC3D_TEXT_TITLE; + #$this->public_title = MODULE_PAYMENT_NOVALNET_CC3D_TEXT_PUBLIC_TITLE; + $this->description = MODULE_PAYMENT_NOVALNET_CC3D_TEXT_DESCRIPTION; + $this->sort_order = MODULE_PAYMENT_NOVALNET_CC3D_SORT_ORDER; + $this->enabled = ((MODULE_PAYMENT_NOVALNET_CC3D_STATUS == 'True') ? true : false); + $this->proxy = MODULE_PAYMENT_NOVALNET_CC3D_PROXY; + + if ((int)MODULE_PAYMENT_NOVALNET_CC3D_ORDER_STATUS_ID > 0) { + $this->order_status = MODULE_PAYMENT_NOVALNET_CC3D_ORDER_STATUS_ID; + } + + if (is_object($order)) $this->update_status(); + $this->form_action_url = 'https://payport.novalnet.de/global_pci_payport'; + } + + ### calculate zone matches and flag settings to determine whether this module should display to customers or not ### + function update_status() { + global $order, $db; + + if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_NOVALNET_CC3D_ZONE > 0) ) { + $check_flag = false; + $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_NOVALNET_CC3D_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id"); + while (!$check->EOF) { + if ($check->fields['zone_id'] < 1) { + $check_flag = true; + break; + } elseif ($check->fields['zone_id'] == $order->billing['zone_id']) { + $check_flag = true; + break; + } + $check->MoveNext(); + } + + if ($check_flag == false) { + $this->enabled = false; + } + } + } + + ### JS validation which does error-checking of data-entry if this module is selected for use ### + ### the fields to be cheked are (Bank Owner, Bank Account Number and Bank Code Lengths) ### + ### currently this function is not in use ### + // @return string + function javascript_validation() { + return false; + } + + ### Builds set of input fields for collecting Bankdetail info ### + // @return array + function selection() { + global $xtPrice, $order, $HTTP_POST_VARS, $_POST; + $onFocus = ' onfocus="methodSelect(\'pmt-' . $this->code . '\')"'; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + $card_holder = ''; + if (isset($HTTP_POST_VARS['cc3d_holder'])) {$card_holder = $HTTP_POST_VARS['cc3d_holder'];} + if(!$card_holder and isset($_SESSION['cc3d_holder'])){$card_holder = $_SESSION['cc3d_holder'];} + if(!$card_holder){$card_holder=$order->billing['firstname'].' '.$order->billing['lastname'];} + $cc3d_no = ''; + if (isset($HTTP_POST_VARS['cc3d_no'])) {$cc3d_no = $HTTP_POST_VARS['cc3d_no'];} + if(!$cc3d_no and isset($_SESSION['cc3d_no'])){$cc3d_no = $_SESSION['cc3d_no'];} + $cc3d_exp_month = ''; + if (isset($HTTP_POST_VARS['cc3d_exp_month'])) {$cc3d_exp_month = $HTTP_POST_VARS['cc3d_exp_month'];} + if(!$cc3d_exp_month and isset($_SESSION['cc3d_exp_month'])){$cc3d_exp_month = $_SESSION['cc3d_exp_month'];} + $cc3d_exp_year = ''; + if (isset($HTTP_POST_VARS['cc3d_exp_year'])) {$cc3d_exp_year = $HTTP_POST_VARS['cc3d_exp_year'];} + if(!$cc3d_exp_year and isset($_SESSION['cc3d_exp_year'])){$cc3d_exp_year = $_SESSION['cc3d_exp_year'];} + $cc3d_cvc2 = ''; + if (isset($HTTP_POST_VARS['cc3d_cvc2'])) {$cc3d_cvc2 = $HTTP_POST_VARS['cc3d_cvc2'];} + if(!$cc3d_cvc2 and isset($_SESSION['cc3d_cvc2'])){$cc3d_cvc2 = $_SESSION['cc3d_cvc2'];} + + $book_info = str_replace('$BOOKINFO', MODULE_PAYMENT_NOVALNET_CC3D_BOOK_REF, MODULE_PAYMENT_NOVALNET_CC3D_TEXT_BOOKING_INFO); + + $expires_month[] = array ('id' => '', 'text' => MODULE_PAYMENT_NOVALNET_CC3D_TEXT_SELECT); + for ($i = 1; $i < 13; $i ++) + { + $expires_month[] = array ('id' => sprintf('%02d', $i), 'text' => strftime('%B', mktime(0, 0, 0, $i, 1, 2000))); + } + + $today = getdate(); + $expires_year[] = array ('id' => '', 'text' => MODULE_PAYMENT_NOVALNET_CC3D_TEXT_SELECT); + for ($i = $today['year']; $i < $today['year'] + 10; $i ++) + { + $expires_year[] = array ('id' => strftime('%y', mktime(0, 0, 0, 1, 1, $i)), 'text' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i))); + } + + $selection = array('id' => $this->code, + 'module' => $this->title, + 'fields' => array(array('title' => MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CARD_OWNER, + 'field' => zen_draw_input_field('cc3d_holder', $card_holder, 'id="'.$this->code.'-cc3d_holder"' . $onFocus), + 'tag' => $this->code.'-cc3d_holder'), + array('title' => MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CC_NO, + 'field' => zen_draw_input_field('cc3d_no', '', 'id="' . $this->code . '-cc3d_no"' . $onFocus), + 'tag' => $this->code . '-cc3d_no'), + array('title' => MODULE_PAYMENT_NOVALNET_CC3D_TEXT_EXP_MONTH, + 'field' => zen_draw_pull_down_menu('cc3d_exp_month', $expires_month, $_SESSION['cc3d_exp_month'], 'id="' . $this->code . '-cc3d_exp_month"' . $onFocus), + 'tag' => $this->code . '-cc3d_exp_month'), + array('title' => MODULE_PAYMENT_NOVALNET_CC3D_TEXT_EXP_YEAR, + 'field' => zen_draw_pull_down_menu('cc3d_exp_year', $expires_year, $_SESSION['cc3d_exp_year'], 'id="' . $this->code . '-cc3d_exp_year"' . $onFocus), + 'tag' => $this->code . '-cc3d_exp_year'), + array('title' => MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CVC, + 'field' => zen_draw_input_field('cc3d_cvc2', '' /*$cc3d_cvc2*/, 'id="' . $this->code . '-cc3d_cvc2"' . $onFocus. 'maxlength=3').MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CVC2.$book_info, + 'tag' => $this->code . '-cc3d_cvc2') + )); + + /*if(function_exists('get_percent')) + { + $selection['module_cost'] = $GLOBALS['ot_payment']->get_percent($this->code); + }*/ + + return $selection; + } + + ### Precheck to Evaluate the Bank Datas ### + function pre_confirmation_check() { + global $HTTP_POST_VARS, $_POST,$messageStack; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + + $HTTP_POST_VARS['cc3d_holder'] = trim($HTTP_POST_VARS['cc3d_holder']); + $HTTP_POST_VARS['cc3d_no'] = trim($HTTP_POST_VARS['cc3d_no']); + $HTTP_POST_VARS['cc3d_exp_month'] = trim($HTTP_POST_VARS['cc3d_exp_month']); + $HTTP_POST_VARS['cc3d_exp_year'] = trim($HTTP_POST_VARS['cc3d_exp_year']); + $HTTP_POST_VARS['cc3d_cvc2'] = trim($HTTP_POST_VARS['cc3d_cvc2']); + #echo'
';var_dump($_REQUEST); exit;
+    $error = '';
+	
+    if (defined('MODULE_PAYMENT_NOVALNET_CC3D_MANUAL_CHECK_LIMIT') and MODULE_PAYMENT_NOVALNET_CC3D_MANUAL_CHECK_LIMIT){
+      if ( (!defined('MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID2') or !MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID2)) or (!defined('MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID2') or !MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID2))){
+          $error = 'Product-ID2 and/or Tariff-ID2 missing';
+      }
+    }
+
+  
+    if(!$HTTP_POST_VARS['cc3d_holder'] || strlen($HTTP_POST_VARS['cc3d_holder'])code;
+      $messageStack->add_session('checkout_payment', $error . '', 'error');
+      zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));
+    }
+  }
+
+  ### Display Bank Information on the Checkout Confirmation Page ###
+  // @return array
+  function confirmation() {
+    global $HTTP_POST_VARS, $_POST, $order;
+    $_SESSION['nn_total'] = $order->info['total'];
+    if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST;
+
+
+      $cardnoLength = strlen(str_replace(' ','',$HTTP_POST_VARS['cc3d_no']));
+      $crdNo = str_replace(' ','',$HTTP_POST_VARS['cc3d_no']);
+      $cardnoInfo = '';
+      $chkLength = $cardnoLength-5;
+      for($i=0;$i<$cardnoLength;$i++){
+	if($i >= $chkLength){
+	$cardnoInfo .= '*';
+	}else{
+	$cardnoInfo .= $crdNo[$i];
+	}
+      }
+
+      $dcardnoLength = strlen(str_replace(' ','',$HTTP_POST_VARS['cc3d_cvc2']));
+      $card3dInfo = '';
+      for($i=0;$i<$dcardnoLength;$i++){
+      $card3dInfo .= '*';
+      }
+
+      $confirmation = array('fields' => array(array('title' => MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CARD_OWNER,
+                          'field' => $HTTP_POST_VARS['cc3d_holder']),
+                    array('title' => MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CC_NO,
+                          'field' => $cardnoInfo),
+                    array('title' => MODULE_PAYMENT_NOVALNET_CC3D_TEXT_EXP_MONTH,
+			   'field' => $HTTP_POST_VARS['cc3d_exp_month']),
+		    array('title' => MODULE_PAYMENT_NOVALNET_CC3D_TEXT_EXP_YEAR,
+                           'field' => $HTTP_POST_VARS['cc3d_exp_year']),
+		    array('title' => MODULE_PAYMENT_NOVALNET_CC3D_TEXT_CVC,
+                           'field' => $card3dInfo)
+                          ));
+
+    return $confirmation;
+  }
+
+  ### Build the data and actions to process when the "Submit" button is pressed on the order-confirmation screen. ###
+  ### These are hidden fields on the checkout confirmation page ###
+  // @return string
+  function process_button() {
+    global $HTTP_POST_VARS, $_POST, $order, $currencies, $customer_id, $db;
+    if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST;
+
+    #Get the required additional customer details from DB
+    $customer = $db->Execute("SELECT customers_gender, customers_dob, customers_fax FROM ". TABLE_CUSTOMERS . " WHERE customers_id='". (int)$_SESSION['customer_id']."'");
+
+    if ($customer->RecordCount() > 0){
+      $customer = $customer->fields;
+    }
+    list($customer['customers_dob'], $extra) = explode(' ', $customer['customers_dob']);
+
+    if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status_add_tax_ot'] == 1) {
+       $totalamount=$order->info['total'] + $order->info['tax'];
+       } else { 
+       $totalamount=$order->info['total'];
+    }
+   $amount =sprintf('%.2f', $totalamount);
+
+    if (preg_match('/[^\d\.]/', $amount) or !$amount){
+      ### $amount contains some unallowed chars or empty ###
+      $err                      = '$amount ('.$amount.') is empty or has a wrong format';
+      $order->info['comments'] .= 'Novalnet Error Message : '.$err;
+      $payment_error_return     = 'payment_error='.$this->code.'&error='.$err;
+      zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));
+    }
+    $amount = preg_replace('/^0+/', '', $amount);
+    $amount = sprintf('%0.2f', $amount);
+    $amount = str_replace('.', '', $amount);
+    #echo __CLASS__.' : '.$order->info['total']." <=> $amount
"; + + $product_id = MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID; + $manual_check_limit = trim(MODULE_PAYMENT_NOVALNET_CC3D_MANUAL_CHECK_LIMIT); + $manual_check_limit = str_replace(',', '', $manual_check_limit); + $manual_check_limit = str_replace('.', '', $manual_check_limit); + + if($manual_check_limit && $amount>=$manual_check_limit) + { + $product_id = MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID2; + $tariff_id = MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID2; + } + + $user_ip = $this->getRealIpAddr(); + + $checkout_url = zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'); + + if(strstr($checkout_url, '?')) + { + $checkout_url = str_replace(' ', '', $checkout_url); + if(substr($checkout_url,-1)=='?')$error_url = $checkout_url.'payment_error=novalnet_cc3d&error=$ERROR_MESSAGE ($STATUS)'; + else $error_url = $checkout_url.'&payment_error=novalnet_cc3d&error=$ERROR_MESSAGE ($STATUS)'; + } + else $error_url = $checkout_url.'?payment_error=novalnet_cc3d&error=$ERROR_MESSAGE ($STATUS)'; + + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_CC3D_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_CC3D_TEST_MODE == '1')? 1: 0; + + + $oldreturnurl=zen_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL'); + $old_value=explode(':',$oldreturnurl); + $new_protocol_value=(empty($_SERVER["HTTPS"])) ? 'http' : 'https'; + $return_url=$new_protocol_value.':'.$old_value[1]; + + $process_button_string = zen_draw_hidden_field('vendor', MODULE_PAYMENT_NOVALNET_CC3D_VENDOR_ID) . + zen_draw_hidden_field('product', $product_id) . + zen_draw_hidden_field('key', '6') . + zen_draw_hidden_field('tariff', $tariff_id) . + zen_draw_hidden_field('auth_code', MODULE_PAYMENT_NOVALNET_CC3D_AUTH_CODE) . + zen_draw_hidden_field('currency', $order->info['currency']) . + zen_draw_hidden_field('amount', $amount) . + zen_draw_hidden_field('first_name', $this->html_to_utf8($order->customer['firstname'])) . + zen_draw_hidden_field('last_name', $this->html_to_utf8($order->customer['lastname'])) . + zen_draw_hidden_field('email', $order->customer['email_address']) . + zen_draw_hidden_field('street', $this->html_to_utf8($order->customer['street_address'])) . + zen_draw_hidden_field('search_in_street', '1') . + zen_draw_hidden_field('city', $this->html_to_utf8($order->customer['city'])) . + zen_draw_hidden_field('zip', $order->customer['postcode']) . + zen_draw_hidden_field('country_code', $order->customer['country']['iso_code_2']) . + zen_draw_hidden_field('lang', MODULE_PAYMENT_NOVALNET_CC3D_TEXT_LANG) . + zen_draw_hidden_field('remote_ip', $user_ip) . + zen_draw_hidden_field('tel', $order->customer['telephone']) . + zen_draw_hidden_field('fax', $customer['customers_fax']) . + zen_draw_hidden_field('birth_date', $customer['customers_dob']) . + zen_draw_hidden_field('session', zen_session_id()) . + zen_draw_hidden_field('cc_holder', $this->html_to_utf8($HTTP_POST_VARS['cc3d_holder'])) . + zen_draw_hidden_field('cc_no', $HTTP_POST_VARS['cc3d_no']) . + zen_draw_hidden_field('cc_exp_month', $HTTP_POST_VARS['cc3d_exp_month']) . + zen_draw_hidden_field('cc_exp_year', $HTTP_POST_VARS['cc3d_exp_year']) . + zen_draw_hidden_field('cc_cvc2', $HTTP_POST_VARS['cc3d_cvc2']) . + zen_draw_hidden_field('return_url', $return_url) . + zen_draw_hidden_field('return_method', 'POST') . + zen_draw_hidden_field('error_return_url', $error_url) . + zen_draw_hidden_field('test_mode', $test_mode) . + zen_draw_hidden_field('error_return_method', 'POST'); + + return $process_button_string; + } + + ### Insert the Novalnet Transaction ID in DB ### + function before_process() { + global $HTTP_POST_VARS, $_POST, $order, $currencies, $customer_id,$messageStack; + if($_POST['tid'] && $_POST['status'] == '100'){ + if( $this->order_status ) { + $order->info['order_status'] = $this->order_status; + } + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_CC3D_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_CC3D_TEST_MODE == '1')? 1: 0; + $test_mode_value=( $_POST['test_mode'] == 1) ? $_POST['test_mode'] : $test_mode; + if ($test_mode_value){ + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_CC3D_TEST_ORDER_MESSAGE; + } + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + $order->info['comments'] .= 'Novalnet Transaction ID : '.$HTTP_POST_VARS['tid']; + $_SESSION['nn_tid'] = $HTTP_POST_VARS['tid']; + } + } + + function isPublicIP($value) + { + if(!$value || count(explode('.',$value))!=4) return false; + return !preg_match('~^((0|10|172\.16|192\.168|169\.254|255|127\.0)\.)~', $value); + } + + ### get the real Ip Adress of the User ### + function getRealIpAddr() + { + if($this->isPublicIP($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR']; + if($iplist=explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])) + { + if($this->isPublicIP($iplist[0])) return $iplist[0]; + } + if ($this->isPublicIP($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_FORWARDED_FOR']) ) return $_SERVER['HTTP_FORWARDED_FOR']; + + return $_SERVER['REMOTE_ADDR']; + } + + ### replace the Special German Charectors ### + function ReplaceSpecialGermanChars($string) + { + $what = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß"); + $how = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss"); + + $string = str_replace($what, $how, $string); + + return $string; + } + + ### Send the order detail to Novalnet ### + function after_process() { + global $order, $customer_id, $insert_id,$db,$_POST; + + $product_id = MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID; + if($_SESSION['nn_tid']){ + ### Pass the Order Reference to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_CC3D_VENDOR_ID.'&product='.$product_id.'&key=6&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_CC3D_AUTH_CODE.'&status=100&tid='.$_SESSION['nn_tid'].'&reference=BNR-'.$insert_id.'&vwz2='.MODULE_PAYMENT_NOVALNET_CC3D_TEXT_ORDERNO.''.$insert_id.'&vwz3='.MODULE_PAYMENT_NOVALNET_CC3D_TEXT_ORDERDATE.''.date('Y-m-d H:i:s'); + $urlparam .= '&order_no='.$insert_id; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + unset($_SESSION['nn_tid']); + ### Implement here the Emailversand and further functions, incase if you want to send a own email ### + } + return false; + } + + ### Used to display error message details ### + // @return array + function get_error() { + global $HTTP_GET_VARS, $_GET; + if(count($HTTP_GET_VARS)==0 || $HTTP_GET_VARS=='') $HTTP_GET_VARS = $_GET; + + $error = array('title' => MODULE_PAYMENT_NOVALNET_CC3D_TEXT_ERROR, 'error' => stripslashes(utf8_decode($HTTP_GET_VARS['error']))); + + return $error; + } + + ### Check to see whether module is installed ### + // @return boolean + function check() { + global $db; + if (!isset($this->_check)) { + $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_NOVALNET_CC3D_STATUS'"); + $this->_check = $check_query->RecordCount(); + } + return $this->_check; + } + + ### Install the payment module and its configuration settings ### + function install() { + global $db; + $db->Execute("alter table ".TABLE_ORDERS." modify payment_method varchar(250)"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Allowed zones','MODULE_PAYMENT_NOVALNET_CC3D_ALLOWED', '','Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))', '6', '0', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable CC3D Secure Module', 'MODULE_PAYMENT_NOVALNET_CC3D_STATUS', 'True', 'Do you want to activate the Credit Card 3D Secure Method(CC3D) of Novalnet AG?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Test Mode', 'MODULE_PAYMENT_NOVALNET_CC3D_TEST_MODE', 'True', 'Do you want to enable the test mode?', '6', '2', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Please contact sales@novalnet.de if you do not have any of the following Novalnet IDs!

Wenn Sie keine oder irgendeine der folgenden Novalnet IDs nicht haben sollten, bitte sich an sales@novalnet.de wenden!

Novalnet Merchant ID', 'MODULE_PAYMENT_NOVALNET_CC3D_VENDOR_ID', '', 'Your Merchant ID of Novalnet', '6', '3', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Authorisation Code', 'MODULE_PAYMENT_NOVALNET_CC3D_AUTH_CODE', '', 'Your Authorisation Code of Novalnet', '6', '4', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Product ID', 'MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID', '', 'Your Product ID of Novalnet', '6', '5', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Tariff ID', 'MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID', '', 'Your Tariff ID of Novalnet', '6', '6', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Manual checking amount in cents', 'MODULE_PAYMENT_NOVALNET_CC3D_MANUAL_CHECK_LIMIT', '', 'Please enter the amount in cents', '6', '7', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your second Product ID in Novalnet', 'MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID2', '', 'for the manual checking', '6', '8', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('The Tariff ID of the second product', 'MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID2', '', 'for the manual checking', '6', '9', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your Booking Reference at Novalnet', 'MODULE_PAYMENT_NOVALNET_CC3D_BOOK_REF', '', 'Your Booking Reference at Novalnet', '6', '10', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_NOVALNET_CC3D_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '11', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_NOVALNET_CC3D_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '12', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_NOVALNET_CC3D_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '13', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Proxy', 'MODULE_PAYMENT_NOVALNET_CC3D_PROXY', '0', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)', '6', '14', now())"); + } + + ### Remove the module and all its settings ### + function remove() { + global $db; + $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')"); + } + + ### Internal list of configuration keys used for configuration of the module ### + // @return array + function keys() { + return array('MODULE_PAYMENT_NOVALNET_CC3D_ALLOWED', 'MODULE_PAYMENT_NOVALNET_CC3D_STATUS', 'MODULE_PAYMENT_NOVALNET_CC3D_TEST_MODE', 'MODULE_PAYMENT_NOVALNET_CC3D_VENDOR_ID', 'MODULE_PAYMENT_NOVALNET_CC3D_AUTH_CODE', 'MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID', 'MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID', 'MODULE_PAYMENT_NOVALNET_CC3D_MANUAL_CHECK_LIMIT', 'MODULE_PAYMENT_NOVALNET_CC3D_PRODUCT_ID2', 'MODULE_PAYMENT_NOVALNET_CC3D_TARIFF_ID2', 'MODULE_PAYMENT_NOVALNET_CC3D_BOOK_REF', 'MODULE_PAYMENT_NOVALNET_CC3D_SORT_ORDER', 'MODULE_PAYMENT_NOVALNET_CC3D_ORDER_STATUS_ID', 'MODULE_PAYMENT_NOVALNET_CC3D_ZONE', 'MODULE_PAYMENT_NOVALNET_CC3D_PROXY'); + } + + function html_to_utf8 ($data) + { + return preg_replace("/\\&\\#([0-9]{3,10})\\;/e", '$this->_html_to_utf8("\\1")', $data); + } + + function _html_to_utf8 ($data) + { + if ($data > 127) + { + $i = 5; + while (($i--) > 0) + { + if ($data != ($a = $data % ($p = pow(64, $i)))) + { + $ret = chr(base_convert(str_pad(str_repeat(1, $i + 1), 8, "0"), 2, 10) + (($data - $a) / $p)); + for ($i; $i > 0; $i--) + $ret .= chr(128 + ((($data % pow(64, $i)) - ($data % ($p = pow(64, $i - 1)))) / $p)); + break; + } + } + } + else + { + $ret = "&#$data;"; + } + return $ret; + } + + ### Realtime accesspoint for communication to the Novalnet paygate ### + function perform_https_request($nn_url, $urlparam) + { + $debug = 0;#set it to 1 if you want to activate the debug mode + + if($debug) print "
perform_https_request: $nn_url
\n\r\n"; + if($debug) print "perform_https_request: $urlparam
\n\r\n"; + + ## some prerquisites for the connection + $ch = curl_init($nn_url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + if ($this->proxy) {curl_setopt($ch, CURLOPT_PROXY, $this->proxy); } + + ## establish connection + $data = curl_exec($ch); + $data = $this->ReplaceSpecialGermanChars($data); + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug) + { + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + } + + #close connection + curl_close($ch); + + ## read and return data from novalnet paygate + if($debug) print "
\n\n" . $data . "\n
\n\n"; + + return array ($errno, $errmsg, $data); + } +} +/* +order of functions: +selection -> $order-info['total'] wrong, cause shipping_cost is net +pre_confirmation_check -> $order-info['total'] wrong, cause shipping_cost is net +confirmation -> $order-info['total'] right, cause shipping_cost is gross +process_button -> $order-info['total'] right, cause shipping_cost is gross +before_process -> $order-info['total'] wrong, cause shipping_cost is net +after_process -> $order-info['total'] right, cause shipping_cost is gross +*/ + +?> diff --git a/includes/modules/payment/novalnet_cc_pci.php b/includes/modules/payment/novalnet_cc_pci.php new file mode 100644 index 0000000..39569f6 --- /dev/null +++ b/includes/modules/payment/novalnet_cc_pci.php @@ -0,0 +1,655 @@ +key = MODULE_PAYMENT_NOVALNET_CC_PCI_PASSWORD; + $this->code = 'novalnet_cc_pci'; + $this->title = MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_TITLE; + $this->public_title = MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_PUBLIC_TITLE; + $this->description = MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_DESCRIPTION; + $this->sort_order = MODULE_PAYMENT_NOVALNET_CC_PCI_SORT_ORDER; + $this->enabled = ((MODULE_PAYMENT_NOVALNET_CC_PCI_STATUS == 'True') ? true : false); + $this->proxy = MODULE_PAYMENT_NOVALNET_CC_PCI_PROXY; + $this->implementation = 'PHP_PCI'; + + $this->checkReturnedData(); + + if ((int)MODULE_PAYMENT_NOVALNET_CC_PCI_ORDER_STATUS_ID > 0){ + $this->order_status = MODULE_PAYMENT_NOVALNET_CC_PCI_ORDER_STATUS_ID; + } + + if (is_object($order)) $this->update_status(); + $this->form_action_url = 'https://payport.novalnet.de/pci_payport'; + + if($_POST['session'] && $_SESSION['payment'] == $this->code){ + $this->checkSecurity(); + } + } + + ### calculate zone matches and flag settings to determine whether this module should display to customers or not ### + function update_status() { + global $order, $db; + + if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_NOVALNET_CC_PCI_ZONE > 0) ){ + $check_flag = false; + $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_NOVALNET_CC_PCI_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id"); + + while (!$check->EOF){ + if ($check->fields['zone_id'] < 1){ + $check_flag = true; + break; + } + elseif ($check->fields['zone_id'] == $order->billing['zone_id']){ + $check_flag = true; + break; + } + $check->MoveNext(); + } + + if ($check_flag == false){ + $this->enabled = false; + } + } + } + + ### JS validation which does error-checking of data-entry if this module is selected for use ### + ### the fields to be cheked are (Bank Owner, Bank Account Number and Bank Code Lengths) ### + ### currently this function is not in use ### + // @return string + function javascript_validation(){ + return false; + } + + ### Builds set of input fields for collecting Bankdetail info ### + // @return array + function selection(){ + global $order, $HTTP_POST_VARS, $_POST, $HTTP_GET_VARS, $_GET; + $onFocus = ''; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + $selection = array('id' => $this->code, + 'module' => $this->public_title, + 'fields' => array(array()) + ); + + if(function_exists(get_percent)){ + $selection['module_cost'] = $GLOBALS['ot_payment']->get_percent($this->code); + } + + return $selection; + } + + ### Precheck to Evaluate the Bank Datas ### + function pre_confirmation_check(){ + global $HTTP_POST_VARS, $_POST,$messageStack; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + #echo'

';var_dump($_REQUEST); exit;
+		$error = '';
+
+		if (defined('MODULE_PAYMENT_NOVALNET_CC_PCI_MANUAL_CHECK_LIMIT') and MODULE_PAYMENT_NOVALNET_CC_PCI_MANUAL_CHECK_LIMIT){
+			  if ( (!defined('MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID2') or !MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID2)) or (!defined('MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID2') or !MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID2))){
+				  $error = 'Product-ID2 and/or Tariff-ID2 missing';
+			  }
+		}
+
+		if(!MODULE_PAYMENT_NOVALNET_CC_PCI_VENDOR_ID || !MODULE_PAYMENT_NOVALNET_CC_PCI_AUTH_CODE || !MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID || !MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID || !MODULE_PAYMENT_NOVALNET_CC_PCI_PASSWORD ){
+		  $error = MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_JS_NN_MISSING;
+		}
+
+		if($error!=''){
+		  $payment_error_return = 'payment_error=' . $this->code;
+		  $messageStack->add_session('checkout_payment', $error . '', 'error');
+		  zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));
+		}
+  }
+
+  ### Display Information on the Checkout Confirmation Page ###
+  // @return array
+  function confirmation(){
+		global $HTTP_POST_VARS, $_POST, $order;
+		$_SESSION['nn_total'] = $order->info['total'];
+		if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST;
+		#print "in confirmation"; exit;
+
+		return $confirmation;
+  }
+
+  ### Build the data and actions to process when the "Submit" button is pressed on the order-confirmation screen. ###
+  ### These are hidden fields on the checkout confirmation page ###
+  // @return string
+  function process_button(){
+		global $HTTP_POST_VARS, $_POST, $order, $db, $currencies, $messageStack, $insert_id;    
+		if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST;
+
+		#Get the required additional customer details from DB
+		$customer_values = $db->Execute("SELECT customers_gender, customers_dob, customers_fax FROM ". TABLE_CUSTOMERS . " WHERE customers_id='". (int)$_SESSION['customer_id'] ."'");
+		
+		while(!$customer_values->EOF){
+		   $customer_values->MoveNext();
+		}
+		
+		list($customer_values->fields['customers_dob'], $extra) = explode(' ', $customer_values->fields['customers_dob']);    
+
+		if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status_add_tax_ot'] == 1){
+		   $totalamount=$order->info['total'] + $order->info['tax'];
+		} else { $totalamount=$order->info['total'];}
+		
+		$amount =sprintf('%.2f', $totalamount);
+
+		if (preg_match('/[^\d\.]/', $amount) or !$amount){
+			  ### $amount contains some unallowed chars or empty ###
+			  $err                      = '$amount ('.$amount.') is empty or has a wrong format';
+			  $order->info['comments'] .= 'Novalnet Error Message : '.$err;
+			  $payment_error_return     = 'payment_error='.$this->code;
+			  $messageStack->add_session('checkout_payment', $err . '', 'error');
+			  zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));      
+		}
+	
+		$amount = preg_replace('/^0+/', '', $amount);
+		$amount = sprintf('%0.2f', $amount);
+		$amount = str_replace('.', '', $amount);
+		#echo __CLASS__.' : '.$order->info['total']." <=> $amount
"; + + $product_id = MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID; + $manual_check_limit = trim(MODULE_PAYMENT_NOVALNET_CC_PCI_MANUAL_CHECK_LIMIT); + $manual_check_limit = str_replace(',', '', $manual_check_limit); + $manual_check_limit = str_replace('.', '', $manual_check_limit); + + if($manual_check_limit && $amount>=$manual_check_limit){ + $product_id = MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID2; + $tariff_id = MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID2; + } + + $uniqid = uniqid(); + + //print $amount; exit; + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_MODE == '1')? 1: 0; + + list($auth_code, $product_id, $tariff_id, $amount, $test_mode, $uniqid, $hash) = $this->encodeParams($auth_code=MODULE_PAYMENT_NOVALNET_CC_PCI_AUTH_CODE, $product_id, $tariff_id, $amount, $test_mode, $uniqid); + + $user_ip = $this->getRealIpAddr(); + + $checkout_url = zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'); + + if(strstr($checkout_url, '?')){ + $checkout_url = str_replace(' ', '', $checkout_url); + if(substr($checkout_url,-1)=='?')$error_url = $checkout_url.'payment_error=novalnet_cc_pci&error=$ERROR_MESSAGE ($STATUS)'; + else $error_url = $checkout_url.'&payment_error=novalnet_cc_pci&error=$ERROR_MESSAGE ($STATUS)'; + }else $error_url = $checkout_url.'?payment_error=novalnet_cc_pci&error=$ERROR_MESSAGE ($STATUS)'; + + $_SESSION['order_status_id_value']=$this->order_status; + $oldreturnurl=zen_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL'); + $old_value=explode(':',$oldreturnurl); + $new_protocol_value=(empty($_SERVER["HTTPS"])) ? 'http' : 'https'; + $return_url=$new_protocol_value.':'.$old_value[1]; + $process_button_string = zen_draw_hidden_field('vendor_id', MODULE_PAYMENT_NOVALNET_CC_PCI_VENDOR_ID) . + zen_draw_hidden_field('product_id', $product_id) . + zen_draw_hidden_field('payment_id', '6') . + zen_draw_hidden_field('tariff_id', $tariff_id) . + zen_draw_hidden_field('vendor_authcode', $auth_code) . + zen_draw_hidden_field('currency', $order->info['currency']) . + zen_draw_hidden_field('amount', $amount) . + zen_draw_hidden_field('hash', $hash) . + zen_draw_hidden_field('uniqid', $uniqid) . + zen_draw_hidden_field('gender', 'u') . + zen_draw_hidden_field('firstname', $this->html_to_utf8($order->customer['firstname'])) . + zen_draw_hidden_field('lastname', $this->html_to_utf8($order->customer['lastname'])) . + zen_draw_hidden_field('email', $order->customer['email_address']) . + zen_draw_hidden_field('street', $this->html_to_utf8($order->customer['street_address'])) . + #zen_draw_hidden_field('house_no', '2') . + zen_draw_hidden_field('search_in_street', '1') . + zen_draw_hidden_field('city', $this->html_to_utf8($order->customer['city'])) . + zen_draw_hidden_field('zip', $order->customer['postcode']) . + zen_draw_hidden_field('country_code', $order->customer['country']['iso_code_2']) . + zen_draw_hidden_field('lang', MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_LANG) . + zen_draw_hidden_field('remote_ip', $user_ip) . + zen_draw_hidden_field('tel', $order->customer['telephone']) . + zen_draw_hidden_field('fax', $customer['customers_fax']) . + zen_draw_hidden_field('birthday', $customer['customers_dob']) . + zen_draw_hidden_field('session', zen_session_id()) . + zen_draw_hidden_field('return_url', $return_url) . + zen_draw_hidden_field('return_method', 'POST') . + zen_draw_hidden_field('error_return_url', $error_url) . + zen_draw_hidden_field('test_mode', $test_mode) . + zen_draw_hidden_field('error_return_method', 'POST'). + zen_draw_hidden_field('implementation', strtoupper($this->implementation)) . + zen_draw_hidden_field('proxy', $this->proxy); + + + return $process_button_string; + } + + ### Insert the Novalnet Transaction ID in DB ### + function before_process(){ + global $_POST, $order; + if($_POST['tid'] && $_POST['status'] == '100'){ + if( $this->order_status ) { + $order->info['order_status'] = $this->order_status; + } + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_MODE == '1')? 1: 0; + $test_mode_value=( $_POST['test_mode'] == 1) ? $_POST['test_mode'] : $test_mode; + if ($test_mode_value){ + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_ORDER_MESSAGE; + } + + $order->info['comments'] .= 'Novalnet Transaction ID : '.$_POST['tid']; + } + } + + function isPublicIP($value){ + if(!$value || count(explode('.',$value))!=4) return false; + return !preg_match('~^((0|10|172\.16|192\.168|169\.254|255|127\.0)\.)~', $value); + } + + ### get the real Ip Adress of the User ### + function getRealIpAddr(){ + if($this->isPublicIP($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR']; + if($iplist=explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])) + { + if($this->isPublicIP($iplist[0])) return $iplist[0]; + } + if ($this->isPublicIP($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_FORWARDED_FOR']) ) return $_SERVER['HTTP_FORWARDED_FOR']; + + return $_SERVER['REMOTE_ADDR']; + } + + ### Send the order detail to Novalnet ### + function after_process(){ + global $order, $customer_id, $insert_id,$db,$_POST; + + $product_id = MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID; + if($_POST['tid'] != ''){ + ### Pass the Order Reference to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_CC_PCI_VENDOR_ID.'&product='.$product_id.'&key=6&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_CC_PCI_AUTH_CODE.'&status=100&tid='.$_POST['tid'].'&reference=BNR-'.$insert_id.'&vwz2='.MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_ORDERNO.''.$insert_id.'&vwz3='.MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_ORDERDATE.''.date('Y-m-d H:i:s'); + $urlparam .= '&order_no='.$insert_id; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + $_POST['tid'] = ''; + ### Implement here the Emailversand and further functions, incase if you want to send a own email ### + } + return false; + } + + ### Used to display error message details ### + // @return array + function get_error(){ + global $HTTP_GET_VARS, $_GET; + if(count($HTTP_GET_VARS)==0 || $HTTP_GET_VARS=='') $HTTP_GET_VARS = $_GET; + + #$error = array('title' => MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_ERROR, + # 'error' => stripslashes(urldecode($HTTP_GET_VARS['error']))); + #print $HTTP_GET_VARS['error']; exit; + $error = array('title' => MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_ERROR, 'error' => stripslashes(utf8_decode($HTTP_GET_VARS['error']))); + + return $error; + } + + ### Check to see whether module is installed ### + // @return boolean + function check() { + global $db; + if (!isset($this->_check)){ + $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_NOVALNET_CC_PCI_STATUS'"); + $this->_check = $check_query->RecordCount(); + } + return $this->_check; + } + + ### Install the payment module and its configuration settings ### + function install() + { + global $db; + $db->Execute("alter table ".TABLE_ORDERS." modify payment_method varchar(250)"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Allowed zones', 'MODULE_PAYMENT_NOVALNET_CC_PCI_ALLOWED', '', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))', '6', '0', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable CC Module', 'MODULE_PAYMENT_NOVALNET_CC_PCI_STATUS', 'True', 'Do you want to activate the Credit Card Method(CC) of Novalnet AG?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Test Mode', 'MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_MODE', 'True', 'Do you want to enable the test mode?', '6', '2', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Please contact sales@novalnet.de if you do not have any of the following Novalnet IDs!

Wenn Sie keine oder irgendeine der folgenden Novalnet IDs nicht haben sollten, bitte sich an sales@novalnet.de wenden!

Novalnet Merchant ID', 'MODULE_PAYMENT_NOVALNET_CC_PCI_VENDOR_ID', '', 'Your Merchant ID of Novalnet', '6', '3', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Authorisation Code', 'MODULE_PAYMENT_NOVALNET_CC_PCI_AUTH_CODE', '', 'Your Authorisation Code of Novalnet', '6', '4', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Product ID', 'MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID', '', 'Your Product ID of Novalnet', '6', '5', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Tariff ID', 'MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID', '', 'Your Tariff ID of Novalnet', '6', '6', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Manual checking amount in cents', 'MODULE_PAYMENT_NOVALNET_CC_PCI_MANUAL_CHECK_LIMIT', '', 'Please enter the amount in cents', '6', '7', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your second Product ID in Novalnet', 'MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID2', '', 'for the manual checking', '6', '8', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('The Tariff ID of the second product', 'MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID2', '', 'for the manual checking', '6', '9', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Enter password here', 'MODULE_PAYMENT_NOVALNET_CC_PCI_PASSWORD', '', 'for the manual checking', '6', '10', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your Booking Reference at Novalnet', 'MODULE_PAYMENT_NOVALNET_CC_PCI_BOOK_REF', '', 'Your Booking Reference at Novalnet', '6', '11', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_NOVALNET_CC_PCI_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '12', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_NOVALNET_CC_PCI_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '13', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_NOVALNET_CC_PCI_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '14', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Proxy', 'MODULE_PAYMENT_NOVALNET_CC_PCI_PROXY', '0', 'If you use a Proxy Server, enter the Proxy Server IP with port here (e.g. www.proxy.de:80)', '6', '15', now())"); + + } + + ### Remove the module and all its settings ### + function remove(){ + global $db; + $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')"); + } + + ### Internal list of configuration keys used for configuration of the module ### + // @return array + function keys() { + return array('MODULE_PAYMENT_NOVALNET_CC_PCI_ALLOWED', 'MODULE_PAYMENT_NOVALNET_CC_PCI_STATUS', 'MODULE_PAYMENT_NOVALNET_CC_PCI_TEST_MODE', 'MODULE_PAYMENT_NOVALNET_CC_PCI_VENDOR_ID', 'MODULE_PAYMENT_NOVALNET_CC_PCI_AUTH_CODE', 'MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID', 'MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID', 'MODULE_PAYMENT_NOVALNET_CC_PCI_MANUAL_CHECK_LIMIT', 'MODULE_PAYMENT_NOVALNET_CC_PCI_PRODUCT_ID2', 'MODULE_PAYMENT_NOVALNET_CC_PCI_TARIFF_ID2','MODULE_PAYMENT_NOVALNET_CC_PCI_PASSWORD', 'MODULE_PAYMENT_NOVALNET_CC_PCI_BOOK_REF', 'MODULE_PAYMENT_NOVALNET_CC_PCI_SORT_ORDER', 'MODULE_PAYMENT_NOVALNET_CC_PCI_ORDER_STATUS_ID', 'MODULE_PAYMENT_NOVALNET_CC_PCI_ZONE', 'MODULE_PAYMENT_NOVALNET_CC_PCI_PROXY'); + } + + ### replace the Special German Charectors ### + function ReplaceSpecialGermanChars($string){ + $what = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß"); + $how = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss"); + + $string = str_replace($what, $how, $string); + + return $string; + } + + function html_to_utf8 ($data){ + return preg_replace("/\\&\\#([0-9]{3,10})\\;/e", '$this->_html_to_utf8("\\1")', $data); + } + + function _html_to_utf8 ($data){ + if ($data > 127){ + $i = 5; + while (($i--) > 0){ + if ($data != ($a = $data % ($p = pow(64, $i)))){ + $ret = chr(base_convert(str_pad(str_repeat(1, $i + 1), 8, "0"), 2, 10) + (($data - $a) / $p)); + for ($i; $i > 0; $i--) + $ret .= chr(128 + ((($data % pow(64, $i)) - ($data % ($p = pow(64, $i - 1)))) / $p)); + break; + } + } + }else{ + $ret = "&#$data;"; + } + return $ret; + } + + ### Realtime accesspoint for communication to the Novalnet paygate ### + function perform_https_request($nn_url, $urlparam){ + $debug = 0;#set it to 1 if you want to activate the debug mode + + if($debug) print "
perform_https_request: $nn_url
\n\r\n"; + if($debug) print "perform_https_request: $urlparam
\n\r\n"; + + ## some prerquisites for the connection + $ch = curl_init($nn_url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + + if ($this->proxy){ + curl_setopt($ch, CURLOPT_PROXY, $this->proxy); + } + + ## establish connection + $data = curl_exec($ch); + $data = $this->ReplaceSpecialGermanChars($data); + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug){ + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + } + + #close connection + curl_close($ch); + + ## read and return data from novalnet paygate + if($debug) print "
\n\n" . $data . "\n
\n\n"; + + return array ($errno, $errmsg, $data); + } + + function debug2($object, $filename, $debug = false){ + if (!$debug){return;} + $fh = fopen("/tmp/$filename", 'a+'); + fwrite($fh, date('Y-m-d H:i:s').' '.print_r($object, true)); + fwrite($fh, "


\n"); + fclose($fh); + } + + function checkSecurity() { + global $_POST, $order, $insert_id, $messageStack; + + if(strlen(trim($_POST['tid']))==17 && $_POST['status']==100 && $_POST['session']== zen_session_id()){ + #xtc_redirect(zen_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL')); + }else{ + if($_POST['status_desc']){ + $error_status = $_POST['status_desc']; + }else { + $error_status = "There was an error and your payment could not be completed "; + } + $err = $error_status." (".$_POST['status'].")"; + #'session missing or returned session is wrong'; + $order->info['comments'] .= '. Novalnet Error Message : '.$err; + $payment_error_return = 'payment_error='.$this->code/*.'&error='.$err*/; + $messageStack->add_session('checkout_payment', $err . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + } + function encode($data){ + $data = trim($data); + if ($data == '') return'Error: no data'; + if (!function_exists('base64_encode') or !function_exists('pack') or !function_exists('crc32')){return'Error: func n/a';} + + try { + $crc = sprintf('%u', crc32($data));# %u is a must for ccrc32 returns a signed value + $data = $crc."|".$data; + $data = bin2hex($data.$this->key); + $data = strrev(base64_encode($data)); + } + catch (Exception $e){ + echo('Error: '.$e); + } + return $data; + } + + function decode($data){ + $data = trim($data); + if ($data == ''){ + return'Error: no data'; + } + if (!function_exists('base64_decode') or !function_exists('pack') or !function_exists('crc32')){ + return'Error: func n/a'; + } + + try { + $data = base64_decode(strrev($data)); + $data = pack("H".strlen($data), $data); + $data = substr($data, 0, stripos($data, $this->key)); + $pos = strpos($data, "|"); + if ($pos === false){ + return("Error: CKSum not found!"); + } + $crc = substr($data, 0, $pos); + $value = trim(substr($data, $pos+1)); + if ($crc != sprintf('%u', crc32($value))){ + return("Error; CKSum invalid!"); + } + return $value; + } + catch (Exception $e){ + echo('Error: '.$e); + } + } + + function hash($h){ #$h contains encoded data + global $amount_zh; + if (!$h) return'Error: no data'; + if (!function_exists('md5')){return'Error: func n/a';} + return md5($h['auth_code'].$h['product_id'].$h['tariff'].$h['amount'].$h['test_mode'].$h['uniqid'].strrev($this->key)); + } + + function checkHash($request){ + if (!$request) return false; #'Error: no data'; + $h['auth_code'] = $request['vendor_authcode'];#encoded + $h['product_id'] = $request['product_id'];#encoded + $h['tariff'] = $request['tariff_id'];#encoded + $h['amount'] = $request['amount'];#encoded + $h['test_mode'] = $request['test_mode'];#encoded + $h['uniqid'] = $request['uniqid'];#encoded + if ($request['hash2']!= $this->hash($h)){ + return false; + } + return true; + } + + function checkHash4java($request){ + if (!$request) return false; #'Error: no data'; + $h['auth_code'] = $request['auth_code'];#encoded + $h['product_id'] = $request['product_id'];#encoded + $h['tariff'] = $request['tariff_id'];#encoded + $h['amount'] = $request['amount'];#encoded + $h['test_mode'] = $request['test_mode'];#encoded + $h['uniqid'] = $request['uniqid'];#encoded + + if ($request['hash2'] != $this->hash($h)) + { + return false; + } + return true; + } + + function encode4java($data = '', $func = ''){ + $salt = 1010; + if (!isset($data) or trim($data) == '' or !$func){ + return'Error: missing arguments: $str and/or $func!'; + } + if ($func != 'decbin' and $func != 'bindec'){ + return'Error: $func has wrong value!'; + } + if ($func == 'decbin'){ + return decbin(intval($data) + intval($salt)); + }else{ + return bindec($data) - intval($salt); + } + } + function checkReturnedData(){ + if ($_POST['hash2'] && $_SESSION['payment'] == $this->code){ + if (strtoupper($this->implementation) == 'JAVA_PCI'){ + #Java encoded + if( $_POST['vendor_authcode'] != md5(MODULE_PAYMENT_NOVALNET_CC_PCI_AUTH_CODE.strrev($this->key)) ){ + $err = MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_HASH_ERROR.'; wrong auth_code!'; + $payment_error_return = 'payment_error=novalnet_cc_pci&error='.$_POST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + $_POST['auth_code'] = MODULE_PAYMENT_NOVALNET_CC_PCI_AUTH_CODE;#todo: check? + $_POST['product_id'] = $this->encode4java($_POST['product_id'], 'bindec'); + $_POST['tariff_id'] = $this->encode4java($_POST['tariff_id'], 'bindec'); + $_POST['amount'] = $this->encode4java($_POST['amount'], 'bindec'); + $_POST['test_mode'] = $this->encode4java($_POST['test_mode'], 'bindec'); + $_POST['uniqid'] = $this->encode4java($_POST['uniqid'], 'bindec'); + + if (!$this->checkHash4java($_POST)){ #PHP encoded + $err = MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_HASH_ERROR; + $payment_error_return = 'payment_error=novalnet_cc_pci&error='.$_POST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + }else{ #PHP encoded + if (!$this->checkHash($_POST)){ + $err = MODULE_PAYMENT_NOVALNET_CC_PCI_TEXT_HASH_ERROR; + $payment_error_return = 'payment_error=novalnet_cc_pci&error='.$_POST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + }else{ + $_POST['test_mode'] = $this->decode($_POST['test_mode']); + } + } + } + } + + function encodeParams($auth_code, $product_id, $tariff_id, $amount, $test_mode, $uniqid){ + if (strtoupper($this->implementation) == 'JAVA_PCI'){ + $uniqid = time();#must ne a long integer + $hash = md5($auth_code.$product_id.$tariff_id.$amount.$test_mode.$uniqid.strrev($this->key)); + $auth_code = md5($auth_code.strrev($this->key)); + $product_id = $this->encode4java($product_id, 'decbin'); + $tariff_id = $this->encode4java($tariff_id, 'decbin'); + $amount = $this->encode4java($amount, 'decbin'); + $test_mode = $this->encode4java($test_mode, 'decbin'); + $uniqid = $this->encode4java($uniqid, 'decbin'); + }else{ + $auth_code = $this->encode($auth_code); + $product_id = $this->encode($product_id); + $tariff_id = $this->encode($tariff_id); + $amount = $this->encode($amount); + $test_mode = $this->encode($test_mode); + $uniqid = $this->encode($uniqid); + $hash = $this->hash(array('auth_code' => $auth_code, 'product_id' => $product_id, 'tariff' => $tariff_id, 'amount' => $amount, 'test_mode' => $test_mode, 'uniqid' => $uniqid)); + } + return array($auth_code, $product_id, $tariff_id, $amount, $test_mode, $uniqid, $hash); + } + + +} + /* + flow of functions: + selection -> $order-info['total'] wrong, cause shipping_cost is net + pre_confirmation_check -> $order-info['total'] wrong, cause shipping_cost is net + confirmation -> $order-info['total'] right, cause shipping_cost is gross + process_button -> $order-info['total'] right, cause shipping_cost is gross + before_process -> $order-info['total'] wrong, cause shipping_cost is net + after_process -> $order-info['total'] right, cause shipping_cost is gross + --------------- + */ + +?> diff --git a/includes/modules/payment/novalnet_elv_at.php b/includes/modules/payment/novalnet_elv_at.php new file mode 100644 index 0000000..cb45313 --- /dev/null +++ b/includes/modules/payment/novalnet_elv_at.php @@ -0,0 +1,483 @@ +code = 'novalnet_elv_at'; + $this->title = MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_TITLE; + $this->description = MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_DESCRIPTION; + $this->sort_order = MODULE_PAYMENT_NOVALNET_ELV_AT_SORT_ORDER; + $this->enabled = ((MODULE_PAYMENT_NOVALNET_ELV_AT_STATUS == 'True') ? true : false); + $this->proxy = MODULE_PAYMENT_NOVALNET_ELV_AT_PROXY; + + if ((int)MODULE_PAYMENT_NOVALNET_ELV_AT_ORDER_STATUS_ID > 0) { + $this->order_status = MODULE_PAYMENT_NOVALNET_ELV_AT_ORDER_STATUS_ID; + } + if (is_object($order)) $this->update_status(); + } + + ### calculate zone matches and flag settings to determine whether this module should display to customers or not ### + function update_status() { + global $order, $db; + + if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_NOVALNET_ELV_AT_ZONE > 0) ) { + $check_flag = false; + $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_NOVALNET_ELV_AT_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id"); + while (!$check->EOF) { + if ($check->fields['zone_id'] < 1) { + $check_flag = true; + break; + } elseif ($check->fields['zone_id'] == $order->billing['zone_id']) { + $check_flag = true; + break; + } + $check->MoveNext(); + } + + if ($check_flag == false) { + $this->enabled = false; + } + } + } + + ### JS validation which does error-checking of data-entry if this module is selected for use ### + ### the fields to be cheked are (Bank Owner, Bank Account Number and Bank Code Lengths) ### + ### currently this function is not in use ### + // @return string + function javascript_validation() { + return false; + } + + ### Builds set of input fields for collecting Bankdetail info ### + // @return array + function selection() { + global $order; + + $onFocus = ' onfocus="methodSelect(\'pmt-' . $this->code . '\')"'; + + $bank_account = ''; + if (isset($_POST['bank_account_at'])) {$bank_account = $_POST['bank_account_at'];} + if(!$bank_account and isset($_GET['bank_account_at'])) {$bank_account = $_GET['bank_account_at'];} + $bank_code = ''; + if (isset($_POST['bank_code_at'])) {$bank_code = $_POST['bank_code_at'];} + if(!$bank_code and isset($_GET['bank_code_at']) ) {$bank_code = $_GET['bank_code_at'];} + + $selection = array('id' => $this->code, + 'module' => $this->title, + 'fields' => array(array('title' => MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_ACCOUNT_OWNER, + 'field' => zen_draw_input_field('bank_account_holder_at', $order->billing['firstname'] . ' ' . $order->billing['lastname'], 'id="'.$this->code.'-bank_account_holder_at"' . $onFocus), + 'tag' => $this->code.'-bank_account_holder_at'), + array('title' => MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_ACCOUNT_NUMBER, + 'field' => zen_draw_input_field('bank_account_at', $_SESSION['bank_account_at'], 'id="' . $this->code . '-bank_account_at"' . $onFocus), + 'tag' => $this->code . '-bank_account_at'), + array('title' => MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_CODE, + 'field' => zen_draw_input_field('bank_code_at', $_SESSION['bank_code_at'], 'id="' . $this->code . '-bank_code_at"' . $onFocus), + 'tag' => $this->code . '-bank_code_at') + )); + + return $selection; + } + + ### Precheck to Evaluate the Bank Datas ### + function pre_confirmation_check() { + global $_POST, $messageStack; + $_POST['bank_account_at'] = trim($_POST['bank_account_at']); + $_POST['bank_code_at'] = trim($_POST['bank_code_at']); + $_SESSION['bank_account_at'] = $_POST['bank_account_at']; + $_SESSION['bank_code_at'] = $_POST['bank_code_at']; + $error = ''; + + + if (defined('MODULE_PAYMENT_NOVALNET_ELV_AT_MANUAL_CHECK_LIMIT') and MODULE_PAYMENT_NOVALNET_ELV_AT_MANUAL_CHECK_LIMIT){ + if ( (!defined('MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID2') or !MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID2)) or (!defined('MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID2') or !MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID2))){ + $error = 'Product-ID2 and/or Tariff-ID2 missing'; + } + } + + if(!$_POST['bank_account_holder_at'] || strlen($_POST['bank_account_holder_at'])code . '&bank_account_holder_at=' . urlencode($_POST['bank_account_holder_at']) . '&bank_account_at=' . $_POST['bank_account_at'] . '&bank_code_at=' . $_POST['bank_code_at']; + + $messageStack->add_session('checkout_payment', $error . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + } + + ### Display Bank Information on the Checkout Confirmation Page ### + // @return array + function confirmation() { + global $_POST; + + $cardnoLength = strlen(str_replace(' ','',$_POST['bank_account_at'])); + $crdNo = str_replace(' ','',$_POST['bank_account_at']); + $cardnoInfo = ''; + $chkLength = $cardnoLength-4; + for($i=0;$i<$cardnoLength;$i++){ + if($i >= $chkLength){ + $cardnoInfo .= '*'; + }else{ + $cardnoInfo .= $crdNo[$i]; + } + } + + $cardnoLength1 = strlen(str_replace(' ','',$_POST['bank_code_at'])); + $crdNo1 = str_replace(' ','',$_POST['bank_code_at']); + $cardnoInfo1 = ''; + $chkLength1 = $cardnoLength1-3; + for($i=0;$i<$cardnoLength1;$i++){ + if($i >= $chkLength1){ + $cardnoInfo1 .= '*'; + }else{ + $cardnoInfo1 .= $crdNo1[$i]; + } + } + + + $confirmation = array('fields' => array(array('title' => MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_ACCOUNT_OWNER, + 'field' => $_POST['bank_account_holder_at']), + array('title' => MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_ACCOUNT_NUMBER, + 'field' => $cardnoInfo), + array('title' => MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_BANK_CODE, + 'field' => $cardnoInfo1) + )); + + return $confirmation; + } + + ### Build the data and actions to process when the "Submit" button is pressed on the order-confirmation screen. ### + ### These are hidden fields on the checkout confirmation page ### + // @return string + function process_button() { + global $_POST; + + $process_button_string = zen_draw_hidden_field('bank_account_holder_at', $_POST['bank_account_holder_at']) . + zen_draw_hidden_field('bank_account_at', $_POST['bank_account_at']) . + zen_draw_hidden_field('bank_code_at', $_POST['bank_code_at']); + + return $process_button_string; + } + + ### Store the BANK info to the order ### + ### This sends the data to the payment gateway for processing and Evaluates the Bankdatas for acceptance and the validity of the Bank Details ### + function before_process() { + global $_POST, $order, $db, $currencies, $messageStack; + + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_MODE == '1')? 1: 0; + + + + $order->info['bank_account_at'] = $_POST['bank_account_at']; + $order->info['bank_account_holder_at'] = $_POST['bank_account_holder_at']; + $order->info['bank_code_at'] = $_POST['bank_code_at']; + + $len = strlen($_POST['bank_account_at']); + $this->novalnet_elv_at_middle = substr($_POST['bank_account_at'], 4, ($len-8)); + if ( (defined('MODULE_PAYMENT_NOVALNET_ELV_AT_EMAIL')) && (zen_validate_email(MODULE_PAYMENT_NOVALNET_ELV_AT_EMAIL)) ) { + $order->info['bank_account_at'] = substr($_POST['bank_account_at'], 0, 4) . str_repeat('X', (strlen($_POST['bank_account_at']) - 8)) . substr($_POST['bank_account_at'], -4); + } + + #Get the required additional customer details from DB + $customer_values = $db->Execute("SELECT customers_gender, customers_firstname, customers_lastname, customers_dob, customers_email_address, customers_telephone, customers_fax, customers_email_format FROM ". TABLE_CUSTOMERS . " WHERE customers_id='".(int)$_SESSION['customer_id']."'"); + while(!$customer_values->EOF) + { + $customer_values->MoveNext(); + } + list($customer_values->fields['customers_dob'], $extra) = explode(' ', $customer_values->fields['customers_dob']); + + ### Process the payment to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + + +if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status_add_tax_ot'] == 1) { +$totalamount=$order->info['total'] + $order->info['tax']; +} else { +$totalamount=$order->info['total']; +} + $amount =sprintf('%.2f', $totalamount); + if(preg_match('/[,.]$/', $amount)) + { + $amount = $amount . '00'; + } + else if(preg_match('/[,.][0-9]$/', $amount)) + { + $amount = $amount . '0'; + } + $amount = preg_replace('/^0+/', '', $amount); + $amount = str_replace('.', '', $amount); + $amount = str_replace(',', '', $amount); + $product_id = MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID; + $manual_check_limit = trim(MODULE_PAYMENT_NOVALNET_ELV_AT_MANUAL_CHECK_LIMIT); + $manual_check_limit = str_replace(',', '', $manual_check_limit); + $manual_check_limit = str_replace('.', '', $manual_check_limit); + + if($manual_check_limit && $amount>=$manual_check_limit) + { + $product_id = MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID2; + $tariff_id = MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID2; + } + + $user_ip = $this->getRealIpAddr(); + + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_ELV_AT_VENDOR_ID.'&product='.$product_id.'&key=8&tariff='.$tariff_id.'&auth_code='.MODULE_PAYMENT_NOVALNET_ELV_AT_AUTH_CODE.'¤cy='.$order->info['currency']; + $urlparam .= '&amount='.$amount.'&bank_account_holder='.$_POST['bank_account_holder_at'].'&bank_account='.$_POST['bank_account_at']; + $urlparam .= '&bank_code='.$_POST['bank_code_at'].'&first_name='.$order->billing['firstname'].'&last_name='.$order->billing['lastname']; + $urlparam .= '&street='.$order->billing['street_address'].'&city='.$order->billing['city'].'&zip='.$order->billing['postcode']; + $urlparam .= '&country='.$order->billing['country']['iso_code_2'].'&email='.$customer_values->fields['customers_email_address']; + $urlparam .= '&birth_date='.$customer_values->fields['customers_dob'].'&tel='.$customer_values->fields['customers_telephone']; + $urlparam .= '&fax='.$customer_values->fields['customers_fax'].'&gender='.$customer_values->fields['customers_gender']; + $urlparam .= '&search_in_street=1&remote_ip='.$user_ip.'&input1=email_format'; + $urlparam .= '&input_val1='.$customer_values->fields['customers_email_format'].'&language='.MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_LANG; + + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); +// echo '
Result: '. print_r($data); exit; + $aryResponse = array(); + #capture the result and message and other parameters from response data '$data' in an array + $aryPaygateResponse = explode('&', $data); + foreach($aryPaygateResponse as $key => $value) + { + if($value!="") + { + $aryKeyVal = explode("=",$value); + $aryResponse[$aryKeyVal[0]] = $aryKeyVal[1]; + } + } +//echo '
Result :'.print_r($aryResponse); exit; + if($aryResponse['status']==100) + { + if( $this->order_status ) { + $order->info['order_status'] = $this->order_status; + } + ### Passing through the Transaction ID from Novalnet's paygate into order-info ### + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_MODE == '1')? 1: 0; + $test_mode_value=( $aryResponse['test_mode'] == 1) ? $aryResponse['test_mode'] : $test_mode; + if ($test_mode_value){ + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_ORDER_MESSAGE; + } + $order->info['comments'] .= 'Novalnet Transaction ID : '.$aryResponse['tid']; + $_SESSION['nn_tid']=$aryResponse['tid']; + } + else + { + ### Passing through the Error Response from Novalnet's paygate into order-info ### + $order->info['comments'] .= 'Novalnet Error Code : '.$aryResponse['status'].', Novalnet Error Message : '.$aryResponse['status_desc']; + + $payment_error_return = 'payment_error=' . $this->code; + + $messageStack->add_session('checkout_payment', $aryResponse['status_desc'] . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + + } + + ### Realtime accesspoint for communication to the Novalnet paygate ### + function perform_https_request($nn_url, $urlparam) + { + $debug = 0;#set it to 1 if you want to activate the debug mode + + if($debug) print "
perform_https_request: $nn_url
\n\r\n"; + if($debug) print "perform_https_request: $urlparam
\n\r\n"; + + ## some prerquisites for the connection + $ch = curl_init($nn_url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + if ($this->proxy) {curl_setopt($ch, CURLOPT_PROXY, $this->proxy); } + + ## establish connection + $data = curl_exec($ch); + $data = $this->ReplaceSpecialGermanChars($data); + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug) + { + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + } + + #close connection + curl_close($ch); + + ## read and return data from novalnet paygate + if($debug) print "
\n\n" . $data . "\n
\n\n"; + + return array ($errno, $errmsg, $data); + } + + ### replace the Special German Charectors ### + function ReplaceSpecialGermanChars($string) + { + $what = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß"); + $how = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss"); + + $string = str_replace($what, $how, $string); + + return $string; + } + + ### get the real Ip Adress of the User ### + + function getRealIpAddr() + { + if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet + { + $ip=$_SERVER['HTTP_CLIENT_IP']; + } + elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy + { + $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; + } + else + { + $ip=$_SERVER['REMOTE_ADDR']; + } + /* + $num="(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])"; + if (!preg_match("/^$num\\.$num\\.$num\\.$num$/", $ip)){ + $ip='127.0.0.1'; + +*/ + return $ip; + + // } + + + } + ### Send additional information about bankdata via email to the store owner ### + ### Send the order detail to Novalnet ### + function after_process() { + global $order, $customer_id, $insert_id,$db; + + $product_id = MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID; + ### Pass the Order Reference to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_ELV_AT_VENDOR_ID.'&product='.$product_id.'&key=8&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_ELV_AT_AUTH_CODE.'&status=100&tid='.$_SESSION['nn_tid'].'&reference=BNR-'.$insert_id.'&vwz3='.$insert_id.'&vwz3_prefix='.MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_ORDERNO.'&vwz4='.date('Y.m.d').'&vwz4_prefix='.MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_ORDERDATE; + $urlparam .= '&order_no='.$insert_id; + + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + #$this->debug2($urlparam, $filename='xtcomm_urlparam'); + unset($_SESSION['nn_tid']); + unset($_SESSION['bank_account_at']); + unset($_SESSION['bank_code_at']); + ### Implement here the Emailversand and further functions, incase if you want to send a own email ### + return false; + } + + ### Store additional order information ### + ### not in use ### + // @param int $zf_order_id + function after_order_create($zf_order_id) { + return false; + } + + ### Used to display error message details ### + // @return array + function get_error() { + global $_GET; + + $error = array('title' => MODULE_PAYMENT_NOVALNET_ELV_AT_TEXT_ERROR, + 'error' => stripslashes(urldecode($_GET['error']))); + + return $error; + } + + ### Check to see whether module is installed ### + // @return boolean + function check() { + global $db; + if (!isset($this->_check)) { + $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_NOVALNET_ELV_AT_STATUS'"); + $this->_check = $check_query->RecordCount(); + } + return $this->_check; + } + + ### Install the payment module and its configuration settings ### + function install() { + global $db; + $db->Execute("alter table ".TABLE_ORDERS." modify payment_method varchar(250)"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Allowed zones', 'MODULE_PAYMENT_NOVALNET_ELV_AT_ALLOWED', '', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))', '6', '0', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable ELV-AT Module', 'MODULE_PAYMENT_NOVALNET_ELV_AT_STATUS', 'True', 'Do you want to activate the Austrian Direct Debit Method(ELV-AT) of Novalnet AG?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Test Mode', 'MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_MODE', 'True', 'Do you want to enable the test mode?', '6', '2', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Please contact sales@novalnet.de if you do not have any of the following Novalnet IDs!

Wenn Sie keine oder irgendeine der folgenden Novalnet IDs nicht haben sollten, bitte sich an sales@novalnet.de wenden!

Novalnet Merchant ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_VENDOR_ID', '', 'Your Merchant ID of Novalnet', '6', '3', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Authorisation Code', 'MODULE_PAYMENT_NOVALNET_ELV_AT_AUTH_CODE', '', 'Your Authorisation Code of Novalnet', '6', '4', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Product ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID', '', 'Your Product ID of Novalnet', '6', '5', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Tariff ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID', '', 'Your Tariff ID of Novalnet', '6', '6', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Booking Amount Limit', 'MODULE_PAYMENT_NOVALNET_ELV_AT_MANUAL_CHECK_LIMIT', '', 'The amount from which the manual booking control should occur', '6', '7', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Product ID2', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID2', '', 'Your 2nd Product ID of Novalnet', '6', '8', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Tariff ID2', 'MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID2', '', 'Your 2nd Tariff ID of Novalnet', '6', '9', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Information to the Customer', 'MODULE_PAYMENT_NOVALNET_ELV_AT_INFO', '','will be shown on the payment formula', '6', '10', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_NOVALNET_ELV_AT_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '11', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_NOVALNET_ELV_AT_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '12', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_NOVALNET_ELV_AT_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '13', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Proxy', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PROXY', '0', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)', '6', '14', now())"); + } + + ### Remove the module and all its settings ### + function remove() { + global $db; + $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')"); + } + + ### Internal list of configuration keys used for configuration of the module ### + // @return array + function keys() { + return array('MODULE_PAYMENT_NOVALNET_ELV_AT_ALLOWED', 'MODULE_PAYMENT_NOVALNET_ELV_AT_STATUS', 'MODULE_PAYMENT_NOVALNET_ELV_AT_TEST_MODE', 'MODULE_PAYMENT_NOVALNET_ELV_AT_VENDOR_ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_AUTH_CODE', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_MANUAL_CHECK_LIMIT', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PRODUCT_ID2', 'MODULE_PAYMENT_NOVALNET_ELV_AT_TARIFF_ID2', 'MODULE_PAYMENT_NOVALNET_ELV_AT_INFO', 'MODULE_PAYMENT_NOVALNET_ELV_AT_SORT_ORDER', 'MODULE_PAYMENT_NOVALNET_ELV_AT_ORDER_STATUS_ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_ZONE','MODULE_PAYMENT_NOVALNET_ELV_AT_PROXY'); + } + + +} + +?> diff --git a/includes/modules/payment/novalnet_elv_at_pci.php b/includes/modules/payment/novalnet_elv_at_pci.php new file mode 100644 index 0000000..79f9bb2 --- /dev/null +++ b/includes/modules/payment/novalnet_elv_at_pci.php @@ -0,0 +1,661 @@ +key = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PASSWORD; + $this->code = 'novalnet_elv_at_pci'; + $this->title = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_TITLE; + $this->public_title = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_PUBLIC_TITLE; + $this->description = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_DESCRIPTION; + $this->sort_order = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_SORT_ORDER; + $this->enabled = ((MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_STATUS == 'True') ? true : false); + $this->proxy = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PROXY; + $this->implementation = 'PHP_PCI'; + + $this->checkReturnedData(); + + if ((int)MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ORDER_STATUS_ID > 0){ + $this->order_status = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ORDER_STATUS_ID; + } + + if (is_object($order)) $this->update_status(); + $this->form_action_url = 'https://payport.novalnet.de/pci_payport'; + if($_POST['session'] && $_SESSION['payment'] == $this->code){$this->checkSecurity();} + + } + + ### calculate zone matches and flag settings to determine whether this module should display to customers or not ### + function update_status() { + global $order; + + if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ZONE > 0) ) { + $check_flag = false; + $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id"); + while (!$check->EOF) { + if ($check->fields['zone_id'] < 1) { + $check_flag = true; + break; + }elseif ($check->fields['zone_id'] == $order->billing['zone_id']) { + $check_flag = true; + break; + } + $check->MoveNext(); + } + + if ($check_flag == false) {$this->enabled = false; } + } + } + + ### JS validation which does error-checking of data-entry if this module is selected for use ### + ### the fields to be cheked are (Bank Owner, Bank Account Number and Bank Code Lengths) ### + ### currently this function is not in use ### + // @return string + function javascript_validation(){ + return false; + } + + ### Builds set of input fields for collecting Bankdetail info ### + // @return array + function selection() { + global $order, $HTTP_POST_VARS, $_POST, $HTTP_GET_VARS, $_GET; + + $onFocus = ''; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + $selection = array('id' => $this->code, + 'module' => $this->public_title, + 'fields' => array(array()) + ); + + if(function_exists(get_percent)){ + $selection['module_cost'] = $GLOBALS['ot_payment']->get_percent($this->code); + } + + return $selection; + } + + ### Precheck to Evaluate the Bank Datas ### + function pre_confirmation_check() { + global $HTTP_POST_VARS, $_POST,$messageStack; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + #echo'

';var_dump($_REQUEST); exit;
+		$error = '';
+
+		if (defined('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_MANUAL_CHECK_LIMIT') and MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_MANUAL_CHECK_LIMIT){
+			  if ( (!defined('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID2') or !MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID2)) or (!defined('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID2') or !MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID2))){
+				  $error = 'Product-ID2 and/or Tariff-ID2 missing';
+			  }
+		}
+	
+		if(!MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_VENDOR_ID || !MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_AUTH_CODE || !MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID || !MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID || !MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PASSWORD){
+			$error = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_JS_NN_MISSING;
+		}
+
+		if($error!='')	{
+			  $payment_error_return = 'payment_error=' . $this->code;
+			  $messageStack->add_session('checkout_payment', $error . '', 'error');
+			  zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));
+		}
+  }
+
+  ### Display Information on the Checkout Confirmation Page ###
+  // @return array
+  function confirmation() {
+		global $HTTP_POST_VARS, $_POST, $order;    
+		$_SESSION['nn_total'] = $order->info['total'];
+		if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST;
+		#print "in confirmation"; exit;
+
+		return $confirmation;
+  }
+
+  ### Build the data and actions to process when the "Submit" button is pressed on the order-confirmation screen. ###
+  ### These are hidden fields on the checkout confirmation page ###
+  // @return string
+  function process_button() {
+		global $HTTP_POST_VARS, $_POST, $order, $db, $currencies, $messageStack;    
+		if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST;
+		#Get the required additional customer details from DB
+		$customer_values = $db->Execute("SELECT customers_gender, customers_dob, customers_fax FROM ". TABLE_CUSTOMERS . " WHERE customers_id='". (int)$_SESSION['customer_id'] ."'");
+		
+		while(!$customer_values->EOF) {
+			$customer_values->MoveNext();
+		}
+		
+		list($customer_values->fields['customers_dob'], $extra) = explode(' ', $customer_values->fields['customers_dob']);
+
+		if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status_add_tax_ot'] == 1){
+			$totalamount=$order->info['total'] + $order->info['tax'];
+		}else{ 
+			$totalamount=$order->info['total'];
+		}
+		$amount =sprintf('%.2f', $totalamount);
+		
+		if (preg_match('/[^\d\.]/', $amount) or !$amount){
+			  ### $amount contains some unallowed chars or empty ###
+			  $err                      = '$amount ('.$amount.') is empty or has a wrong format';
+			  $order->info['comments'] .= '. Novalnet Error Message : '.$err;
+			  $payment_error_return     = 'payment_error='.$this->code;
+			  $messageStack->add_session('checkout_payment', $err . '', 'error');
+			  zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));      
+		}
+		
+		$amount = preg_replace('/^0+/', '', $amount);
+		$amount = sprintf('%0.2f', $amount);
+		$amount = str_replace('.', '', $amount);
+		#echo __CLASS__.' : '.$order->info['total']." <=> $amount
"; + + $product_id = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID; + $manual_check_limit = trim(MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_MANUAL_CHECK_LIMIT); + $manual_check_limit = str_replace(',', '', $manual_check_limit); + $manual_check_limit = str_replace('.', '', $manual_check_limit); + + if($manual_check_limit && $amount>=$manual_check_limit){ + $product_id = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID2; + $tariff_id = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID2; + } + + $user_ip = $this->getRealIpAddr(); + + $checkout_url = zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'); + + if(strstr($checkout_url, '?')){ + $checkout_url = str_replace(' ', '', $checkout_url); + if(substr($checkout_url,-1)=='?')$error_url = $checkout_url.'payment_error=novalnet_elv_at_pci&error=$ERROR_MESSAGE ($STATUS)'; + else $error_url = $checkout_url.'&payment_error=novalnet_elv_at_pci&error=$ERROR_MESSAGE ($STATUS)'; + } + else $error_url = $checkout_url.'?payment_error=novalnet_elv_at_pci&error=$ERROR_MESSAGE ($STATUS)'; + + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_MODE == '1')? 1: 0; + + $_SESSION['order_status_id_value']=$this->order_status; + + $oldreturnurl=zen_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL'); + $old_value=explode(':',$oldreturnurl); + $new_protocol_value=(empty($_SERVER["HTTPS"])) ? 'http' : 'https'; + $return_url=$new_protocol_value.':'.$old_value[1]; + + $uniqid = uniqid(); + + list($auth_code, $product_id, $tariff_id, $amount, $test_mode, $uniqid, $hash) = $this->encodeParams($auth_code=MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_AUTH_CODE, $product_id, $tariff_id, $amount, $test_mode, $uniqid); + + + $process_button_string = zen_draw_hidden_field('vendor_id', MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_VENDOR_ID) . + zen_draw_hidden_field('product_id', $product_id) . + zen_draw_hidden_field('payment_id', '8') . + zen_draw_hidden_field('tariff_id', $tariff_id) . + zen_draw_hidden_field('vendor_authcode', $auth_code) . + zen_draw_hidden_field('currency', $order->info['currency']) . + zen_draw_hidden_field('amount', $amount) . + zen_draw_hidden_field('hash', $hash) . + zen_draw_hidden_field('uniqid', $uniqid) . + zen_draw_hidden_field('gender', 'u') . + zen_draw_hidden_field('firstname', $this->html_to_utf8($order->customer['firstname'])) . + zen_draw_hidden_field('lastname', $this->html_to_utf8($order->customer['lastname'])) . + zen_draw_hidden_field('email', $order->customer['email_address']) . + zen_draw_hidden_field('street', $this->html_to_utf8($order->customer['street_address'])) . + zen_draw_hidden_field('search_in_street', '1') . + zen_draw_hidden_field('city', $this->html_to_utf8($order->customer['city'])) . + zen_draw_hidden_field('zip', $order->customer['postcode']) . + zen_draw_hidden_field('country_code', $order->customer['country']['iso_code_2']) . + zen_draw_hidden_field('lang', MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_LANG) . + zen_draw_hidden_field('remote_ip', $user_ip) . + zen_draw_hidden_field('tel', $order->customer['telephone']) . + zen_draw_hidden_field('fax', $customer_values->fields['customers_fax']) . + zen_draw_hidden_field('birthday', $customer_values->fields['customers_dob']) . + zen_draw_hidden_field('session', zen_session_id()) . + zen_draw_hidden_field('return_url', $return_url) . + zen_draw_hidden_field('return_method', 'POST') . + zen_draw_hidden_field('error_return_url', $error_url) . + zen_draw_hidden_field('test_mode', $test_mode) . + zen_draw_hidden_field('error_return_method', 'POST'). + zen_draw_hidden_field('implementation', strtoupper($this->implementation)). + zen_draw_hidden_field('proxy', $this->proxy); + + + return $process_button_string; + } + + ### Insert the Novalnet Transaction ID in DB ### + function before_process() { + global $_POST, $order; + if($_POST['tid'] && $_POST['status'] == '100'){ + if( $this->order_status ) { + $order->info['order_status'] = $this->order_status; + } + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_MODE == '1')? 1: 0; + + $test_mode_value=( $_POST['test_mode'] == 1) ? $_POST['test_mode'] : $test_mode; + + if ($test_mode_value){ + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_ORDER_MESSAGE; + } + + $order->info['comments'] .= 'Novalnet Transaction ID : '.$_POST['tid']; + } + } + + function isPublicIP($value){ + if(!$value || count(explode('.',$value))!=4) return false; + return !preg_match('~^((0|10|172\.16|192\.168|169\.254|255|127\.0)\.)~', $value); + } + + ### get the real Ip Adress of the User ### + function getRealIpAddr(){ + if($this->isPublicIP($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR']; + if($iplist=explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])){ + if($this->isPublicIP($iplist[0])) return $iplist[0]; + } + if ($this->isPublicIP($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_FORWARDED_FOR']) ) return $_SERVER['HTTP_FORWARDED_FOR']; + + return $_SERVER['REMOTE_ADDR']; + } + + ### Send the order detail to Novalnet ### + function after_process(){ + + global $order, $customer_id, $insert_id,$db,$_POST; + + $product_id = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID; + if($_POST['tid'] != ''){ + ### Pass the Order Reference to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_VENDOR_ID.'&product='.$product_id.'&key=8&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_AUTH_CODE.'&status=100&tid='.$_POST['tid'].'&reference=BNR-'.$insert_id.'&vwz2='.MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_ORDERNO.''.$insert_id.'&vwz3='.MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_ORDERDATE.''.date('Y-m-d H:i:s'); + $urlparam .= '&order_no='.$insert_id; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + $_POST['tid'] = ''; + ### Implement here the Emailversand and further functions, incase if you want to send a own email ### + } + return false; + } + + ### Used to display error message details ### + // @return array + function get_error() + { + global $HTTP_GET_VARS, $_GET; + if(count($HTTP_GET_VARS)==0 || $HTTP_GET_VARS=='') $HTTP_GET_VARS = $_GET; + $error = array('title' => MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_ERROR, 'error' => stripslashes(utf8_decode($HTTP_GET_VARS['error']))); + return $error; + } + + ### Check to see whether module is installed ### + // @return boolean + function check() + { + global $db; + if (!isset($this->_check)) + { + $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_STATUS'"); + $this->_check = $check_query->RecordCount(); + } + return $this->_check; + } + + ### Install the payment module and its configuration settings ### + function install() { + global $db; + $db->Execute("alter table ".TABLE_ORDERS." modify payment_method varchar(250)"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Allowed zones', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ALLOWED', '', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))', '6', '0', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable ELV-AT Module', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_STATUS', 'True', 'Do you want to activate the Austrian Direct Debit Method(ELV-AT) of Novalnet AG?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Test Mode', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_MODE', 'True', 'Do you want to enable the test mode?', '6', '2', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Please contact sales@novalnet.de if you do not have any of the following Novalnet IDs!

Wenn Sie keine oder irgendeine der folgenden Novalnet IDs nicht haben sollten, bitte sich an sales@novalnet.de wenden!

Novalnet Merchant ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_VENDOR_ID', '', 'Your Merchant ID of Novalnet', '6', '3', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Authorisation Code', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_AUTH_CODE', '', 'Your Authorisation Code of Novalnet', '6', '4', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Product ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID', '', 'Your Product ID of Novalnet', '6', '5', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Tariff ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID', '', 'Your Tariff ID of Novalnet', '6', '6', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Manual checking amount in cents', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_MANUAL_CHECK_LIMIT', '', 'Please enter the amount in cents', '6', '7', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your second Product ID in Novalnet', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID2', '', 'for the manual checking', '6', '8', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('The Tariff ID of the second product', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID2', '', 'for the manual checking', '6', '9', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Password please', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PASSWORD', '', 'for the manual checking', '6', '10', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your Booking Reference at Novalnet', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_BOOK_REF', '', 'Your Booking Reference at Novalnet', '6', '11', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '12', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '13', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '14', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Proxy', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PROXY', '0', 'If you use a Proxy Server, enter the Proxy Server IP with port here (e.g. www.proxy.de:80)', '6', '15', now())"); + } + + ### Remove the module and all its settings ### + function remove() + { + global $db; + $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')"); + } + + ### Internal list of configuration keys used for configuration of the module ### + // @return array + function keys() + { + return array('MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ALLOWED', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_STATUS', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEST_MODE', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_VENDOR_ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_AUTH_CODE', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_MANUAL_CHECK_LIMIT', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PRODUCT_ID2', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TARIFF_ID2','MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PASSWORD','MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_BOOK_REF', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_SORT_ORDER', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ORDER_STATUS_ID', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_ZONE', 'MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_PROXY'); + } + + ### replace the Special German Charectors ### + function ReplaceSpecialGermanChars($string){ + $what = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß"); + $how = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss"); + + $string = str_replace($what, $how, $string); + + return $string; + } + + function html_to_utf8 ($data){ + return preg_replace("/\\&\\#([0-9]{3,10})\\;/e", '$this->_html_to_utf8("\\1")', $data); + } + + function _html_to_utf8 ($data){ + if ($data > 127){ + $i = 5; + while (($i--) > 0){ + if ($data != ($a = $data % ($p = pow(64, $i)))){ + $ret = chr(base_convert(str_pad(str_repeat(1, $i + 1), 8, "0"), 2, 10) + (($data - $a) / $p)); + for ($i; $i > 0; $i--) + $ret .= chr(128 + ((($data % pow(64, $i)) - ($data % ($p = pow(64, $i - 1)))) / $p)); + break; + } + } + }else{ + $ret = "&#$data;"; + } + return $ret; + } + + ### Realtime accesspoint for communication to the Novalnet paygate ### + function perform_https_request($nn_url, $urlparam){ + $debug = 0;#set it to 1 if you want to activate the debug mode + + if($debug) print "
perform_https_request: $nn_url
\n\r\n"; + if($debug) print "perform_https_request: $urlparam
\n\r\n"; + + ## some prerquisites for the connection + $ch = curl_init($nn_url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + + if ($this->proxy){ + curl_setopt($ch, CURLOPT_PROXY, $this->proxy); + } + + ## establish connection + $data = curl_exec($ch); + $data = $this->ReplaceSpecialGermanChars($data); + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug){ + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + } + + #close connection + curl_close($ch); + + ## read and return data from novalnet paygate + if($debug) print "
\n\n" . $data . "\n
\n\n"; + + return array ($errno, $errmsg, $data); + } + + function debug2($object, $filename, $debug = false){ + if (!$debug){return;} + $fh = fopen("/tmp/$filename", 'a+'); + fwrite($fh, date('Y-m-d H:i:s').' '.print_r($object, true)); + fwrite($fh, "


\n"); + fclose($fh); + } + + function checkSecurity() { + global $_POST, $order, $insert_id, $messageStack; + + if(strlen(trim($_POST['tid']))==17 && $_POST['status']==100 && $_POST['session']== zen_session_id()){ + #xtc_redirect(zen_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL')); + }else{ + if($_POST['status_desc']){ + $error_status = $_POST['status_desc']; + }else { + $error_status = "There was an error and your payment could not be completed "; + } + $err = $error_status." (".$_POST['status'].")"; + #'session missing or returned session is wrong'; + $order->info['comments'] .= '. Novalnet Error Message : '.$err; + $payment_error_return = 'payment_error='.$this->code/*.'&error='.$err*/; + $messageStack->add_session('checkout_payment', $err . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + } + function encode($data){ + $data = trim($data); + if ($data == '') return'Error: no data'; + if (!function_exists('base64_encode') or !function_exists('pack') or !function_exists('crc32')){return'Error: func n/a';} + + try { + $crc = sprintf('%u', crc32($data));# %u is a must for ccrc32 returns a signed value + $data = $crc."|".$data; + $data = bin2hex($data.$this->key); + $data = strrev(base64_encode($data)); + } + catch (Exception $e){ + echo('Error: '.$e); + } + return $data; + } + + function decode($data){ + $data = trim($data); + if ($data == ''){ + return'Error: no data'; + } + if (!function_exists('base64_decode') or !function_exists('pack') or !function_exists('crc32')){ + return'Error: func n/a'; + } + + try { + $data = base64_decode(strrev($data)); + $data = pack("H".strlen($data), $data); + $data = substr($data, 0, stripos($data, $this->key)); + $pos = strpos($data, "|"); + if ($pos === false){ + return("Error: CKSum not found!"); + } + $crc = substr($data, 0, $pos); + $value = trim(substr($data, $pos+1)); + if ($crc != sprintf('%u', crc32($value))){ + return("Error; CKSum invalid!"); + } + return $value; + } + catch (Exception $e){ + echo('Error: '.$e); + } + } + + function hash($h){ #$h contains encoded data + global $amount_zh; + if (!$h) return'Error: no data'; + if (!function_exists('md5')){return'Error: func n/a';} + return md5($h['auth_code'].$h['product_id'].$h['tariff'].$h['amount'].$h['test_mode'].$h['uniqid'].strrev($this->key)); + } + + function checkHash($request){ + if (!$request) return false; #'Error: no data'; + $h['auth_code'] = $request['vendor_authcode'];#encoded + $h['product_id'] = $request['product_id'];#encoded + $h['tariff'] = $request['tariff_id'];#encoded + $h['amount'] = $request['amount'];#encoded + $h['test_mode'] = $request['test_mode'];#encoded + $h['uniqid'] = $request['uniqid'];#encoded + if ($request['hash2']!= $this->hash($h)){ + return false; + } + return true; + } + + function checkHash4java($request){ + if (!$request) return false; #'Error: no data'; + $h['auth_code'] = $request['auth_code'];#encoded + $h['product_id'] = $request['product_id'];#encoded + $h['tariff'] = $request['tariff_id'];#encoded + $h['amount'] = $request['amount'];#encoded + $h['test_mode'] = $request['test_mode'];#encoded + $h['uniqid'] = $request['uniqid'];#encoded + + if ($request['hash2'] != $this->hash($h)) + { + return false; + } + return true; + } + + function encode4java($data = '', $func = ''){ + $salt = 1010; + if (!isset($data) or trim($data) == '' or !$func){ + return'Error: missing arguments: $str and/or $func!'; + } + if ($func != 'decbin' and $func != 'bindec'){ + return'Error: $func has wrong value!'; + } + if ($func == 'decbin'){ + return decbin(intval($data) + intval($salt)); + }else{ + return bindec($data) - intval($salt); + } + } + function checkReturnedData(){ + if ($_POST['hash2'] && $_SESSION['payment'] == $this->code){ + if (strtoupper($this->implementation) == 'JAVA_PCI'){ + #Java encoded + if( $_POST['vendor_authcode'] != md5(MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_AUTH_CODE.strrev($this->key)) ){ + $err = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_HASH_ERROR.'; wrong auth_code!'; + $payment_error_return = 'payment_error=novalnet_elv_at_pci&error='.$_POST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + $_POST['auth_code'] = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_AUTH_CODE;#todo: check? + $_POST['product_id'] = $this->encode4java($_POST['product_id'], 'bindec'); + $_POST['tariff_id'] = $this->encode4java($_POST['tariff_id'], 'bindec'); + $_POST['amount'] = $this->encode4java($_POST['amount'], 'bindec'); + $_POST['test_mode'] = $this->encode4java($_POST['test_mode'], 'bindec'); + $_POST['uniqid'] = $this->encode4java($_POST['uniqid'], 'bindec'); + + if (!$this->checkHash4java($_POST)){ #PHP encoded + $err = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_HASH_ERROR; + $payment_error_return = 'payment_error=novalnet_elv_at_pci&error='.$_POST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + }else{ #PHP encoded + if (!$this->checkHash($_POST)){ + $err = MODULE_PAYMENT_NOVALNET_ELV_AT_PCI_TEXT_HASH_ERROR; + $payment_error_return = 'payment_error=novalnet_elv_at_pci&error='.$_POST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + }else{ + $_POST['test_mode'] = $this->decode($_POST['test_mode']); + } + } + } + } + + function encodeParams($auth_code, $product_id, $tariff_id, $amount, $test_mode, $uniqid){ + if (strtoupper($this->implementation) == 'JAVA_PCI'){ + $uniqid = time();#must ne a long integer + $hash = md5($auth_code.$product_id.$tariff_id.$amount.$test_mode.$uniqid.strrev($this->key)); + $auth_code = md5($auth_code.strrev($this->key)); + $product_id = $this->encode4java($product_id, 'decbin'); + $tariff_id = $this->encode4java($tariff_id, 'decbin'); + $amount = $this->encode4java($amount, 'decbin'); + $test_mode = $this->encode4java($test_mode, 'decbin'); + $uniqid = $this->encode4java($uniqid, 'decbin'); + }else{ + $auth_code = $this->encode($auth_code); + $product_id = $this->encode($product_id); + $tariff_id = $this->encode($tariff_id); + $amount = $this->encode($amount); + $test_mode = $this->encode($test_mode); + $uniqid = $this->encode($uniqid); + $hash = $this->hash(array('auth_code' => $auth_code, 'product_id' => $product_id, 'tariff' => $tariff_id, 'amount' => $amount, 'test_mode' => $test_mode, 'uniqid' => $uniqid)); + } + return array($auth_code, $product_id, $tariff_id, $amount, $test_mode, $uniqid, $hash); + } + + +} +/* +flow of functions: +selection -> $order-info['total'] wrong, cause shipping_cost is net +pre_confirmation_check -> $order-info['total'] wrong, cause shipping_cost is net +confirmation -> $order-info['total'] right, cause shipping_cost is gross +process_button -> $order-info['total'] right, cause shipping_cost is gross +before_process -> $order-info['total'] wrong, cause shipping_cost is net +after_process -> $order-info['total'] right, cause shipping_cost is gross +--------------- +flow of url/path: +/xtcommerce/account.php +/xtcommerce/account_history_info.php +/xtcommerce/address_book.php +/xtcommerce/checkout_shipping.php +/xtcommerce/checkout_shipping.php +/xtcommerce/checkout_payment.php +/xtcommerce/checkout_confirmation.php +*/ + +?> diff --git a/includes/modules/payment/novalnet_elv_de.php b/includes/modules/payment/novalnet_elv_de.php new file mode 100644 index 0000000..d3c5ee2 --- /dev/null +++ b/includes/modules/payment/novalnet_elv_de.php @@ -0,0 +1,719 @@ +code = 'novalnet_elv_de'; + $this->title = MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_TITLE; + $this->description = MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_DESCRIPTION; + $this->sort_order = MODULE_PAYMENT_NOVALNET_ELV_DE_SORT_ORDER; + $this->enabled = ((MODULE_PAYMENT_NOVALNET_ELV_DE_STATUS == 'True') ? true : false); + $this->proxy = MODULE_PAYMENT_NOVALNET_ELV_DE_PROXY; + + // Check the tid in session and make the second call + if($_SESSION['nn_tid_elv_de']) + { + //Check the time limit + if($_SESSION['max_time_elv_de'] && time() > $_SESSION['max_time_elv_de']) + { + unset($_SESSION['nn_tid_elv_de']); + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SESSION_ERROR . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + + if( $_GET['new_novalnet_pin_elv_de'] == 'true') + { + $_SESSION['new_novalnet_pin_elv_de'] = true; + $this->secondcall(); + } + } + + // define callback types + $this->isActivatedCallback = false; + if(MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS != 'False') + { + $this->isActivatedCallback = true; + } + + if ((int)MODULE_PAYMENT_NOVALNET_ELV_DE_ORDER_STATUS_ID > 0) { + $this->order_status = MODULE_PAYMENT_NOVALNET_ELV_DE_ORDER_STATUS_ID; + } + + if (is_object($order)) $this->update_status(); + } + + ### calculate zone matches and flag settings to determine whether this module should display to customers or not ### + function update_status() { + global $order, $db; + + if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_NOVALNET_ELV_DE_ZONE > 0) ) { + $check_flag = false; + $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_NOVALNET_ELV_DE_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id"); + while (!$check->EOF) { + if ($check->fields['zone_id'] < 1) { + $check_flag = true; + break; + } elseif ($check->fields['zone_id'] == $order->billing['zone_id']) { + $check_flag = true; + break; + } + $check->MoveNext(); + } + + if ($check_flag == false) { + $this->enabled = false; + } + } + } + + ### JS validation which does error-checking of data-entry if this module is selected for use ### + ### the fields to be cheked are (Bank Owner, Bank Account Number and Bank Code Lengths) ### + ### currently this function is not in use ### + // @return string + function javascript_validation() { + return false; + } + + ### Builds set of input fields for collecting Bankdetail info ### + // @return array + function selection() { + global $order, $_POST, $_GET; + + $onFocus = ' onfocus="methodSelect(\'pmt-' . $this->code . '\')"'; + + $bank_account = ''; + if (isset($_POST['bank_account'])) {$bank_account = $_POST['bank_account'];} + if(!$bank_account and isset($_GET['bank_account'])) {$bank_account = $_GET['bank_account'];} + if (isset($_POST['bank_code'])){$bank_code = $_POST['bank_code'];} + $bank_code = ''; + if(!$bank_code and isset($_GET['bank_code'])) {$bank_code=$_GET['bank_code'];} + + if(!$_SESSION['nn_tid_elv_de']){ + $selection = array('id' => $this->code, + 'module' => $this->title, + 'fields' => array(array('title' => MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_ACCOUNT_OWNER, + 'field' => zen_draw_input_field('bank_account_holder', $order->billing['firstname'] . ' ' . $order->billing['lastname'], 'id="'.$this->code.'-bank_account_holder"' . $onFocus), + 'tag' => $this->code.'-bank_account_holder'), + array('title' => MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_ACCOUNT_NUMBER, + 'field' => zen_draw_input_field('bank_account', $_SESSION['bank_account'], 'id="' . $this->code . '-bank_account"' . $onFocus), + 'tag' => $this->code . '-bank_account'), + array('title' => MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_CODE, + 'field' => zen_draw_input_field('bank_code', $_SESSION['bank_code'], 'id="' . $this->code . '-bank_code"' . $onFocus), + 'tag' => $this->code . '-bank_code'), + #array('title' => 'INFO:', 'field' => MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_CUST_INFORM), + array('title' => '', 'field' => MODULE_PAYMENT_NOVALNET_ELV_DE_INFO) + )); + + if(MODULE_PAYMENT_NOVALNET_ELV_DE_ACDC=="True") + { + $aryAcdc = array('title' => '', 'field' => zen_draw_checkbox_field('acdc', '1', false, 'id="' . $this->code . '-acdc"' . $onFocus).MODULE_PAYMENT_NOVALNET_ELV_DE_ACDC_INFO); + array_push($selection['fields'], $aryAcdc); + $aryAcdc = array('title' => '', 'field' => MODULE_PAYMENT_NOVALNET_ELV_DE_ACDC_DIV); + array_push($selection['fields'], $aryAcdc); + } + + // Display callback fields + $amount_check = $this->findTotalAmount(); + if($this->isActivatedCallback && strtolower($order->customer['country']['iso_code_2']) == 'de' && $amount_check >= MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_MIN_LIMIT ) + { + $selection['fields'][] = array( 'title' => MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_TEL, 'field' => zen_draw_input_field ( 'user_tel_elv_de', $order->customer['telephone'], 'id="'.$this->code.'-callback" '.$onFocus ) ); + } + }else{ + $selection = array('id' => $this->code, + 'module' => $this->title); + // Show PIN field, after first call + $selection['fields'][] = array( 'title' => MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_INPUT_REQUEST_DESC, 'field' => zen_draw_input_field( 'novalnet_pin_elv_de', '', 'id="'.$this->code.'-callback" '.$onFocus.' maxlength="4" size="4" ') ); + $selection['fields'][] = array( 'title' => ''.MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_NEW_PIN.'') ; + } + return $selection; + } + + ### Precheck to Evaluate the Bank Datas ### + function pre_confirmation_check() { + global $HTTP_POST_VARS, $_POST, $order,$messageStack; + $error = ''; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + if(!MODULE_PAYMENT_NOVALNET_ELV_DE_VENDOR_ID || !MODULE_PAYMENT_NOVALNET_ELV_DE_AUTH_CODE || !MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID || !MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID) + { + $error = MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_JS_NN_MISSING; + } + $HTTP_POST_VARS['bank_account_holder'] = trim($HTTP_POST_VARS['bank_account_holder']); + $HTTP_POST_VARS['bank_account'] = trim($HTTP_POST_VARS['bank_account']); + $HTTP_POST_VARS['bank_code'] = trim($HTTP_POST_VARS['bank_code']); + $HTTP_POST_VARS['acdc'] = trim($HTTP_POST_VARS['acdc']); + $HTTP_POST_VARS['user_tel_elv_de'] = trim($HTTP_POST_VARS['user_tel_elv_de']); + $HTTP_POST_VARS['novalnet_pin_elv_de'] = trim($HTTP_POST_VARS['novalnet_pin_elv_de']); + + // Callback stuff.... + + if($_SESSION['nn_tid_elv_de']) + { + //check the amount is equal with the first call or not + $amount = $this->findTotalAmount(); + if($_SESSION['elv_de_order_amount'] != $amount){ + unset($_SESSION['nn_tid_elv_de']); + unset($_SESSION['elv_de_order_amount']); + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', MODULE_PAYMENT_NOVALNET_ELV_DE_AMOUNT_VARIATION_MESSAGE . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + // check pin + if( !is_numeric( $HTTP_POST_VARS['novalnet_pin_elv_de'] ) || strlen( $HTTP_POST_VARS['novalnet_pin_elv_de'] ) != 4 ) + { + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_PIN_NOTVALID . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + else + { + if( $HTTP_POST_VARS['novalnet_pin_elv_de'] ) + $_SESSION['novalnet_pin_elv_de'] = $HTTP_POST_VARS['novalnet_pin_elv_de']; + } + } + else + { + if (defined('MODULE_PAYMENT_NOVALNET_ELV_DE_MANUAL_CHECK_LIMIT') and MODULE_PAYMENT_NOVALNET_ELV_DE_MANUAL_CHECK_LIMIT) + { + if ( (!defined('MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID2') or !MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID2)) or (!defined('MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID2') or !MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID2))) + { + $error = 'Product-ID2 and/or Tariff-ID2 missing'; + } + } + + if(!$_POST['bank_account_holder'] || strlen($_POST['bank_account_holder'])findTotalAmount(); + if( $this->isActivatedCallback && strtolower($order->customer['country']['iso_code_2']) == 'de' && $amount_check >= MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_MIN_LIMIT ) + { + if( strlen( $HTTP_POST_VARS['user_tel_elv_de'] ) < 8 || !is_numeric( $HTTP_POST_VARS['user_tel_elv_de'] ) ){ + $error .= utf8_decode( MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS_TEL_NOTVALID ); + } + if($error!='') { + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', $error . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + }else{ + $_SESSION['user_tel_elv_de'] = $HTTP_POST_VARS['user_tel_elv_de']; + // firstcall() + $this->before_process(); + $messageStack->add_session('checkout_payment', MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_INPUT_REQUEST_DESC . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL', true, false)); + } + } + //echo $error; + if($error!='') { + $payment_error_return = 'payment_error=' . $this->code . '&bank_account_holder=' . urlencode($_POST['bank_account_holder']) . '&bank_account=' . $_POST['bank_account'] . '&bank_code=' . $_POST['bank_code']; + $messageStack->add_session('checkout_payment', $error . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + } + } + + //This is user defined function used for getting order amount in cents with tax + public function findTotalAmount(){ + global $order; + if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status']['customers_status_add_tax_ot'] == 1) { + $total = $order->info['total'] + $order->info['tax']; + } else { + $total = $order->info['total']; + } + if (preg_match('/[^\d\.]/', $total) or !$total){ + ### $amount contains some unallowed chars or empty ### + $err = 'amount ('.$total.') is empty or has a wrong format'; + $payment_error_return = 'payment_error='.$this->code; + $messageStack->add_session('checkout_payment', $err . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + $amount = sprintf('%0.2f', $total); + $amount = preg_replace('/^0+/', '', $amount); + $amount = str_replace('.', '', $amount); + return $amount; + } + + + public function secondCall() + { + global $messageStack; + // If customer forgets PIN, send a new PIN + if( $_SESSION['new_novalnet_pin_elv_de'] ) + $request_type = 'TRANSMIT_PIN_AGAIN'; + else + $request_type = 'PIN_STATUS'; + + $_SESSION['new_novalnet_pin_elv_de'] = false; + + $xml = ' + + + '.MODULE_PAYMENT_NOVALNET_ELV_DE_VENDOR_ID.' + '.MODULE_PAYMENT_NOVALNET_ELV_DE_AUTH_CODE.' + '.$request_type.' + '.$_SESSION['nn_tid_elv_de'].' + '.$_SESSION['novalnet_pin_elv_de'].' + + '; + + $xml_response = $this->curl_xml_post( $xml ); + + // Parse XML Response to object + $xml_response = simplexml_load_string( $xml_response ); + #$_SESSION['status'] = $xml_response->status; + + if( $xml_response->status != 100 ) + { + $payment_error_return = 'payment_error='.$this->code; + $messageStack->add_session('checkout_payment', utf8_decode($xml_response->status_message) . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + else + { + $array = (array) $xml_response; + + // add tid, because it's missing in the answer + $array['tid'] = $_SESSION['nn_tid_elv_de']; + $array['statusdesc'] = $array['status_message']; // Param-name is changed + $array['test_mode'] = $_SESSION['test_mode_elv_de']; + return $array; + } + } + + + public function curl_xml_post( $request ) + { + $ch = curl_init( "https://payport.novalnet.de/nn_infoport.xml" ); + curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: close')); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $request); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + + ## establish connection + $xml_response = curl_exec($ch); + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug) + { + /* + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + */ + } + + #close connection + curl_close($ch); + + return $xml_response; + } + + ### Display Bank Information on the Checkout Confirmation Page ### + // @return array + function confirmation() { + global $_POST; + + $cardnoLength = strlen(str_replace(' ','',$_POST['bank_account'])); + $crdNo = str_replace(' ','',$_POST['bank_account']); + $cardnoInfo = ''; + $chkLength = $cardnoLength-4; + for($i=0;$i<$cardnoLength;$i++){ + if($i >= $chkLength){ + $cardnoInfo .= '*'; + }else{ + $cardnoInfo .= $crdNo[$i]; + } + } + + $cardnoLength1 = strlen(str_replace(' ','',$_POST['bank_code'])); + $crdNo1 = str_replace(' ','',$_POST['bank_code']); + $cardnoInfo1 = ''; + $chkLength1 = $cardnoLength1-3; + for($i=0;$i<$cardnoLength1;$i++){ + if($i >= $chkLength1){ + $cardnoInfo1 .= '*'; + }else{ + $cardnoInfo1 .= $crdNo1[$i]; + } + } + + $confirmation = array('fields' => array(array('title' => MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_ACCOUNT_OWNER, + 'field' => $_POST['bank_account_holder']), + array('title' => MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_ACCOUNT_NUMBER, + 'field' => $cardnoInfo), + array('title' => MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_BANK_CODE, + 'field' => $cardnoInfo1) + )); + + return $confirmation; + } + + ### Build the data and actions to process when the "Submit" button is pressed on the order-confirmation screen. ### + ### These are hidden fields on the checkout confirmation page ### + // @return string + function process_button() { + global $_POST; + + $process_button_string = zen_draw_hidden_field('bank_account_holder', $_POST['bank_account_holder']) . + zen_draw_hidden_field('bank_account', $_POST['bank_account']) . + zen_draw_hidden_field('bank_code', $_POST['bank_code']).zen_draw_hidden_field('acdc', $_POST['acdc']); + + return $process_button_string; + } + + ### Store the BANK info to the order ### + ### This sends the data to the payment gateway for processing and Evaluates the Bankdatas for acceptance and the validity of the Bank Details ### + function before_process() { + global $_POST, $order, $db, $currencies, $messageStack; + + // Setting callback type // see constructor + // First call is done, so check PIN / second call... + if( $_SESSION['nn_tid_elv_de'] && $this->isActivatedCallback ) + { + //Test mode based on the responsone test mode value + if($_SESSION['test_mode_elv_de'] == 1){ + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_ORDER_MESSAGE; + } + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_ELV_DE_TID_MESSAGE.$_SESSION['nn_tid_elv_de']; + $aryResponse = $this->secondCall(); + return; + } + + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_MODE == '1')? 1: 0; + + $order->info['bank_account'] = $_POST['bank_account']; + $order->info['bank_account_holder'] = $_POST['bank_account_holder']; + $order->info['bank_code'] = $_POST['bank_code']; + + #Get the required additional customer details from DB + $customer_values = $db->Execute("SELECT customers_gender, customers_firstname, customers_lastname, customers_dob, customers_email_address, customers_telephone, customers_fax, customers_email_format FROM ". TABLE_CUSTOMERS . " WHERE customers_id='".(int)$_SESSION['customer_id']."'"); + while(!$customer_values->EOF) + { + $customer_values->MoveNext(); + } + list($customer_values->fields['customers_dob'], $extra) = explode(' ', $customer_values->fields['customers_dob']); + ### Process the payment to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $amount = $this->findTotalAmount(); + $product_id = MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID; + $manual_check_limit = trim(MODULE_PAYMENT_NOVALNET_ELV_DE_MANUAL_CHECK_LIMIT); + $manual_check_limit = str_replace(',', '', $manual_check_limit); + $manual_check_limit = str_replace('.', '', $manual_check_limit); + + if($manual_check_limit && $amount>=$manual_check_limit) + { + $product_id = MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID2; + $tariff_id = MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID2; + } + + + $user_ip = $this->getRealIpAddr(); + $acdc = ''; + if($_POST['acdc']){$acdc = "&acdc=1";} + + //set the user telephone + if($_SESSION['user_tel_elv_de']){ + $user_telephone = $_SESSION['user_tel_elv_de']; + }else{ + $user_telephone = $order->customer['telephone']; + } + // set post params + if( $this->isActivatedCallback && strtolower($order->customer['country']['iso_code_2']) == 'de' && $amount >= MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_MIN_LIMIT ) + { + if( MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS == 'Callback (Telefon & Handy)' ) + { + $this->callback_type = '&pin_by_callback=1'; + } + else + { + $this->callback_type = '&pin_by_sms=1'; + } + } + + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_ELV_DE_VENDOR_ID.'&product='.MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID.'&key=2&tariff='.MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID.'&auth_code='.MODULE_PAYMENT_NOVALNET_ELV_DE_AUTH_CODE.'¤cy='.$order->info['currency']; + $urlparam .= '&amount='.$amount.'&bank_account_holder='.$_POST['bank_account_holder'].'&bank_account='.$_POST['bank_account']; + $urlparam .= '&bank_code='.$_POST['bank_code'].'&first_name='.$order->billing['firstname'].'&last_name='.$order->billing['lastname']; + $urlparam .= '&street='.$order->billing['street_address'].'&city='.$order->billing['city'].'&zip='.$order->billing['postcode']; + $urlparam .= '&country='.$order->billing['country']['iso_code_2'].'&email='.$customer_values->fields['customers_email_address']; + $urlparam .= '&birth_date='.$customer_values->fields['customers_dob'].'&tel='.$user_telephone; + $urlparam .= '&fax='.$customer_values->fields['customers_fax'].'&gender='.$customer_values->fields['customers_gender'].'&search_in_street=1'; + $urlparam .= '&input1=Bestellnummer&input_val1='.$order->info['order_status'].'&remote_ip='.$user_ip.$acdc; + $urlparam .= '&language='.MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_LANG; + // Setting callback type // see constructor + $urlparam .= $this->callback_type; + //echo $urlparam; exit; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + + $aryResponse = array(); + #capture the result and message and other parameters from response data '$data' in an array + $aryPaygateResponse = explode('&', $data); + foreach($aryPaygateResponse as $key => $value) + { + if($value!="") + { + $aryKeyVal = explode("=",$value); + $aryResponse[$aryKeyVal[0]] = $aryKeyVal[1]; + } + } + + if($aryResponse['status']==100) + { + ### Passing through the Transaction ID from Novalnet's paygate into order-info ### + if( $this->isActivatedCallback && strtolower($order->customer['country']['iso_code_2']) == 'de' && $amount >= MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_MIN_LIMIT ){ + $_SESSION['elv_de_order_amount']= $amount; + $_SESSION['nn_tid_elv_de'] = $aryResponse['tid']; + // To avoide payment method confussion add code in session + //set session for maximum time limit to 30 minutes + $_SESSION['max_time_elv_de'] = time() + (30 * 60); + //TEST BILLING MESSAGE BASED ON THE RESPONSE TEST MODE + $_SESSION['test_mode_elv_de'] = $aryResponse['test_mode']; + }else{ + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_MODE == '1')? 1: 0; + + $test_mode_value=( $aryResponse['test_mode'] == 1) ? $aryResponse['test_mode']: $test_mode; + if ($test_mode_value){ + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_ORDER_MESSAGE; + } + + if( $this->order_status ) { + $order->info['order_status'] = $this->order_status; + } + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_ELV_DE_TID_MESSAGE.$aryResponse['tid']; + $_SESSION['nn_tid_elv_de'] = $aryResponse['tid']; + } + } + else + { + ### Passing through the Error Response from Novalnet's paygate into order-info ### + $order->info['comments'] .= 'Novalnet Error Code : '.$aryResponse['status'].', Novalnet Error Message : '.$aryResponse['status_desc']; + + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', $aryResponse['status_desc'] . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + + } + + ### Realtime accesspoint for communication to the Novalnet paygate ### + function perform_https_request($nn_url, $urlparam) + { + $debug = 0;#set it to 1 if you want to activate the debug mode + + if($debug) print "
perform_https_request: $nn_url
\n\r\n"; + if($debug) print "perform_https_request: $urlparam
\n\r\n"; + + ## some prerquisites for the connection + $ch = curl_init($nn_url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + if ($this->proxy) {curl_setopt($ch, CURLOPT_PROXY, $this->proxy); } + + ## establish connection + $data = curl_exec($ch); + $data = $this->ReplaceSpecialGermanChars($data); + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug) + { + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + } + + #close connection + curl_close($ch); + + ## read and return data from novalnet paygate + if($debug) print "
\n\n" . $data . "\n
\n\n"; + + return array ($errno, $errmsg, $data); + } + + ### replace the Special German Charectors ### + function ReplaceSpecialGermanChars($string) + { + $what = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß"); + $how = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss"); + + $string = str_replace($what, $how, $string); + + return $string; + } + + ### get the real Ip Adress of the User ### + function getRealIpAddr() + { + if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet + { + $ip=$_SERVER['HTTP_CLIENT_IP']; + } + elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy + { + $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; + } + else + { + $ip=$_SERVER['REMOTE_ADDR']; + } + + return $ip; + } + + ### Send additional information about bankdata via email to the store owner ### + ### Send the order detail to Novalnet ### + function after_process() { + global $order, $customer_id, $insert_id; + + $product_id = MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID; + if($_SESSION['nn_tid_elv_de'] != ''){ + ### Pass the Order Reference to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_ELV_DE_VENDOR_ID.'&product='.$product_id.'&key=2&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_ELV_DE_AUTH_CODE.'&status=100&tid='.$_SESSION['nn_tid_elv_de'].'&reference=BNR-'.$insert_id.'&vwz3='.$insert_id.'&vwz3_prefix='.MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_ORDERNO.'&vwz4='.date('Y.m.d').'&vwz4_prefix='.MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_ORDERDATE; + $urlparam .= '&order_no='.$insert_id; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + } + unset($_SESSION['nn_tid_elv_de']); + unset($_SESSION['bank_account']); + unset($_SESSION['bank_code']); + unset($_SESSION['bank_account_holder']); + unset($_SESSION['max_time_elv_de']); + unset($_SESSION['test_mode_elv_de']); + unset($_SESSION['user_tel_elv_de']); + + #print "$customer_id, $insert_id"; exit; + ### Implement here the Emailversand and further functions, incase if you want to send a own email ### + + return false; + } + + ### Store additional order information ### + ### not in use ### + // @param int $zf_order_id + function after_order_create($zf_order_id) { + return false; + } + + ### Used to display error message details ### + // @return array + function get_error() { + global $_GET; + + $error = array('title' => MODULE_PAYMENT_NOVALNET_ELV_DE_TEXT_ERROR, + 'error' => stripslashes(urldecode($_GET['error']))); + + return $error; + } + + ### Check to see whether module is installed ### + // @return boolean + function check() { + global $db; + if (!isset($this->_check)) { + $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_NOVALNET_ELV_DE_STATUS'"); + $this->_check = $check_query->RecordCount(); + } + return $this->_check; + } + + ### Install the payment module and its configuration settings ### + function install() { + global $db; + $db->Execute("alter table ".TABLE_ORDERS." modify payment_method varchar(250)"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Allowed zones', 'MODULE_PAYMENT_NOVALNET_ELV_DE_ALLOWED', '', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))', '6', '0', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable ELV-DE Module', 'MODULE_PAYMENT_NOVALNET_ELV_DE_STATUS', 'True', 'Do you want to activate the German Direct Debit Method(ELV-DE) of Novalnet AG?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS', 'False','When activated by PIN Callback / SMS the customer to enter their phone / mobile number requested. By phone or SMS, the customer receives from the AG Novalnet a PIN, which he must enter before ordering. If the PIN is valid, the payment process has been completed successfully, otherwise the customer will be prompted again to enter the PIN. This service is only available for customers from Germany.', '6', '3', 'zen_cfg_select_option(array( \'False\', \'Callback (Telefon & Handy)\', \'SMS (nur Handy)\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_MIN_LIMIT', '','Please enter minimum amount limit to enable \"Pin by CallBack\" modul (In Cents, e.g. 100,200)', '6', '2', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Test Mode', 'MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_MODE', 'True', 'Do you want to enable the test mode?', '6', '2', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Please contact sales@novalnet.de if you do not have any of the following Novalnet IDs!

Wenn Sie keine oder irgendeine der folgenden Novalnet IDs nicht haben sollten, bitte sich an sales@novalnet.de wenden!

Novalnet Merchant ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_VENDOR_ID', '', 'Your Merchant ID of Novalnet', '6', '3', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Authorisation Code', 'MODULE_PAYMENT_NOVALNET_ELV_DE_AUTH_CODE', '', 'Your Authorisation Code of Novalnet', '6', '4', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Product ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID', '', 'Your Product ID of Novalnet', '6', '5', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Tariff ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID', '', 'Your Tariff ID of Novalnet', '6', '6', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Manual checking amount in cents', 'MODULE_PAYMENT_NOVALNET_ELV_DE_MANUAL_CHECK_LIMIT', '', 'Please enter the amount in cents', '6', '7', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your second Product ID in Novalnet', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID2', '', 'for the manual checking', '6', '8', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('The Tariff ID of the second product', 'MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID2', '', 'for the manual checking', '6', '9', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable ACDC Control','MODULE_PAYMENT_NOVALNET_ELV_DE_ACDC', 'False', 'Do you want to activate the ACDC Control of Novalnet AG?', '6', '10','zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Information to the Customer', 'MODULE_PAYMENT_NOVALNET_ELV_DE_INFO', '','will be shown on the payment formula', '6', '11', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_NOVALNET_ELV_DE_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '12', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_NOVALNET_ELV_DE_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '13', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_NOVALNET_ELV_DE_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '14', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Proxy', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PROXY', '0', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)', '6', '15', now())"); + } + + ### Remove the module and all its settings ### + function remove() { + global $db; + $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')"); + } + + ### Internal list of configuration keys used for configuration of the module ### + // @return array + function keys() { + return array('MODULE_PAYMENT_NOVALNET_ELV_DE_ALLOWED','MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_SMS','MODULE_PAYMENT_NOVALNET_ELV_DE_PIN_BY_CALLBACK_MIN_LIMIT', 'MODULE_PAYMENT_NOVALNET_ELV_DE_STATUS', 'MODULE_PAYMENT_NOVALNET_ELV_DE_TEST_MODE', 'MODULE_PAYMENT_NOVALNET_ELV_DE_VENDOR_ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_AUTH_CODE', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_MANUAL_CHECK_LIMIT', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PRODUCT_ID2', 'MODULE_PAYMENT_NOVALNET_ELV_DE_TARIFF_ID2', 'MODULE_PAYMENT_NOVALNET_ELV_DE_ACDC', 'MODULE_PAYMENT_NOVALNET_ELV_DE_INFO', 'MODULE_PAYMENT_NOVALNET_ELV_DE_SORT_ORDER', 'MODULE_PAYMENT_NOVALNET_ELV_DE_ORDER_STATUS_ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_ZONE','MODULE_PAYMENT_NOVALNET_ELV_DE_PROXY'); + } + + +} + +?> diff --git a/includes/modules/payment/novalnet_elv_de_pci.php b/includes/modules/payment/novalnet_elv_de_pci.php new file mode 100644 index 0000000..cef9a99 --- /dev/null +++ b/includes/modules/payment/novalnet_elv_de_pci.php @@ -0,0 +1,700 @@ +key = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PASSWORD; + $this->code = 'novalnet_elv_de_pci'; + $this->title = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_TITLE; + $this->public_title = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_PUBLIC_TITLE; + $this->description = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_DESCRIPTION; + $this->sort_order = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_SORT_ORDER; + $this->enabled = ((MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_STATUS == 'True') ? true : false); + $this->proxy = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PROXY; + $this->implementation = 'PHP_PCI'; + + $this->checkReturnedData(); + + if ((int)MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ORDER_STATUS_ID > 0) + { + $this->order_status = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ORDER_STATUS_ID; + } + + if (is_object($order)) $this->update_status(); + $this->form_action_url = 'https://payport.novalnet.de/pci_payport'; + + if($_POST['session'] && $_SESSION['payment'] == $this->code){ + $this->checkSecurity(); + } + + + } + + ### calculate zone matches and flag settings to determine whether this module should display to customers or not ### + function update_status() + { + global $order, $db; + + if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ZONE > 0) ) + { + $check_flag = false; + $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id"); + while (!$check->EOF) + { + if ($check->fields['zone_id'] < 1) + { + $check_flag = true; + break; + } + elseif ($check->fields['zone_id'] == $order->billing['zone_id']) + { + $check_flag = true; + break; + } + $check->MoveNext(); + } + + if ($check_flag == false) + { + $this->enabled = false; + } + } + } + + ### JS validation which does error-checking of data-entry if this module is selected for use ### + ### the fields to be cheked are (Bank Owner, Bank Account Number and Bank Code Lengths) ### + ### currently this function is not in use ### + // @return string + function javascript_validation() + { + return false; + } + + ### Builds set of input fields for collecting Bankdetail info ### + // @return array + function selection() + { + global $xtPrice, $order, $HTTP_POST_VARS, $_POST; + $onFocus = ''; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + $selection = array('id' => $this->code, + 'module' => $this->public_title, + 'fields' => array(array()) + ); + + if(function_exists(get_percent)) + { + $selection['module_cost'] = $GLOBALS['ot_payment']->get_percent($this->code); + } + + return $selection; + } + + ### Precheck to Evaluate the Bank Datas ### + function pre_confirmation_check() + { + global $HTTP_POST_VARS, $_POST,$messageStack; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + #echo'

';var_dump($_REQUEST); exit;
+		$error = '';
+
+		if (defined('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_MANUAL_CHECK_LIMIT') and MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_MANUAL_CHECK_LIMIT)
+		{
+			  if ( (!defined('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID2') or !MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID2)) or (!defined('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID2') or !MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID2 or preg_match('/[^\d]/', MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID2)))
+			  {
+				  $error = 'Product-ID2 and/or Tariff-ID2 missing';
+			  }
+		}
+
+		if(!MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_VENDOR_ID || !MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_AUTH_CODE || !MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID || !MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID || !MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PASSWORD )
+		{
+		  $error = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_JS_NN_MISSING;
+		}
+
+		if($error!='') 
+		{
+		  $payment_error_return = 'payment_error=' . $this->code;
+		  $messageStack->add_session('checkout_payment', $error . '', 'error');
+		  zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));      
+		}
+  }
+
+  ### Display Information on the Checkout Confirmation Page ###
+  // @return array
+  function confirmation() 
+  {
+		global $HTTP_POST_VARS, $_POST, $order;
+		$_SESSION['nn_total'] = $order->info['total'];
+		if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST;
+		#print "in confirmation"; exit;
+
+		return $confirmation;
+  }
+
+  ### Build the data and actions to process when the "Submit" button is pressed on the order-confirmation screen. ###
+  ### These are hidden fields on the checkout confirmation page ###
+  // @return string
+  function process_button()
+  {
+    
+		global $HTTP_POST_VARS, $_POST, $order, $currencies, $db,$messageStack;
+		if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST;
+
+		#Get the required additional customer details from DB
+		$customer_values = $db->Execute("SELECT customers_gender, customers_dob, customers_fax FROM ". TABLE_CUSTOMERS . " WHERE customers_id='". (int)$_SESSION['customer_id'] ."'");
+		
+		while(!$customer_values->EOF) 
+		{
+			$customer_values->MoveNext();
+		}
+		
+		list($customer_values->fields['customers_dob'], $extra) = explode(' ', $customer_values->fields['customers_dob']);
+
+		if($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status_add_tax_ot'] == 1) 
+		{
+			$totalamount=$order->info['total'] + $order->info['tax'];
+		}
+		else
+		{ 
+			$totalamount=$order->info['total'];
+		}
+		$amount =sprintf('%.2f', $totalamount);
+
+		//$amount = number_format($p_amount * $currencies->currencies['EUR']['value'], $currencies->currencies['EUR']['decimal_places']);
+
+
+		// $amount = $_SESSION['nn_total'];
+		if(preg_match('/[^\d\.]/', $amount) or !$amount)
+		{
+			  ### $amount contains some unallowed chars or empty ###
+			  $err                      = '$amount ('.$amount.') is empty or has a wrong format';
+			  $order->info['comments'] .= '. Novalnet Error Message : '.$err;
+			  $payment_error_return     = 'payment_error='.$this->code;
+			  $messageStack->add_session('checkout_payment', $err . '', 'error');	  
+			  zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));
+		}
+		
+		$amount = preg_replace('/^0+/', '', $amount);
+		$amount = sprintf('%0.2f', $amount);
+		$amount = str_replace('.', '', $amount);
+		#echo __CLASS__.' : '.$order->info['total']." <=> $amount
"; + + $product_id = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID; + $manual_check_limit = trim(MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_MANUAL_CHECK_LIMIT); + $manual_check_limit = str_replace(',', '', $manual_check_limit); + $manual_check_limit = str_replace('.', '', $manual_check_limit); + + if($manual_check_limit && $amount>=$manual_check_limit) + { + $product_id = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID2; + $tariff_id = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID2; + } + + $user_ip = $this->getRealIpAddr(); + + $checkout_url = zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'); + + if(strstr($checkout_url, '?')) + { + $checkout_url = str_replace(' ', '', $checkout_url); + if(substr($checkout_url,-1)=='?')$error_url = $checkout_url.'payment_error=novalnet_elv_de_pci&error=$ERROR_MESSAGE ($STATUS)'; + else $error_url = $checkout_url.'&payment_error=novalnet_elv_de_pci&error=$ERROR_MESSAGE ($STATUS)'; + } + else $error_url = $checkout_url.'?payment_error=novalnet_elv_de_pci&error=$ERROR_MESSAGE ($STATUS)'; + + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_MODE == '1')? 1: 0; + + $_SESSION['order_status_id_value']=$this->order_status; + + $oldreturnurl=zen_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL'); + $old_value=explode(':',$oldreturnurl); + $new_protocol_value=(empty($_SERVER["HTTPS"])) ? 'http' : 'https'; + $return_url=$new_protocol_value.':'.$old_value[1]; + + $uniqid = uniqid(); + + list($auth_code, $product_id, $tariff_id, $amount, $test_mode, $uniqid, $hash) = $this->encodeParams($auth_code=MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_AUTH_CODE, $product_id, $tariff_id, $amount, $test_mode, $uniqid); + + $process_button_string = zen_draw_hidden_field('vendor_id', MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_VENDOR_ID) . + zen_draw_hidden_field('product_id', $product_id) . + zen_draw_hidden_field('payment_id', '2') . + zen_draw_hidden_field('tariff_id', $tariff_id) . + zen_draw_hidden_field('vendor_authcode', $auth_code) . + zen_draw_hidden_field('currency', $order->info['currency']) . + zen_draw_hidden_field('amount', $amount) . + zen_draw_hidden_field('hash', $hash) . + zen_draw_hidden_field('uniqid', $uniqid) . + zen_draw_hidden_field('gender', 'u') . + zen_draw_hidden_field('firstname', $this->html_to_utf8($order->customer['firstname'])) . + zen_draw_hidden_field('lastname', $this->html_to_utf8($order->customer['lastname'])) . + zen_draw_hidden_field('email', $order->customer['email_address']) . + zen_draw_hidden_field('street', $this->html_to_utf8($order->customer['street_address'])) . + zen_draw_hidden_field('search_in_street', '1') . + zen_draw_hidden_field('city', $this->html_to_utf8($order->customer['city'])) . + zen_draw_hidden_field('zip', $order->customer['postcode']) . + zen_draw_hidden_field('country_code', $order->customer['country']['iso_code_2']) . + zen_draw_hidden_field('lang', MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_LANG) . + zen_draw_hidden_field('remote_ip', $user_ip) . + zen_draw_hidden_field('tel', $order->customer['telephone']) . + zen_draw_hidden_field('fax', $customer_values->fields['customers_fax']) . + zen_draw_hidden_field('birthday', $customer_values->fields['customers_dob']) . + zen_draw_hidden_field('session', zen_session_id()) . + zen_draw_hidden_field('return_url', $return_url) . + zen_draw_hidden_field('return_method', 'POST') . + zen_draw_hidden_field('error_return_url', $error_url) . + zen_draw_hidden_field('test_mode', $test_mode) . + zen_draw_hidden_field('error_return_method', 'POST'). + zen_draw_hidden_field('implementation', strtoupper($this->implementation)) . + zen_draw_hidden_field('proxy', $this->proxy); + + return $process_button_string; + } + + ### Insert the Novalnet Transaction ID in DB ### + function before_process() + { + global $_POST, $order; + if($_POST['tid'] && $_POST['status'] == '100'){ + if( $this->order_status ) { + $order->info['order_status'] = $this->order_status; + } + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_MODE == '1')? 1: 0; + + $test_mode_value=( $_POST['test_mode'] == 1) ? $_POST['test_mode'] : $test_mode; + + if ($test_mode_value) + { + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_ORDER_MESSAGE; + } + + $order->info['comments'] .= 'Novalnet Transaction ID : '.$_POST['tid']; + } + } + + function isPublicIP($value) + { + if(!$value || count(explode('.',$value))!=4) return false; + return !preg_match('~^((0|10|172\.16|192\.168|169\.254|255|127\.0)\.)~', $value); + } + + ### get the real Ip Adress of the User ### + function getRealIpAddr() + { + if($this->isPublicIP($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR']; + if($iplist=explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])) + { + if($this->isPublicIP($iplist[0])) return $iplist[0]; + } + if ($this->isPublicIP($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_FORWARDED_FOR']) ) return $_SERVER['HTTP_FORWARDED_FOR']; + + return $_SERVER['REMOTE_ADDR']; + } + + ### Send the order detail to Novalnet ### + function after_process() + { + global $order, $customer_id, $insert_id,$db,$_POST; + + $product_id = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID; + if($_POST['tid'] != ''){ + ### Pass the Order Reference to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_VENDOR_ID.'&product='.$product_id.'&key=2&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_AUTH_CODE.'&status=100&tid='.$_POST['tid'].'&reference=BNR-'.$insert_id.'&vwz2='.MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_ORDERNO.''.$insert_id.'&vwz3='.MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_ORDERDATE.''.date('Y-m-d H:i:s'); + $urlparam .= '&order_no='.$insert_id; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + $_POST['tid'] = ''; + ### Implement here the Emailversand and further functions, incase if you want to send a own email ### + } + return false; + } + + ### Used to display error message details ### + // @return array + function get_error() + { + global $HTTP_GET_VARS, $_GET; + if(count($HTTP_GET_VARS)==0 || $HTTP_GET_VARS=='') $HTTP_GET_VARS = $_GET; + $error = array('title' => MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_ERROR, 'error' => stripslashes(utf8_decode($HTTP_GET_VARS['error']))); + + return $error; + } + + ### Check to see whether module is installed ### + // @return boolean + function check() + { + global $db; + if (!isset($this->_check)) + { + $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_STATUS'"); + $this->_check = $check_query->RecordCount(); + } + return $this->_check; + } + + ### Install the payment module and its configuration settings ### + function install() + { + global $db; + $db->Execute("alter table ".TABLE_ORDERS." modify payment_method varchar(250)"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Allowed zones', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ALLOWED', '', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))', '6', '0', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable ELV-DE Module', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_STATUS', 'True', 'Do you want to activate the German Direct Debit Method(ELV-DE) of Novalnet AG?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Test Mode', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_MODE', 'True', 'Do you want to enable the test mode?', '6', '2', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Please contact sales@novalnet.de if you do not have any of the following Novalnet IDs!

Wenn Sie keine oder irgendeine der folgenden Novalnet IDs nicht haben sollten, bitte sich an sales@novalnet.de wenden!

Novalnet Merchant ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_VENDOR_ID', '', 'Your Merchant ID of Novalnet', '6', '3', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Authorisation Code', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_AUTH_CODE', '', 'Your Authorisation Code of Novalnet', '6', '4', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Product ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID', '', 'Your Product ID of Novalnet', '6', '5', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Tariff ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID', '', 'Your Tariff ID of Novalnet', '6', '6', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Manual checking amount in cents', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_MANUAL_CHECK_LIMIT', '', 'Please enter the amount in cents', '6', '7', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your second Product ID in Novalnet', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID2', '', 'for the manual checking', '6', '8', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('The Tariff ID of the second product', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID2', '', 'for the manual checking', '6', '9', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Password please', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PASSWORD', '', 'for the manual checking', '6', '10', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your Booking Reference at Novalnet', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_BOOK_REF', '', 'Your Booking Reference at Novalnet', '6', '11', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '12', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '13', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '14', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Proxy', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PROXY', '0', 'If you use a Proxy Server, enter the Proxy Server IP with port here (e.g. www.proxy.de:80)', '6', '15', now())"); + } + + ### Remove the module and all its settings ### + function remove() + { + global $db; + $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')"); + } + + ### Internal list of configuration keys used for configuration of the module ### + // @return array + function keys() + { + return array('MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ALLOWED', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_STATUS', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEST_MODE', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_VENDOR_ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_AUTH_CODE', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_MANUAL_CHECK_LIMIT', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PRODUCT_ID2', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TARIFF_ID2','MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PASSWORD', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_BOOK_REF', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_SORT_ORDER', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ORDER_STATUS_ID', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_ZONE', 'MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_PROXY'); + } + ### replace the Special German Charectors ### + function ReplaceSpecialGermanChars($string){ + $what = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß"); + $how = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss"); + + $string = str_replace($what, $how, $string); + + return $string; + } + + function html_to_utf8 ($data){ + return preg_replace("/\\&\\#([0-9]{3,10})\\;/e", '$this->_html_to_utf8("\\1")', $data); + } + + function _html_to_utf8 ($data){ + if ($data > 127){ + $i = 5; + while (($i--) > 0){ + if ($data != ($a = $data % ($p = pow(64, $i)))){ + $ret = chr(base_convert(str_pad(str_repeat(1, $i + 1), 8, "0"), 2, 10) + (($data - $a) / $p)); + for ($i; $i > 0; $i--) + $ret .= chr(128 + ((($data % pow(64, $i)) - ($data % ($p = pow(64, $i - 1)))) / $p)); + break; + } + } + }else{ + $ret = "&#$data;"; + } + return $ret; + } + + ### Realtime accesspoint for communication to the Novalnet paygate ### + function perform_https_request($nn_url, $urlparam){ + $debug = 0;#set it to 1 if you want to activate the debug mode + + if($debug) print "
perform_https_request: $nn_url
\n\r\n"; + if($debug) print "perform_https_request: $urlparam
\n\r\n"; + + ## some prerquisites for the connection + $ch = curl_init($nn_url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + + if ($this->proxy){ + curl_setopt($ch, CURLOPT_PROXY, $this->proxy); + } + + ## establish connection + $data = curl_exec($ch); + $data = $this->ReplaceSpecialGermanChars($data); + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug){ + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + } + + #close connection + curl_close($ch); + + ## read and return data from novalnet paygate + if($debug) print "
\n\n" . $data . "\n
\n\n"; + + return array ($errno, $errmsg, $data); + } + + function debug2($object, $filename, $debug = false){ + if (!$debug){return;} + $fh = fopen("/tmp/$filename", 'a+'); + fwrite($fh, date('Y-m-d H:i:s').' '.print_r($object, true)); + fwrite($fh, "


\n"); + fclose($fh); + } + + function checkSecurity() { + global $_POST, $order, $insert_id, $messageStack; + + if(strlen(trim($_POST['tid']))==17 && $_POST['status']==100 && $_POST['session']== zen_session_id()){ + #xtc_redirect(zen_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL')); + }else{ + if($_POST['status_desc']){ + $error_status = $_POST['status_desc']; + }else { + $error_status = "There was an error and your payment could not be completed "; + } + $err = $error_status." (".$_POST['status'].")"; + #'session missing or returned session is wrong'; + $order->info['comments'] .= '. Novalnet Error Message : '.$err; + $payment_error_return = 'payment_error='.$this->code/*.'&error='.$err*/; + $messageStack->add_session('checkout_payment', $err . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + } + function encode($data){ + $data = trim($data); + if ($data == '') return'Error: no data'; + if (!function_exists('base64_encode') or !function_exists('pack') or !function_exists('crc32')){return'Error: func n/a';} + + try { + $crc = sprintf('%u', crc32($data));# %u is a must for ccrc32 returns a signed value + $data = $crc."|".$data; + $data = bin2hex($data.$this->key); + $data = strrev(base64_encode($data)); + } + catch (Exception $e){ + echo('Error: '.$e); + } + return $data; + } + + function decode($data){ + $data = trim($data); + if ($data == ''){ + return'Error: no data'; + } + if (!function_exists('base64_decode') or !function_exists('pack') or !function_exists('crc32')){ + return'Error: func n/a'; + } + + try { + $data = base64_decode(strrev($data)); + $data = pack("H".strlen($data), $data); + $data = substr($data, 0, stripos($data, $this->key)); + $pos = strpos($data, "|"); + if ($pos === false){ + return("Error: CKSum not found!"); + } + $crc = substr($data, 0, $pos); + $value = trim(substr($data, $pos+1)); + if ($crc != sprintf('%u', crc32($value))){ + return("Error; CKSum invalid!"); + } + return $value; + } + catch (Exception $e){ + echo('Error: '.$e); + } + } + + function hash($h){ #$h contains encoded data + global $amount_zh; + if (!$h) return'Error: no data'; + if (!function_exists('md5')){return'Error: func n/a';} + return md5($h['auth_code'].$h['product_id'].$h['tariff'].$h['amount'].$h['test_mode'].$h['uniqid'].strrev($this->key)); + } + + function checkHash($request){ + if (!$request) return false; #'Error: no data'; + $h['auth_code'] = $request['vendor_authcode'];#encoded + $h['product_id'] = $request['product_id'];#encoded + $h['tariff'] = $request['tariff_id'];#encoded + $h['amount'] = $request['amount'];#encoded + $h['test_mode'] = $request['test_mode'];#encoded + $h['uniqid'] = $request['uniqid'];#encoded + if ($request['hash2']!= $this->hash($h)){ + return false; + } + return true; + } + + function checkHash4java($request){ + if (!$request) return false; #'Error: no data'; + $h['auth_code'] = $request['auth_code'];#encoded + $h['product_id'] = $request['product_id'];#encoded + $h['tariff'] = $request['tariff_id'];#encoded + $h['amount'] = $request['amount'];#encoded + $h['test_mode'] = $request['test_mode'];#encoded + $h['uniqid'] = $request['uniqid'];#encoded + + if ($request['hash2'] != $this->hash($h)) + { + return false; + } + return true; + } + + function encode4java($data = '', $func = ''){ + $salt = 1010; + if (!isset($data) or trim($data) == '' or !$func){ + return'Error: missing arguments: $str and/or $func!'; + } + if ($func != 'decbin' and $func != 'bindec'){ + return'Error: $func has wrong value!'; + } + if ($func == 'decbin'){ + return decbin(intval($data) + intval($salt)); + }else{ + return bindec($data) - intval($salt); + } + } + function checkReturnedData(){ + if ($_POST['hash2'] && $_SESSION['payment'] == $this->code){ + if (strtoupper($this->implementation) == 'JAVA_PCI'){ + #Java encoded + if( $_POST['vendor_authcode'] != md5(MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_AUTH_CODE.strrev($this->key)) ){ + $err = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_HASH_ERROR.'; wrong auth_code!'; + $payment_error_return = 'payment_error=novalnet_elv_de_pci&error='.$_POST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + $_POST['auth_code'] = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_AUTH_CODE;#todo: check? + $_POST['product_id'] = $this->encode4java($_POST['product_id'], 'bindec'); + $_POST['tariff_id'] = $this->encode4java($_POST['tariff_id'], 'bindec'); + $_POST['amount'] = $this->encode4java($_POST['amount'], 'bindec'); + $_POST['test_mode'] = $this->encode4java($_POST['test_mode'], 'bindec'); + $_POST['uniqid'] = $this->encode4java($_POST['uniqid'], 'bindec'); + + if (!$this->checkHash4java($_POST)){ #PHP encoded + $err = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_HASH_ERROR; + $payment_error_return = 'payment_error=novalnet_elv_de_pci&error='.$_POST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + }else{ #PHP encoded + if (!$this->checkHash($_POST)){ + $err = MODULE_PAYMENT_NOVALNET_ELV_DE_PCI_TEXT_HASH_ERROR; + $payment_error_return = 'payment_error=novalnet_elv_de_pci&error='.$_POST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + }else{ + $_POST['test_mode'] = $this->decode($_POST['test_mode']); + } + } + } + } + + function encodeParams($auth_code, $product_id, $tariff_id, $amount, $test_mode, $uniqid){ + if (strtoupper($this->implementation) == 'JAVA_PCI'){ + $uniqid = time();#must ne a long integer + $hash = md5($auth_code.$product_id.$tariff_id.$amount.$test_mode.$uniqid.strrev($this->key)); + $auth_code = md5($auth_code.strrev($this->key)); + $product_id = $this->encode4java($product_id, 'decbin'); + $tariff_id = $this->encode4java($tariff_id, 'decbin'); + $amount = $this->encode4java($amount, 'decbin'); + $test_mode = $this->encode4java($test_mode, 'decbin'); + $uniqid = $this->encode4java($uniqid, 'decbin'); + }else{ + $auth_code = $this->encode($auth_code); + $product_id = $this->encode($product_id); + $tariff_id = $this->encode($tariff_id); + $amount = $this->encode($amount); + $test_mode = $this->encode($test_mode); + $uniqid = $this->encode($uniqid); + $hash = $this->hash(array('auth_code' => $auth_code, 'product_id' => $product_id, 'tariff' => $tariff_id, 'amount' => $amount, 'test_mode' => $test_mode, 'uniqid' => $uniqid)); + } + return array($auth_code, $product_id, $tariff_id, $amount, $test_mode, $uniqid, $hash); + } + +} +/* +flow of functions: +selection -> $order-info['total'] wrong, cause shipping_cost is net +pre_confirmation_check -> $order-info['total'] wrong, cause shipping_cost is net +confirmation -> $order-info['total'] right, cause shipping_cost is gross +process_button -> $order-info['total'] right, cause shipping_cost is gross +before_process -> $order-info['total'] wrong, cause shipping_cost is net +after_process -> $order-info['total'] right, cause shipping_cost is gross +--------------- +flow of url/path: +/xtcommerce/account.php +/xtcommerce/account_history_info.php +/xtcommerce/address_book.php +/xtcommerce/checkout_shipping.php +/xtcommerce/checkout_shipping.php +/xtcommerce/checkout_payment.php +/xtcommerce/checkout_confirmation.php +*/ + +?> diff --git a/includes/modules/payment/novalnet_instantbanktransfer.php b/includes/modules/payment/novalnet_instantbanktransfer.php new file mode 100644 index 0000000..1c8c2c6 --- /dev/null +++ b/includes/modules/payment/novalnet_instantbanktransfer.php @@ -0,0 +1,723 @@ +key = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PASSWORD; #'z2Vw3E4j'; + $this->code = 'novalnet_instantbanktransfer'; + $this->form_action_url = 'https://payport.novalnet.de/online_transfer_payport'; + $this->title = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_TITLE; + $this->public_title = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_PUBLIC_TITLE; + $this->description = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_DESCRIPTION; + $this->sort_order = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_SORT_ORDER; + $this->enabled = ((MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_STATUS == 'True') ? true : false); + $this->blnDebug = false; #todo: set to false for live system + $this->proxy = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PROXY; + $this->implementation = ''; + + if ((int)MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ORDER_STATUS_ID > 0) { + $this->order_status = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ORDER_STATUS_ID; + } + #check encoded data + if ($_REQUEST['hash2'] && $_SESSION['payment'] == $this->code){ + if (strtoupper($this->implementation) == 'JAVA'){#Java encoded + if ( $_REQUEST['auth_code'] != md5(MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_AUTH_CODE.strrev($this->key)) ){ + $err = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_HASH_ERROR.'; wrong auth_code!'; + $payment_error_return = 'payment_error=novalnet_instantbanktransfer&error='.$_REQUEST['status_text'].'; '.$err; + xtc_redirect(xtc_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + $_REQUEST['auth_code'] = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_AUTH_CODE;#todo: check? + $_REQUEST['product_id'] = $this->encode4java($_REQUEST['product'], 'bindec'); + $_REQUEST['tariff_id'] = $this->encode4java($_REQUEST['tariff'], 'bindec'); + $_REQUEST['amount'] = $this->encode4java($_REQUEST['amount'], 'bindec'); + $_REQUEST['test_mode'] = $this->encode4java($_REQUEST['test_mode'], 'bindec'); + $_REQUEST['uniqid'] = $this->encode4java($_REQUEST['uniqid'], 'bindec'); + + if (!$this->checkHash4java($_REQUEST)){#PHP encoded + $err = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_HASH_ERROR; + $payment_error_return = 'payment_error=novalnet_instantbanktransfer&error='.$_REQUEST['status_text'].'; '.$err; + xtc_redirect(xtc_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + }else{#PHP encoded + if (!$this->checkHash($_REQUEST)){ + $err = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_HASH_ERROR; + $payment_error_return = 'payment_error=novalnet_instantbanktransfer&error='.$_REQUEST['status_text'].'; '.$err; + xtc_redirect(xtc_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + }else{ + $_REQUEST['auth_code'] = $this->decode($_REQUEST['auth_code']); + $_REQUEST['product_id'] = $this->decode($_REQUEST['product_id']); + $_REQUEST['tariff_id'] = $this->decode($_REQUEST['tariff_id']); + $_REQUEST['amount'] = $this->decode($_REQUEST['amount']); + $_REQUEST['test_mode'] = $this->decode($_REQUEST['test_mode']); + $_REQUEST['uniqid'] = $this->decode($_REQUEST['uniqid']); + } + } + } + + if ((int)MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ORDER_STATUS_ID > 0) { + $this->order_status = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ORDER_STATUS_ID; + } + + if (is_object($order)) $this->update_status(); + } + + ### calculate zone matches and flag settings to determine whether this module should display to customers or not ### + function update_status() { + global $order, $db; + + if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ZONE > 0) ) { + $check_flag = false; + $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id"); + while (!$check->EOF) { + if ($check->fields['zone_id'] < 1) { + $check_flag = true; + break; + } elseif ($check->fields['zone_id'] == $order->billing['zone_id']) { + $check_flag = true; + break; + } + $check->MoveNext(); + } + + if ($check_flag == false) { + $this->enabled = false; + } + } + } + + ### JS validation which does error-checking of data-entry if this module is selected for use ### + ### the fields to be cheked are (Bank Owner, Bank Account Number and Bank Code Lengths) ### + ### currently this function is not in use ### + // @return string + function javascript_validation() { + return false; + } + + ### Builds set of input fields for collecting Bankdetail info ### + // @return array + function selection() { + global $xtPrice, $order, $HTTP_POST_VARS, $_POST; + + $onFocus = ''; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + $selection = array('id' => $this->code, + 'module' => $this->title, + 'fields' => array(array('title' => '') + )); + + if(function_exists('get_percent')) + { + $selection['module_cost'] = $GLOBALS['ot_payment']->get_percent($this->code); + } + return $selection; + } + + ### Precheck to Evaluate the Bank Datas ### + function pre_confirmation_check() { + global $HTTP_POST_VARS, $_POST, $messageStack; + + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + $error = ''; + + if(!MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_VENDOR_ID || !MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_AUTH_CODE || !MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PRODUCT_ID || !MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TARIFF_ID || !MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PASSWORD ) + { + $error = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_JS_NN_MISSING; + } + + if($error!='') { + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', $error . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + } + + ### Display Bank Information on the Checkout Confirmation Page ### + // @return array + function confirmation() { + global $HTTP_POST_VARS, $_POST, $order; + $_SESSION['nn_total'] = $order->info['total']; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + $confirmation = array(); + + return $confirmation; + } + + ### Build the data and actions to process when the "Submit" button is pressed on the order-confirmation screen. ### + ### These are hidden fields on the checkout confirmation page ### + // @return string + function process_button() { + global $HTTP_POST_VARS, $_POST, $order, $currencies, $customer_id, $db; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + #Get the required additional customer details from DB + $customer = $db->Execute("SELECT customers_gender, customers_dob, customers_fax FROM ". TABLE_CUSTOMERS . " WHERE customers_id='". (int)$_SESSION['customer_id']."'"); + + if ($customer->RecordCount() > 0){ + $customer = $customer->fields; + } + list($customer['customers_dob'], $extra) = explode(' ', $customer['customers_dob']); + + if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status_add_tax_ot'] == 1) { + $totalamount=$order->info['total'] + $order->info['tax']; + } else { + $totalamount=$order->info['total']; + } + $amount =sprintf('%.2f', $totalamount); + if (preg_match('/[^\d\.]/', $amount) or !$amount){ + ### $amount contains some unallowed chars or empty ### + $err = '$amount ('.$amount.') is empty or has a wrong format'; + $order->info['comments'] .= 'Novalnet Error Message : '.$err; + $payment_error_return = 'payment_error='.$this->code; + $messageStack->add_session('checkout_payment', $err . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + $amount = preg_replace('/^0+/', '', $amount); + $amount = sprintf('%0.2f', $amount); + $amount = str_replace('.', '', $amount); + $vendor_id = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_VENDOR_ID; + $auth_code = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_AUTH_CODE; + $product_id = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TARIFF_ID; + $amount = $amount; + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE == '1')? 1: 0; + $uniqid = uniqid(); + $user_ip = $this->getRealIpAddr(); + $checkout_url = zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'); + + if (strtoupper($this->implementation) == 'JAVA'){ + $uniqid = time();#must ne a long integer + $hash = md5($auth_code.$product_id.$tariff_id.$amount.$test_mode.$uniqid.strrev($this->key)); + $auth_code = md5($auth_code.strrev($this->key)); + $product_id = $this->encode4java($product_id, 'decbin'); + $tariff_id = $this->encode4java($tariff_id, 'decbin'); + $amount = $this->encode4java($amount, 'decbin'); + $test_mode = $this->encode4java($test_mode, 'decbin'); + $uniqid = $this->encode4java($uniqid, 'decbin'); + }else{ + $auth_code = $this->encode($auth_code); + $product_id = $this->encode($product_id); + $tariff_id = $this->encode($tariff_id); + $amount = $this->encode($amount); + $test_mode = $this->encode($test_mode); + $uniqid = $this->encode($uniqid); + $hash = $this->hash(array('auth_code' => $auth_code, 'product_id' => $product_id, 'tariff' => $tariff_id, 'amount' => $amount, 'test_mode' => $test_mode, 'uniqid' => $uniqid)); + } + + if(strstr($checkout_url, '?')) + { + $checkout_url = str_replace(' ', '', $checkout_url); + if(substr($checkout_url,-1)=='?') + $error_url = $checkout_url.'payment_error=novalnet_instantbanktransfer&error=$ERROR_MESSAGE ($STATUS)'; + else $error_url = $checkout_url.'&payment_error=novalnet_instantbanktransfer&error=$ERROR_MESSAGE ($STATUS)'; + } + else $error_url = $checkout_url.'?payment_error=novalnet_instantbanktransfer&error=$ERROR_MESSAGE ($STATUS)'; + $oldreturnurl=zen_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL'); + $old_value=explode(':',$oldreturnurl); + $new_protocol_value=(empty($_SERVER["HTTPS"])) ? 'http' : 'https'; + $return_url=$new_protocol_value.':'.$old_value[1]; + $_SESSION['pymt_method'] = 'instantbanktransfer'; + + $process_button_string = + zen_draw_hidden_field('vendor', $vendor_id) .#Pflicht + zen_draw_hidden_field('auth_code', $auth_code) . + zen_draw_hidden_field('product', $product_id) . + zen_draw_hidden_field('tariff', $tariff_id) . + zen_draw_hidden_field('test_mode', $test_mode) . + zen_draw_hidden_field('uniqid', $uniqid) . + zen_draw_hidden_field('amount', $amount) . + zen_draw_hidden_field('hash', $hash) . + zen_draw_hidden_field('nnpayment','onlinetransfer') . + zen_draw_hidden_field('key', self::KEY) .#Pflicht + zen_draw_hidden_field('currency', $order->info['currency']) . + zen_draw_hidden_field('first_name', $this->html_to_utf8($order->customer['firstname'])) . + zen_draw_hidden_field('last_name', $this->html_to_utf8($order->customer['lastname'])) . + zen_draw_hidden_field('gender', 'u') . + zen_draw_hidden_field('email', $order->customer['email_address']) . + zen_draw_hidden_field('street', $this->html_to_utf8($order->customer['street_address'])) . + zen_draw_hidden_field('search_in_street', '1') . + zen_draw_hidden_field('city', $this->html_to_utf8($order->customer['city'])) . + zen_draw_hidden_field('zip', $order->customer['postcode']) . + zen_draw_hidden_field('country', $order->customer['country']['iso_code_2']) . + zen_draw_hidden_field('country_code', $order->customer['country']['iso_code_2']) . + zen_draw_hidden_field('lang', MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_LANG) .#default: 'DE' + zen_draw_hidden_field('language', MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_LANG) .#default: 'DE' + zen_draw_hidden_field('remote_ip', $user_ip) . #Pflicht + zen_draw_hidden_field('tel', $order->customer['telephone']) . + zen_draw_hidden_field('fax', $customer['customers_fax']) . + zen_draw_hidden_field('birth_date', $customer['customers_dob']) . + zen_draw_hidden_field('session', zen_session_id()) . + zen_draw_hidden_field('return_url', $return_url) . + zen_draw_hidden_field('return_method', 'POST') . + zen_draw_hidden_field('error_return_url', $error_url) . + zen_draw_hidden_field('user_variable_0', str_replace(array($new_protocol_value.'://', 'www.'), array('', ''), $_SERVER['SERVER_NAME'])) . + zen_draw_hidden_field('error_return_method', 'POST'). + zen_draw_hidden_field('implementation', strtoupper($this->implementation)) . + zen_draw_hidden_field('proxy', $this->proxy); + + $process_button_string .= $this->getParams4InstantBankTransfer(); + + return $process_button_string; + } + + ### Insert the Novalnet Transaction ID in DB ### + function before_process() { + global $HTTP_POST_VARS, $_POST, $order, $currencies, $customer_id; + if( isset( $_POST['status'] ) && $_POST['status'] == 100 ) { + if( $this->order_status ) { + $order->info['order_status'] = $this->order_status; + } + + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + $testvalue=(strtolower(MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE == '1')? 1: 0; + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE == '1')? 1: 0; + $test_mode_value=( $_REQUEST['test_mode'] == 1) ? $_REQUEST['test_mode'] : $test_mode; + if ($test_mode_value){ + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_ORDER_MESSAGE; + } + + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TID_MESSAGE.' '.$HTTP_POST_VARS['tid']; + $_SESSION['nn_tid'] = $HTTP_POST_VARS['tid'];#todo: + } + } + + ### Send the order detail to Novalnet ### + function after_process() { + global $order, $customer_id, $insert_id; + $product_id = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TARIFF_ID; + if( $_SESSION['nn_tid'] != ''){ + ### Pass the Order Reference to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_VENDOR_ID.'&product='.$product_id.'&key=33&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_AUTH_CODE.'&status=100&tid='.$_SESSION['nn_tid'].'&reference=BNR-'.$insert_id.'&vwz2='.MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_ORDERNO.''.$insert_id.'&vwz3='.MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_ORDERDATE.''.date('Y-m-d H:i:s'); + $urlparam .= '&order_no='.$insert_id; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + } + unset($_SESSION['nn_tid']); + + #print "$customer_id, $insert_id"; exit; + ### Implement here the Emailversand and further functions, incase if you want to send a own email ### + $_SESSION['t_id']=$insert_id; + return false; + } + + ### Used to display error message details ### + // @return array + function get_error() { + global $HTTP_GET_VARS, $_GET; + if(count($HTTP_GET_VARS)==0 || $HTTP_GET_VARS=='') $HTTP_GET_VARS = $_GET; + + #print $HTTP_GET_VARS['error']; exit; + $error = array('title' => MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_ERROR, 'error' => stripslashes(utf8_decode($HTTP_GET_VARS['error']))); + + return $error; + } + + ### Check to see whether module is installed ### + // @return boolean + function check() { + global $db; + if (!isset($this->_check)) { + $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_STATUS'"); + $this->_check = $check_query->RecordCount(); + } + return $this->_check; + } + + ### Install the payment module and its configuration settings ### + function install() { + global $db; + $db->Execute("alter table ".TABLE_ORDERS." modify payment_method varchar(250)"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Allowed zones','MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ALLOWED', '','Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))', '6', '0', now())"); +// $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Enable Instant Bank Transfer Module', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ALLOWED', '', 'Do you want to activate the Instant Bank Transfer Method of Novalnet AG?', '6', '1', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Instant Bank Transfer Module', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_STATUS', 'True', 'Do you want to activate the Instant Bank Transfer Method of Novalnet AG?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enbale Test Mode', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE', 'True', 'Do you want to activate the test Mode?', '6', '2', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Password you can get from http://admin.novalnet.de -> Stammdaten -> Paymentzugriffsschluessel', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PASSWORD', '', 'Enter your password at Novalnet', '6', '3', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Please contact sales@novalnet.de if you do not have any of the following Novalnet IDs!

Wenn Sie keine oder irgendeine der folgenden Novalnet IDs nicht haben sollten, bitte sich an sales@novalnet.de wenden!

Novalnet Merchant ID', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_VENDOR_ID', '', 'Your Merchant ID of Novalnet', '6', '4', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Authorisation Code', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_AUTH_CODE', '', 'Your Authorisation Code of Novalnet', '6', '5', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Product ID', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PRODUCT_ID', '', 'Your Product ID of Novalnet', '6', '6', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Tariff ID', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TARIFF_ID', '', 'Your Tariff ID of Novalnet', '6', '7', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '8', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '9', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '10', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Information to your customer', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_INFO', '', 'Information for your customer', '6', '11', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Proxy', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PROXY', '0', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)', '6', '12', now())"); + } + + ### Remove the module and all its settings ### + function remove() { + global $db; + $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')"); + } + + ### Internal list of configuration keys used for configuration of the module ### + // @return array + function keys(){ + return array('MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ALLOWED', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_STATUS', + 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEST_MODE','MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_VENDOR_ID', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_AUTH_CODE', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PRODUCT_ID', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TARIFF_ID', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_INFO', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_SORT_ORDER', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ORDER_STATUS_ID', + 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_ZONE', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PASSWORD', 'MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_PROXY'); + } + + function html_to_utf8 ($data) + { + $data = utf8_encode($data); + return preg_replace("/\\&\\#([0-9]{3,10})\\;/e", '$this->_html_to_utf8("\\1")', $data); + } + + function _html_to_utf8 ($data) + { + if ($data > 127) + { + $i = 5; + while (($i--) > 0) + { + if ($data != ($a = $data % ($p = pow(64, $i)))) + { + $ret = chr(base_convert(str_pad(str_repeat(1, $i + 1), 8, "0"), 2, 10) + (($data - $a) / $p)); + for ($i; $i > 0; $i--) + $ret .= chr(128 + ((($data % pow(64, $i)) - ($data % ($p = pow(64, $i - 1)))) / $p)); + break; + } + } + } + else + { + #$this->debug2("&#$data;"); + $ret = "&#$data;"; + } + return $ret; + } + + function debug2($text) + { + $fh = fopen('/tmp/debug2.txt', 'a+'); + if (gettype($text) == 'class' or gettype($text) == 'array') + { + $text = serialize($text); + fwrite($fh, $text); + } + else + { + fwrite($fh, date('H:i:s ').$text."\n"); + } + fclose($fh); + } + + function getAmount($amount) + { + if(!$amount)$amount = $order->info['total']; + if(preg_match('/[,.]$/', $amount)) + { + $amount = $amount . '00'; + } + else if(preg_match('/[,.][0-9]$/', $amount)) + { + $amount = $amount . '0'; + } + $amount = str_replace(array('.', ','),array('',''), $amount); + return$amount; + } + + function isPublicIP($value) + { + if(!$value || count(explode('.',$value))!=4) return false; + return !preg_match('~^((0|10|172\.16|192\.168|169\.254|255|127\.0)\.)~', $value); + } + + ### get the real Ip Adress of the User ### + function getRealIpAddr() + { + if($this->isPublicIP($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR']; + if($iplist=explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])) + { + if($this->isPublicIP($iplist[0])) return $iplist[0]; + } + if ($this->isPublicIP($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_FORWARDED_FOR']) ) return $_SERVER['HTTP_FORWARDED_FOR']; + + return $_SERVER['REMOTE_ADDR']; + } + + ### replace the Special German Charectors ### + function ReplaceSpecialGermanChars($string) + { + $what = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß"); + $how = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss"); + + $string = str_replace($what, $how, $string); + + return $string; + } + function getParams4InstantBankTransfer() + { + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + /*for instant bank transfer via www.sofortueberweisung.de + required params: + project_id= must be registred at via www.sofortueberweisung.de + user_id = Kundennr. ($_SESSION['nn_tid']) + + optional params: + Parameter Bedeutung Typ (Länge) Erklärung + amount Betrag Double (8,2) Der zu überweisende Betrag (Minimum: 0.10 EURO, wichtig für Testbestellungen) Bitte keine Trennzeichen bei Tausender-Beträgen, z.B. 1010.50 Euro, correct: + + reason_1 Verwendungszweck1 String (27) Der Verwendungszweck in Zeile 1 (max. 27 Zeichen). Dieser sollte bei jeder Bestellung unterschiedliche Zuordnungsmerkmale aufweisen (z.B. Bestellnummer, Datum der Bestellung) und ist damit eindeutig. + + reason_2 + + sender_bank_code Bankleitzahl des Kunden String (30) Absender-Bankleitzahl + sender_account_number Kontonummer des Kunden String (30) Absender-Kontonummer + sender_holder Kontoinhaber des Kunden String (27) Absender-Kontoinhaber + sender_country_id Kontoinhaber Länderkürzel String (2) Absender-Land(zweistellig,z.B. DE, CH, AT) + hash Hash-Wert String (>=32) Input-Prüfung, siehe Kapitel 3.2.5 + currency_id Transaktionswährung String (3) Werte sind EUR, CHF und GBP* (* Voraussetzung: englischesKonto) + language_id Sprache des Zahlformulars String (2) Legen Sie mit diesem Parameter die Sprache des Zahlformulars fest, Werte, z.B. DE, EN + + user_variable_0 bis user_variable_5 Kundenvariable 0-5 String (255) Zu Ihrer freien Verwendung (z.B. Session-ID) + + #to deposit at www.sofortueberweisung.de: + Erfolgslink: http://zencart.gsoftpro.de/checkout_process.php + Abbruchlink: http://zencart.gsoftpro.de/.php + + ####Plausicheck error von XT: + http://localhost/zencart/checkout_payment.php?payment_error=novalnet_instantbanktransfer&error=*+Deutsche+Kontonummer+muss+mindestens+3+stellig+sein! + ####wrong bank code error von Novalnet: + http://localhost/zencart/checkout_payment.php?payment_error=novalnet_instantbanktransfer&error=Die+angegebene+Bankleitzahl+gibt+es+nicht+%28501007%29 + http://zencart.gsoftpro.de/checkout_payment.php?payment_error=novalnet_INSTANTBANKTRANSFER&error=zh + ####sucess + */ + $params = + #zen_draw_hidden_field('amount', str_replace(',', '.', $_SESSION['nn_total'])).#todo:form check + #zen_draw_hidden_field('sender_bank_code', $HTTP_POST_VARS['bank_code']). + #zen_draw_hidden_field('sender_account_number', $HTTP_POST_VARS['bank_account']). + #zen_draw_hidden_field('sender_holder=', $this->html_to_utf8($HTTP_POST_VARS['bank_account_holder'])). + #zen_draw_hidden_field('sender_country_id', 'DE'). + #zen_draw_hidden_field('currency_id', 'EUR'). + #zen_draw_hidden_field('language_id', MODULE_PAYMENT_NOVALNET_INSTANTBANKTRANSFER_TEXT_LANG); + #zen_draw_hidden_field('customer_id', $_SESSION['nn_tid']). + zen_draw_hidden_field('user_variable_0', (str_replace(array('http://', 'www.'), array('', ''), HTTP_SERVER))); + return$params; + #this link is stored at www.soforueberweisung.de: https://payport.novalnet.de/online_transfer_payport?status=ok&customer_id=-CUSTOMER_ID-&transaction=-TRANSACTION-&sender_holder=-SENDER_HOLDER-&sender_holder_urlencode=-SENDER_HOLDER_URLENCODE-&sender_account_number=-SENDER_ACCOUNT_NUMBER-&sender_bank_code=-SENDER_BANK_CODE-&sender_bank_name=-SENDER_BANK_NAME-&sender_bank_name_urlencode=-SENDER_BANK_NAME_URLENCODE-&sender_bank_bic=-SENDER_BANK_BIC-&sender_iban=-SENDER_IBAN-&user_variable_0=-USER_VARIABLE_0- + } + + function encode($data) + { + $data = trim($data); + if ($data == '') return'Error: no data'; + if (!function_exists('base64_encode') or !function_exists('pack') or !function_exists('crc32')){return'Error: func n/a';} + + try { + $crc = sprintf('%u', crc32($data));# %u is a must for ccrc32 returns a signed value + $data = $crc."|".$data; + $data = bin2hex($data.$this->key); + $data = strrev(base64_encode($data)); + }catch (Exception $e){ + echo('Error: '.$e); + } + return $data; + } + function decode($data) + { + $data = trim($data); + if ($data == '') {return'Error: no data';} + if (!function_exists('base64_decode') or !function_exists('pack') or !function_exists('crc32')){return'Error: func n/a';} + + try { + $data = base64_decode(strrev($data)); + $data = pack("H".strlen($data), $data); + $data = substr($data, 0, stripos($data, $this->key)); + $pos = strpos($data, "|"); + if ($pos === false){ + return("Error: CKSum not found!"); + } + $crc = substr($data, 0, $pos); + $value = trim(substr($data, $pos+1)); + if ($crc != sprintf('%u', crc32($value))){ + return("Error; CKSum invalid!"); + } + return $value; + }catch (Exception $e){ + echo('Error: '.$e); + } + } + function hash($h)#$h contains encoded data + { + global $amount_zh; + if (!$h) return'Error: no data'; + if (!function_exists('md5')){return'Error: func n/a';} + //echo '
rev pass : '; + //echo strrev($this->key); + //echo '
stright pass : '; + //echo $this->key; + //echo '
'; + return md5($h['auth_code'].$h['product_id'].$h['tariff'].$h['amount'].$h['test_mode'].$h['uniqid'].strrev($this->key)); + } + function checkHash($request) + { + //echo 'check hash called '; + if (!$request) return false; #'Error: no data'; + $h['auth_code'] = $request['auth_code'];#encoded + $h['product_id'] = $request['product'];#encoded + $h['tariff'] = $request['tariff'];#encoded + $h['amount'] = $request['amount'];#encoded + $h['test_mode'] = $request['test_mode'];#encoded + $h['uniqid'] = $request['uniqid'];#encoded + if ($request['hash2'] != $this->hash($h)){ + return false; + } + return true; + } + + function checkHash4java($request) + { + if (!$request) return false; #'Error: no data'; + $h['auth_code'] = $request['auth_code'];#encoded + $h['product_id'] = $request['product_id'];#encoded + $h['tariff'] = $request['tariff_id'];#encoded + $h['amount'] = $request['amount'];#encoded + $h['test_mode'] = $request['test_mode'];#encoded + $h['uniqid'] = $request['uniqid'];#encoded + if ($request['hash2'] != $this->hash($h)){ + return false; + } + return true; + } + + function encode4java($data = '', $func = ''){ + $salt = 1010; + if (!isset($data) or trim($data) == '' or !$func){ + return'Error: missing arguments: $str and/or $func!'; + } + if ($func != 'decbin' and $func != 'bindec'){ + return'Error: $func has wrong value!'; + } + if ($func == 'decbin'){ + return decbin(intval($data) + intval($salt)); + }else{ + return bindec($data) - intval($salt); + } + } + + ### Realtime accesspoint for communication to the Novalnet paygate ### + function perform_https_request($nn_url, $urlparam) + { + $debug = 0;#set it to 1 if you want to activate the debug mode + + if($debug) print "
perform_https_request: $nn_url
\n\r\n"; + if($debug) print "perform_https_request: $urlparam
\n\r\n"; + + ## some prerquisites for the connection + $ch = curl_init($nn_url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + + ## establish connection + $data = curl_exec($ch); + $data = $this->ReplaceSpecialGermanChars($data); + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug) + { + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + } + + #close connection + curl_close($ch); + + ## read and return data from novalnet paygate + if($debug) print "
\n\n" . $data . "\n
\n\n"; + + return array ($errno, $errmsg, $data); + } + +} +/* + Parameters passed on Novalnet: + vendor + product + key + tariff + auth_code + currency + amount + first_name + last_name + email + street + search_in_street + city + zip + country_code + lang + remote_ip + tel + fax + birth_date + session + return_url + return_method + error_return_url + test_mode + error_return_method + amount + user_variable_0 +*/ +/* +order of functions: +selection -> $order-info['total'] wrong, cause shipping_cost is net +pre_confirmation_check -> $order-info['total'] wrong, cause shipping_cost is net +confirmation -> $order-info['total'] right, cause shipping_cost is gross +process_button -> $order-info['total'] right, cause shipping_cost is gross +before_process -> $order-info['total'] wrong, cause shipping_cost is net +after_process -> $order-info['total'] right, cause shipping_cost is gross +*/ + +?> diff --git a/includes/modules/payment/novalnet_invoice.php b/includes/modules/payment/novalnet_invoice.php new file mode 100644 index 0000000..693716b --- /dev/null +++ b/includes/modules/payment/novalnet_invoice.php @@ -0,0 +1,755 @@ +code = 'novalnet_invoice'; + $this->title = MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_TITLE; + $this->public_title = MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_PUBLIC_TITLE; + $this->description = MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DESCRIPTION; + $this->sort_order = MODULE_PAYMENT_NOVALNET_INVOICE_SORT_ORDER; + $this->enabled = ((MODULE_PAYMENT_NOVALNET_INVOICE_STATUS == 'True') ? true : false); + $this->proxy = MODULE_PAYMENT_NOVALNET_INVOICE_PROXY; + + // Check the tid in session and make the second call + if($_SESSION['nn_tid_invoice']) + { + //Check the time limit + if($_SESSION['max_time_invoice'] && time() > $_SESSION['max_time_invoice']){ + unset($_SESSION['nn_tid_invoice']); + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SESSION_ERROR . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + + if( $_GET['new_novalnet_pin_invoice'] == 'true') + { + $_SESSION['new_novalnet_pin_invoice'] = true; + $this->secondcall(); + } + } + + // define callback types + $this->isActivatedCallback = false; + if(MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS != 'False'){ + $this->isActivatedCallback = true; + } + + if ((int)MODULE_PAYMENT_NOVALNET_INVOICE_ORDER_STATUS_ID > 0) { + $this->order_status = MODULE_PAYMENT_NOVALNET_INVOICE_ORDER_STATUS_ID; + } + + if (is_object($order)) $this->update_status(); + } + + ### calculate zone matches and flag settings to determine whether this module should display to customers or not ### + function update_status() { + global $order, $db; + + if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_NOVALNET_INVOICE_ZONE > 0) ) { + $check_flag = false; + $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_NOVALNET_INVOICE_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id"); + while (!$check->EOF) { + if ($check->fields['zone_id'] < 1) { + $check_flag = true; + break; + } elseif ($check->fields['zone_id'] == $order->billing['zone_id']) { + $check_flag = true; + break; + } + $check->MoveNext(); + } + + if ($check_flag == false) { + $this->enabled = false; + } + } + } + + ### JS validation which does error-checking of data-entry if this module is selected for use ### + ### the fields to be cheked are (Bank Owner, Bank Account Number and Bank Code Lengths) ### + ### currently this function is not in use ### + // @return string + function javascript_validation() { + return false; + } + + ### Builds set of input fields for collecting Bankdetail info ### + // @return array + function selection() { + global $xtPrice, $order, $HTTP_POST_VARS, $_POST; + + $onFocus = ''; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + if(!$_SESSION['nn_tid_invoice']){ + $selection = array('id' => $this->code, + 'module' => $this->public_title, + 'fields' => array(array('title' => '', 'field' => MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_INFO)) + ); + #} + // Display callback fields + $amount_check = $this->findTotalAmount(); + if($this->isActivatedCallback && strtolower($order->customer['country']['iso_code_2']) == 'de' && $amount_check >= MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_MIN_LIMIT ) + { + $selection['fields'][] = array( 'title' => MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_TEL, 'field' => zen_draw_input_field ( 'user_tel_invoice', $order->customer['telephone'], 'id="'.$this->code.'-callback" '.$onFocus ) ); + } + }else{ + $selection = array('id' => $this->code, + 'module' => $this->public_title, + ); + + // Show PIN field, after first call + $selection['fields'][] = array( 'title' => MODULE_PAYMENT_NOVALNET_INVOICE_PIN_INPUT_REQUEST_DESC, 'field' => zen_draw_input_field( 'novalnet_pin_invoice', '', 'id="'.$this->code.'-callback" '.$onFocus.' maxlength="4" size="4" ') ); + + $selection['fields'][] = array( 'title' => ''.MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_NEW_PIN.'') ; + } + + if(function_exists('get_percent')) + { + $selection['module_cost'] = $GLOBALS['ot_payment']->get_percent($this->code); + } + + return $selection; + } + + ### Precheck to Evaluate the Bank Datas ### + function pre_confirmation_check() { + global $HTTP_POST_VARS, $_POST,$order,$messageStack; + + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + #var_dump($HTTP_POST_VARS); exit; + $HTTP_POST_VARS['user_tel_invoice'] = trim($HTTP_POST_VARS['user_tel_invoice']); + $HTTP_POST_VARS['novalnet_pin_invoice'] = trim($HTTP_POST_VARS['novalnet_pin_invoice']); + + #var_dump($HTTP_POST_VARS); exit; + if($_SESSION['nn_tid_invoice']) + { + //check the amount is equal with the first call or not + $amount = $this->findTotalAmount(); + if($_SESSION['invoice_order_amount'] != $amount){ + unset($_SESSION['nn_tid_invoice']); + unset($_SESSION['invoice_order_amount']); + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', MODULE_PAYMENT_NOVALNET_INVOICE_AMOUNT_VARIATION_MESSAGE . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + // check pin + if( !is_numeric( $HTTP_POST_VARS['novalnet_pin_invoice'] ) || strlen( $HTTP_POST_VARS['novalnet_pin_invoice'] ) != 4 ) + { + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_PIN_NOTVALID . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + else + { + if( $HTTP_POST_VARS['novalnet_pin_invoice'] ) + $_SESSION['novalnet_pin_invoice'] = $HTTP_POST_VARS['novalnet_pin_invoice']; + } + }else{ + $error = ''; + if(!MODULE_PAYMENT_NOVALNET_INVOICE_VENDOR_ID || !MODULE_PAYMENT_NOVALNET_INVOICE_AUTH_CODE || !MODULE_PAYMENT_NOVALNET_INVOICE_PRODUCT_ID || + !MODULE_PAYMENT_NOVALNET_INVOICE_TARIFF_ID) + { + $error .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_JS_NN_MISSING; + } + // Callback stuff.... + $amount_check = $this->findTotalAmount(); + if( $this->isActivatedCallback && strtolower($order->customer['country']['iso_code_2']) == 'de' && $amount_check >= MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_MIN_LIMIT ) + { + //checking telephone number + if( strlen( $HTTP_POST_VARS['user_tel_invoice'] ) < 8 || !is_numeric( $HTTP_POST_VARS['user_tel_invoice'] ) ) + { + $error .= utf8_decode( MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS_TEL_NOTVALID ); + } + if($error!='') { + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', $error . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + }else{ + $_SESSION['user_tel_invoice'] = $HTTP_POST_VARS['user_tel_invoice']; + // firstcall() + $this->before_process(); + $messageStack->add_session('checkout_payment', MODULE_PAYMENT_NOVALNET_INVOICE_PIN_INPUT_REQUEST_DESC . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL', true, false)); + } + + } + if($error!='') { + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', $error . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + } + } + + ### Display Bank Information on the Checkout Confirmation Page ### + // @return array + function confirmation() { + global $order; + $_SESSION['nn_total'] = $order->info['total']; + + $confirmation = array('fields' => array(array( 'field' => MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_INFO))); + + return $confirmation; + } + + ### Build the data and actions to process when the "Submit" button is pressed on the order-confirmation screen. ### + ### These are hidden fields on the checkout confirmation page ### + // @return string + function process_button() { + global $HTTP_POST_VARS, $_POST; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + return $process_button_string; + } + + ### Store the BANK info to the order ### + ### This sends the data to the payment gateway for processing and Evaluates the Bankdatas for acceptance and the validity of the Bank Details ### + function before_process() { + global $HTTP_POST_VARS, $_POST, $order, $xtPrice, $currencies, $customer_id, $db,$messageStack; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + // First call is done, so check PIN / second call... + if( $_SESSION['nn_tid_invoice'] && $this->isActivatedCallback ) + { + $old_comments = $order->info['comments']; + $order->info['comments'] = ""; + //Test mode based on the responsone test mode value + if($_SESSION['test_mode_invoice'] == 1){ + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEST_ORDER_MESSAGE; + unset($_SESSION['test_mode_invoice']); + } + if($_SESSION['due_date_invoice']) + { + $order->info['comments'] .= '
'.MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DURATION_LIMIT_INFO.' '.$_SESSION['due_date_invoice'].' '.MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DURATION_LIMIT_END_INFO.".

"; + } + else + { + $order->info['comments'] .= '
'.MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_TRANSFER_INFO.'

'; + } + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_ACCOUNT_OWNER.' NOVALNET AG
'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_ACCOUNT_NUMBER.' '.$_SESSION['nn_invoice_account'].'
'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_CODE.' '.$_SESSION['nn_invoice_bankcode'].'
'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_BANK.' '.$_SESSION['nn_invoice_bankname'].', + '.$_SESSION['nn_invoice_bankplace'].'

'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_IBAN.' '.$_SESSION['nn_invoice_iban'].'
'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_BIC.' '.$_SESSION['nn_invoice_bic'].'

'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_AMOUNT.' '.$_SESSION['original_amount_invoice'].' '.$order->info['currency'].'
'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TID_MESSAGE.''.$_SESSION['nn_tid_invoice'].'
'; + $order->info['comments'] .= ''.MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_REFERENCE_INFO.'
'; + $order->info['comments'] .= $old_comments; + $order->info['comments'] = str_replace(array('', '', '
', '
','','','
'), array('', '', "\n", "\n"), $order->info['comments']); + $aryResponse = $this->secondCall(); + return; + } + + #Get the required additional customer details from DB + $customer = $db->Execute("SELECT customers_gender, customers_dob, customers_fax FROM ". TABLE_CUSTOMERS . " WHERE customers_id='". (int)$_SESSION['customer_id']."'"); + + if ($customer->RecordCount() > 0){ + $customer = $customer->fields; + } + list($customer['customers_dob'], $extra) = explode(' ', $customer['customers_dob']); + + ### Process the payment to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $amount = $this->findTotalAmount(); + + $product_id = MODULE_PAYMENT_NOVALNET_INVOICE_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_INVOICE_TARIFF_ID; + + $payment_duration = MODULE_PAYMENT_NOVALNET_INVOICE_DURATION; + $payment_duration = trim($payment_duration); + $payment_duration = str_replace(' ', '', $payment_duration); + if(!preg_match("/^[0-9]*$/", $payment_duration)){$payment_duration = '';} + + $due_date = ''; + $due_date_string = ''; + if($payment_duration) + { + $due_date = date("d.m.Y",mktime(0,0,0,date("m"),date("d")+$payment_duration,date("Y"))); + $due_date_string = '&due_date='.date("Y-m-d",mktime(0,0,0,date("m"),date("d")+$payment_duration,date("Y"))); + } + + $user_ip = $this->getRealIpAddr(); + //set the user telephone + if($_SESSION['user_tel_invoice']) + { + $user_telephone = $_SESSION['user_tel_invoice']; + } + else + { + $user_telephone = $order->customer['telephone']; + } + // set post params + if( $this->isActivatedCallback && strtolower($order->customer['country']['iso_code_2']) == 'de' && $amount >= MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_MIN_LIMIT ) + { + if( MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS == 'Callback (Telefon & Handy)' ) + { + $this->callback_type = '&pin_by_callback=1'; + } + else + { + $this->callback_type = '&pin_by_sms=1'; + } + } + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_INVOICE_VENDOR_ID.'&product='.$product_id.'&key=27&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_INVOICE_AUTH_CODE.'¤cy='.$order->info['currency']; + $urlparam .= '&amount='.$amount.'&invoice_type=INVOICE'.$due_date_string; + $urlparam .= '&first_name='.$this->html_to_utf8($order->customer['firstname']).'&last_name='.$this->html_to_utf8($order->customer['lastname']); + $urlparam .= '&street='.$this->html_to_utf8($order->customer['street_address']).'&city='.$this->html_to_utf8($order->customer['city']).'&zip='.$order->customer['postcode']; + $urlparam .= '&country='.$order->customer['country']['iso_code_2'].'&email='.$order->customer['email_address']; + $urlparam .= '&search_in_street=1&tel='.$user_telephone.'&remote_ip='.$user_ip; + $urlparam .= '&gender='.$customer['customers_gender'].'&birth_date='.$customer['customers_dob'].'&fax='.$customer['customers_fax']; + $urlparam .= '&language='.MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_LANG; + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_INVOICE_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_INVOICE_TEST_MODE == '1')? 1: 0; + $urlparam .= '&test_mode='.$test_mode; + // For PIN by call back + $urlparam .= $this->callback_type; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + + $aryResponse = array(); + #capture the result and message and other parameters from response data '$data' in an array + $aryPaygateResponse = explode('&', $data); + foreach($aryPaygateResponse as $key => $value) + { + if($value!="") + { + $aryKeyVal = explode("=",$value); + $aryResponse[$aryKeyVal[0]] = $aryKeyVal[1]; + } + } + + #Get the type of the comments field on TABLE_ORDERS + $customer = $db->Execute("SHOW FIELDS FROM ". TABLE_ORDERS_STATUS_HISTORY . " WHERE FIELD='comments'"); + if ($customer->RecordCount() > 0){ + $customer = $customer->fields; + } + if(strtolower($customer['Type']) != 'text') + { + ### ALTER TABLE ORDERS modify the column comments ### + $db->Execute("ALTER TABLE ". TABLE_ORDERS_STATUS_HISTORY . " MODIFY comments text"); + } + + if($aryResponse['status']==100) + { + if( $this->isActivatedCallback && strtolower($order->customer['country']['iso_code_2']) == 'de' && $amount >= MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_MIN_LIMIT ){ $_SESSION['invoice_order_amount']= $amount; + $_SESSION['nn_tid_invoice'] = $aryResponse['tid']; + // To avoide payment method confussion add code in session + //set session for maximum time limit to 30 minutes + $_SESSION['max_time_invoice'] = time() + (30 * 60); + //TEST BILLING MESSAGE BASED ON THE RESPONSE TEST MODE + $_SESSION['test_mode_invoice'] = $aryResponse['test_mode']; + $_SESSION['original_amount_invoice'] = $amount / 100; + $_SESSION['due_date_invoice'] = $due_date; + ### WRITE THE INVOICE BANK DATA ON SESSION ### + $_SESSION['nn_invoice_account'] = $aryResponse['invoice_account']; + $_SESSION['nn_invoice_bankcode'] = $aryResponse['invoice_bankcode']; + $_SESSION['nn_invoice_iban'] = $aryResponse['invoice_iban']; + $_SESSION['nn_invoice_bic'] = $aryResponse['invoice_bic']; + $_SESSION['nn_invoice_bankname'] = $aryResponse['invoice_bankname']; + $_SESSION['nn_invoice_bankplace'] = $aryResponse['invoice_bankplace']; + }else{ + if( $this->order_status ) { + $order->info['order_status'] = $this->order_status; + } + $old_comments = $order->info['comments']; + $order->info['comments'] =""; + if($aryResponse['test_mode'] == 1){ + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEST_ORDER_MESSAGE; + }elseif(MODULE_PAYMENT_NOVALNET_INVOICE_TEST_MODE == 'Yes' or MODULE_PAYMENT_NOVALNET_INVOICE_TEST_MODE == '1'){ + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEST_ORDER_MESSAGE; + } + $amount = str_replace('.', ',', sprintf("%.2f", $amount/100)); + + if($due_date) + { + $order->info['comments'] .= '
'.MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DURATION_LIMIT_INFO." $due_date + ".MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_DURATION_LIMIT_END_INFO.".

"; + } + else + { + $order->info['comments'] .= '
'.MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_TRANSFER_INFO.'

'; + } + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_ACCOUNT_OWNER.' NOVALNET AG
'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_ACCOUNT_NUMBER.' '.$aryResponse['invoice_account'].'
'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_CODE.' '.$aryResponse['invoice_bankcode'].'
'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_BANK.' '.$aryResponse['invoice_bankname'].', + '.$aryResponse['invoice_bankplace'].'

'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_IBAN.' '.$aryResponse['invoice_iban'].'
'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_BANK_BIC.' '.$aryResponse['invoice_bic'].'

'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_AMOUNT.' '.$_SESSION['nn_total'].' '.$order->info['currency'].'
'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_REFERENCE.' TID '.$aryResponse['tid'].'
'; + $order->info['comments'] .= ''.MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_REFERENCE_INFO.'
'; + $order->info['comments'] .= $old_comments; + $order->info['comments'] = str_replace(array('', '', '
', '
','','','
'), array('', '', "\n", "\n"), $order->info['comments']); + $_SESSION['nn_tid_invoice'] = $aryResponse['tid']; + } + } + else + { + ### Passing through the Error Response from Novalnet's paygate into order-info ### + $order->info['comments'] .= '. Novalnet Error Code : '.$aryResponse['status'].', Novalnet Error Message : '.$aryResponse['status_desc']; + + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', $aryResponse['status_desc'] . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + + return; + } + + //This is user defined function used for getting order amount in cents with tax + public function findTotalAmount(){ + global $order; + if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status']['customers_status_add_tax_ot'] == 1) { + $total = $order->info['total'] + $order->info['tax']; + } else { + $total = $order->info['total']; + } + if (preg_match('/[^\d\.]/', $total) or !$total){ + ### $amount contains some unallowed chars or empty ### + $err = 'amount ('.$total.') is empty or has a wrong format'; + $payment_error_return = 'payment_error='.$this->code; + $messageStack->add_session('checkout_payment', $err . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + $amount = sprintf('%0.2f', $total); + $amount = preg_replace('/^0+/', '', $amount); + $amount = str_replace('.', '', $amount); + return $amount; + } + + + public function secondCall() + { + global $messageStack; + // If customer forgets PIN, send a new PIN + if( $_SESSION['new_novalnet_pin_invoice'] ) + $request_type = 'TRANSMIT_PIN_AGAIN'; + else + $request_type = 'PIN_STATUS'; + + $_SESSION['new_novalnet_pin_invoice'] = false; + + $xml = ' + + + '.MODULE_PAYMENT_NOVALNET_INVOICE_VENDOR_ID.' + '.MODULE_PAYMENT_NOVALNET_INVOICE_AUTH_CODE.' + '.$request_type.' + '.$_SESSION['nn_tid_invoice'].' + '.$_SESSION['novalnet_pin_invoice'].' + + '; + + $xml_response = $this->curl_xml_post( $xml ); + + // Parse XML Response to object + $xml_response = simplexml_load_string( $xml_response ); + #$_SESSION['status'] = $xml_response->status; + + if( $xml_response->status != 100 ) + { + $payment_error_return = 'payment_error='.$this->code; + $messageStack->add_session('checkout_payment', $xml_response->status_message . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + else + { + $array = (array) $xml_response; + + // add tid, because it's missing in the answer + $array['tid'] = $_SESSION['nn_tid_invoice']; + $array['statusdesc'] = $array['status_message']; // Param-name is changed + $array['test_mode'] = $_SESSION['test_mode_invoice']; + return $array; + } + } + + + public function curl_xml_post( $request ) + { + $ch = curl_init( "https://payport.novalnet.de/nn_infoport.xml" ); + curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: close')); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $request); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + + ## establish connection + $xml_response = curl_exec($ch); + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug) + { + /* + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + */ + } + + #close connection + curl_close($ch); + + return $xml_response; + } + + ### Realtime accesspoint for communication to the Novalnet paygate ### + function perform_https_request($nn_url, $urlparam) + { + $debug = 0;#set it to 1 if you want to activate the debug mode + + if($debug) print "
perform_https_request: $nn_url
\n\r\n"; + if($debug) print "perform_https_request: $urlparam
\n\r\n"; + + ## some prerquisites for the connection + $ch = curl_init($nn_url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + if ($this->proxy) {curl_setopt($ch, CURLOPT_PROXY, $this->proxy); } + + ## establish connection + $data = curl_exec($ch); + $data = $this->ReplaceSpecialGermanChars($data); + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug) + { + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + } + + #close connection + curl_close($ch); + + ## read and return data from novalnet paygate + if($debug) print "
\n\n" . $data . "\n
\n\n"; + + return array ($errno, $errmsg, $data); + } + + function isPublicIP($value) + { + if(!$value || count(explode('.',$value)) != 4) return false; + return !preg_match('~^((0|10|172\.16|192\.168|169\.254|255|127\.0)\.)~', $value); + } + + ### get the real Ip Adress of the User ### + function getRealIpAddr() + { + if($_SERVER['HTTP_X_FORWARDED_FOR'] and $this->isPublicIP($_SERVER['HTTP_X_FORWARDED_FOR'])) + { + return $_SERVER['HTTP_X_FORWARDED_FOR']; + } + if($_SERVER['HTTP_X_FORWARDED_FOR'] and $iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])) + { + if($this->isPublicIP($iplist[0])) return $iplist[0]; + } + if ($_SERVER['HTTP_CLIENT_IP'] and $this->isPublicIP($_SERVER['HTTP_CLIENT_IP'])) + { + return $_SERVER['HTTP_CLIENT_IP']; + } + if ($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'] and $this->isPublicIP($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) + { + return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; + } + if ($_SERVER['HTTP_FORWARDED_FOR'] and $this->isPublicIP($_SERVER['HTTP_FORWARDED_FOR']) ) + { + return $_SERVER['HTTP_FORWARDED_FOR']; + } + return $_SERVER['REMOTE_ADDR']; + } + + ### replace the Special German Charectors ### + function ReplaceSpecialGermanChars($string) + { + $what = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß"); + $how = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss"); + + $string = str_replace($what, $how, $string); + + return $string; + } + + ### Send the order detail to Novalnet ### + function after_process() { + global $order, $customer_id, $insert_id,$db; + + $product_id = MODULE_PAYMENT_NOVALNET_INVOICE_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_INVOICE_TARIFF_ID; + if($_SESSION['nn_tid_invoice'] != ''){ + ### Pass the Order Reference to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_INVOICE_VENDOR_ID.'&product='.$product_id.'&key=27&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_INVOICE_AUTH_CODE.'&status=100&tid='.$_SESSION['nn_tid_invoice'].'&reference=BNR-'.$insert_id.'&vwz2='.MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_ORDERNO.''.$insert_id.'&vwz3='.MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_ORDERDATE.''.date('Y-m-d H:i:s'); + $urlparam .= '&order_no='.$insert_id; + $urlparam .= "&invoice_ref=BNR-".$product_id."-".$insert_id; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + } + unset($_SESSION['user_tel_invoice']); + unset($_SESSION['nn_tid_invoice']); + unset($_SESSION['max_time_invoice']); + + #print "$customer_id, $insert_id"; exit; + ### Implement here the Emailversand and further functions, incase if you want to send a own email ### +/* + $db->Execute("update ".TABLE_ORDERS_STATUS_HISTORY." set comments = '".$order->info['comments']."' , orders_status_id= '".$this->order_status."' where orders_id = '".$insert_id."'"); + $db->Execute("update ".TABLE_ORDERS." set orders_status = '".$this->order_status."' where orders_id = '".$insert_id."'"); +*/ + + return false; + } + + ### Used to display error message details ### + // @return array + function get_error() { + global $HTTP_GET_VARS, $_GET; + if(count($HTTP_GET_VARS)==0 || $HTTP_GET_VARS=='') $HTTP_GET_VARS = $_GET; + + $error = array('title' => MODULE_PAYMENT_NOVALNET_INVOICE_TEXT_ERROR, + 'error' => stripslashes(urldecode($HTTP_GET_VARS['error']))); + + return $error; + } + + ### Check to see whether module is installed ### + // @return boolean + function check() { + global $db; + if (!isset($this->_check)) { + $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_NOVALNET_INVOICE_STATUS'"); + $this->_check = $check_query->RecordCount(); + } + return $this->_check; + } + + ### Install the payment module and its configuration settings ### + function install() { + global $db; + $db->Execute("alter table ".TABLE_ORDERS." modify payment_method varchar(250)"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Allowed zones','MODULE_PAYMENT_NOVALNET_INVOICE_ALLOWED', '','Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))', '6', '0', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS', 'False','When activated by PIN Callback / SMS the customer to enter their phone / mobile number requested. By phone or SMS, the customer receives from the AG Novalnet a PIN, which he must enter before ordering. If the PIN is valid, the payment process has been completed successfully, otherwise the customer will be prompted again to enter the PIN. This service is only available for customers from Germany.', '6', '3', 'zen_cfg_select_option(array( \'False\', \'Callback (Telefon & Handy)\', \'SMS (nur Handy)\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_MIN_LIMIT', '','Please enter minimum amount limit to enable \"Pin by CallBack\" modul (In Cents, e.g. 100,200)', '6', '2', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable INVOICE Module', 'MODULE_PAYMENT_NOVALNET_INVOICE_STATUS', 'True', 'Do you want to activate the Invoice Method of Novalnet AG?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Test Mode', 'MODULE_PAYMENT_NOVALNET_INVOICE_TEST_MODE', 'True', 'Do you want to enable the test mode?', '6', '2', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Please contact sales@novalnet.de if you do not have any of the following Novalnet IDs!

Wenn Sie keine oder irgendeine der folgenden Novalnet IDs nicht haben sollten, bitte sich an sales@novalnet.de wenden!

Novalnet Merchant ID', 'MODULE_PAYMENT_NOVALNET_INVOICE_VENDOR_ID', '', 'Your Merchant ID of Novalnet', '6', '3', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Authorisation Code', 'MODULE_PAYMENT_NOVALNET_INVOICE_AUTH_CODE', '', 'Your Authorisation Code of Novalnet', '6', '4', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Product ID', 'MODULE_PAYMENT_NOVALNET_INVOICE_PRODUCT_ID', '', 'Your Product ID of Novalnet', '6', '5', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Tariff ID', 'MODULE_PAYMENT_NOVALNET_INVOICE_TARIFF_ID', '', 'Your Tariff ID of Novalnet', '6', '6', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Invoice Duration', 'MODULE_PAYMENT_NOVALNET_INVOICE_DURATION', '', 'Invoice Duration', '6', '7', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Information to the Customer', 'MODULE_PAYMENT_NOVALNET_INVOICE_INFO', '','will be shown on the payment formula', '6', '8', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_NOVALNET_INVOICE_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '9', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_NOVALNET_INVOICE_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '10', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_NOVALNET_INVOICE_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '11', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Proxy', 'MODULE_PAYMENT_NOVALNET_INVOICE_PROXY', '0', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)', '6', '12', now())"); + + } + + ### Remove the module and all its settings ### + function remove() { + global $db; + $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')"); + } + + ### Internal list of configuration keys used for configuration of the module ### + // @return array + function keys() { + return array('MODULE_PAYMENT_NOVALNET_INVOICE_ALLOWED','MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_SMS','MODULE_PAYMENT_NOVALNET_INVOICE_PIN_BY_CALLBACK_MIN_LIMIT', 'MODULE_PAYMENT_NOVALNET_INVOICE_STATUS', 'MODULE_PAYMENT_NOVALNET_INVOICE_TEST_MODE', + 'MODULE_PAYMENT_NOVALNET_INVOICE_VENDOR_ID', 'MODULE_PAYMENT_NOVALNET_INVOICE_AUTH_CODE', 'MODULE_PAYMENT_NOVALNET_INVOICE_PRODUCT_ID', + 'MODULE_PAYMENT_NOVALNET_INVOICE_TARIFF_ID', 'MODULE_PAYMENT_NOVALNET_INVOICE_DURATION', 'MODULE_PAYMENT_NOVALNET_INVOICE_INFO', + 'MODULE_PAYMENT_NOVALNET_INVOICE_SORT_ORDER', 'MODULE_PAYMENT_NOVALNET_INVOICE_ORDER_STATUS_ID', 'MODULE_PAYMENT_NOVALNET_INVOICE_ZONE', + 'MODULE_PAYMENT_NOVALNET_INVOICE_PROXY'); + } + + function html_to_utf8 ($data) + { + return preg_replace("/\\&\\#([0-9]{3,10})\\;/e", '$this->_html_to_utf8("\\1")', $data); + } + + function _html_to_utf8 ($data) + { + if ($data > 127) + { + $i = 5; + while (($i--) > 0) + { + if ($data != ($a = $data % ($p = pow(64, $i)))) + { + $ret = chr(base_convert(str_pad(str_repeat(1, $i + 1), 8, "0"), 2, 10) + (($data - $a) / $p)); + for ($i; $i > 0; $i--) + $ret .= chr(128 + ((($data % pow(64, $i)) - ($data % ($p = pow(64, $i - 1)))) / $p)); + break; + } + } + } + else + { + $ret = "&#$data;"; + } + return $ret; + } +} +/* +order of functions: +selection -> $order-info['total'] wrong, cause shipping_cost is net +pre_confirmation_check -> $order-info['total'] wrong, cause shipping_cost is net +confirmation -> $order-info['total'] right, cause shipping_cost is gross +process_button -> $order-info['total'] right, cause shipping_cost is gross +before_process -> $order-info['total'] wrong, cause shipping_cost is net +after_process -> $order-info['total'] right, cause shipping_cost is gross +*/ + +?> diff --git a/includes/modules/payment/novalnet_paypal.php b/includes/modules/payment/novalnet_paypal.php new file mode 100644 index 0000000..d4c77b4 --- /dev/null +++ b/includes/modules/payment/novalnet_paypal.php @@ -0,0 +1,750 @@ +key = MODULE_PAYMENT_NOVALNET_PAYPAL_PASSWORD; #'z2Vw3E4j' + $this->code = 'novalnet_paypal'; + $this->form_action_url = 'https://payport.novalnet.de/paypal_payport'; + $this->title = MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_TITLE; + $this->public_title = MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_PUBLIC_TITLE; + $this->description = MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_DESCRIPTION; + $this->sort_order = MODULE_PAYMENT_NOVALNET_PAYPAL_SORT_ORDER; + $this->enabled = ((MODULE_PAYMENT_NOVALNET_PAYPAL_STATUS == 'True') ? true : false); + $this->blnDebug = false; #todo: set to false for live system + $this->proxy = MODULE_PAYMENT_NOVALNET_PAYPAL_PROXY; + $this->implementation = '';#'JAVA|PHP|''; defaults to 'PHP' + $this->info = MODULE_PAYMENT_PAYPAL_TEXT_INFO; + + #check encoded data + if ($_REQUEST['hash2'] && $_SESSION['payment'] == $this->code){ + if (strtoupper($this->implementation) == 'JAVA'){#Java encoded + if ( $_REQUEST['auth_code'] != md5(MODULE_PAYMENT_NOVALNET_PAYPAL_AUTH_CODE.strrev($this->key)) ){ + $err = MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_HASH_ERROR.'; wrong auth_code!'; + $payment_error_return = 'payment_error=novalnet_PAYPAL&error='.$_REQUEST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + $_REQUEST['auth_code'] = MODULE_PAYMENT_NOVALNET_PAYPAL_AUTH_CODE;#todo: check? + $_REQUEST['product_id'] = $this->encode4java($_REQUEST['product'], 'bindec'); + $_REQUEST['tariff_id'] = $this->encode4java($_REQUEST['tariff'], 'bindec'); + $_REQUEST['amount'] = $this->encode4java($_REQUEST['amount'], 'bindec'); + $_REQUEST['test_mode'] = $this->encode4java($_REQUEST['test_mode'], 'bindec'); + $_REQUEST['uniqid'] = $this->encode4java($_REQUEST['uniqid'], 'bindec'); + + if (!$this->checkHash4java($_REQUEST)){#PHP encoded + $err = MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_HASH_ERROR; + $payment_error_return = 'payment_error=novalnet_paypal&error='.$_REQUEST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + }else{#PHP encoded + if (!$this->checkHash($_REQUEST)){ + $err = MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_HASH_ERROR; + $payment_error_return = 'payment_error=novalnet_paypal&error='.$_REQUEST['status_text'].'; '.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + }else{ + $_REQUEST['auth_code'] = $this->decode($_REQUEST['auth_code']); + $_REQUEST['product_id'] = $this->decode($_REQUEST['product_id']); + $_REQUEST['tariff_id'] = $this->decode($_REQUEST['tariff_id']); + $_REQUEST['amount'] = $this->decode($_REQUEST['amount']); + $_REQUEST['test_mode'] = $this->decode($_REQUEST['test_mode']); + $_REQUEST['uniqid'] = $this->decode($_REQUEST['uniqid']); + } + } + } + if ((int)MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ID > 0) { + $this->order_status = MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ID; + } + + if (is_object($order)){ + $this->update_status(); + } + + } + + ### calculate zone matches and flag settings to determine whether this module should display to customers or not ### + function update_status() { + global $order, $db; + + if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_NOVALNET_PAYPAL_ZONE > 0) ) { + $check_flag = false; + $check_query = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_NOVALNET_PAYPAL_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id"); + while ($check = zen_db_fetch_array($check_query)) { + if ($check['zone_id'] < 1) { + $check_flag = true; + break; + } elseif ($check['zone_id'] == $order->billing['zone_id']) { + $check_flag = true; + break; + } + } + + if ($check_flag == false) { + $this->enabled = false; + } + } + } + + ### JS validation which does error-checking of data-entry if this module is selected for use ### + ### the fields to be cheked are (Bank Owner, Bank Account Number and Bank Code Lengths) ### + ### currently this function is not in use ### + // @return string + function javascript_validation() { + return false; + } + + ### Builds set of input fields for collecting Bankdetail info ### + // @return array + function selection() { + + global $xtPrice, $order, $HTTP_POST_VARS, $_POST; + + $onFocus = ''; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + $selection = array('id' => $this->code, + 'module' => $this->public_title, + 'description' => $this->info, + 'fields' => array(array('title' => '') + )); + + if(function_exists(get_percent)) + { + $selection['module_cost'] = $GLOBALS['ot_payment']->get_percent($this->code); + } + return $selection; + } + + ### Precheck to Evaluate the Bank Datas ### + function pre_confirmation_check() { + global $HTTP_POST_VARS, $_POST; + + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + $error = ''; + $api_signature = MODULE_PAYMENT_NOVALNET_PAYPAL_API_SIGNATURE; + $api_user = MODULE_PAYMENT_NOVALNET_PAYPAL_API_USER; + $api_pw = MODULE_PAYMENT_NOVALNET_PAYPAL_API_PASSWORD; + if(!MODULE_PAYMENT_NOVALNET_PAYPAL_VENDOR_ID || !MODULE_PAYMENT_NOVALNET_PAYPAL_AUTH_CODE || !MODULE_PAYMENT_NOVALNET_PAYPAL_PRODUCT_ID || !MODULE_PAYMENT_NOVALNET_PAYPAL_TARIFF_ID || !MODULE_PAYMENT_NOVALNET_PAYPAL_PASSWORD || !MODULE_PAYMENT_NOVALNET_PAYPAL_API_SIGNATURE || !MODULE_PAYMENT_NOVALNET_PAYPAL_API_USER || !MODULE_PAYMENT_NOVALNET_PAYPAL_API_PASSWORD) + { + $error = MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_JS_NN_MISSING; + } + + if($error!='') { + $payment_error_return = 'payment_error=' . $this->code . '&error=' . urlencode($error); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + } + + ### Display Bank Information on the Checkout Confirmation Page ### + // @return array + function confirmation() { + global $HTTP_POST_VARS, $_POST, $order; + + if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status']['customers_status_add_tax_ot'] == 1) { + $total = $order->info['total'] + $order->info['tax']; + } else { + $total = $order->info['total']; + } + $_SESSION['nn_total'] = sprintf('%.2f', $total); + + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + $confirmation = array(/*'fields' => array(array('title' => MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_CARD_OWNER, + 'field' => $HTTP_POST_VARS['cc_holder']), + array('title' => MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_CC_NO, + 'field' => $HTTP_POST_VARS['cc_no']), + array('title' => MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_EXP_MONTH, + 'field' => $HTTP_POST_VARS['cc_exp_month']), + array('title' => MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_EXP_YEAR, + 'field' => $HTTP_POST_VARS['cc_exp_year']), + array('title' => MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_CVC, + 'field' => '***') + )*/); + + return $confirmation; + } + + ### Build the data and actions to process when the "Submit" button is pressed on the order-confirmation screen. ### + ### These are hidden fields on the checkout confirmation page ### + // @return string + function process_button() { + global $HTTP_POST_VARS, $_POST, $order, $currencies, $customer_id, $db, $messageStack; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + #Get the required additional customer details from DB + $customer_values = $db->Execute("SELECT customers_gender, customers_dob, customers_fax FROM ". TABLE_CUSTOMERS . " WHERE customers_id='". (int)$_SESSION['customer_id'] ."'"); + + while(!$customer_values->EOF){ + $customer_values->MoveNext(); + } + + list($customer_values->fields['customers_dob'], $extra) = explode(' ', $customer_values->fields['customers_dob']); + + if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status_add_tax_ot'] == 1){ + $totalamount=$order->info['total'] + $order->info['tax']; + } else { $totalamount=$order->info['total'];} + + + $amount =sprintf('%.2f', $totalamount); + + if (preg_match('/[^\d\.]/', $amount) or !$amount){ + ### $amount contains some unallowed chars or empty ### + $err = '$amount ('.$amount.') is empty or has a wrong format'; + $order->info['comments'] .= '. Novalnet Error Message : '.$err; + $payment_error_return = 'payment_error='.$this->code; + $messageStack->add_session('checkout_payment', $err . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + $amount = preg_replace('/^0+/', '', $amount); + $amount = sprintf('%0.2f', $amount); + $amount = str_replace('.', '', $amount); + + $api_signature = MODULE_PAYMENT_NOVALNET_PAYPAL_API_SIGNATURE; + $api_user = MODULE_PAYMENT_NOVALNET_PAYPAL_API_USER; + $api_pw = MODULE_PAYMENT_NOVALNET_PAYPAL_API_PASSWORD; + + $vendor_id = MODULE_PAYMENT_NOVALNET_PAYPAL_VENDOR_ID; + $auth_code = MODULE_PAYMENT_NOVALNET_PAYPAL_AUTH_CODE; + $product_id = MODULE_PAYMENT_NOVALNET_PAYPAL_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_PAYPAL_TARIFF_ID; + $uniqid = uniqid(); + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_MODE == '1')? 1: 0; + + if (strtoupper($this->implementation) == 'JAVA'){ + $uniqid = time();#must ne a long integer + $hash = md5($auth_code.$product_id.$tariff_id.$amount.$test_mode.$uniqid.strrev($this->key)); + $auth_code = md5($auth_code.strrev($this->key)); + $product_id = $this->encode4java($product_id, 'decbin'); + $tariff_id = $this->encode4java($tariff_id, 'decbin'); + $amount = $this->encode4java($amount, 'decbin'); + $test_mode = $this->encode4java($test_mode, 'decbin'); + $uniqid = $this->encode4java($uniqid, 'decbin'); + $api_signature = $this->encode4java($api_signature, 'decbin'); + $api_user = $this->encode4java($api_user, 'decbin'); + $api_pw = $this->encode4java($api_pw, 'decbin'); + + }else{ + $auth_code = $this->encode($auth_code); + $product_id = $this->encode($product_id); + $tariff_id = $this->encode($tariff_id); + $amount = $this->encode($amount); + $test_mode = $this->encode($test_mode); + $uniqid = $this->encode($uniqid); + $hash = $this->hash(array('auth_code' => $auth_code, 'product_id' => $product_id, 'tariff' => $tariff_id, 'amount' => $amount, 'test_mode' => $test_mode, 'uniqid' => $uniqid)); + $api_signature = $this->encode($api_signature); + $api_user = $this->encode($api_user); + $api_pw = $this->encode($api_pw); + } + + $user_ip = $this->getRealIpAddr(); + $checkout_url = zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'); + if(strstr($checkout_url, '?')) + { + $checkout_url = str_replace(' ', '', $checkout_url); + if(substr($checkout_url,-1)=='?') + $error_url = $checkout_url.'payment_error=novalnet_paypal&error=$ERROR_MESSAGE ($STATUS)'; + else $error_url = $checkout_url.'&payment_error=novalnet_paypal&error=$ERROR_MESSAGE ($STATUS)'; + } + else $error_url = $checkout_url.'?payment_error=novalnet_paypal&error=$ERROR_MESSAGE ($STATUS)'; + #$error_url = http://localhost/xtcommerce/checkout_payment.php?payment_error=novalnet_paypal&error=$ERROR_MESSAGE ($STATUS) + #http://localhost/xtcommerce/checkout_payment.php?payment_error=checkHashfehlgeschlagen&error=EsfehlenEingabe-Daten + + $process_button_string = + zen_draw_hidden_field('api_signature', $api_signature) . + zen_draw_hidden_field('api_user', $api_user) . + zen_draw_hidden_field('api_pw', $api_pw) . + zen_draw_hidden_field('vendor', $vendor_id) . + zen_draw_hidden_field('auth_code', $auth_code) . + zen_draw_hidden_field('product', $product_id) . + zen_draw_hidden_field('tariff', $tariff_id) . + zen_draw_hidden_field('test_mode', $test_mode) . + zen_draw_hidden_field('uniqid', $uniqid) . + zen_draw_hidden_field('amount', $amount) . + zen_draw_hidden_field('hash', $hash) . + zen_draw_hidden_field('key', $this->KEY) .#Pflicht + zen_draw_hidden_field('currency', $order->info['currency']) . + #zen_draw_hidden_field('first_name', $this->html_to_utf8($order->customer['firstname'])) . + zen_draw_hidden_field('first_name',$this->html_to_utf8($order->customer['firstname'])) . + #zen_draw_hidden_field('last_name', $this->html_to_utf8($order->customer['lastname'])) . + zen_draw_hidden_field('last_name', $this->html_to_utf8($order->customer['lastname'])) . + zen_draw_hidden_field('gender', 'u') . + zen_draw_hidden_field('email', $order->customer['email_address']) . + #zen_draw_hidden_field('street', $this->html_to_utf8($order->customer['street_address'])) . + zen_draw_hidden_field('street', $this->html_to_utf8($order->customer['street_address'])) . + zen_draw_hidden_field('search_in_street', '1') . + #zen_draw_hidden_field('city', $this->html_to_utf8($order->customer['city'])) . + zen_draw_hidden_field('city', $this->html_to_utf8($order->customer['city'])) . + #zen_draw_hidden_field('zip', $order->customer['postcode']) . + zen_draw_hidden_field('zip', $order->customer['postcode']) . + #zen_draw_hidden_field('country', $order->customer['country']['iso_code_2']) . + zen_draw_hidden_field('country', $order->customer['country']['iso_code_2']) . + #zen_draw_hidden_field('country_code', $order->customer['country']['iso_code_2']) . + zen_draw_hidden_field('country_code', $order->customer['country']['iso_code_2']) . + zen_draw_hidden_field('lang', MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_LANG) .#default: 'DE' + zen_draw_hidden_field('language', MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_LANG) .#default: 'DE' + zen_draw_hidden_field('remote_ip', $user_ip) . #Pflicht + zen_draw_hidden_field('tel', $order->customer['telephone']) . + zen_draw_hidden_field('fax', $customer['customers_fax']) . + zen_draw_hidden_field('birth_date', $customer['customers_dob']) . + zen_draw_hidden_field('session', zen_session_id()) . + zen_draw_hidden_field('return_url', zen_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL')) . + zen_draw_hidden_field('return_method', 'POST') . + zen_draw_hidden_field('error_return_url', $error_url) . + zen_draw_hidden_field('user_variable_0', str_replace(array('http://', 'www.'), array('', ''), $_SERVER['SERVER_NAME'])) . + zen_draw_hidden_field('implementation', strtoupper($this->implementation)) . + zen_draw_hidden_field('error_return_method', 'POST'); + //$process_button_string .= $this->getParams(); + return $process_button_string; + } + + ### Insert the Novalnet Transaction ID in DB ### + function before_process() { + global $HTTP_POST_VARS, $_POST, $order, $currencies, $customer_id; + + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + if( isset( $_POST['status'] ) && $_POST['status'] == 100 ) { + if( $this->order_status ) { + $order->info['order_status'] = $this->order_status; + } + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_MODE == '1')? 1: 0; + if($_POST['test_mode'] == 1){ + $order->info['comments'] .= ''.MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_ORDER_MESSAGE.'
'; + }elseif($test_mode == "1"){ + $order->info['comments'] .= ''.MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_ORDER_MESSAGE.'
'; + } + $order->info['comments'] .= '. Novalnet Transaction ID : '.$HTTP_POST_VARS['tid']; + $order->info['comments'] = str_replace(array('', '', '
', '
','','','
'), array('', '', "\n", "\n"), $order->info['comments']); + $_SESSION['nn_tid'] = $HTTP_POST_VARS['tid'];#todo: + } + } + + ### Send the order detail to Novalnet ### + function after_process() { + global $order, $customer_id, $insert_id, $db; + + if ($this->order_status){ + $db->Execute("UPDATE ".TABLE_ORDERS." SET orders_status='".$this->order_status."' WHERE orders_id='".$insert_id."'"); + } + + $product_id = MODULE_PAYMENT_NOVALNET_PAYPAL_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_PAYPAL_TARIFF_ID; + if($_SESSION['nn_tid']){ + ### Pass the Order Reference to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_PAYPAL_VENDOR_ID.'&product='.$product_id.'&key=34&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_PAYPAL_AUTH_CODE.'&status=100&tid='.$_SESSION['nn_tid'].'&reference=BNR-'.$product_id.'-'.$insert_id.'&vwz2='.MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_ORDERNO.''.$insert_id.'&vwz3='.MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_ORDERDATE.''.date('Y-m-d H:i:s'); + $urlparam .= '&order_no='.$insert_id; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + + if ($errno or $errmsg) { + ### Payment Gateway Error ### + $order->info['comments'] .= '. func perform_https_request returned Errorno : '.$errno.', Error Message : '.$errmsg; + $payment_error_return = 'payment_error=' . $this->code . '&error=' .$errmsg. '('.$errno.')'; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + + unset($_SESSION['nn_tid']); + } + #print "$customer_id, $insert_id"; exit; + ### Implement here the Emailversand and further functions, incase if you want to send a own email ### + + return false; + } + + ### Used to display error message details ### + // @return array + function get_error() { + global $HTTP_GET_VARS, $_GET; + if(count($HTTP_GET_VARS)==0 || $HTTP_GET_VARS=='') $HTTP_GET_VARS = $_GET; + + #$error = array('title' => MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_ERROR, + # 'error' => stripslashes(urldecode($HTTP_GET_VARS['error']))); + #print $HTTP_GET_VARS['error']; exit; + $error = array('title' => MODULE_PAYMENT_NOVALNET_PAYPAL_TEXT_ERROR, 'error' => stripslashes(utf8_decode($HTTP_GET_VARS['error']))); + + return $error; + } + + ### Check to see whether module is installed ### + // @return boolean + function check() { + global $db; + if (!isset($this->_check)) { + $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_NOVALNET_PAYPAL_STATUS'"); + $this->_check = $check_query->RecordCount(); + } + return $this->_check; + } + + ### Install the payment module and its configuration settings ### + function install() { + global $db; + $db->Execute("alter table ".TABLE_ORDERS." modify payment_method varchar(250)"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Allowed zones', 'MODULE_PAYMENT_NOVALNET_PAYPAL_ALLOWED', '', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))', '6', '0', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Paypal Module','MODULE_PAYMENT_NOVALNET_PAYPAL_STATUS', 'True', 'Do you want to activate the Credit Card Method(CC) of Novalnet AG?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Test Mode','MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_MODE', 'True', 'Do you want to enable the test mode?', '6', '2', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Enter password here','MODULE_PAYMENT_NOVALNET_PAYPAL_PASSWORD', '','for the manual checking', '6', '3', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Please contact sales@novalnet.de if you do not have any of the following Novalnet IDs!

Wenn Sie keine oder irgendeine der folgenden Novalnet IDs nicht haben sollten, bitte sich an sales@novalnet.de wenden!

Novalnet Merchant ID','MODULE_PAYMENT_NOVALNET_PAYPAL_VENDOR_ID', '', 'Your Merchant ID of Novalnet', '6', '4', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Authorisation Code', 'MODULE_PAYMENT_NOVALNET_PAYPAL_AUTH_CODE', '', 'Your Authorisation Code of Novalnet', '6', '5', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Product ID', 'MODULE_PAYMENT_NOVALNET_PAYPAL_PRODUCT_ID', '', 'Your Product ID of Novalnet', '6', '6', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Tariff ID','MODULE_PAYMENT_NOVALNET_PAYPAL_TARIFF_ID', '','Your Tariff ID of Novalnet', '6', '7', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_NOVALNET_PAYPAL_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '8', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status','MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ID', '0','Set the status of orders made with this payment module to this value', '6', '9', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_NOVALNET_PAYPAL_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '10', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Information to the Customer', 'MODULE_PAYMENT_NOVALNET_PAYPAL_INFO', '', 'will be shown on the payment formula', '6', '11', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Proxy', 'MODULE_PAYMENT_NOVALNET_PAYPAL_PROXY', '', 'If you use a Proxy Server, enter the Proxy Server IP with port here (e.g. www.proxy.de:80)', '6', '12', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('PAYPAL API User Name', 'MODULE_PAYMENT_NOVALNET_PAYPAL_API_USER', '', 'Enter Your PAYPAL API User Name', '6', '13', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('PAYPAL API Password', 'MODULE_PAYMENT_NOVALNET_PAYPAL_API_PASSWORD', '', 'Enter Your PAYPAL API Password', '6', '14', now())"); + + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ( 'PAYPAL API Signature', 'MODULE_PAYMENT_NOVALNET_PAYPAL_API_SIGNATURE', '', 'Enter Your PAYPAL API Signature', '6', '15', now())"); + + #$db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, use_function, date_added) values ('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_PENDING_ID', '0', '6', '16', 'xtc_cfg_pull_down_order_statuses(', 'xtc_get_order_status_name', now())"); + #$db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, use_function, date_added) values ('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_REJECTED_ID', '0', '6', '17', 'xtc_cfg_pull_down_order_statuses(', 'xtc_get_order_status_name', now())"); + #$db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, use_function, date_added) values ('MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ABORT_ID', '0', '6', '18', 'xtc_cfg_pull_down_order_statuses(', 'xtc_get_order_status_name', now())"); + } + + ### Remove the module and all its settings ### + function remove() { + global $db; + $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')"); + } + + ### Internal list of configuration keys used for configuration of the module ### + // @return array + function keys() { + return array('MODULE_PAYMENT_NOVALNET_PAYPAL_ALLOWED', 'MODULE_PAYMENT_NOVALNET_PAYPAL_STATUS', + 'MODULE_PAYMENT_NOVALNET_PAYPAL_TEST_MODE','MODULE_PAYMENT_NOVALNET_PAYPAL_VENDOR_ID', 'MODULE_PAYMENT_NOVALNET_PAYPAL_AUTH_CODE', 'MODULE_PAYMENT_NOVALNET_PAYPAL_PRODUCT_ID', 'MODULE_PAYMENT_NOVALNET_PAYPAL_TARIFF_ID', 'MODULE_PAYMENT_NOVALNET_PAYPAL_INFO', 'MODULE_PAYMENT_NOVALNET_PAYPAL_SORT_ORDER', 'MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ID', /*'MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_ABORT_ID', 'MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_PENDING_ID', 'MODULE_PAYMENT_NOVALNET_PAYPAL_ORDER_STATUS_REJECTED_ID',*/ 'MODULE_PAYMENT_NOVALNET_PAYPAL_ZONE', 'MODULE_PAYMENT_NOVALNET_PAYPAL_PASSWORD', 'MODULE_PAYMENT_NOVALNET_PAYPAL_PROXY', 'MODULE_PAYMENT_NOVALNET_PAYPAL_API_USER', 'MODULE_PAYMENT_NOVALNET_PAYPAL_API_PASSWORD', 'MODULE_PAYMENT_NOVALNET_PAYPAL_API_SIGNATURE'); + } +/* +Bestellstatus "abgebrochen" + +wähle den Bestellstatus für ein abgebrochenen Aktion aus (z.B. PayPal Abbruch) +Bestellstatus OK + +wähle den Bestellstatus für eine erfolgreiche Transaktion aus (z.B. Offen PP bezahlt) +Bestellstatus "in Bearbeitung" + +wähle den Bestellstatus für eine Transaktion aus, die noch nicht von PayPal bearbeitet wurde (z.B. Offen PP wartend) +Bestellstatus "abgewiesen" +*/ + function html_to_utf8 ($data) + { + #$data = utf8_encode($data); + return preg_replace("/\\&\\#([0-9]{3,10})\\;/e", '$this->_html_to_utf8("\\1")', $data); + } + + function _html_to_utf8 ($data) + { + if ($data > 127) + { + $i = 5; + while (($i--) > 0) + { + if ($data != ($a = $data % ($p = pow(64, $i)))) + { + $ret = chr(base_convert(str_pad(str_repeat(1, $i + 1), 8, "0"), 2, 10) + (($data - $a) / $p)); + for ($i; $i > 0; $i--) + $ret .= chr(128 + ((($data % pow(64, $i)) - ($data % ($p = pow(64, $i - 1)))) / $p)); + break; + } + } + } + else + { + #$this->debug2("&#$data;"); + $ret = "&#$data;"; + } + return $ret; + } + + function debug2($text) + { + $fh = fopen('/tmp/debug2.txt', 'a+'); + if (gettype($text) == 'class' or gettype($text) == 'array') + { + $text = serialize($text); + fwrite($fh, $text); + } + else + { + fwrite($fh, date('H:i:s ').$text."\n"); + } + fclose($fh); + } + + function getAmount($amount) + { + if(!$amount)$amount = $order->info['total']; + if(preg_match('/[,.]$/', $amount)) + { + $amount = $amount . '00'; + } + else if(preg_match('/[,.][0-9]$/', $amount)) + { + $amount = $amount . '0'; + } + $amount = str_replace(array('.', ','),array('',''), $amount); + return$amount; + } + + function isPublicIP($value) + { + if(!$value || count(explode('.',$value))!=4) return false; + return !preg_match('~^((0|10|172\.16|192\.168|169\.254|255|127\.0)\.)~', $value); + } + + ### get the real Ip Adress of the User ### + function getRealIpAddr() + { + if($this->isPublicIP($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR']; + if($iplist=explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])) + { + if($this->isPublicIP($iplist[0])) return $iplist[0]; + } + if ($this->isPublicIP($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_FORWARDED_FOR']) ) return $_SERVER['HTTP_FORWARDED_FOR']; + + return $_SERVER['REMOTE_ADDR']; + } + + ### replace the Special German Charectors ### + function ReplaceSpecialGermanChars($string) + { + $what = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß"); + $how = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss"); + + $string = str_replace($what, $how, $string); + + return $string; + } + function getParams() + { + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + /*for paypal via www.paypal.com + required params: + project_id= must be registred at via www.sofortueberweisung.de + user_id = Kundennr. ($_SESSION['nn_tid']) + + optional params: + Parameter Bedeutung Typ (Länge) Erklärung + amount Betrag Double (8,2) Der zu überweisende Betrag (Minimum: 0.10 EURO, wichtig für Testbestellungen) Bitte keine Trennzeichen bei Tausender-Beträgen, z.B. 1010.50 Euro, correct: + + reason_1 Verwendungszweck1 String (27) Der Verwendungszweck in Zeile 1 (max. 27 Zeichen). Dieser sollte bei jeder Bestellung unterschiedliche Zuordnungsmerkmale aufweisen (z.B. Bestellnummer, Datum der Bestellung) und ist damit eindeutig. + + reason_2 + + sender_bank_code Bankleitzahl des Kunden String (30) Absender-Bankleitzahl + sender_account_number Kontonummer des Kunden String (30) Absender-Kontonummer + sender_holder Kontoinhaber des Kunden String (27) Absender-Kontoinhaber + sender_country_id Kontoinhaber Länderkürzel String (2) Absender-Land(zweistellig,z.B. DE, CH, AT) + hash Hash-Wert String (>=32) Input-Prüfung, siehe Kapitel 3.2.5 + currency_id Transaktionswährung String (3) Werte sind EUR, CHF und GBP* (* Voraussetzung: englischesKonto) + language_id Sprache des Zahlformulars String (2) Legen Sie mit diesem Parameter die Sprache des Zahlformulars fest, Werte, z.B. DE, EN + + user_variable_0 bis user_variable_5 Kundenvariable 0-5 String (255) Zu Ihrer freien Verwendung (z.B. Session-ID) + + #to deposit at www.sofortueberweisung.de: + Erfolgslink: http://xtcom.gsoftpro.de/checkout_process.php + Abbruchlink: http://xtcom.gsoftpro.de/.php + + ####Plausicheck error von XT: + http://localhost/xtcommerce/checkout_payment.php?payment_error=novalnet_paypal&error=*+Deutsche+Kontonummer+muss+mindestens+3+stellig+sein! + ####wrong bank code error von Novalnet: + http://localhost/xtcommerce/checkout_payment.php?payment_error=novalnet_paypal&error=Die+angegebene+Bankleitzahl+gibt+es+nicht+%28501007%29 + http://xtcom.gsoftpro.de/checkout_payment.php?payment_error=novalnet_paypal&error=zh + ####sucess + */ + $params = zen_draw_hidden_field('user_variable_0', (str_replace(array('http://', 'www.'), array('', ''), HTTP_SERVER))); + return$params; + #this link is stored at www.soforueberweisung.de: https://payport.novalnet.de/online_transfer_payport?status=ok&customer_id=-CUSTOMER_ID-&transaction=-TRANSACTION-&sender_holder=-SENDER_HOLDER-&sender_holder_urlencode=-SENDER_HOLDER_URLENCODE-&sender_account_number=-SENDER_ACCOUNT_NUMBER-&sender_bank_code=-SENDER_BANK_CODE-&sender_bank_name=-SENDER_BANK_NAME-&sender_bank_name_urlencode=-SENDER_BANK_NAME_URLENCODE-&sender_bank_bic=-SENDER_BANK_BIC-&sender_iban=-SENDER_IBAN-&user_variable_0=-USER_VARIABLE_0- + } + + ### Realtime accesspoint for communication to the Novalnet paygate ### + function perform_https_request($nn_url, $urlparam) + { + $debug = 0;#set it to 1 if you want to activate the debug mode + + if($debug) print "
perform_https_request: $nn_url
\n\r\n"; + if($debug) print "perform_https_request: $urlparam
\n\r\n"; + + ## some prerquisites for the connection + $ch = curl_init($nn_url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + if ($this->proxy) {curl_setopt($ch, CURLOPT_PROXY, $this->proxy); } + + ## establish connection + $data = curl_exec($ch); + $data = $this->ReplaceSpecialGermanChars($data); + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug) + { + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + } + + #close connection + curl_close($ch); + + ## read and return data from novalnet paygate + if($debug) print "
\n\n" . $data . "\n
\n\n"; + + return array ($errno, $errmsg, $data); + } + function encode($data) + { + $data = trim($data); + if ($data == '') return'Error: no data'; + if (!function_exists('base64_encode') or !function_exists('pack') or !function_exists('crc32')){return'Error: func n/a';} + + try { + $crc = sprintf('%u', crc32($data));# %u is a must for ccrc32 returns a signed value + $data = $crc."|".$data; + $data = bin2hex($data.$this->key); + $data = strrev(base64_encode($data)); + }catch (Exception $e){ + echo('Error: '.$e); + } + return $data; + } + function decode($data) + { + $data = trim($data); + if ($data == '') {return'Error: no data';} + if (!function_exists('base64_decode') or !function_exists('pack') or !function_exists('crc32')){return'Error: func n/a';} + + try { + $data = base64_decode(strrev($data)); + $data = pack("H".strlen($data), $data); + $data = substr($data, 0, stripos($data, $this->key)); + $pos = strpos($data, "|"); + if ($pos === false){ + return("Error: CKSum not found!"); + } + $crc = substr($data, 0, $pos); + $value = trim(substr($data, $pos+1)); + if ($crc != sprintf('%u', crc32($value))){ + return("Error; CKSum invalid!"); + } + return $value; + }catch (Exception $e){ + echo('Error: '.$e); + } + } + function hash($h)#$h contains encoded data + { + global $amount_zh; + if (!$h) return'Error: no data'; + if (!function_exists('md5')){return'Error: func n/a';} + return md5($h['auth_code'].$h['product_id'].$h['tariff'].$h['amount'].$h['test_mode'].$h['uniqid'].strrev($this->key)); + } + function checkHash($request) + { + if (!$request) return false; #'Error: no data'; + $h['auth_code'] = $request['auth_code'];#encoded + $h['product_id'] = $request['product'];#encoded + $h['tariff'] = $request['tariff'];#encoded + $h['amount'] = $request['amount'];#encoded + $h['test_mode'] = $request['test_mode'];#encoded + $h['uniqid'] = $request['uniqid'];#encoded + //print $request['hash2']."
". $this->hash($h);exit; + if ($request['hash2'] != $this->hash($h)){ + return false; + } + return true; + } + + function checkHash4java($request) + { + if (!$request) return false; #'Error: no data'; + $h['auth_code'] = $request['auth_code'];#encoded + $h['product_id'] = $request['product_id'];#encoded + $h['tariff'] = $request['tariff_id'];#encoded + $h['amount'] = $request['amount'];#encoded + $h['test_mode'] = $request['test_mode'];#encoded + $h['uniqid'] = $request['uniqid'];#encoded + + if ($request['hash2'] != $this->hash($h)){ + return false; + } + return true; + } + + function encode4java($data = '', $func = ''){ + $salt = 1010; + if (!isset($data) or trim($data) == '' or !$func){ + return'Error: missing arguments: $str and/or $func!'; + } + if ($func != 'decbin' and $func != 'bindec'){ + return'Error: $func has wrong value!'; + } + if ($func == 'decbin'){ + return decbin(intval($data) + intval($salt)); + }else{ + return bindec($data) - intval($salt); + } + } +} +?> diff --git a/includes/modules/payment/novalnet_prepayment.php b/includes/modules/payment/novalnet_prepayment.php new file mode 100644 index 0000000..b917ae4 --- /dev/null +++ b/includes/modules/payment/novalnet_prepayment.php @@ -0,0 +1,507 @@ +blnDebug) {$this->debug2(__FUNCTION__);} + + $this->code = 'novalnet_prepayment'; + $this->title = MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_TITLE; + $this->public_title = MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_PUBLIC_TITLE; + $this->description = MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_DESCRIPTION; + $this->sort_order = MODULE_PAYMENT_NOVALNET_PREPAYMENT_SORT_ORDER; + $this->enabled = ((MODULE_PAYMENT_NOVALNET_PREPAYMENT_STATUS == 'True') ? true : false); + $this->proxy = MODULE_PAYMENT_NOVALNET_PREPAYMENT_PROXY; + + if ((int)MODULE_PAYMENT_NOVALNET_PREPAYMENT_ORDER_STATUS_ID > 0) { + $this->order_status = MODULE_PAYMENT_NOVALNET_PREPAYMENT_ORDER_STATUS_ID; + } + + if (is_object($order)) $this->update_status(); + } + + ### calculate zone matches and flag settings to determine whether this module should display to customers or not ### + function update_status() { + global $order, $db; + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + + if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_NOVALNET_PREPAYMENT_ZONE > 0) ) { + $check_flag = false; + $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_NOVALNET_PREPAYMENT_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id"); + while (!$check->EOF) { + if ($check->fields['zone_id'] < 1) { + $check_flag = true; + break; + } elseif ($check->fields['zone_id'] == $order->billing['zone_id']) { + $check_flag = true; + break; + } + $check->MoveNext(); + } + + if ($check_flag == false) { + $this->enabled = false; + } + } + } + + ### JS validation which does error-checking of data-entry if this module is selected for use ### + ### the fields to be cheked are (Bank Owner, Bank Account Number and Bank Code Lengths) ### + ### currently this function is not in use ### + // @return string + function javascript_validation() { + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + return false; + } + + ### Builds set of input fields for collecting Bankdetail info ### + // @return array + function selection() { + global $xtPrice, $order, $HTTP_POST_VARS, $_POST; + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + + $onFocus = ''; + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + $selection = array('id' => $this->code, + 'module' => $this->title, + 'fields' => array(array('title' => '', 'field' => MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_INFO)) + ); + + if(function_exists('get_percent')) + { + $selection['module_cost'] = $GLOBALS['ot_payment']->get_percent($this->code); + } + + return $selection; + } + + ### Precheck to Evaluate the Bank Datas ### + function pre_confirmation_check() { + global $HTTP_POST_VARS, $_POST, $messageStack; + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + #var_dump($HTTP_POST_VARS); exit; + + $error = ''; + + if(!MODULE_PAYMENT_NOVALNET_PREPAYMENT_VENDOR_ID || !MODULE_PAYMENT_NOVALNET_PREPAYMENT_AUTH_CODE || !MODULE_PAYMENT_NOVALNET_PREPAYMENT_PRODUCT_ID || !MODULE_PAYMENT_NOVALNET_PREPAYMENT_TARIFF_ID) + { + $error = MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_JS_NN_MISSING; + } + + if($error!='') { + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', $error . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + } + + ### Display Bank Information on the Checkout Confirmation Page ### + // @return array + function confirmation() { + global $HTTP_POST_VARS, $_POST, $order; + $_SESSION['nn_total'] = $order->info['total']; + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + $confirmation = array('fields' => array(array('title' => $this->public_title, 'field' => MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_INFO))); + + return $confirmation; + } + + ### Build the data and actions to process when the "Submit" button is pressed on the order-confirmation screen. ### + ### These are hidden fields on the checkout confirmation page ### + // @return string + function process_button() { + global $HTTP_POST_VARS, $_POST; + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + return $process_button_string; + } + + ### Store the BANK info to the order ### + ### This sends the data to the payment gateway for processing and Evaluates the Bankdatas for acceptance and the validity of the Bank Details ### + function before_process() { + global $HTTP_POST_VARS, $_POST, $order, $xtPrice, $currencies, $customer_id, $db, $messageStack; + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + + if(count($HTTP_POST_VARS)==0 || $HTTP_POST_VARS=='') $HTTP_POST_VARS = $_POST; + + #Get the required additional customer details from DB + $customer = $db->Execute("SELECT customers_gender, customers_dob, customers_fax FROM ". TABLE_CUSTOMERS . " WHERE customers_id='". (int)$_SESSION['customer_id']."'"); + + if ($customer->RecordCount() > 0){ + $customer = $customer->fields; + } + list($customer['customers_dob'], $extra) = explode(' ', $customer['customers_dob']); + + ### Process the payment to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + +// $amount = $_SESSION['nn_total']; + + if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status_add_tax_ot'] == 1) { + $totalamount=$order->info['total'] + $order->info['tax']; + } else { + $totalamount=$order->info['total']; + } + $p_amount =sprintf('%.2f', $totalamount); + + $amount = number_format($p_amount * $currencies->currencies['EUR']['value'], $currencies->currencies['EUR']['decimal_places']); + + + if (preg_match('/[^\d\.]/', $amount) or !$amount){ + ### $amount contains some unallowed chars or empty ### + $err = '$amount ('.$amount.') is empty or has a wrong format'; + $order->info['comments'] .= 'Novalnet Error Message : '.$err; + $payment_error_return = 'payment_error='.$this->code; + $messageStack->add_session('checkout_payment', $err . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + $amount = preg_replace('/^0+/', '', $amount); + $orig_amount = $amount; + $amount = sprintf('%0.2f', $amount); + $amount = str_replace('.', '', $amount); + #echo __CLASS__.' : '.$order->info['total']." <=> $amount


";exit; + + $product_id = MODULE_PAYMENT_NOVALNET_PREPAYMENT_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_PREPAYMENT_TARIFF_ID; + + $user_ip = $this->getRealIpAddr(); + + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_PREPAYMENT_VENDOR_ID.'&product='.$product_id.'&key=27&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_PREPAYMENT_AUTH_CODE.'¤cy='.$order->info['currency']; + $urlparam .= '&amount='.$amount.'&invoice_type=PREPAYMENT'; + $urlparam .= '&first_name='.$this->html_to_utf8($order->customer['firstname']).'&last_name='.$this->html_to_utf8($order->customer['lastname']); + $urlparam .= '&street='.$this->html_to_utf8($order->customer['street_address']).'&city='.$this->html_to_utf8($order->customer['city']).'&zip='.$order->customer['postcode']; + $urlparam .= '&country='.$order->customer['country']['iso_code_2'].'&email='.$order->customer['email_address']; + $urlparam .= '&search_in_street=1&tel='.$order->customer['telephone'].'&remote_ip='.$user_ip; + $urlparam .= '&gender='.$customer['customers_gender'].'&birth_date='.$customer['customers_dob'].'&fax='.$customer['customers_fax']; + $urlparam .= '&language='.MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_LANG; + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_MODE == '1')? 1: 0; + $urlparam .= '&test_mode='.$test_mode; + + #print str_replace('&', '
', "$urlparam"); exit; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + + $aryResponse = array(); + #capture the result and message and other parameters from response data '$data' in an array + $aryPaygateResponse = explode('&', $data); + foreach($aryPaygateResponse as $key => $value) + { + if($value!="") + { + $aryKeyVal = explode("=",$value); + $aryResponse[$aryKeyVal[0]] = $aryKeyVal[1]; + } + } + + #Get the type of the comments field on TABLE_ORDERS + $customer = $db->Execute("SHOW FIELDS FROM ". TABLE_ORDERS_STATUS_HISTORY . " WHERE FIELD='comments'"); + if ($customer->RecordCount() > 0){ + $customer = $customer->fields; + } + if(strtolower($customer['Type']) != 'text') + { + ### ALTER TABLE ORDERS modify the column comments ### + $db->Execute("ALTER TABLE ". TABLE_ORDERS_STATUS_HISTORY . " MODIFY comments text"); + } + + if($aryResponse['status']==100) + { + $_SESSION['nn_tid'] = $aryResponse['tid']; + $_SESSION['t_id']=$aryResponse['tid']; + $old_comments = $order->info['comments']; + $order->info['comments'] = ''; + $amount = str_replace('.', ',', sprintf("%.2f", $amount/100)); + if( $this->order_status ) { + $order->info['order_status'] = $this->order_status; + } + $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_MODE == '1')? 1: 0; + $test_mode_value=( $aryResponse['test_mode'] == 1) ? $aryResponse['test_mode'] : $test_mode; + if ($test_mode_value){ + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_ORDER_MESSAGE; + } + + $order->info['comments'] .= '\n'.MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_TRANSFER_INFO.'\n\n'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_ACCOUNT_OWNER.' NOVALNET AG\n'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_ACCOUNT_NUMBER.' '.$aryResponse['invoice_account'].'\n'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_CODE.' '.$aryResponse['invoice_bankcode'].'\n'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_BANK.' '.$aryResponse['invoice_bankname'].', '.$aryResponse['invoice_bankplace'].'\n\n'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_IBAN.' '.$aryResponse['invoice_iban'].'\n'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_BANK_BIC.' '.$aryResponse['invoice_bic'].'\n\n'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_AMOUNT.' '.$orig_amount.' '.$order->info['currency'].'\n'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_REFERENCE.'TID '.$aryResponse['tid'].'\n'; + $order->info['comments'] .= MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_REFERENCE_INFO.'\n'; + + $order->info['comments'] .= $old_comments; + + ### WRITE THE PREPAYMENT BANK DATA ON SESSION ### + $_SESSION['nn_invoice_account'] = $aryResponse['invoice_account']; + $_SESSION['nn_invoice_bankcode'] = $aryResponse['invoice_bankcode']; + $_SESSION['nn_invoice_iban'] = $aryResponse['invoice_iban']; + $_SESSION['nn_invoice_bic'] = $aryResponse['invoice_bic']; + $_SESSION['nn_invoice_bankname'] = $aryResponse['invoice_bankname']; + $_SESSION['nn_invoice_bankplace'] = $aryResponse['invoice_bankplace']; + } + else + { + ### Passing through the Error Response from Novalnet's paygate into order-info ### + $order->info['comments'] .= 'Novalnet Error Code : '.$aryResponse['status'].', Novalnet Error Message : '.$aryResponse['status_desc']; + + $payment_error_return = 'payment_error=' . $this->code; + $messageStack->add_session('checkout_payment', $aryResponse['status_desc'] . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + + return; + + } + + ### Realtime accesspoint for communication to the Novalnet paygate ### + function perform_https_request($nn_url, $urlparam) + { + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + $debug = 0;#set it to 1 if you want to activate the debug mode + + if($debug) print "
perform_https_request: $nn_url
\n\r\n"; + if($debug) print "perform_https_request: $urlparam
\n\r\n"; + + ## some prerquisites for the connection + $ch = curl_init($nn_url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + if ($this->proxy) {curl_setopt($ch, CURLOPT_PROXY, $this->proxy); } + + ## establish connection + $data = curl_exec($ch); + $data = $this->ReplaceSpecialGermanChars($data); + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug) + { + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + } + + #close connection + curl_close($ch); + + ## read and return data from novalnet paygate + if($debug) print "
\n\n" . $data . "\n
\n\n"; + + return array ($errno, $errmsg, $data); + } + + function isPublicIP($value) + { + if(!$value || count(explode('.',$value))!=4) return false; + return !preg_match('~^((0|10|172\.16|192\.168|169\.254|255|127\.0)\.)~', $value); + } + + ### get the real Ip Adress of the User ### + function getRealIpAddr() + { + if($this->isPublicIP($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR']; + if($iplist=explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])) + { + if($this->isPublicIP($iplist[0])) return $iplist[0]; + } + if ($this->isPublicIP($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_FORWARDED_FOR']) ) return $_SERVER['HTTP_FORWARDED_FOR']; + + return $_SERVER['REMOTE_ADDR']; + } + + + ### replace the Special German Charectors ### + function ReplaceSpecialGermanChars($string) + { + $what = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß"); + $how = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss"); + + $string = str_replace($what, $how, $string); + + return $string; + } + + ### Send the order detail to Novalnet ### + function after_process() { + global $order, $customer_id, $insert_id,$db; + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + + $product_id = MODULE_PAYMENT_NOVALNET_PREPAYMENT_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_PREPAYMENT_TARIFF_ID; + if( $_SESSION['nn_tid'] != ''){ + ### Pass the Order Reference to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_PREPAYMENT_VENDOR_ID.'&product='.$product_id.'&key=27&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_PREPAYMENT_AUTH_CODE.'&status=100&tid='.$_SESSION['nn_tid'].'&reference=BNR-'.$insert_id.'&vwz2='.MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_ORDERNO.''.$insert_id.'&vwz3='.MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_ORDERDATE.''.date('Y-m-d H:i:s'); + $urlparam .= '&order_no='.$insert_id; + $urlparam .= "&invoice_ref=BNR-".$product_id."-".$insert_id; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + } + unset($_SESSION['nn_tid']); + + #print "$customer_id, $insert_id"; exit; + ### Implement here the Emailversand and further functions, incase if you want to send a own email ### + + $db->Execute("update ".TABLE_ORDERS_STATUS_HISTORY." set comments = '".$order->info['comments']."' , orders_status_id= '".$this->order_status."' where orders_id = '".$insert_id."'"); + $db->Execute("update ".TABLE_ORDERS." set orders_status = '".$this->order_status."' where orders_id = '".$insert_id."'"); + + + return false; + } + + ### Used to display error message details ### + // @return array + function get_error() { + global $HTTP_GET_VARS, $_GET; + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + if(count($HTTP_GET_VARS)==0 || $HTTP_GET_VARS=='') $HTTP_GET_VARS = $_GET; + + $error = array('title' => MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEXT_ERROR, + 'error' => stripslashes(urldecode($HTTP_GET_VARS['error']))); + + return $error; + } + + ### Check to see whether module is installed ### + // @return boolean + function check() { + global $db; + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + if (!isset($this->_check)) { + $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_STATUS'"); + $this->_check = $check_query->RecordCount(); + } + return $this->_check; + } + + ### Install the payment module and its configuration settings ### + function install() { + global $db; + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + $db->Execute("alter table ".TABLE_ORDERS." modify payment_method varchar(250)"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Allowed zones','MODULE_PAYMENT_NOVALNET_PREPAYMENT_ALLOWED', '','Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))', '6', '0', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Prepayment Module', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_STATUS', 'True', 'Do you want to activate the Prepayment Method of Novalnet AG?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Test Mode', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_MODE', 'True', 'Do you want to enable the test mode?', '6', '2', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Please contact sales@novalnet.de if you do not have any of the following Novalnet IDs!

Wenn Sie keine oder irgendeine der folgenden Novalnet IDs nicht haben sollten, bitte sich an sales@novalnet.de wenden!

Novalnet Merchant ID', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_VENDOR_ID', '', 'Your Merchant ID of Novalnet', '6', '3', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Authorisation Code', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_AUTH_CODE', '', 'Your Authorisation Code of Novalnet', '6', '4', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Product ID', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_PRODUCT_ID', '', 'Your Product ID of Novalnet', '6', '5', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Tariff ID', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_TARIFF_ID', '', 'Your Tariff ID of Novalnet', '6', '6', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Information to the Customer', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_INFO', '','will be shown on the payment formula', '6', '8', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '8', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '9', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '10', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Proxy', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_PROXY', '0', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)', '6', '11', now())"); + } + + ### Remove the module and all its settings ### + function remove() { + global $db; + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')"); + } + + ### Internal list of configuration keys used for configuration of the module ### + // @return array + function keys() { + if ($this->blnDebug) {$this->debug2(__FUNCTION__);} + return array('MODULE_PAYMENT_NOVALNET_PREPAYMENT_ALLOWED', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_STATUS', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_TEST_MODE', + 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_VENDOR_ID', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_AUTH_CODE', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_PRODUCT_ID', + 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_TARIFF_ID', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_INFO', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_SORT_ORDER', + 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_ORDER_STATUS_ID', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_ZONE', 'MODULE_PAYMENT_NOVALNET_PREPAYMENT_PROXY'); + } + + function html_to_utf8 ($data) + { + return preg_replace("/\\&\\#([0-9]{3,10})\\;/e", '$this->_html_to_utf8("\\1")', $data); + } + + function _html_to_utf8 ($data) + { + if ($data > 127) + { + $i = 5; + while (($i--) > 0) + { + if ($data != ($a = $data % ($p = pow(64, $i)))) + { + $ret = chr(base_convert(str_pad(str_repeat(1, $i + 1), 8, "0"), 2, 10) + (($data - $a) / $p)); + for ($i; $i > 0; $i--) + $ret .= chr(128 + ((($data % pow(64, $i)) - ($data % ($p = pow(64, $i - 1)))) / $p)); + break; + } + } + } + else + { + $ret = "&#$data;"; + } + return $ret; + } + function debug2($funcname) + { + $fh = fopen('/tmp/debug2.txt', 'a+'); + fwrite($fh, date('H:i:s ').$funcname."\n"); + fclose($fh); + } +} +/* +order of functions: +selection -> $order-info['total'] wrong, cause shipping_cost is net +pre_confirmation_check -> $order-info['total'] wrong, cause shipping_cost is net +confirmation -> $order-info['total'] right, cause shipping_cost is gross +process_button -> $order-info['total'] right, cause shipping_cost is gross +before_process -> $order-info['total'] wrong, cause shipping_cost is net +after_process -> $order-info['total'] right, cause shipping_cost is gross +*/ + +?> diff --git a/includes/modules/payment/novalnet_tel.php b/includes/modules/payment/novalnet_tel.php new file mode 100644 index 0000000..01fafc2 --- /dev/null +++ b/includes/modules/payment/novalnet_tel.php @@ -0,0 +1,593 @@ +code = 'novalnet_tel'; + $this->title = MODULE_PAYMENT_NOVALNET_TEL_TEXT_TITLE; + $this->public_title = MODULE_PAYMENT_NOVALNET_TEL_TEXT_PUBLIC_TITLE; + $this->description = MODULE_PAYMENT_NOVALNET_TEL_TEXT_DESCRIPTION; + $this->sort_order = MODULE_PAYMENT_NOVALNET_TEL_SORT_ORDER; + $this->enabled = ((MODULE_PAYMENT_NOVALNET_TEL_STATUS == 'True') ? true : false); + $this->proxy = MODULE_PAYMENT_NOVALNET_TEL_PROXY; + + if ((int)MODULE_PAYMENT_NOVALNET_TEL_ORDER_STATUS_ID > 0) { + $this->order_status = MODULE_PAYMENT_NOVALNET_TEL_ORDER_STATUS_ID; + } + +//echo "ya"; exit; + if (is_object($order)) $this->update_status(); + } + + ### calculate zone matches and flag settings to determine whether this module should display to customers or not ### + function update_status() { + global $order, $db; + + if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_NOVALNET_TEL_ZONE > 0) ) { + $check_flag = false; + $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_NOVALNET_TEL_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id"); + while (!$check->EOF) { + if ($check->fields['zone_id'] < 1) { + $check_flag = true; + break; + } elseif ($check->fields['zone_id'] == $order->billing['zone_id']) { + $check_flag = true; + break; + } + $check->MoveNext(); + } + + if ($check_flag == false) { + $this->enabled = false; + } + } + } + + ### JS validation which does error-checking of data-entry if this module is selected for use ### + ### the fields to be cheked are (Bank Owner, Bank Account Number and Bank Code Lengths) ### + ### currently this function is not in use ### + // @return string + function javascript_validation() { + return false; + } + + ### Builds set of input fields for collecting Bankdetail info ### + // @return array + function selection() { + global $order, $order_total_modules, $currencies; + /* + require_once (DIR_WS_CLASSES.'shipping.php');echo'hihi'; + $shipping_modules = new shipping($_SESSION['shipping']); + $order_total_modules->process(); + $_SESSION['nn_total'] = sprintf('%0.2f', trim($order->info['total'])); + */ + $onFocus = ''; + + + + $_SESSION['nn_total'] = sprintf('%0.2f', trim($order->info['total'])); +// $amount = $_SESSION['nn_total']; + + if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status_add_tax_ot'] == 1) { + $totalamount=$order->info['total'] + $order->info['tax']; + } else { + $totalamount=$order->info['total']; + } + $amount =sprintf('%.2f', $totalamount); + $err = ''; + if (preg_match('/[^\d\.]/', $amount) or !$amount){ + ### $amount contains some unallowed chars or empty ### + $err = '$amount ('.$amount.') is empty or has a wrong format'; + $order->info['comments'] .= '. Novalnet Error Message : '.$err; + $payment_error_return = 'payment_error='.$this->code; + $messageStack->add_session('checkout_payment', $err . '', 'error'); + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + $amount = preg_replace('/^0+/', '', $amount); + $orig_amount = $amount; + #$amount = sprintf('%0.2f', $amount); + $amount = str_replace('.', '', $amount); + #echo''.__CLASS__.$order->info['total']." <=> $amount


"; + if($amount>90 && $amount<=1000000000) + { + if(!isset($_SESSION['tid']) or empty($_SESSION['tid'])) + { + ### FIRST CALL ### + $selection = array('id' => $this->code, + 'module' => $this->title, + 'fields' => array(array('title' => '', + 'field' => '' /*MODULE_PAYMENT_NOVALNET_TEL_INFO*/) + )); + } + else + { + ### SECOND CALL ### + $sess_tel = trim($_SESSION['novaltel_no']); + + if($sess_tel) + { + $aryTelDigits = str_split($sess_tel, 4); + $count = 0; + $str_sess_tel = ''; + foreach ($aryTelDigits as $ind=>$digits) + { + $count++; + $str_sess_tel .= $digits; + if($count==1) $str_sess_tel .= '-'; + else $str_sess_tel .= ' '; + } + $str_sess_tel=trim($str_sess_tel); + if($str_sess_tel) $sess_tel=$str_sess_tel; + } + + $selection = array('id' => $this->code, + 'module' => $this->public_title, + 'fields' => array(array('title' => '', + 'field' => "
".MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP_INFO."
"), + array('title' => MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP1, + 'field' => MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP1_DESC." $sess_tel
".MODULE_PAYMENT_NOVALNET_TEL_TEXT_COST_INFO.$orig_amount.MODULE_PAYMENT_NOVALNET_TEL_TEXT_TAX_INFO), + array('title' => MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP2, + 'field' => MODULE_PAYMENT_NOVALNET_TEL_TEXT_STEP2_DESC) + )); + } + /*if(function_exists('get_percent')) + { + $selection['module_cost'] = $GLOBALS['ot_payment']->get_percent($this->code); + }*/ + }#end of if($amount>90 && $amount<=1000) + else{ }#phonepayment not allowed because of amount beeing too large + + return $selection; + } + + ### Precheck to Evaluate the Bank Datas ### + function pre_confirmation_check() { + global $order, $currencies, $customer_id, $db; + $error = ''; + $focus_on = ''; + + if(!MODULE_PAYMENT_NOVALNET_TEL_VENDOR_ID || !MODULE_PAYMENT_NOVALNET_TEL_AUTH_CODE || !MODULE_PAYMENT_NOVALNET_TEL_PRODUCT_ID || !MODULE_PAYMENT_NOVALNET_TEL_TARIFF_ID) + { + $error = MODULE_PAYMENT_NOVALNET_TEL_TEXT_JS_NN_MISSING; + } + elseif(!$_SESSION['tid']) + { + #Get the required additional customer details from DB + $customer = $db->Execute("SELECT customers_gender, customers_dob, customers_fax FROM ". TABLE_CUSTOMERS . " WHERE customers_id='". (int)$_SESSION['customer_id']."'"); + + if ($customer->RecordCount() > 0){ + $customer = $customer->fields; + } + list($customer['customers_dob'], $extra) = explode(' ', $customer['customers_dob']); + + ### Process the payment to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + + // $amount = $_SESSION['nn_total']; + if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status_add_tax_ot'] == 1) { + $totalamount=$_SESSION['nn_total'] + $order->info['tax']; + } else { + $totalamount=$_SESSION['nn_total']; + } + $amount =sprintf('%.2f', $totalamount); + + if (preg_match('/[^\d\.]/', $amount) or !$amount){ + ### $amount contains some unallowed chars or empty ### + $err = '$amount ('.$amount.') is empty or has a wrong format'; + $order->info['comments'] .= '. Novalnet Error Message : '.$err; + $payment_error_return = 'payment_error='.$this->code.'&error='.$err; + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + $amount = preg_replace('/^0+/', '', $amount); + $orig_amount = $amount; + $amount = sprintf('%0.2f', $amount); + $amount = str_replace('.', '', $amount); + #echo''.__CLASS__.$order->info['total']." <=> $amount
"; + + $product_id = MODULE_PAYMENT_NOVALNET_TEL_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_TEL_TARIFF_ID; + $user_ip = $this->getRealIpAddr(); + + ### Process the payment to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_TEL_VENDOR_ID.'&product='.$product_id.'&key=18&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_TEL_AUTH_CODE.'¤cy='.$order->info['currency']; + $urlparam .= '&amount='.$amount.'&first_name='.$this->html_to_utf8($order->customer['firstname']).'&last_name='.$this->html_to_utf8($order->customer['lastname']); + $urlparam .= '&street='.$this->html_to_utf8($order->customer['street_address']).'&city='.$this->html_to_utf8($order->customer['city']); + $urlparam .= '&zip='.$order->customer['postcode']; + $urlparam .= '&country='.$order->customer['country']['iso_code_2'].'&email='.$order->customer['email_address']; + $urlparam .= '&search_in_street=1&tel='.$order->customer['telephone'].'&remote_ip='.$user_ip; + $urlparam .= '&gender='.$customer['customers_gender'].'&birth_date='.$customer['customers_dob'].'&fax='.$customer['customers_fax']; + $urlparam .= '&language='.MODULE_PAYMENT_NOVALNET_TEL_TEXT_LANG; + // $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_TEL_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_TEL_TEST_MODE == '1')? 1: 0; + $urlparam .= '&test_mode='.$test_mode; + + + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + + $aryPaygateResponse = array(); + #capture the result and message and other parameters from response data '$data' in an array + $aryPaygateResponse = explode('&', $data); + foreach($aryPaygateResponse as $key => $value) + { + if($value!="") + { + $aryKeyVal = explode("=",$value); + $aryResponse[$aryKeyVal[0]] = $aryKeyVal[1]; + } + } + + +//print_r($aryResponse); exit; + + if($aryResponse['status']==100 && $aryResponse['tid']) + { + $_SESSION['t_id']=$aryResponse['tid']; + if( $this->order_status ) { + $order->info['order_status'] = $this->order_status; + } + $aryResponse['status_desc']=''; + if(!$_SESSION['tid']) + { + $_SESSION['tid'] = $aryResponse['tid']; + $_SESSION['novaltel_no'] = $aryResponse['novaltel_number']; + } + } + elseif($aryResponse['status']==18){} + elseif($aryResponse['status']==19) + { + $_SESSION['tid'] = ''; + $_SESSION['novaltel_no'] = ''; + } + else $status = $aryResponse['status']; + if($aryResponse['status']==100){ + $_SESSION['t_id']=$aryResponse['tid']; + $error=' ';$focus_on='#novalnet_tel';} + else{$error=$aryResponse['status_desc'];} + } + + if($error!='') { + // $payment_error_return = 'payment_error='.$this->code.'&error='.urlencode($error); + $error_value=substr($error,0,43); + $payment_error_return="payment_error=".$this->code."&error=".$error_value; + + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + +// zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + + } + + ### Display Bank Information on the Checkout Confirmation Page ### + // @return array + function confirmation() { + + $confirmation = array('fields' => array(array('title' => '', 'field' => ''))); + + return $confirmation; + } + + ### Build the data and actions to process when the "Submit" button is pressed on the order-confirmation screen. ### + ### These are hidden fields on the checkout confirmation page ### + // @return string + function process_button() { + $process_button_string = ''; + + return $process_button_string; + } + + ### This sends the data to the payment gateway for processing and Evaluates the Payment for acceptance and the validity of the Telephone Details ### + function before_process() { + global $order, $currencies, $customer_id, $db; + + // $test_mode = (strtolower(MODULE_PAYMENT_NOVALNET_TEL_TEST_MODE) == 'true' or MODULE_PAYMENT_NOVALNET_TEL_TEST_MODE == '1')? 1: 0; + // if ($test_mode){ + // $order->info['comments'] .= 'TESTBESTELLUNG
'; + // } + + #Get the required additional customer details from DB + $customer = $db->Execute("SELECT customers_gender, customers_dob, customers_fax FROM ". TABLE_CUSTOMERS . " WHERE customers_id='". (int)$_SESSION['customer_id']."'"); + + if ($customer->RecordCount() > 0){ + $customer = $customer->fields; + } + list($customer['customers_dob'], $extra) = explode(' ', $customer['customers_dob']); + + ### Process the payment to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + +// $amount = $_SESSION['nn_total']; + + if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status_add_tax_ot'] == 1) { + $totalamount=$_SESSION['nn_total'] + $order->info['tax']; + } else { + $totalamount=$_SESSION['nn_total']; + } + $amount =sprintf('%.2f', $totalamount); + + if(!$amount)$amount = $order->info['total']; + if(preg_match('/[,.]$/', $amount)) + { + $amount = $amount . '00'; + } + else if(preg_match('/[,.][0-9]$/', $amount)) + { + $amount = $amount . '0'; + } + $amount = preg_replace('/^0+/', '', $amount); + $amount = str_replace('.', '', $amount); + $amount = str_replace(',', '', $amount); + + $product_id = MODULE_PAYMENT_NOVALNET_TEL_PRODUCT_ID; + $tariff_id = MODULE_PAYMENT_NOVALNET_TEL_TARIFF_ID; + + $user_ip = $this->getRealIpAddr(); + $aryPaygateResponse = array(); + + if($_SESSION['tid']) + { + ### Process the payment to payport ## + $url = 'https://payport.novalnet.de/nn_infoport.xml'; + + $urlparam = ''.MODULE_PAYMENT_NOVALNET_TEL_VENDOR_ID.''; + $urlparam .= ''.MODULE_PAYMENT_NOVALNET_TEL_AUTH_CODE.''; + $urlparam .= 'NOVALTEL_STATUS'.$_SESSION['tid'].''; + $urlparam .= ''.MODULE_PAYMENT_NOVALNET_TEL_TEXT_LANG.''; + + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + + if(strstr($data, '')) + { + preg_match('/novaltel_status>?([^<]+)/i', $data, $matches); + $aryResponse['status'] = $matches[1]; + + preg_match('/novaltel_status_message>?([^<]+)/i', $data, $matches); + $aryResponse['status_desc'] = $matches[1]; + } + } + #var_dump($aryResponse); exit; + if($_SESSION['tid'] && $aryResponse['status']==100) #### On successful payment #### + { + #### Redirecting the user to the checkout page #### + $order->info['comments'] .= '. Novalnet Transaction ID : '.$_SESSION['tid']; + $_SESSION['tid'] = ''; + $_SESSION['novaltel_no'] = ''; + } + else #### On payment failure #### + { + ### Passing the Error Response from Novalnet's paygate to payment error ### + $status = ''; + if($wrong_amount==1){$status = '1';$aryResponse['status_desc'] = MODULE_PAYMENT_NOVALNET_TEL_TEXT_AMOUNT_ERROR1;} + elseif($aryResponse['status']==18){} + elseif($aryResponse['status']==19) + { + $_SESSION['tid'] = ''; + $_SESSION['novaltel_no'] = ''; + } + else $status = $aryResponse['status']; + + ### Passing through the Error Response from Novalnet's paygate into order-info ### + #$order->info['comments'] .= '. Novalnet Error Code : '.$aryResponse['status'].', Novalnet Error Message : '.$aryResponse['status_desc']; + + $payment_error_return = 'payment_error=' . $this->code . '&error1=' . substr(urlencode($aryResponse['status_desc']),0,43); + + zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false)); + } + + } + + ### Realtime accesspoint for communication to the Novalnet paygate ### + function perform_https_request($nn_url, $urlparam) + { + $debug = 0;#set it to 1 if you want to activate the debug mode + + if($debug) print "
perform_https_request: $nn_url
\n\r\n"; + if($debug) print "perform_https_request: $urlparam
\n\r\n"; + + ## some prerquisites for the connection + $ch = curl_init($nn_url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // decomment it if you want to have effective ssl checking + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + if ($this->proxy) {curl_setopt($ch, CURLOPT_PROXY, $this->proxy); } + + ## establish connection + $data = curl_exec($ch); + $data = utf8_decode($this->ReplaceSpecialGermanChars($data)); + #print "$data"; exit; + + ## determine if there were some problems on cURL execution + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + ###bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative value in case of successful termination) + if($errno < 0) $errno = 0; + ##bug fix for PHP 4.1.0/4.1.2 + + if($debug) + { + print_r(curl_getinfo($ch)); + echo "\n

\n\n\nperform_https_request: cURL error number:" . $errno . "\n
\n\n"; + echo "\n\n\nperform_https_request: cURL error:" . $errmsg . "\n
\n\n"; + } + + #close connection + curl_close($ch); + + ## read and return data from novalnet paygate + if($debug) print "
\n\n" . $data . "\n
\n\n"; + + return array ($errno, $errmsg, $data); + } + + function isPublicIP($value) + { + if(!$value || count(explode('.',$value))!=4) return false; + return !preg_match('~^((0|10|172\.16|192\.168|169\.254|255|127\.0)\.)~', $value); + } + + ### get the real Ip Adress of the User ### + function getRealIpAddr() + { + if($this->isPublicIP($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR']; + if($iplist=explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])) + { + if($this->isPublicIP($iplist[0])) return $iplist[0]; + } + if ($this->isPublicIP($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; + if ($this->isPublicIP($_SERVER['HTTP_FORWARDED_FOR']) ) return $_SERVER['HTTP_FORWARDED_FOR']; + + return $_SERVER['REMOTE_ADDR']; + } + + ### replace the Special German Charectors ### + function ReplaceSpecialGermanChars($string) + { + $what = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß"); + $how = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss"); + + $string = str_replace($what, $how, $string); + + return $string; + } + + ### Send the order detail to Novalnet ### + function after_process() { + global $order, $customer_id, $insert_id,$db; + + $order->info['comments'] .= '. Novalnet Transaction ID : '.$_SESSION['t_id']; + $db->Execute("update ".TABLE_ORDERS_STATUS_HISTORY." set comments = '".$order->info['comments']."' , orders_status_id= '".$this->order_status."' where orders_id = '".$insert_id."'"); + $db->Execute("update ".TABLE_ORDERS." set orders_status = '".$this->order_status."' where orders_id = '".$insert_id."'"); + if($_SESSION['tid']){ + ### Pass the Order Reference to paygate ## + $url = 'https://payport.novalnet.de/paygate.jsp'; + $urlparam = 'vendor='.MODULE_PAYMENT_NOVALNET_TEL_VENDOR_ID.'&product='.$product_id.'&key=27&tariff='.$tariff_id; + $urlparam .= '&auth_code='.MODULE_PAYMENT_NOVALNET_TEL_AUTH_CODE.'&status=100&tid='.$_SESSION['tid'].'&reference=BNR-'.$insert_id.'&vwz2='.MODULE_PAYMENT_NOVALNET_TEL_TEXT_ORDERNO.''.$insert_id.'&vwz3='.MODULE_PAYMENT_NOVALNET_TEL_TEXT_ORDERDATE.''.date('Y-m-d H:i:s'); + $urlparam .= '&order_no='.$insert_id; + list($errno, $errmsg, $data) = $this->perform_https_request($url, $urlparam); + } + + + + unset($_SESSION['tid']); + unset($_SESSION['novaltel_no']); + + return false; + } + + ### Used to display error message details ### + // @return array + function get_error() { + global $HTTP_GET_VARS, $_GET; + if(count($HTTP_GET_VARS)==0 || $HTTP_GET_VARS=='') $HTTP_GET_VARS = $_GET; + + $error = array('title' => MODULE_PAYMENT_NOVALNET_TEL_TEXT_ERROR, + 'error' => stripslashes(urldecode($HTTP_GET_VARS['error']))); + + return $error; + } + + ### Check to see whether module is installed ### + // @return boolean + function check() { + global $db; + if (!isset($this->_check)) { + $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_NOVALNET_TEL_STATUS'"); + $this->_check = $check_query->RecordCount(); + } + return $this->_check; + } + + ### Install the payment module and its configuration settings ### + function install() { + global $db; + $db->Execute("alter table ".TABLE_ORDERS." modify payment_method varchar(250)"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Allowed zones','MODULE_PAYMENT_NOVALNET_TEL_ALLOWED', '','Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))', '6', '0', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Phone Payment Module', 'MODULE_PAYMENT_NOVALNET_TEL_STATUS', 'True', 'Do you want to activate the Phone Payment Method of Novalnet AG?', '6', '1', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + // $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Test Mode', 'MODULE_PAYMENT_NOVALNET_TEL_TEST_MODE', 'True', 'Do you want to activate Test Mode?', '6', '2', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Please contact sales@novalnet.de if you do not have any of the following Novalnet IDs!

Wenn Sie keine oder irgendeine der folgenden Novalnet IDs nicht haben sollten, bitte sich an sales@novalnet.de wenden!

Novalnet Merchant ID', 'MODULE_PAYMENT_NOVALNET_TEL_VENDOR_ID', '', 'Your Merchant ID of Novalnet', '6', '3', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Authorisation Code', 'MODULE_PAYMENT_NOVALNET_TEL_AUTH_CODE', '', 'Your Authorisation Code of Novalnet', '6', '4', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Product ID', 'MODULE_PAYMENT_NOVALNET_TEL_PRODUCT_ID', '', 'Your Product ID of Novalnet', '6', '5', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Novalnet Tariff ID', 'MODULE_PAYMENT_NOVALNET_TEL_TARIFF_ID', '', 'Your Tariff ID of Novalnet', '6', '6', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Information to the Customer', 'MODULE_PAYMENT_NOVALNET_TEL_INFO', '', 'Will be shown on the payment formula', '6', '7', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_NOVALNET_TEL_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '8', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_NOVALNET_TEL_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '9', 'zen_cfg_pull_down_order_statuses(', 'zen_get_order_status_name', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_NOVALNET_TEL_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '10', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())"); + $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Proxy', 'MODULE_PAYMENT_NOVALNET_TEL_PROXY', '0', 'If you use a Proxy Server, enter the Proxy Server IP here (e.g. www.proxy.de:80)', '6', '11', now())"); + + } + + ### Remove the module and all its settings ### + function remove() { + global $db; + $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')"); + } + + ### Internal list of configuration keys used for configuration of the module ### + // @return array + function keys() { + return array('MODULE_PAYMENT_NOVALNET_TEL_ALLOWED','MODULE_PAYMENT_NOVALNET_TEL_STATUS', /* 'MODULE_PAYMENT_NOVALNET_TEL_TEST_MODE',*/ 'MODULE_PAYMENT_NOVALNET_TEL_VENDOR_ID', 'MODULE_PAYMENT_NOVALNET_TEL_AUTH_CODE', 'MODULE_PAYMENT_NOVALNET_TEL_PRODUCT_ID', 'MODULE_PAYMENT_NOVALNET_TEL_TARIFF_ID', 'MODULE_PAYMENT_NOVALNET_TEL_INFO', 'MODULE_PAYMENT_NOVALNET_TEL_SORT_ORDER', 'MODULE_PAYMENT_NOVALNET_TEL_ORDER_STATUS_ID', 'MODULE_PAYMENT_NOVALNET_TEL_ZONE','MODULE_PAYMENT_NOVALNET_TEL_PROXY'); + } + function html_to_utf8 ($data) + { + return preg_replace("/\\&\\#([0-9]{3,10})\\;/e", '$this->_html_to_utf8("\\1")', $data); + } + + function _html_to_utf8 ($data) + { + if ($data > 127) + { + $i = 5; + while (($i--) > 0) + { + if ($data != ($a = $data % ($p = pow(64, $i)))) + { + $ret = chr(base_convert(str_pad(str_repeat(1, $i + 1), 8, "0"), 2, 10) + (($data - $a) / $p)); + for ($i; $i > 0; $i--) + $ret .= chr(128 + ((($data % pow(64, $i)) - ($data % ($p = pow(64, $i - 1)))) / $p)); + break; + } + } + } + else + { + $ret = "&#$data;"; + } + return $ret; + } +} +?> diff --git a/includes/templates/template_default/templates/tpl_checkout_novalnet_confirmation_default.php b/includes/templates/template_default/templates/tpl_checkout_novalnet_confirmation_default.php new file mode 100644 index 0000000..830d6d9 --- /dev/null +++ b/includes/templates/template_default/templates/tpl_checkout_novalnet_confirmation_default.php @@ -0,0 +1,32 @@ + + +

+
+ $v) print ""; + ?> + +
+
\ No newline at end of file

_APGLX@^dk}RsDwPI(^Q@^bYEnVzFvNuo0LwiR>7LUAiT2Gl-2tu!C@~qP88{#@ zBY&V|U}7caEPlgE=V+m&bxg&|9-}I=1ypW1$RBW;MECKW>HZ6YX)&t~qFGIstb;mE zUziVJRiQ9w*9j8svBwPTiF~bM7f`u+?=dDzDF%wA&YKXP4tT&y4f3oEHeEyH^T(io z9ro*qVTADcjDh85`4c+AkNQAjMp$E@v?DzeU<^4uj&;Wc|<@d zr7%_Zc0KdNJf`Y;Kx2E?fb;(ytbAay%wWwh&B3ND9%2ASV4VOLut3BfEXe;h;(D&1 zlgPl5mjoK;;ycWZL-BcnBr>1QZ=t7DqUnP6pli%Nt>U=|Z32f)sV!K+!*TWWD1LEY zg&cs)%0XrWKn6PIx|aqhfM;UN+^4HeKM}CJWg$am-Fc4qVKndnXE{8TE!;8K|yLiPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBU*#z{m$RA@u(nsk5EVg6RBQ(bqM!y*6zqsnPXU3Wc~m_(Ks@0TL7($^yWhFr%+Aj4+D)9~ zmzlkpdGGuAmG|Dhz3p6ZWX$o)uP%e_u>E$Kv9szj<7cnU?6b#CnPz+Mn%RBl9qpr; zJ$8wHj@%4B>=t|8-rsr0?c)n*a8{E|3nVGd4eaCc4=NO_e1SXk8 z^A7LQ7wyrm`W*M=8aH<4w_eXH)4y?(7p-^wC)Ro>Ip0EsK)N|Pc&Ybm3%!5|bJn^y zg9bSR#97x#PzXu`6QDrkb>1li^LllihZ#0ym3#J+74GSemOCK34x8(>CJ*6cMN5|8mbUX4f0!Vv{)L?jME)NvGT+sIg$f$uHzP@K`au`!!^ zc|hbO5SI-7(x($)PBJ{k-#G(7dY;_pb1wimn~F+DQW66k{k&1X)^=1bY)uPf$siladfdJFzttH-W81a?YN`GiC2-LF6Gkz2S#@h3fS2~Oi z9}XJq9HgdT)R>@nPC`kaBqIw1VT+y=Bb^ixhG_saToV~SpFgD9p%oy8{5+sl8-8>Z zV`|*tS3K$N3FaSQhJL&vVhF`c02Mj}g(xc+(K4JO1Hjga1rY>#0AcjSxIXRCX(15W z3j!V5`7w9X$ax-Q(EH0G#^`eHfEn(%$_YNLib0X<5^T@3BU3a00YC->#^g>Z2&U(& zHU7Hw15-Q@jwuS%e()?0L?<%f0HvmwqkzKWX;8pRuoZ3#JPAVL0l9N*jWuLx{dH@rBOvA3q!Q>wG^ls!GwvIt>}0JxNiY~AoYQ`?Ue=I=ogS~FU|9V z0cS?Ik|T6T#|M3ms$PJjQ=(*#G$x}3L!MiL>NDot!vCnKVTR@5QfKPRy@~*00eRU@F>KUFU)aQf8)4!(*2)#BuKmiCTckl)GxezJ=tXwGNJ|J9^VuDeGEtCZj1ZUpE$^vS3UPTD> zXF=frgdh}Qq)O5uC{kMy5rodnL7G;IrW}(hKnHcW+e0Z*Nnk!51ED8A^jXoGdg0TR zL5jWTqmGeYcDKgD35t}r5P)QDcoyi&fyHYGfCJmz?txOFOd2vWmIB3wAnQJMN10G5 z?m|#ogJ*#z{efUqvj%KQKzI+JX6<{0P)T5shy{%cDs8yZsZ;Q0Qb!c=UET6_=zjE;dS_C3l*ik%`2N?DLxEnBCS1r$7-1?rx&C|EjNJ|IxcC29M3 z04=NE?D_@!crAnCF9e~;$kC-mC=jsUSvPv9C>Vexz~$9lHs29Rv`8nr*Ujg){inGP zsu#H>tLj{k5+j%sXvM{^Pwm>*ZQQiU zO`1M0tlcOC&Q#WP_s-VhG;wd6*_-b%ct$`(%0{bL)NIYAi7#~T&LLymy6+oYyY2(> zq5+Kh=X_who_3Y3Rma}0x~4W* z3jO3-oL><}!$NQ^Cu^}g@vHj6d)xfF#&0}4?16GnL@X(4r2{slicK4P-MoEI*SBiC z8}jOVkw^$gAm|{Aa6HQ*e!)vjIes+a=2IUo_qoXzvk)o;OdTb`#l2hX^D!4yx>*aB zx;EE85=O#;0D}{N!C1kwF_ZWU9y^|_g!z4keKnwX$=8&kWzV^&DSGh;TF_FjJ5>&H zU$3rnoqG-T8DR|&oZRY`(Ow%nxoAam;%}@h;|U#U$2Uo!*u2Pkqbl@@ywh~nJt~6*Qp@$H!q{2vbfAMEw&JHO1(`%Xow0qp^R&=o<~xi~e&& qI^$mo^MF$KdH(}9{|EZF2kAE;s&MtGV$XB{0000Payment - Novalnet AG Credit Card '); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_DESCRIPTION', 'Pay safe and easy through Novalnet AG
Before activating please enter the required Novalnet IDs in Edit mode!'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_LANG', 'EN'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_INFO', ''); + define('MODULE_PAYMENT_NOVALNET_CC_STATUS_TITLE', 'Enable CC Module'); + define('MODULE_PAYMENT_NOVALNET_CC_STATUS_DESC', 'Do you want to activate the Credit card Method(CC) of Novalnet AG?'); + define('MODULE_PAYMENT_NOVALNET_CC_VENDOR_ID_TITLE', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_CC_VENDOR_ID_DESC', 'Your Novalnet Merchant ID'); + define('MODULE_PAYMENT_NOVALNET_CC_AUTH_CODE_TITLE', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_CC_AUTH_CODE_DESC', 'Your Novalnet Merchant Authorisationcode'); + define('MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID_TITLE', 'Your Novalnet Product ID'); + define('MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID_DESC', 'Your Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID_TITLE', 'Your Novalnet Tariff ID'); + define('MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID_DESC', 'the Tariff ID of the product'); + define('MODULE_PAYMENT_NOVALNET_CC_MANUAL_CHECK_LIMIT_TITLE', 'Manual checking amount in cents'); + define('MODULE_PAYMENT_NOVALNET_CC_MANUAL_CHECK_LIMIT_DESC', 'Please enter the amount in cents'); + define('MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID2_TITLE', 'Your second Product ID in Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_PRODUCT_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID2_TITLE', 'the Tariff ID of the second product'); + define('MODULE_PAYMENT_NOVALNET_CC_TARIFF_ID2_DESC', 'for the manual checking'); + define('MODULE_PAYMENT_NOVALNET_CC_BOOK_REF_TITLE', 'Your Booking Reference at Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_BOOK_REF_DESC', 'Your Booking Reference at Novalnet'); + define('MODULE_PAYMENT_NOVALNET_CC_ORDER_STATUS_ID_TITLE', 'Set Order Status'); + define('MODULE_PAYMENT_NOVALNET_CC_ORDER_STATUS_ID_DESC', 'Set the status of orders made with this payment module to this value'); + define('MODULE_PAYMENT_NOVALNET_CC_SORT_ORDER_TITLE', 'Sort order of display.'); + define('MODULE_PAYMENT_NOVALNET_CC_SORT_ORDER_DESC', 'Sort order of display. Lowest is displayed first.'); + define('MODULE_PAYMENT_NOVALNET_CC_ZONE_TITLE', 'Payment Zone'); + define('MODULE_PAYMENT_NOVALNET_CC_ZONE_DESC', 'If a zone is selected, only enable this payment method for that zone.'); + define('MODULE_PAYMENT_NOVALNET_CC_ALLOWED_TITLE', 'Allowed zones'); + define('MODULE_PAYMENT_NOVALNET_CC_ALLOWED_DESC', 'Please enter the zones separately which should be allowed to use this modul (e. g. AT,DE (leave empty if you want to allow all zones))'); + define('MODULE_PAYMENT_NOVALNET_CC_TEXT_PUBLIC_TITLE', '