From 7ef274b9d5bf4ab728b206c04f759b80ac7e1736 Mon Sep 17 00:00:00 2001 From: securesubmit-buildmaster Date: Tue, 5 Jan 2021 09:19:12 -0500 Subject: [PATCH 01/13] 20210105 deployment --- sami.phar | Bin 2461851 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 sami.phar diff --git a/sami.phar b/sami.phar deleted file mode 100644 index c341b0430a00e0315438085d93c73c01410a1ed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2461851 zcmcFs2b^m~)qm0ny-M@3)W>6aFFm_?@ZhCyvPm|*0Yb`6Z=0R~ihv@Z@>Gyw1Cc69 zlO_TJB7%S@h*Yrwp9ly@m-3x+@67DYZZ?}_!Qc1s-{j@~=ggTiXU?3NJ9EH((t5Qb zjb(~buGknWr^}Kfj>7*+4?R>ecIcReD{_@+jZ2Kh+GF}sYb|_<-*3ogin+0LtyZqC zlS)&WTDl%v8!r{4X|7U%C)Q+2QlMEAE48HXd#NOo96KbQk5;S4aji_XRy|~uD;=$@ zTD^Mg1PT7NZe1Z-#y<{OmEe-mdcL-{%>UqUNrjuOXDZy-D*OUUTQ#`NY&Aqgshe4N*N$h%(;3_X?f`k=tkQm6T;w50+@XR?3&6iQ|gV0#_}ABvqsc zK*1;oV(!PcY)vWl>qk+pR#f=#hnoryBfg|O{#yF*LH!=)8xGnB37*{bGkocY8(QIO zD8c^y2$Gq+AbW?%j(F_TE-iiffPPO`YtdRJj)gzGRwx|t{nh{6i9X)9>J=`U$A{0} zQm8tjD)Yo!^x=Jblx;v$wS(@t3O@S1J%mRQFTMMDCw){o_h>91jpveJr@Y-)6FI(9 zv2US6tSMJYtv1r_zl}hL_~5O2E2T5^qeDy5vqJQhOd`ceE%io8W#l#&s)2Zt=FVei8M>j%@Nm(1Z3>)~m#Z{{7Bzz}z)pm?=9=eOKadSUUeDwc zs0=CLLfp;UxP%HSADqjO&u~Jmv#SNc5HI`dbq`XqBZnn3l#0nrst(>eQ!1jE?-Q#- z{K-#N-cOl_(5I;t=gP<@)s-{s1Cncq4iHa#=(HOtxpi={8J|=T-BhWRD(p)vBn@QP zXo%Nt^-7%cTxk)_`zxIo7t)oQ@;b$1J)Lu$u;_M^Rf0585{^ZWjeu>iC;4>Lj zng3&6vD=L?J}Kx(*NA5F(O8~i-(o2lQVQZ%e-ii%EyXlSDKp6=L@wP0BuD{>x4(Vn z!?b{zQ3~*INv^^b<6O@+FOs4VpP#yYcUsg)b@9}TwM?PAE~k{&hV{3s8 zF|)-EYbo1?q1lMP5xL3`ag~VEr*6x_l!;NetNduj5eJF5)iyDvNbT^H4z5-a;-Twc z_(g|^82;vE$59;&F<20dN(EATv@MK}MhMW58S$icOp>* z;$Q4<$0_%^;Z@;*xdFr`$QmHlh1fPoZ>Ovyv>ApwNU0-&B0m21g)dXeAqI92S1#fF zAzj{yv=!nluW#}SC6f+ZYu1sz1p^*74&qPm+)$)cqNzx4$BQ!xh^7UBZia%91+no* zGiwIboIr&Pv{^pMJMTiYl1r4DMF=*9FCFBIwV5IxoOcKx;$D%xo~2TWT*Y8~pserB z3bG;I^?~*&$|dS8196#J5KmG8uOk8?wtxTqDM~7Gjzf@wl>3}4NQwCObsw@B#d;`! zc-w&p=LT(}N(`g1X%K(@#!Y{vk`7z_Ibx9ZCxjHSx!tQQo<0~p_mdW)=R|>bxj!UM z0rB1+aBTV|a^S^GE)(bNr5vr`bUIau7Ql31G9ANs*~Nd$&tqTROQaTJ<;{>r( z#0%szmr_QN%N$Idx)|ml;{2Gs*S12BMZEp}vYL_(U3D`MmMXkDk0R!4uL)`7ow^+O}xOMYvkWQ-BcqcJS2oZmI&7WCZCCcM2VL&{gsa59fF-O`J@grAx z1FfxYD7``Qrd)w4SE6lWreNk^o`m*TBC;atwwm0Hk`Ep&Fj)n1YmMVa2_(WUj(GS^ zUz()EgO3vPhRMK^x}Ma=N#*CZt%p8TDk?ng`b zBq|Xq@kNL$QU9&XOp7oqrxMT~<57Nmt&tiazIfN`2UGeD%b_=B8rXkk2{&TvZ>Gm7 zw|+U?j!d!6PhP5o9r1-<{E>N*4a;H|B2Ka75$g(O^vmO}^NV0&?kC$Te?hgPTaMhW zyr7f{kf3KlJUUp}hLSH!a9620zd0}3{Q;KCURHPVrZdT!olEk@DDF=CU9-stRQhFg zC%yzvCY9!k5O*iV-v47ZIg(H3-45iNQ9BvpClQ1HYaB>rAH`4VGsS47E%?b32ruHd zUcBjD$~%fqC~qG>IrZSb*eb#(4LiSxg?{p~@~&(y|4CG$ho5|J$LCmbZ+S(ON_j3? z>@l8f+~vn?a<@D^2}LZ_)BpbV0t;tEs}qApN6^NC5kZh0g|&ZSJxbief+v1>EVZUl zMiWs1y+)JwwzqtN(vRYP7=4e?PzN4#%!scZ`PBmDpZ)~+XDX~3Cz4_i_jvM@n`kl1GEr*+=DL}< zpeV5gz4*q-3R=Rl`We5n8O`_TXV+}Bv0kvON{}KJ_OtVk@UzJNlc+=wf3(tm;$c)z z%QDxV!OtJRvfbO1eZz9h$+0l_xnL7DTY6g__rl<3FU5GC%DpTH2MfKd12jMZ*v}9z z+wIIFXaUycCH{582;$3zbu1FnEvJxPA>7w@d$vq#uwhx`3q!d0u^+SLv}N_I zMMJnPt+z?2^vmj5i-&M`+_URRw1{Q7YHuM5si+06dfQ*V{5#6OELTnV7je}W+naS- z%<|fT-=mn$@KbDYto!OACmLx9gD*;m$25Ls4Lt!zGYtt!5iMu__j}7?76PCi%m>Hr zWQnlJ5v(8f%kk1`iL{9Rr;oXhN;`O7aZV4&DI|0FoQrr1(PpQ7cqXMDMa4X|9<;H5 z`74ttHj^7!Xk)1k8+-Vv3g{AjWCrkOPhayC6?&985HB<=0r4`Y2r=RZPixqo#0~Iy z*dU50o{424J!KJniyCe*>_VS67>>aCZ{umhjZwuyb{ zrHB0O0;-3RByL0nA15cuMU2`0^YdkqwlYGGixX1B{Ws=0N;*m+2A9kY5E!71olbZW zUw+{Xw$p1AUTZO)uP21g_9)>+JjHkY6;$3)oR1YuHws%HOG)0$&LGr?FRkC}x0HGm zb>L{>3t@S`%@k~A7?h6E;Jf4fJ$$aWFvMsSUEV+I={(nJx6 zZ>)dz*Hpcugi~JF?3XvS1aml?5F@_*=663!iAU)ZUj7Xp+9&QN%!r0xzq1cz9%Ys$ zFfY)`*GLhFKYZZ89cU4w*s_nSU@jAF`8$Lb@zLyWU6ghdo%oTIrBpP88S&rW3Ee`O zM`=c$nNH}{gc$MhhhBM-5|1))1frD;?$1Y6NC_|EK^s>-L3u|JIGo|~33H{yFHegF z4meI?D^#QOL7tfRnQbC2;;Kvk%64%LX%KW58{HrG8gyZt%pm^x(Z?C>kQ)kcXBaAV zAF^cz@%3#sY(})-*!WSIg`wA{EGA>(E;KM_s%{**@rX*p54REZ66W) zw;jK~UzqX^saq!qjMn9Amw9D~gTBCS?=j0Ae19k(rn22}j!lHNLOke}Kd=`DhTKi! zg;aEuPt}Nb=}PZ^i@ljLWET(!rABAH5EF7hKO&MMnr~LJB;1g0h7g-zeWY9!Odw25 z0MY%-EL*3-stggO&tn!Qv!G}`;URu?V1;4(v#B|ZrWX60T9RZ2hxpR|lgvkM7)f|X z6y9gz=d;-J#1Y_!#tJjGA;%=5m^p6I_TOtkO!O6q-`(eDU!i(2E>nD|F~ghVPY6Ha zv7d`3DF2Yz?S)k^lQ(XDN(w;S>c&UepelObYmoK99tDtH$GoS$iIjr4!&4tV_lZ@* z4ljOTQ;Vzdf7eZ3NDEkYQ_t-gzK+xZQU2qteng8HGKsrTQ{7vLZz07Xu3PaPwkWym zn#^s~6&vkOe{=aev?ilMDbEHcy~UiIe5?@{6*M^108z&o8BQ3c{TcNt%!bVEiB zNGH|9!fB4TMez{yNXfq$WgT*|$+JRAQJ8Yqi4R7+Gx5RplynqP4fs|SFY2{~6>*o% zCfQ&#?3jTHm`n9xf7usyRHNTQR9z&wm&!Y=2{2|FJncw^ImFkb=bTE3hs-?)+Qk?4 z=Q`jaTM9BGei&YFq0}Skm_N1xHL>?r0xRMNr|)>kvRK)s)b*t05LPAQ@+Ys zg{;|^h^&a`=U#k?(vBo6(DDk<5mLm-UCK{W(ox#V3_E*ZX2J7{L%q#vPydDT4w>EJ zbzm-4c+QQ)Dr3tcl**inp^W(={-){y`Q@uk#v zZ>GG%PRwweq`VZ7|16>k#IapdY$0S62jSsr^-7U9h@%KC;s@LPlcm5%acDvs74my1 z?`eb>@$y}35vq?-#?PjRqZGeoW_j*Lri3B)-S8tO<<%vkWlXRO$NZd2dI@5_`3y_(z*zx9 zM|}%Rkm~Z8D8DAVJ@KK4=l%UJES=&0WXgd>nK%bqKZTvckCR45yyrUx4{eT-8W|6< z;v4yEgcWhq=MHE40Y_`(Ha{7|4kVWLn#acfupDXUHgkwqK5yFj%D0xqTIGmAzD0C^ zc-=#PIEAu~62bu`uh)MNPQ-IR$RA2MM`^8K8sY$+^<=_|82#0ilay66l);H#@3m|p z3@C_4{CLIxQO4mi%*J{F-j&97pWIR4LtKCJJ6lk`;l@1ZbZ|%+oSlG_8i_!O_(Nrl zZK>WcRHYdudtDy69{~;=PZ5v&LV-;+hD(SCGSv*c+l+)ek`_Wd?1am4HVhHVhiU{pbAbRIz`;| z+#j%f+2B!{z$JCS5tx~>u-5hq5}+U+|HO%3r+OW{p$MrfT~?!%FR$2yZ+XQ1PB3+r zLpXti80VrXA>OK0Tto>6w|pX@uax78{P?ohc0zL_K7HrWEQK?;V-hIEE$sqdfnp-A zHr~xL*u#n`dY#`z+6J+5$YCt&zF~0Vsc^Mg+XedpA>5Zjz*I~`EBu089NyMLaS`u$ zA@CU0>fi}77)9r}#hN&2Pk|b7)#tW)gi;Ug`rs_Z3@k2o1V6=KoU4~G zfmo?j!?Py%$<66Rfr#54wU3gL^m80FIHyVqeVX*0x#Mu?0ak6|*$_{7v3dt3?HAz8 zBPD0z2svTO`wSVC5dZM68`zAgpJ6V-OH(P7`ZkieMNGW9p6w&t&_|hzP_w~~a-T~K z3h~|_)PF?Iu-ozwTS> z?jzKkAylQT?+{kRgRlKEOO6h26=YbT#CsAABOZ9p3ww+pt^rQNz}^je#VPAMBxpta z=nH{eDQmyk`8*{cE7FMvgwGOM#8;oXBSmTZIok!a{JAt#&_9v9C}RApwHReI58ji- z2f&DqYoR5G4-&lUsegZ;me4P8Gf(EO66l#Nl>fgVDUQF0WB=Td`J#Szh_nuJtvx)48{yV<;5Tzf&lm*!tefJ1;B@rL-_)G6&yDEk- zy?Ojpawl;dh}(aEs{oZ;KZ;@&4B1Vh7sMTZcO~oML$|3oIZH*qgm`|$$1mEzhSnim zDJq4!QA&H(UP9+Vv;Bvv?U4wVPKqh>*NIXPPuj|J57qP#0Rdsg znK5O34J;SkKH^VIm$QRWM`E4m#k%>bK&`t0 z1zsxX-n$6ZN4za_{ZB^`R6OmZycd!&1@WztWs33+5odMJ5h?M?odkgqzgYS^Tizcc zlAS-Tqtus@lhF`Ed)~uBxI>q6Ze4S`Bgr%jF}2m%m(!XbvINUwLD|Kv+G!kHwM z41bpa)^}^t&WI=LPi7k#j{f9JwwK`WE3#H|3K`uHpS|~3Ep60eKlx(kx(?QNC$f_X z@v7b5WUrG2KKX)uQT{ByXGkYSocQAJ#%WcL|5QrEqk+?<3Mo58>TTr8uyBSqHj(nLCgmf(b;90bwEXC&Q@*JcEkM?q z6#gEG4H5tG`~w%#!as!$4JArphi{IQ`~vA&i0@zXXEt>^{?n;83AP1OKZ>M35Dz-G zau%)iai31vFnU8)M<{v&v2?_T-aqZjwCLogR5Upz7>@`i611Qsw0Fca%+G8|C5U~x z5|GkoN$H5IuetGlT6*f!Ej?Jt)Tqt3i3o^~D+)iPA{_teh#+hTA=N*W%<>R-x>5cN zE&Ed#PoPApm!p+_k90T0>LZbJX~Cb8$$R0Pd|LG7MBj*O$`@y7(VvpOy`_4EmE9)Y z4N?8_pFzDrB~l&lPPB@y$^ zlY$YIx99vYGvH*+xKvG8s5=j`Z|I*9Pq)7P6eSW(LkYt|B8VXynK%dO z{zeAwNnptuj400`ZG-sKLszgJpdtaQ?Lx9tY)i|fd>d}@$*(EkQR|S}mO98ENOTwE zEKxunGh2G8fE(s&x;PQ;7r_2mmDY=yM6?!_=1Wbkg701+w?ZdyBi_E#dbX=;L~b~t zVvhS_!i~87Q(LnP-r7Or?wT%Mw}T)h;)!Qo`A4b&(R7h&AOW{(q@?6pgq>l2A}VMe8PuahkzC^9vbwB|$Ud)kp3q8x zgf7Z2fFx)yi2uH#^mi)Z0F++X9|qAtf>)#{ncydtMr>ZOPmWTG(oKs==`X?^wBRrk zbaA>%R`Ky0KeC)sq{O1E@sh;Ce4&f>E5wixudqM0j?ymL@7U9#8xpR7U!xuoEq`3g zHaJ)pYw0-~WVa&V>rS-$EcjC3PyPY4Ac8@OF(Qn-WzZ{`yuuTT*Zg zUciDTTu>s`q)yTxi2urNx+ks4^auqBP1>`V2T53t`108gvz^)pFDxbwuZ6*>zi_{1 zIS+@P(nQemG^(qo94 z&oag3%Oa+q5Fdr8{CR;*aR*?+Lw7_>;y3jUJT=5-Y_i35Lu&?^v>bn60KJvAMAmZ< zr~Y-?qqKfK2F|(q@%lDF3{~T|oxKRhwr25_= zriOUsS(oofdHd9pG63(~pV*E++)|Jc(f($Yy~@;MaHRE|BM@oM5&5RzUl*Ufn%q-U{l5VtwS&GJcu$>@VL zb2s0wJ}2-Ye(jbW*lzqD17i;vLxp@d-46Q*bcmasxp6W-=PYx zCw>qyk~@RN7CmBWDqa^KBf6K2g@}J_J<}3dZ#e8#J7w%KUNae~Sk%eUVT%oosKv*K77>5@&KM)^5nC)IW=vgu zB}w`U;>9{W+wV1ytkxo&K$l6t9XI?U3@ZU;y^IheKK|hC5vqh9vBg4J3GocSs<9~T zF2DOTTYBqb=j{0&7yo{XNQwB+%rP955@K~a8J+Jc=IDA|Tl*bCi1_3yhiNEbpN<2s zixx06tw^Nd^K~`+nZ%Y5*FCp6%Wn4Zyo(Zh zYi(hBw|z&!Z6Kbxaqv@VT=N>sKJM2&v776VnBZ9bg{qAgo zS05jMVFWZ8KiOn;5Wd8AYmq?`(Rt+)zoeQ_EG{c!6xQ=fl{vN!kq|5I$cm3&FI z9-=)-$PhpL%EK$EXooCGHYd>M$heJo`rSvcbm7th2^?MR`XUre1C@*RxbGiSpz#3( z@^bu|YlFn5h_5NHVJ}rKt#WG-x}B~G#{taMFi!dh;_L5jJdp||y6J4bXAmC77bhWY zQ=Oyw!`4Fm5TlpQ9gEv%@SCGb;mM(T;dRD+4ibnEPuyF_g8V+tZyu4gn7~+Em`t}| z){A;a{KdEDj>G5^$Pqd>UR4a?;9MR558@8wLfl6G?+L1|K0_1X@(Q`Mg_K8=J%)&> zH}z^txoSzX@X@2)ZUqxUsSxkoET6b3j%5IeK@wc3fF?Qk}gWNAh5G+wTZ zSDXq;e~1`6qWifhn?W5mSgn|=-Ir(w(e;-bFQYOYx;PJS=5XkCs=@z-H9H%2MWBKZ zw>(D9#=kxaqAYO98>5kKBhVn;ZCdvOD$K!43Bwrt+X@VbKe*b>wl1$7h=E2RSf!n} z5SS3}dgin2G><+buuvubzq}Xd@=h0m1gIj!)3ZLd3f8CbMSMm~zhvm-cdOk6E=2!} zSKUDM)W@laxVpp=?;wBSjGI|fsE-|qsD#K0)wK^%JmTrMUj9WYQlB_L;DJr0T(p2a zjsM&w+`~j?h>!nC&(>9z6i(Qw$`hh+aWYgP2DiHXV=7!9eF=$UIuDskBi~1yFyhwF zoqYeGxuI7V{PTtfJWVjV}u2E_mAA7U?!^bw128HDN49M!kUK#I8Hu!EUP?=!dT zMb)MK=ZW?aE6z7p(5m*)KHW92XL`Bg*7sgG4S} z99 zG2(F#&z%R*rxEGnXsF2y2K+Fb(l3$oUt|)AcobR8j(IOrGFsL5kxk`|4#W> zj<*jFKgN*B0~>EnAZ`_L<=X36|LJ4%0uTS+u4a6UG$Z0g&pnW(RqGQE5h@{6U^4xU zWC0OdZ}0PCN^}4iK3PhfAES}kIzO!ciNxrL|9Iqh_D)%!a0+)*LewuxjtSqOrpLDx zoIBzPcbqy)rRk#~LPxSCb5wF78REv=er%az-NK5&@*`JmgH#2$eKpSUGv>L!y7ZnQ zegW~ov5%Qo?lG6_$!dn8dgdj5N&F#V`ITdCqBZZK$ezU3874X^QhY-E$sZiR4jnjR zz}k!Gy6S%!sXt=&$)L7pT?{Zi6KRQqC8(CeF<^*=0`qC)l>EJsf>`dnqx+~g9sg>{Z7+; zl&(iUWT9lj`KH~3Um%2t=bS#)qJ%xd3qr_DL8^=6Jj%!w;nZLDElPPBX-LG|@2Gx{ zlJ=OcFCb+^U8W&s+{e;cLm9_M%{}lVGzr9SSI%G_7M#+2FGQrlv$62W zX<`S6*}q-Kp6oGcB2U82$NWq}YN%Ihr2^O{d_liN%45l}fmr+Nbu9PY({u0@p-)TE z8a&Zrid)Dk&S>84Tf;KoJ(79z1%+*#we%viuMxk2_?+y5&8XIOi)xMu3(bf(Kfr;p zaIp=n!7h~fKSa5RcYOViY$0}W%VXr&aZlIOtzIOBOeZWs z*B0`s2`}P>uk6cSg&a`WBD|cokhDV7i&)!guR0aBN0MfKt1Tq^6_F6pbiwWH)$pE! zM|aKXyDqMHrH7PK(oTrC-M24W=w009uy%4qYw3lO{+?7D@fZ7C#eCQRl6ts!9d=4J z=In}=g?(#lh+(m#Bi{7-!)H=`4$!x}aJs-EoghUNi@4uo=dtyN#XUHcN$M?CYWxI@ zcm)*lFcPOBen`}UD+km}JQ3n}|8GF(B35g+;0_;FO$9=cmd%->|mh6AknIfM>z?1q25 zPU(8MxrKBtK^f*K=(2mbYLPJz@rnmKZAv>(^$D#nQ{ZQyUGnY=nNHLz;@Yk6Vdt&( z=sFAK?X`MwK2ZSTkM@3I9hJ04I%tj%`V4P{W;P<8O5{R3_loQ$l;&Wdofnr=8h*+z z%+jzWRuKk7Uqj1wUGOK40KWphG+7{1{# zDXmODQ8H!Nw?|*5bm1ptI)zNd5MM|u*_5tF*vCZSnRte-9)%ZlVap?K_MfwuYd>^x z4f7;Ye=*Zy0-Z~e4~XF}UU3htT91iXw?IK?>Qb}Hh!Q0Khq(W$ef~#@_U|LkoQAhM zTBr=--p}PE^ywZkH4{U4nw)`v%Dsaq7x6HQ?^a5(YDp3NwM?FGA2Ya2R4U>V?_b8U zO+Bo?9WCTB66g1&z{?uqeIO6+D$pSAVtkQB_dVi4o@VaUt#86~4+TK1p8h!&5AM6L z4*Zj*D%^)4?2_~l*%429YsGoA`aNt*c$Cc*vG^{pQiak`3dAjcv@?5mO|_U5jEd28 z*=n5dAzt*^*I8<}N9JvwX#Crpj1*hhNUDjrBJ`P^Xf=D}ZRTVa&h z?_w<_9FU4~{0830L>(deZoiskLl%3IuL-|{v1S*ZMBHcJudqqzejvj<-^ka%UxfGj zXe&QOs*k9CX71D<*rn0);V_sfiu+|^Scs25d=ooQpoe9{uVKS+ZB49_Nu*%!Hoiyc zAn#I!Nb!h!Jaj2reD4vZ&ZD6(b3u}8{{Gn5E`mZ35B~P0zJg19=VB~K_hazllt(J9^QTs zozZ|q?~%@c_>aqMY;GY6&w3CU;4F2xSPDY*xzygXFabrMj`;N#Z~Foj>5w@kFUo|v zLTPp&(je~sxxJ339EUBQ#{Ws;A;jRlt1h6Dh7prXW8blax8{Ru=AYrmDfEXGQ)suVc0ltOW5X%}k9_ ziRLSPYbfkFnDaLsqA|pMS04Hu$~U0Kx|(t&;X?ey!O=S@*Ah;Lb_KGt%`zs`5Yh0N zJKv%#qFGOm8j{m>h=tA7PkbG!`TD(2r)-CVxh>wSaI9oql&xQRN zF%ZOC%yU~^_V3#~81A7)cGyNJ9q|#1XPTDYzZ&>7o}f|^h5{t|JP`x&KYO)yr$qh3 zJf4UhDkQ!!VE=~>I+k+u_t0}3a8?mlp*I5jln8|Q`Y$Kgrm+4aw?I}(@J6?RG!3Hq zIL~QRp8hV2r!b_sc+QLK9+?`?bt1_XAU^ZLsYc3m5O6Q<9(XPzzkrY<^+7aj_1H0# zU;qW1;NDRFyy!>CNQ0>QD9wEO0IfY29ARriG{hS%;u#O!Ql`T6kJtFx%n{A??sLho zg_ytcH}6oo{$a!dI*8p;MLbawMf^Jv5%JjrZ)PE7|M6=+rykxx5w3RLgXj+N>8np? z>4D*76!@gN1m7Ol5*ZO|2Wi>dXf)0u&v_l;MBM)Vs}oe0kWyR9&_qo`2?{X$CJe_ZZu2M~+H zUAg=m?gk<;V(hSQvv6jlrZZ+5XtH8+nA+%M$pF!cR*!&W5m8OWL^YVHrIA=iY!~s_ zE0e4*h?ZD~AfAOgqmlJ`q5{MXXP>ta{xg6@^k9Mg zv?LZ1x7o&@IaqY8g92WIPNUZ#J5oAr0>LY&R zGv9rcvW_(5z$-?rRv1;>2)^4PnL;6Hqcj^k0zehqZ z#C5M5*~_nrp?r)1Zu~^0{&%HdQ-}xu>hYgZDTnh|Fv=$Qmpg=UW;GeT5VybYwQDJ< zXccMz&kCefxH^R&ybmL7kGS2gx9&qiLP!Rd%Sajw@x713pP_uiHIBdsdAej2 z?)E`-ZXnAGh*xd%GFvkquIBWR5@h@bkreUIr+HbRr5>ueEnH1ktMQ$4HyV*E5-O5{cS_ob4*Qs&_XO`aJKHsF0G8QuR2_`ho}-f9_?biM3fgc32a z$;Dryl*1YmEHustGu1Z;BjS7auRD-34(HhUdV67lF5D1#08u95Q7_(Trld+JWbk<0 zPiN@jt26KV*I8#!y5ZV}r;|E4J_&v~sW#$y>Tl$iMOor~x|s6I@pGcfp>&n_kX}rA zM`!EPDCGdDA#=W7<)?_dlD0tH`Alz`avZ#LTfockXvcPvN<=*5iFbFP4ED8trYB-x6PAU<){i+`dd z1JuP@2C!MO1hgH|F5=eTYq030|HcB|X1(QToP%(H?}0ZHNf5W6bRSP8S+%s$ z;l3u+Z<$aarhQMc4mbb>P4hfN!bQZJS4;1pQY@`p;T6uVbqS1JaeBzdu*%CHqh#Yt zR*799g4L1|nGkRN{8lPTv$Ra~#t_kR^G~)HWI}x9GSGQ3p>eI*caX<&JXdzY?3Wv4#R2Z;PPJ)=SjqEAh!Nue`({~a`x0S{|Q!pb%>wYC=Q2J!gKHeq2w|A|u9@_LsYCx{&*K78==chiRH z?*mA;f)mMwB{_b(EQ;qKbco+LTeBCXGr;G?W6=3@kW|y<@g(7dFo|dM;!$%#(b$C2 zn?|K43-hdiACdM)T=mzlK12%`Reo~tDBWweBQaUTJ?@dS?E|CA4~79->uYT$|4LE- zqWk3b#Z>+cBPs|E<7V7nB)UP=DgVnBDEgb;{I+$K;Gj)@@~0=>9r4xGe_?5!{t4dR zd|fvEDpVE+BE%<+a<+KhKeqDnr+3d~p{#@jam&5$XX8cxV1}@WHhhS?#1VhG>T|S7 z`bUcb56^E5N&YhR44D#VvA*zJ9)qXYU^4KMb_roW!_GQ+_e33ncTlx7z5O?Bknd8J!JSgvIK{ms0;D6>%aD8O0`7K6}2GAb9{MQ!L$%F zd%M_XmHwfTSXt&useqO)K5XhMSEpE(VQ@i%)vEoWtopJk=8@} zp)zs>Rny?6AWDEdLz)j!^34cKl0f3OMBJmSx7aIz>%P27j#PjTh7^Un#p7NA*Y=<*5=m`SY0#A~fBASA` zSt;W#@R^M7QP@D4hxak?=U*c~NBp7og0=MLFxg%K3G)o@JnD7s`&UWxAnyIr8*KUZ zp!v_yw`%#(hXqC+KF zO{>W)zlYYke9^^FDmECRZkwN9P6_s!FAapZ0vBrcMp6ev{}vXOk7w3SiWOoQ63TRy zTO@%9;;$-y{~s-Pzj@^n24AI4j(5T0uO$y7Dqh@$%@hyp{V>@}Fc(lI$n%J@u!$|> z9?<)FS3L%k-?_(+Bab6K_uj-Mi^kq|Ms(ef8s-uymH zYc?n8Ii%Aee&4mn$Mnhh1)?rQ9Za#mV1tN{%@&RHF=kDo>v!q0`P^4n(+7z?A|^k3 znuRjpvH{}o48_j)(6d!Fb2!VL=nr+#jd|(d>!B2EQzdv~%@!FqLot^4W2Nh2V>{FnW%qfaxtnftkP?oTXt-PS_6h$o+5W8pT2 zSETt0B{)EgE0?MnJdumNEbf6zlEnXjY+DdH5YPF)t-nO&VE%gkLsHn_t*^&(98_o_ z-8rPUBmS-M$mx_0=M}w$vt(*h^;j=1vEzC1lnG|(eYxz>o?N?-Y9e0t?d1PaxtJpn zViY__K9l4Zg?~aE3F4No9?niffGiHJ2}U*W1V8$tE*~Mj0P({IDr|UI_=qpf39lS{ zlY|S1=8Lyrjmbt7CKvw*nL~(=tNX$xyKPBpv+ybUIEr@%iF**Qe)9e+=~MeIsF4p| z@n)}>;iLKO1e-&A`Dc{QwBRhkgCq)FpApu?tI+-|p?7zg6L+wL2u z0^p92C0MFeDLXP@4PV4sxa(tWyjp$2C5VQ2kK6noOx>z`%W0@EjZ4}~QX&4=Fn89IdP%8(EIV80D(yA$wQ~4BLU?FH=sAd|y*Ip9WsTtLDs#KSLgZKT>4jUtQq2f`!( z&$a8ef>ela|8pC*%(1j{fa9q$NnGe?7xG_&;Q{Rd@$k=mW_v2p(#`=-m#pF@5?-21 z2oIuS&s|vleQCR5Jc3<4Kn5Yiiyk~`4=T{oM6fbfta8yxJS|8>h%NzKaa{WeN`$$Z z{+14}FK6JgG;FX}$xw~B`Qz7rlaegm<@m9N=h$t3LB)vg*WPB6j->@D;4Ugbkc)N} zNDv(#-M$|cWa-xChk>lX@{a=q7Q|I5=|PlbX;DOql@Y^3{9Vz+rjUD5#d;yogZFFk z-Dmz!9JHSxt$}#kQ+{TxF#HRxAv}cFtg&adB?AuPd+nR|q0+MHlkg1x->xa@*~B*? zj-R^w;q*Z^wIrHK}GXFv>e|XeyDFJJCN&pvir}A7+j{AuahzW2NMn zK{w_pm1<)KSdPym@%kFB3ctV~iM|@cJCeteuwXIfD0SdY=IB_o3XiWF3v!7uXQ?qZ zrWli{*2xv?Wa=@6Os*NTIDCZ1m(Enj;QyjyF;;A7ty-oXi;D_HVaj}-p{rncy*yol z3|EF1YwQq%ZuQzRh?}e27`zw6jbZi_&-ahRt0(O-SnsXCJRW2c%etyMR>3-oi^B>g zVQvBxsSF&Kcy3Z(kN_%a69ba3mCD_yIV ztLvoFbZRa6$=XsSC9S~TKp3^EQt~APYWx?{O0>BK3t>TZm263o79r-uGnrt6R8tzO z!y;IwSe1&UBzm<%jUXa~Lk+6DXyWRjxGs|eWXIbN#^7iW{7Hp_&m4+Ns+QnScm~DQ ztDv(cyeB#a8)Ncg(lL;L`~}8z9R7LOSgFGQ1fK`Z=wQ%FbK`|l;<#!x53Lca!oA;I z16m9Q0PK#O+30rFt4@c{22X(e63;v9~|>e=@e?sx-t0#r-*80@yVz< zo=j+>nhAAGshUtHlnIq)f|EyM@+2oqsFm6YPAi*;$tD#tjeJs}oYcmnQQ0I4A%QpY zGRbIbjNe7XK^Ky&pZ`C}8vLK$WU)HO3?`4yYPK45J`?|~#9_4>tww`ES1P1*O{-p) zvYMQU30bG3bLvyM*>o;r(Kcmzo!f8L8TB&`ceQD7hm8TZ+hS_k0{)K4?a-+#I=SB@ zF{B++o{(7{4Mx(O(NuF7s{B6~T8~fp)@@FGPdRbix9kLjhUT zqHRY*9<{`wSA~qeoXTNLwH;ZL!f7Am@kAwsg~WRs|f#4_1R49`;=c1$R^9q7}5nt>L;RRmjMa28+UDwq(MF z^u)L#o#yQi;WXgV1WV+Le%AHAl%w>btgvcNuye=g?nT(dVSbrHf0M@SFR$fOb6t$WZ2qi7q+Ww4}ne=~Bd+ZbYPE)~-`bTW&< zJ8SV;V@jjjq}RLsI_O1uojE%*%~d9~T8&)NNlmNG6G5{qR?MnwA&1Rpa_Xj|-dJ&5 zkt@t_ep|>>C`farggToJYQhtKry0q>J*)7A!xUj5*QJuhD#Zfv&Fc)GaGkV{MKN=6p~gZC))Ya zY;<~xYcV;E3muC@I7rJ2=Uy364jW(mX4X7<%mL+iWS4P zxWXiI8C9QNZfnGp?vz_*YFRqEi14h#XUZk267j?Sg0_(`=#6fljx#r9>KUU>?J$~J zj;yZfFzTc5T^qiG&nfnu!yIoJIyxJYO7yz0PnWZq9iCj%ESUSWsimKaS+tpOu;q&e z6LqUat+0ojX@^JGG^Y42VK+4s-k3rw1AnD=c&bec7_9{SGL&uWe%Q>ag1tL4-}u0{ zgYjAQ#wPf$lxbR5f^ooYj7p64Xe1lgWL2{9>13nP%BURq=y=&WB{j`f?S+8J?bS|N zTpm>+QRuWfiB79#ogUXXGhq!JQBu%FqK$H^E%UZD)wskrrJE}GWYZ3ZERgj}Rmz0d z;n(})6X3^Mh6$x~Chwgro3$#7GT`(XW3S*x6N6gJ8Bm$a z!HgyjE_J5Sw&|TNNnGxQF~zU3Of)&CJ!sd5+v-cqzCQ@Lo>=2vLkonlp)u;-f| zwJGBdI)YqO)2if51%o3Mnbw*uv$l?x=cG1cE=`PA z+WxXuno}EHx|9R#*phW;!8-|qXTsPt>7`9Kj2z&IvN{)U8dDzlVG^8}PiNG*r=$+O zjQ2Ojlsl-`ds3Vt9QC*rp>`?nwku_(j?Y_?N;_Kbf)UDZmcS4Np3tO|7hT1qNvn`q z719a&Y^IU*nWv4@@}#R(EgG7YhP%M|C$yE&Y{}!b$MS~hnNB+^Px}&1iy`J1Z)%KL zNm%ZWO;#$6im#YV!CbPs%E)jy4griNzw(?Y|9*O8RsHq3cuRe?@W+fZqhxhaQUqt5y(TAyF)u4v*(ZLPr>Bq3GE z>-J=0shGnwR058v5cNM6stj& z@@K6rQ%C2aZqop+PvrST|K{+~f0GcO+MG(qoepCdTpomN#uT_hT{DQ^WzjW?zRT(z z4zI2`MZH=p!JL30G>dR}LuNN45 zbw+S|E**x!?veri*6XHYE}Kp>ZZAxh3jTnhHC-LI2D~wY)+tR-88s49#bs}(63JF^ z+#;K>Hbc&swvseYC}%>duq|xMrHyi#*~N`3YvXZMrs^-HC%m(T;b%}#TUVA?Xt zmF$&9sZ*9zHSM6y&4s+>+^oJmE}JTH(oAYxt}8ZU`AXJY_m!#*XV_ckYLO&ock4@$ zWGI)Pt@-j?#^|dyrcw@rEn|vJXPpx7gg2FRx75C*L1m9u)9qTI8dNINB}2hfN)~;2 zQ_*g-Ona>MPQsuKMLMqHtgTt9#MM)lqNiSMI~pa`v{7bP8|)Havfgy28wyKk)(noh z9rnyvLpEtD*DQPTs&ce5J6?fV%B&$;PBjvpNJy(~&jxkAP)et7`zsok#y6{PI?}q5 z#vo~@T!w;bl17{QqS2r)_=G4OLN&qDk#Nl@glj(ZdU~B7Mka8N9bE!#amuYSNz5s? zzc6l{3Mk_7sj7ZfUsFeFwo*;0ZAQ`=Rnv*~f+vZOvX#=RqlL99HciYujFc9~mJu$5Ooxlf|eDrl6CkQi)Kc)#RF% zl0}&>$O;){QmHRk>{*>tvS8Xo{B9v^_N7~`QeGAHOw8z~>n68-R%NN$WYSY&GH=Zb-u zXv15ojVm)+2u$_4xF@cwWoNP~d(rOg6_DWVh)PULBlrwz{8 zqFl^5&!1!W{JfM0H(AglH6fAaHpG&th^^F7XX=SiJ!eX{ra5hBexQc41c!BMdj1Sd z0<-XtL+__PaVAg*w4-1S5ZqR+rhGlzR<))`@6qe3K65^jhv}>kTADrWM92wYB-s8` zq9KVFs;!xWucSiw=pp~6$pwyhR6Pu4_&Zs;P; zyu@nJ)?-t-mdB?z3WN@yOGE;}Yc(8lcC1E6%0Csz#4P!&)vRwvgYtB|nCnUrNFZ0x zfI&*12zg2|rLCNp%HfbO<>-*m+h>At2LGRh-W_LFr-XT7+tKl>oxXgO>Q6E+i?J;I zNyG|VuKu6_@=Srt)t{t0$Fi9I1{)bA{LtvAYl>$3B&VN@P8B9&PUVbt+>x*3_130O zs#AERA$QJQk((zo`EcA6beohDnS#Zw4uw-qkI9mR1^d`+OfE6`Ei>a8MQyrZj+8C& zg3k$V*=&o&4LVcMY1Xu(o^r$L2t}r4=FCLL9du}%Sy!ksX|mZ2YDLJVh__>POFh@} z$0c!lGv)J6hLz=MtH#nc2U@16CNz-_VH$_RPl2Wg}Rck)W)sOaBzw54@8Jxbx@ z6m7FBUCzl8*+@v4&;{(1!CJEAPdXL0j;rP?h9*@Zowh0;&op9{g3cCdsgshdLNj6L zC})Fd2WPbC8@0GWZf#rZ`ewsE8}ivb6V*gB!R4cq&4w&z*Lo9*VkWNjL7H0^%w(jg znp9O!I}(0t)F6?DRn2TWZ>j24T4$o93a7(i@2s*=%bTmpS#3rGNtLOLZ=5SldM#;N zsqU&33LdxL6KL1f8g<#MGF5_E&}F6~leFs7>5$nQE9c$1j?~y{#wyWBx6Qxp9GDW-2KN8Q?XWoMDf}pSA%hbD`e^gSXxj`(!8rzNH_ON zzxEs&;L9aPhiM!gS}eXd%~&9uH1;qK2%~C7li#7Y(gDEk394oBVgMpMbzKq(xm#|d zZk#xDzf%b*=C(Q?D+->UL_J2o*_ni_g>1&4FUJbbM!cwl#Dh(3owDU48C7c9(ke@0 z!MrTq)>orJbH<*@wQN3JmW~ut2GK}i3e*!*HhEm>uEz=i7+zXsd=^HA7WnHHJ_D%_ zhi^JJ|A$@a*K!OJG~&dt)d2Zmqgypi^DRCTKxI(=p#;o<|Y4`1?0W1kJY zzC{LcNYfS=Cj;>XJ8sLEB+m}X4k0LYfzjvTANN|stnnEy%l28?vRwvR>M?hQith(y&*Nt z=LIT$xqa3%ZK>90vsPU^U@o|4r)3RKqgk8wg(qsMsc1ejkx;oE`i{GrE;XGs-?UcF z)u*CiXJp1Mv6SVLrcP;QN?un^!NQSE@8+suOF0`-sGx(|byAbT=xkTYeqByCrIqEU zEeV66(8=f;^0bmm1menEQ#lce7Q7Wn+T*q41ND$2uWz{G8BHYB$x7`Cl{aoyWc;~^ zG;S!tye}JROD)BTR?8BE=?<5xwj+8)q*(W>X0a%7IzdU%Zg)+)U240=IcVkBT_y46mlVzSVgbcC%zTfwa~2IXQuEbQGi!&;V_c0PZLf`Iw5(;WEhX>b@^!89;hqyGL0$`NH^`3yKDn_n1fg!GZHaEB4NA2U5Fr!m}gm~r9G3Yj4M&f0PMa`;^{ zIB(%j;`RGmrmW5_3@Ig_!4GNrDGv-C+IGYz%KSif2TNy#8zHZ45UK|*GlI3l`2t@( zm}IEKFeM5I<57xF*<-e6;B1h?B&oNjD+QxGq%lO=g-SpzHxx4}E)z)EElriYJ~Q1e zL?h1ebcj>H3TdFGXs7C(!gMCw(8w~*l2_BoR;&@F&h4%0CH`XFn$SAp*-1`Q4`<}j zRIwNzPkG$aNl(X7&SbsHe70FH_?^=wzr#_|G=dddn42z?!|~Z5r*btr0j)IeHMOM% ziA5V|#$5(iQ*WQvSL;z#q6po(tduvh)q2ug@|bK^lh&?l&U)*if^oby8#YVrzJy+$ zGsw-kaKYk|mxHcUPS?^(LNTj_Ys{E6^@d-kQFCddIw@_1;Ns5?j9HO(BCb{XbIMLT zqN~<@%6!}F^toD-xq`tQ*Q;~oMm(&Um`T*r*>XjaS9-FJ33;Hp%`j9!gXfldXutAVjWm`g zhc1liBXFe-VSU6Sa|x*<@VF_HW&TWBA}qM!I)}k*G%IG*7Of|0vYJay#e}aN&!=@W zTCKvTwI||DmB#Hhk2j*z-hzVjX%*UZ&S#xSxebkcxa{<#Ve%m}g@Yw;CY=lzDoS(1 zsGpSAa}HZrVR4(J)y}kYe8v%0n*7q5GMH**a~*HBX_ie?)bda&VTE*eQ`(Be(+<5_ zl8&X!($M&L#AC@CCv}FJEA4f5awd5+*W%I{X~|HLnaV|FNd_Zcr^RU_3a%EMO zj;1y8iEJkzo#FIT;IM5b`)s&VC=33qcQPD~n-^T7z0_P2i013C(*k1X4D3Z+!b_5P zdMRfKxjN|JO#^k7`kwPDqdq^+QTo79c7@UschHlgp2O|8wx)c#7>#(%CUY)A6DVen z-*3>*L_!`VIMs^7YZ6wS`6aouK4S6sCB#u0V-|BK-qy8n@y;q_xJk-f2SKa@mb7)9 z8Ka{mq|E1imldQIr!W?XJ*?E=#upd6pVSa!ELc&L^j=al1oJg_+8Z=xqT^}3zS-eg zGsd{7?Q%AKp{a3gWX9w!7efudC8((94aQn*+7s4D)GDs+)WysVT`;dxwhiqzBtmIdr-2y04{O}$f7tXXDc(g{nvl5IB<6Omvm7OY50^?Z3I zE1PjBb8VN>V91s8=~x(6=&jn8OB1mMTK`YncXTPLc5To374Mt@K?EI=K?KQ&GlHUk zl7syEZ(E_ex=)AmykUKVK4&e;wyZ9=_ug094{Ddr`&0QWQxy%{E?-Y+^n{Zch60y*6u=hbtW<93>0A}z#zYz^113cX{yU2-*#)>S1vTw{7Fh|GXGhUKFLZuv(Mt6q3k`MAI@Ti`oRf7xVbD@^!QQo#$p~q5w zJngU$W6P(n4+;ZR{s*H7hsl&Bn+f?r!LSSF-sHW$T`6QQ+Pov9Q?%V-Hpl4fn?wib z#~-Q3ugoL-Hi3FnKfO`E-lxc$s^iP^ z_4^yudCfRKb3ZS+z&pmSDy31m%(!o;b@~-20aaHaw6zM`drRKEQM2pkgRlQAP z#!jaC=Gp0phimf;5*v~5u2(9J5BhP3n^)up^F;$qi(3>6wc2g88zAihgK2!*SJ);| znOg9t^5KGIo4c(jjC`gc$ApU5Z+ll9$&}k1FZns5^bk1<>2Z%{3rAiqN|&};?UQY_ zJyw{2d#zJ@Q*Kfs=AO&L9*eug&*LZ7YUKJDF@&=#>jgvcAnJK$ZjpN!kLGH%$iiMb zZ{oZmZMnQ;_b4s>Yz6wc?1BZ(ELNMiq@zbt1qXn8q_Yapk8kpHOg-X8Yy5>8b0kTo zv;5>l9{AI~5VrHdA}AXV6ocPr6cZ$A@y9m#TOD}$fm+C|`_t+F*E8REgG}hZo%!Q` zeCF?Rw)i~r74OTLFZxs}`_CBKP4yq=|9j*7p~)!U3c$w=Dggut2>kjQzmy}uYQ7k! zFOBnS{C`dG%i+Coel^o?*N~5kQ~Z<2#lyW>5?JS3QRHiDWY5KklmcmzA8G_f5u%d-svK<=89C z+zA_!K+xNPTzWbd-NUiwOZ{>>Tt=_i6eupp!@*oozxSjzD4%yPsQAe_w(-6`ZU?== zj3w)p97g?!nEVd#TzA1LyzUhkTs2)Z0*cYnx zu_s-UvYvV23?ph#1QG8USi2TMrLz$v2L51>hj* ze&Bk-FTsA{^T*!VN3Du-sh@!y&W{q08D&#&YRcF_}OW{$=qHlx9s#L zw}g7*a0RF$bI{cN?u`L5X|4%v&$_(%rh9smJ(bY+{|L){eM&eh7w7WuGVYhOeZ_R<6rQNdFxDaTTPLb`8FXQi3gqD z)FAU!QQzFp>1K4?usMmxgvv1g3S1y}!xIaQmLxkoDr!JvRMzjRxmOltw#7x}6l0g( zS#!p2TZ!V@{qTVHbsgOwg{iXDK%CaV!>s+HcEjunsLz()%+&U9&8&Y{8$Jlz|6oA) zYo(B0y2A0BuJCu$LGd3~ihn;HeAB!Dtdjn49$RU!1AtwBJ6GS2)i;9kMQjo;@Eq{( z*>K;rg+E`@W$W!310BLk{0!Q{zdvND&V5sAdtV!}&*utxF~e^UmcX7rA1vu>iIF%W zyaVR_{8G<;gFb&K(Kf(ke@CBbyP9(9paKq%k-{_1=N@HO4ny7_uH77|yi;}Y#M!m8 z1>qs*(|vbw%6LE?Ph;2$k9`%F7Sdo{Rt=_Vt$Iuu6&{n88<(g2Vd{e_77S12`tEpYn3t8H?ipk$a71Q5ym{*4={s^xG3mg5J}{;PvQ z{@B9U_$0pzWTAzzzgCK$yOuYR+v~>^;bA#`y`#U0489HCe>wbtDwe#KLUu-#``5@# zdz{qv_d#X=o(UXU<*roe6c2w2HW$EV24C_?$iP`;n?PC=s(BOxZy%VJQ8U@zmjzbt z5i~R_+X$YP6JR&RAF)~3IHhYHF@a{5({iyp(oRC4J1u_@8S^1MOVh8|Jd1Nv?w)5% zyKMIHc7?GOB8&Mnw~I9{4qJ9RtqaJ*yyhg(^gLS86RTC5_^18OCgV`97KJ&@hx@=f z1LHTY>Ru^FHLep^U=`qhVP2N?u;qc{EycUYHN52}ENkydj5d5ha`Z{I(da%}S5Aa{qgSTs7-|jGPwth+(^!GCOR5?!0b%i&a9_9BHS3AmF%Ip zl`^(5JSz^n^V@C+jv@WMCU`&rzp$RKx^in>hW+hEEIUHw>3~I#=Ip7~<{8$@KaDkC zYXVFSpHfYpE8a~subQxfnjmM~AKsXj+FCBA)0e3hc{#cMI@bQnnt;G4o9p~HPCfde zCLH}M5cl9i^Na6*?C|~DwsJo_>w4%3HmK4iq8io#R()SAHtRL0f{Fzw&km9`IL|-bx58BP&bF3fi!M~~t zFxK+y>boz}4tg*x{H&&U`679)`>C0EIS{3s^ZdXXh|Lpx5!lho$8#)#v_E(knt(Y@2)_tTrp$rY z?(=tZ=4Xdgd{>x!vjBYcK>kC7^8rsGcyrQo9Y^%?jpY4y5qJz7u1(-~`)TU; zUEK~R=^c&&F%I!vjPoHXMRZ_@jn8Ip;Xsa)4De%qQ#FAMX0!;-1tAWIZ9c>};2nKA zHlg6$Kq~?NEHAaHKOiCL{iuJvy$O{-$-|QBccId^U(9!lsQ$8ueyV`pYA=#PIRoGe zNbpk~k`nxXJN)Dk{nyMg!tNu#FAN^-P9TKbs;jlFAN)jOI%6$*Kt~R%4y!9Jr$tIL zmz5}U2H>fR6G5F>0!4Z>~>fIf{UuEeP-faplKJ1+JoZSy+}_yIY3$u zAUv8MUXQW8eGoW5f|P&UwJvjZjls$!7URQ4WDnDX@HrlW6=$o#xu~wa<6aET3b_Vt z01gm$jyl>!Qt>o7j>NE@X?%OXN_ZFv0j+6ytmIlKpu3~2wlTdya(Z^kVraZ@Rfvmt zqQ$lG*bZGsw*DxTUXs-G`GH!iBc5i)og0YaK3x@bU7NQpB^0MihZ_@BX9{N^?Q)a% z^&0bO^eoX#tLR;&`Y5Rw`J>9L8=9ICsdwKnunwNj_BTEQ`U~;e!H<>ce`FT@7~iKJT9&ZYBQEV^u>CD`Sd5hfL#>_`%!BrH`CAZsd48m4%8{- zY~!Dhxo8JJD(&1oN_ZKWqGEGN_ZBvYV}QTN@gIGq9LRpIo$BYwpt}_g<^$lm9k65n z(_4zX{C&W6yM(|`#H43hFRVlKW(%yBHU8%GeDqJZcV=?S2Pk1jvNP$td47&+P(6;@ z{y=Dp){hTDb#x@eLi70yxx(kVt+er|+Q297aMp#|q8K}y?PXF6$4I<$_vG3geHtQ= zX1LgjLyxm$IQFne{*HP2ZiI|$(r?KjB6m!^Iom>hR&85ou$CbO>tQ%Ix?$?)!`uc| z!WS!h)SB+`Y%OfH#mL91>CX7HOJtGET?YwPH^CpCiP7nI>Z*_@yhw{?&{1^6&I2tu zO=^J)<#7}nZ(nYtyE{A9SulFpG+FOJKU6cxNtW3V4URx?+(2f7bx@9DW)pXOOpl2W zEh7eYnUz>x{m#X%YbUghV;@$K9rlfxr2K~o&>L0K9kcS2ziu)H$ z{X{^}1CNKk)^p=cdbCQn>t0*7!L?0C6d@J+<|dRAX1izCK5nNtW2BDeoRzxbL~`>Mnz9flPOtFAx1= z^+e@l#n?^HMS%FzHZu4*?!3O!!iKIL+9^xLq{VkEd86rVEf4KF-sU=pmBW$PokqtE3v zSvz6kM4NrkW?Os(ZlJI^fIwSt9#>YEYyqDgl(nPgK|FEhrXX6|=OU{&9W9xHU!UzZ z*@A2iXLk1s>f%Kf-tMb_^JuWLnhBWG)=e%}EbE_&lg+HG`nU+g*j=`mXCkQfT=y4i zb>~2_Qu%Q|J^2Hbj-^|Mx=|0{fI6z(!t&FHtdZ0w02$xOVVESo`c;wNxLbcZAT4Dg zKz63JwH;B!&TO$AKP~uPPIKWqb@68T;x>k@YfeLZ!C*KpjXkYS-}3V#oPJO4N*nb0 zI1Pi~ZQMLel*c_pMr`GaS845K%%F$&&FY9ja}oOL`KGbHWgN!d8`4uw?B%8`$eUHH zK$?c`K}v?5VsNxR)A^>^3q{$W@sDhu@_BcC?G9(~osMFxj?3lEu#kl7OGQ@_-r#`jWo=uL~HjeXnbg%zwx+2uRyA> zYa+!zw2rqb)c{0EibuDJ?kvxg=2Uhgp`CD+yF@mYEm#~Nt3oZUhb3kF4I2}&D9g<6 z?Bq&^<(>ph)(Nxx_Q;}poRkh5ZAD^q81aW4b+pXY=t@_RE6bZ@&ut18skO&(y6w!< zHeE41D}^cbM+iqgSMMU9_bh;4rjz^?o)P?)kSBkB!ZQM!+rh7DoGz+=Y%>w)GnG@Y z{S+&{nU_9|^Pj%?FJJ$#p}w)3AKDyHRlDj7eV-8M2R{6)-!Hyh%Q^lhpy(Bn66o9q zjdj%xoAk#|7VCBDBG8Y=I`^Jm0)VCS^#z~)*4JSAZw@}>Q_oFyQy4D7cFQHXT%OQi zyV=A-UL0xPxHxSt54l)(c2>8- zm>ry*#-it48uuA?=<8Zh?t00~f(L6#ff1|K!QHg;6*oDl_K$mC7;g^ALex-?Y=-qE z+Nx|G7aj^eaU*@Oc4II}ceBS$>1&&nRW3kP-CcdPp#}M{?u};-`vOxHa&X#! zdK|2@Z$^OEj@(QgdJ^*<*NGBi;|LxrE@i^h>7N~(mDIYv*EpTF;+mNagQIKYDB{a; zt?s}cdp{n}$9X15k$(8=ix}{>ND$Ey?-Xg;@2+se7suXEa?gRNu5<3=#%x0E=D8qZ zt7N<*`t%7Q|GK;T=OOoBzxMS1wYxjLaOmQ%>J{;C#|!fH`1lz2zcGApym()~{`Gi) zD5#Hv&YGaZ!$EZN<)C{>wm&X@9CUyEBwxSL=RxLx6VLeDC7T}U+FWsf9YLNN}fc<<+ea)Mv%H+{*XoIJs7X&MO+)94 z!O9aYF3;(zrhDm8)m?$bh>}|S4H>S+G$(zgKkt-=GSy)XsVMwbZvZ|Ru=7Q% z^yRh4KVJNcV3g~xW}A-#kj2h~M)#>`&J5DEyK}qi4v;xQ1@4;X%r#NbWS4o&k%f@* znO~{iBUbhtw#i&A#Jy22Y8`wD;)oepY8$I8JEAEaj#uQglWzP{sJS-d4@gcrm!(tA z@>+WIqn#cC(v`Ms9-0rKAK>5HVDXbg(*l0Mui~6t*~OsZWbf5&-0YFVVwb7i&#H}g z65C8=9e{hFeFDN!4+Yi~Cj*aSknf>lgtLpCR>%GA7Hms`>Okpp+6`wCxW5~t7d$c( zA-i}`{(zkDCM%+veAiqd;BB)%teH+^p-;EzeKGR|APD~P<|~7F=)pd^Q4E{D7(uN# zWdzY+jf5!FLZ~g;E|s}ZH??jbFo0_}I{sU($!C}6J#MeCJJ9g`&IkFoBT$N7y&myb z(YEy8IRei*_ml9Gbgai@atIK*zo_igCI%x1-u+Ga*{w~CWXs7p! zAJ-<3v;M$he+7Quao@CziFYf_%ZiV@dGT{L`DD!`@5>7$e~69%T0X$(`eMyq^ZxC3 zktM2$yk(YTugnsFceK#=BR-!8_LA@Ls|Nvc0UV zfVG8irt!(4+4jiJyloOoK69hLInE3xlt(RF*N`Gdot_J)mS-@sP%GT2>*pz_`!W$S zDH8yL*tELE981Y{t^AM~9RA`C;?&(#p@BXn=~$h3bMfc(GHse-5VgCr&WX^BKouuU zW9o?E<#}C!67MQ8=R1AL&iAxm;?dHo8yI<*zG<$f-Mz(5bOg~9!%bBU3p0V}BG7v~ zTy9;t2$j8-$uVJeq!O*H?s0v{jkQ)JaepEr0dudZkT5B-*>`Pu#m?tt=U_I;^j383 zK;K%Yksm48bU!hPZDr_stL_9h@Kzyr@Ya`OZx#e)FPJ{VW>UVWCJwTmT(*fFFcw+dDHbv_6|pN6cj z$gZfIF54@IoL1URGqzbq-_K8F+;}VF8C(MQd`(HAV^(W_Iq`&tS4|!FLG7()aLS=i zFhbgA4uo7cA_ucW9CmKURe%&Gwg{Pf}7epGQS(gkxu4SN!#& zL!S{%JoY?vISBBipgpN}f<)27y64#j9l(cw_C<=~)}?$ahK&OfKxk22PQDRVTSmum zyP&75i4*H?Gtd3pjP&IQSitozF+z}CNu-IQF@2(|a8HQ#y&X$zyOfE1pm!#Nx$=sU z5?l0wSU1J!COkNIc|KUw6mlNLRs-k`+sJjUd_h$*B?3^5^bCogVCP!<%=(K(n0 zNbGek!+4K(vzY}oebSzc*&iRzRXEHM=x+U|C2U3&F|ig>SY$&c(PCXOA?lRsty?eH zZTffU%-6d8o7v@G$Y`Yat#&(~IL+@QmCApoc7F>kgW3(DW#8eGpKJHeBMj7T?#+Vl+!@ox^s;@By{3-n6OMC9=GEXvn&K}%c z+W99CJ;SBwhJTFsIU$K3&JmUm5-uw-?GBw#7^gT(Y)`@R5*Baurg*6vP#i~*a(w3G4y^d z%NQ0RmcDbg7?U5yv`LqvMS`~Nc)d1ylAMQpiZ$cZ`g#P$oAYhYb*DvB`EA{wMmKG* zt>0&D8`51Fj9Nh=fr+E?#q0%0FDsUua^V03Q<+tw@Y>|$Q>xf%s!pS$&8WV}j-^U1 z9dSQLIiC6P4OjJ@4b-(KwWQ67&~nV+sNoOGF39qd4j6pA*#lO^ZiTH- zBR4i69pnxHC+Re;LoC7|+%st*Pj-I=G6y*|%an-h&Z@QET|>l{RoXk_<`CB4g|Vh| z!wS3SN9^jm8sphQ%XPqI^{SIqiKS+jqJukuJz|?K;}NHEnkIRk%6b}u1GlAOn&Gzd zg;REk?z#daZF))|ih|$Y@$(aGoy4i_?^lD_dPX`gdV%U32S0gN%E%_YCXlWJH0N#G z>?@N01jGKo0{o~hvdIl`yrPXoA}GdRj`D71+y%Fn%+i*BP^aHs{EOHAB1s{HB!zD@ z>DM3xXpiNXn{Vbqo>_=?$Et;B)dVdm^;1-YXL)e}0HZle>IdL`IdD`o48F(@0Y^`@PU!QYyh zfNN3Y9@o6s%Jx>7E2_(3|JKqxkMsZnudQGo6Jr;Uvf@-xhAF*ix%0t}84EmOyHwW( ze2h75XI{idqSXz^Kh*03=c^MTJU2vjS#3A@wx20?h(ed}Xb&|<@B>`t)e;8UrdI1S z2ntAh-*V)u<5igzSOvUDKh2ZDr)EO8o1XGhv(=TDF zY6~uJHJ|AS%{gZ`G`rSRS{UU@C%LGb8TDc9cK(6C8D0P#za*z_tVqcYG`FeWke53b zG#=Tb>+W1)x&-nYK58piH|MTuIQyu$x+J<7z7JUBnAg>9*6Uup zBgYju`->$~==iDdGumcqfR{1cKdEb@H|I~ZGA!+j{_AaN>A6kLzxB=iZRQrL7wlLy zpLN?3sgQ7O9OK44hX$TRoY*A%74RZ(F!p_qg9m=)Ef3!K@RW*>G9mf}sG0#((fK!p z;Y*nWNjc>bzBu29rkN$QYD0liw-g(I7xa<*W+bJf+OYY{D^u2(`IA-3{{7PQQLA zgKH`Z+3a^Y-WnHQ?M@2E7L-`lpf?iCsk7~a2=Wh0+r)?+`5FV#?bg&Xg~%|mIAx|v zUMXc|g7p`$A=GHA~Fm40$g>e!*i4;efYEPBHFYX_XEgO|2qW zL7|n_$?~~$Hx%n~DBc6xs+p1p^wiX`a*3DV6;$_HeLj2P?Ic$#ZZ;UEM~$gZvHV`% zBu!`Kr9)(8=Eh63PmgCh+>zoMqx#RG^gW;XN6_t zO9cJAcrnURQ$`sVq5nlb^CyvW#3b%=oD+oK7cFH3j*WpQUh~`ua#ZinUcY&<38=&l zYkao9o5t!WR%HN(G4FIZZg)vUf#kLms%jJV&w{?3y#NU%gEDn~ltOcr6Y8?tL&0BP zh8uQ?W$oH0vANoF7c1p`2&rDT=FUOEn#|=Q1CejQ8uGiv+N>4^truh|0NPzxZc;xywnM2&LlCYJ9F2&jpnxq89n0GY>Wa$TT|yqEdY>K5P!aw@m9PM^!SW{f(nlc{9Y2;rTro2NIXP zx12O0cD`lLgADUcr1oN{Nqs3Jmj9M(H=s6 zx89|Dq|m@3U|zwzKNMjsgrH9XLH7xLnELKm`uWueDh4~u`<$z~jkO`QdB{&?REQM5 z5~3)lWYycJeOahGWV1c{*+g&-!!;3>Z-mwQ_8>1JJ1 zDvwb;9Ac&@p#8UL?nz_KJ)kiSl3B5v0R9dCDh*q-yf;o9Ue>XjoJzg9_IrCRE z%&bruDA2@#o79$;Gm6N^uuxblau40Mxu@ekbqx$Kl0^67I#adb&M~o{^Y`L`hA^f^ zs7_DXvpq0Eg-@joq6uNn-3*MY86vl*OyX0JwVw5HzkA+wuyhOP`pMh8WSoxJA-r33 zk*-4?P%XpL1ZHJ!P0BqJ4WBozxb7G*yt^SdX%Re39_O>KdjS6fA)U(kFcU}Jstxlw z%Ijk5*FmA>icrkB@LbOa?4sHj^c?f?Df+aa)bqw`m@V5^4$?^FLpFv@VvunM*&~@w z?=11!2>DUd0uT?Ktd5r1=1%z#H)piBo7-{MuuJ}S^i*IDsQwG&d*4%VUTdO$t7HG$ zaU|+*NeJJXy5E5@%-04EIv@oc*WZ*VAfR;+8{)xUn(E}n86jv@A{kO8A@ShLCJJcH zQWwlVcaWwRI`}x{4`DZG7lfE3#*@5xj|lh@a0ppPZ-o^W9!w!D7vg|<`6@YwhVHW) z^q2393>XsJSF{*7B0m@z3e>mD>knj#5eL7T&R;wvFAE9KvtKrNWIAl{0A;uY;RR~u z1`@HM+~eu=eI-S_eJ z73!zUuU#Z?G=Ei!pI)Lz$gPEaM`iNLa{Ctt=DXKqzh)m7d!WuW2@&Fk4eM*hB3830 zN++j9Wez>8**(1h{?k)It^%Gp$OM%Ves4Gq;f0$g8Q-rm!V_lm#HV7~&rf$~XDMQE ze^)ttXV6`4WK`em{EL1IO!K_bu`#2fTfVc+2bn+bJ5Ijx7bR`6d=b13xe=6dg51SP zyiLtcS%;@BsY-lRBnSm-n!>vFeoR+m<>4S9Vd z?9H*%Qe|Cmxq^iC6U{cs{k+iHF1Y}cvbq~VW~n>UBn`%yAVyN~nQFiJJTMR31S;|I zCp~t>i5j9Vbg;259o1}VhSJK*mYwQ7te$!Iy#ACk_Umr({2ph2K{&;l5(w9ZVA{-3 z!{<+N^!fYavdu#v$YK&7Ur)x55zhX%TL?*>>pZznlhLqvC4k{WzT&CE();K3b^R4k z`gWs!1iV7#ne^lR=zo92kdLhU-wKR)Dc-OnAJZmUp#6!N3x{2xaL<>J4fN-|ZzsUE z`8t4}=g+bKcNGHt|5hOioqrEBh6)k?b~)Q0s>D~`{vTE1@>BBU->L+7h_2=TMwNIO zN zYBDHth?~hvB7W*+KE-*=VD?u6JLj5JsobF@pT;v0HA5xB7Uxim%Hxsk^3w^ zu#M-nrty3I`7A%bM%=-fq9$DI=;@{Gj+aEb>K$sXv4d7h#8HW>~ZqV>3B7YQ`6D=$Mo z@Z>5kz^7JjbK0Dcn!goN;z(Qm;zbNr9uIcOK2BZ_0fZ2_?8$iLY4`)MAAiw0WgM`Dt;y)fYV-ajIwl?^XE{tkCO4Gy@%L@e_b>Fs>O!~=2bL? zzZDJa|69>0KeN`MXe93%`!_%6kA2S%efWE{4hX#fHWA-=-3}`V9BjOJh5Nr;z<-*We#%<-8npl-^&j(hRuEfj zlvg(xRnnKv?5tR-dcZ-KRl$16AX08Y_c#Q><*{=r&gV(uk)D()!uMAOS-FKjNF(`i(; z80sd(ide1VR>o$){>CU0>#e{tj^XIC6_ z{+s%@{QAcK<_*s8yGGtpnP15SFII5@wfLLe6#yx~pOSCa^nVly$n*Viw=0DDY=bbc zYZ&3V9}fACGamA-=C@4HpU(Gx1~Gu*fBz1*35fXgzr8cO@xOb6-xP^ohP1&VK%(>y zw2v+H=AP^i*Y+ZU54?PiZg8d!RWtik~w? zc@P>O7YN@dn9JEuW(X(=Vbjwt-~k0_`pc!pYNA+m*~+PBatRqQLS3Comdw&y_hxj0 zqXG$+#38mq2Me4a8WViJ$&g8?1ZnIPxIdLunu({Uf(rozHGnVgF5cp52H_NSFz!#Z zPU~AdtdsdN2ImLDI?18xYHyAuy0nQ|DXRLG!9PTCLyd!y0$*H-lxF0`=R6*kMhdiZ2{Z8QYb zXT=T)JT>XtQ)7&$`)PS?R7Xzlc+zhu0ch&%>TT*!S%|%{#n&ESQq#OX1S_Kf z%Yp+@VP26z5Nwjc7WEg%nSeVJ2BNv)W@%SKj?NXjp7OQ043dQ^m~8)ePri*PZ&@a? zG=LL)3L#np{(ntY1`!87gnLMNNcvL>UwSylPoF|fIuYFCpPz%W%B*E1XJ1l zE#2Y!%5k;d$LE!+#RZVu)A|rSrjoLoCyHGlNojb458i^fqj1Wi11tUEFI1r{)~d|? z?pOkj@NK!rYv=UW-_(EWSVCSm8|*(?>tD{L|IV?LWfqO}B@f<;x2;S+???VEOnK`q zufH((9n8vd>J*oU8s^)wLLjZASOw{LIJRO_Qd_FLLFzmoUS*|{QCOYHG6xh-tx9CD z4R2k>cz@VBmkq;j-R5C1>_Xr%q#Zwop+xqbgZa1A(nyUSi!L!GKe24Q7%LT$B35v? zt!e3=UoIYDC(8AxxcV8hARP?MKz!zdMF|Y6$`PVI$Qj90YUjh&9T|3W924bu?kD?f z2*ELtS44zA@0L#Ay4l-7;mMAjtClit-=EiE4cnIGc?Vif6MvZPBJek4J=7<)x=?pIYQhvqJ8=1zchT+Sn!&SaFA{JnWxXkO70?0NH69-|-O z%^s~~+zy)aut@YTE7E@M9e$}K{u^%vNm+0ft-r0f;W?}Lm7?z-wi~O!f5@0X#2+5i z@4Lr-*yUb+d6>Vf83r2twaOhdM6X@Nuv+XOK)}oUE_W#P?-$|PTMGa)+mCd5@%wWB zs`db*e9Uy;S$|0V+kJiZJ}Wo(k~9BKK>X4VLwwC^XZtq+aRhdK2>ihzR%jz=VLJ(w zqPCE$b_IO%L3gzc(WHAy?)58e*)5u1Z(*d2YgB=(Ipny568x;_6wnV{A+A2B?3rlH z*1dMSjD8!>H}I)+J$5coW`dDu7V4G0lO^n$Vv!qR>-7#cyWVv)ERb?cu%YZ)MX89X zKRvLfzk6!mYckt1+ccXtXLnR_vbY!+YIL@^aguZub8VaOQ6O*)`0+>--N7cpM#XnRw~|-qTLRmVPSIYl z%VX>28RW4t(CyS6b{&5PZRoQZ^Z%369j| zr`n!e#n=!^`h-Ean%De_Sf7va^B`dBP&o4BA;Xr#6%m-Klk8(tGNx0t0lKN4fpTq3 zC3qI0dtP53`T~D5c))tftg-d%tX=UKv_@-Bsh)|=Ttn;3%#u?)p9p7Y@LM}>1xY!0 za;3uVF`LYu=1GEjJ8=>n3e5jmluYlo%?80|9gp)SO}a*|e5uRySC;|TzL`?uqDn+{E2sO(WSmPdx& z42(TfWVto=-~zjvtCMZcE5uWk`(^L$1gn2~*p=j_l(W|%#3b?jt~PwwCUH~Xw!J`5 z@~$;kdd-KPVXYGXNESDV+QPO{bj)Dic6vwroLkj-O6i1Z1sa8gA@ht{Wt5e*76c}^ zcy<91B_n9hF3a-ZsIk);&g-By(&6URl`wkacT8}uiH4v%!SQJoT*F>p;!4EfXzdw| zmBTtD&{0pNiNnf{oH(FYmWu7czgF2IZ^QhI4|a$J^hw9ojM%M~HbB&BNv`|u23QKU z*26VzIjX52XqxcpIOI<|)9+w)HB~aa2U#jx_!M(WW`+@1dAq;*m1Wwl2TQxmD}e-l zl%o;kdR}g$&=z*3JXg_xh8k(`iNZU)G9A$`nenLd82Z3db*Dg@3H~iKNa8kqeNyC`UsspeyXmpDL0^>*K1#y zMYfWw+v<2aogeyT+>xq^P_+mc<9=3Cl9q6dFIO_>Epq+9PFq-V_@ttPt0YftR{~6C z2nS*!SqNjKYPV5bmDK9gmrG3TMA&wZz~XQS2I6XK&EVaz?a{*$ZO(_8*`jt%SPlO? za=Yt8^scOQN&{Xzw7j0+!+!!R{MWDIum08=$PX~Xau8Ji0WI)c@=LM*U!UFoS!?jV zYWhoS@YW8zApzf81D7QY!H)iqTLb++X$=G&cCf;5ya175y6%}lndE%2mQp*#W+hb_ zPEN$BIJ#!hW}>CxytBwHfWdZTWEmn{D~`I>447zBAZ}JB#EUHF{@QF{y9_KC>lt#D zW6L%H>v<)gLCd#0Ei2_NJWCQ|q~Pp%t+HOz{^6D*8mvgFS;(rQt-(My@rWKwQM*1H z;(A;Yj{MXgOR%jvvLp|2{>;t3WwPOzZp!DAbB*zq#|NA<4j8l55J9l@y3?fnAnDx-YVLgfb_n z4>gA%)PZXmajSK9d3fBwB>ZH%bno6z6V2TFC}Ivq56#6x*Wi5WMyZw0kNc_^&Iz?lO$6o9dhjtl(Q=~w(Hx6t9QIY2vZJwk=M*n z?)Yp?d5q;dL0Ja%`U0j|ccW=(p15oAATkSVWp*#O^&N$jgXMNWi7eVcd$x0*W~?xE z;&nP?MM!&fqpydQoIMzrM; z5S4cxBXjbx+X5XBF}GN`WvSa9##Os;w-J5uGPIEkonQtzNy-Hogbnj>{5?4W_57_h zP`UEugg^aG(#Uhvd)RQssmcl9i2(k%FeVo-j6!7Nb;z>txFjCzEz#v~2+9OG6_89U z!-7I^aloQu@I*Ur$N(PwG~j>W6i|L25YTY631DA-k4=0XKE4hXKox_4Y8Qn{^N_EUwg|HmAGdZz&8ZN7zpC<7oQ8D$dK{?`+eX;$QwWe7=!wqA^r(s zFdnfCOGtuuNzk4&05JMzlJje47~9PoLxQ$Rnt$a{ zc?ny=yzSCtwig$AGI!&aJb`cjspHI$)MRJGeaj1E3fY1;h1rn&<3JFwANYK`Lmr!Y zYab&Bde^6^h;n%@l)#(U4FnvJ#d2;zW`TKaT8 zHZ`&-s=^yn9ETEve2W+xlKl@!u0WB#Z!E$|8e=9CCN^2zlfXPk$21tg2=H)qC%A zPDgZf1zlAOQPP|_GspNwMbQZ47<4i~sq#Ia&vx#sAuw7qvEQ}5YleZQh3svc?~TiH zcLU!@M|dfXZ5h{c>qDuRSq+IevbgOYyfYvvYESO9QUfl@Ohp3z7rvCJ!5>k~*HB)H z&~A5K9X7s^0!3esAv-!0qDuv22j>AoAmhg3!L>Edf5y0gy3z zXJ3S_Pt1<3b5J%8{kfHnou1uevlNT8;HK+iSyw=5Il}qERPLLdZw5D{_3#V-lwa0R zA6MEUp7MN^a%+9B?H;Bfmx&{74C^BAMDMT=hvg%3`gGNRBllm;+b=oTlP3zZ{&J|Y z(C?oF>_5$IzF@Ea18o>%zk1N0(erR3`5pC|(tdiTr8C0<*vEZMaNwC%kuzp7CI)WV zFG=vS5l-S;+5wC?@UIxqr&_p=Z2SjT`L%fJ078MuJpXiY0exyZSaE`?=T?2|7q%cG?C_;L(y_ zmiz9Mc@2c~cw+wm&PQ{nJ%q4%b6e!R%ra2Bar$bCCgG!H5kq!l;c^GNZet zVf3+PH?coEc?p^8&aQ=8`cOjD%!Lpy%I)5ZOFy<2J96Rz0<=2$%7svDB34>ebw&6& z1n0>Oadfx6i0ulHMc3QI-mr?7yRL3dyv7VS!)68NUe2-vmjB&o17%T z%nL1eiL96;LKxA@t7w9S!Z@y1e9U>e!TA(%?m+ZI^Wy!+_w)W_xeBZ9rG8o{kXh`2 z<#TLrt6+&*s#I(pSXv`*g^2X!@!{H1A0+WHWq%L3Nkgpkd}ZeB6;M3p6e7hJguI)0 zgZXtE{1X!Tk1c1PrJMFR=H?Rk9h1G}c1p@F04P@F{Spn_eC($lI&fnR9`%cI&<8cw|SM^0>kom%?O!ero(K6%Vl<9 zJoa!kp}Ba-_C`qyNc;#_+s;hFtUfP#-l==tND5iz;(ZUIsTsJ0o&`72y%WMarVUFI zI#tK(M8FE`j*o3H%nqm{x#OA`OPFi^#WrEoRebaRp$ot3{#pHH@%!8Pk^#{p)C!-Y zYYLLQe*Kd(B>vN)cQ8y=eLB5JNE?Dh?|_`2gCQ&egO@Uc6%JNaHq};lm~P3S z5c*_Iy_llFO$Lm3j=dWj-Z-OQUWA43J8MeM^E>kzu0NB$YLhCUJOz-I`(=<0Rg?Dd zh9J2GGz?&@m9uxY)PG<=fVGVxMba^@b~KNqQgji!xVUQsWiw)Q7UU87Z5w-0d)pEv z!JKeC>}Q>@C|}Y{N@kag*s>aW5BX#vc8k(&rk3Go{T zBw0kFCSN%+5YKk$Mr!iFx8@{O^{rKAvv7N|P)s z@PU#65GQ7@BK?V@@0;sV#k0EE)!~K*)dn0?Q;XUel%ts==8Hq4g6>l0J0YL4EcI8omB%U}_td z1`mVL(yc9+CgOlR^_RBjA0;)E|ELpS)(Mt{betBY{dn-W>^6U z13J1!EcQ)~m7g0>*B-61Y<_T0zfB+M4+`en3TA zC=XBf?(vR=YGb>@oY1%+jOXO-KQLTy;Gv==2kCz_+az+>Q^36IBsY61|}{r z6JRnS1XHA=hiiMHxAh$K|{>;K{XTQvE% zH@E&DF?pZW+TYeJHhQjE%lV@xrs>BG=!QsAJi;{c;kMwxlhEI;V>DHK@kzb1cAn_E zA3;$m1P5AY8G??vw_=TFC;Vyi!oc%%@nI6Lt$^KbvY%W%So|ytCi4)gX_>kup3jA4 zTE9<3hsy8rDI$a9ll2hjt*9K0JdTUt<38hTmG;acmB=a`=d zBuROGflE)%(2xf#(cmO}R*0|a@XKq+$rQl&|NYvZ9ltb4!ICRtYu|?tT#`(qd9F z3*h!<28Yxn6`Vpqrdto}3(4lqdmHxWJ$neZrx?2daj4wlK=s_}U9scq`|zM5rwri) zsJAl(mWBikIKHgswU2#LdnOh#wI&;TFa#gv}vEvpixQB;~R%gm}bH8X<#X>Ex5^nz3O&{gjrx zY+sS{612?lzt~IEZx9yX=X%RhIOLoII|Eu+M~EvAOMMM;8<|ewz)A_T1hES7y`1*|?N&2;9diNIV_gr09=AraJ+%I9ZQ`x8OysUOPzLSVh zMo=_}=cS#|11DPt+jI{@!Zvg7)N;37w!?JNdV&OdUvMP@^{5&_59r1Hp#h(Cmlqig z!i`x@&t09`h!cktPDvJiK4aacZ=P(%i%Tre9!{LD>6T+t<30}6>E0@gE0SOzU}-o- zWMKzX5me&I!=BePFTPVNq0D7oXgc$erJ?q-7z9w0+%<&04m zpy*g8!rb%A`#EauHa=@ud-k@}A_B~2MFNnAoGWU(gL>jpwtwNX(ta7=lI&JOrF`+r z01&PJ)XA%H@UP&Q&t2%_i@)whMiuDBi+ z#nJ}}7tms!i6M+}2Jg9<0@6Tx$k%i&LmK6Ka3X9d&G!ujr1!23nXd3l9=;t7$ETI| z=Rot-(%zQrJuf{G| z(ca&+(s--Q0KV%Ak)f6s-j$&2yG(#09Ma~$}R8}RX_`!qNnVc_HChKw2{H${HVNiCLyi7HwQ7EvX{vfpI+662tL zs%W<}HVU*^9gUTt-OMA3-v%zbO}*>-D5h1+j(zOnY#1Jc<+M@GzR>OWfjU6%~_BgTuboBb8a;g7K|qm3=D}ba(rGG z9YiTWR{%nOn`x5~B!1fDl3KwzMT2qw7JAfY4TgDu&j)e~oFgM(DX|nfX@U&i5J*&k zKf(l;0zy3^l`Fy z2E%V~bJ?BO&1%aw_A-Wci+hL$5OLP^r-u!04Icd=!e9?HBn=zn;jm!gQZ%?%;4XxH zpnCmcon;{78G>LwdLn&;>ur8ssn9~A6D-P`ELJ@Ci0W=NA<$jtP)by1*C=YR(C z!vIIYi0a2b1{0e16=McfEieD(^8>Mr{V$<2u$>lr0nozG&`3mdm#eamX)s8?tGHn8 z*-E*Ijf+)*=<_+WnRAkx^99UgEp(NIUesWusQRD_J3HYKAQ}D<(iF#$L5}-*OA~uE zTK9*zh8>&Xpot~-4@0gWBNtpj-5N3 zl@|NTs`k0zp$>SKK$85HY?cV@SwnxYeZgbWwx`{Z$(G?`J_5q&UpwPpw!4qmnfF~U zOWzvgf23-BY;=G3Ik5NFR`(@8{+E^XnYu+0KQ)W~|88|ZaZ2x_`=qR~KkoA9P5vF6 z_TEW1UD)av7Rb8La({$xEq8eF_1g9Cm-X`oj{I+S@SisD6fj$_`Qt0w`%8Ys=SuPQ zvfym=3y10RXruu~1inE4{3@(nbQVg07Q&>#z9;+&IA@%o?#+F9>F*~XsmHMjjLN+3 zQ;1~1|ZR9|!+fazagO#{`1A;Aw1~ zXoq&1h!tTwEY$}DL+s);%&A!1wE2bQZ0q~}^yDqoYr9NW5WagK0dXN8HEoRskndoZQ-5gY|76ttap?LbGd_0P_=NC}G=fX%pf+h6-t+rdf=`t$c)=D9gk&z(kl zGd+JJv*}F5_(>;jCKxrIoGqrci!;+CZ3Fr9pRPOP6=g<3hfZ@R7K{+C;6a5IY&3Yc zZ(AVA%k-OZg4Hz07d}w@>igsMv1@&QXRs?jw=L=Ib1)z>Y7$&F`LanvVTZpqYVFGw z_^~M=AY=^QPHP}~VJJi9$OAn;eIXi^y5aB)29#MA*tuU$ZXgl(c2wlSdGNbU_@xhk z5A%1QCDa-{lnsA8f3pf0&(WxK60HgitNk%*|`u9louT%y|%U0s)r9%~~UyB?B# zu%@EY`w^nn#lt=}nzIUUU{A2H<$iHbDe+X|ZrAg=IAO)i95;wS@k#` zs7=*kI1QY=Ty8Gm-L7*rIGU8E==U@k9~4ADFv}tAHm)SxB^X~9w9#`q8+S;*icr$6 zIlF=GaLA*JQ+V>WI&U~$6nUgi7{0py%PG&%{j&MzW5*+3!;s%@bbmd?$icy5U2X^rd>d+qw|V6-h?IBhx{A-;^`N8 z^(jm?|6qPVFEOw=@e(-XE2I(z1mY{D@{5P`6=f_N*aQY8<`v*J>+bpai)rddc-xbH z@XGdn!V8KqfO8i7GQEaF)AJX81Rg<%D~w9O#s@}l>}}hFD*O2wbABif7Js%4zh2%) z+YtG`ad{tC2eYG3Si}GL@;z9UIZ-g@^zY7As3^vtoY-IWWnKv@v`mA%uLyTHl-JvUdJzdxBEHXJM7 z9QFXq#{3z>l9MR7`h422I2L&v7OBye=Z;ywU3Ii_*Jz4#V~V605|-@mZNtN7+wkK^$o;l&D0^ys#SZR9gQg^&;iS=Bt$7JD z=Kuo0UuQ~a8$SJmlLX~8Qq%E4{Gk`SK5l=g0hB1Q%Uq4Y( zEcx}FpJ5x6X*d$X=FTpl=GQb8RxO0hcPA}3eNjhLGaIZRj{ zNcb&8Q0cPq9?qSIfzcR5!sgDb7zl{Rx^mSPc5WO&dPv|N=(B?pj@ijMag;@qz+u%; zZe6n69w>@+(|W%5AivpAU=(Q{DQ&J%z|&PHF|&;rpU0dR*$%r^rzFHj*{e+awgaLK zGtr&(qGcP|8f3TRl$a69zun|!6bZ}4VID9<=iDv?LoP=Wnk~?)&@; zDClSQV>SO^_&vwz2kvEG{rXOT?m;X=dU~zRklJ~d={JfYSkY@B+oy<=)qB8!%*R0xamQbJ#vRY%muH!A%$Z zFykUGC9HB}I}jB@M6n(Q%4L46E@%%Oi{89~dKl`UH*-R}Ff*~FBU;9IZ3tQ3Ce6AdlwghibGa4FHgHTG6iX$0hay!Na5gAU3Ufr5Ux>5Wbvk(8wuwlDK5s^^nek zwGg((g%|Mc47ilVig|d^Kp!8VMfF!9>=GCXj-t%FZ@|G9u{RWm1U$301h4=Tx~~I2 z?*g15@ zVi`wo|F2CgqxWHi6Bp56mh-<8oS3JiaQvl0ggco{?yJi=~Nt+rFo^0Zof5sf5XL46q!Lq;aV8D=$tMGK)Xfrd86r?*K zanpGRW{rjx3;HHJ8L!JV#PY##=fMa|-l(EU1>rX2BPejm@hXw8W319|>@|H$z3pxj)?A`cFLfBv;TsX+u#5MzD__OD>}xSpFki-Wi%{O92PWU;fshxx!dR zg0-GcDdY3|LH7UC4{W&(Y&Db5e3$7x#U-LiUY{Gqv##J@Mh=*4+ExdUiZj&PHITxH zE?7lCNR**PTMW;bNbsRUXYBbyoheyQ_s8cC{ZbNrUE?7I_aVNwNIf_Af&Rn(!XNToWwF(cKb;$tG z=ME%@x)w8J0CFY2FV2hVC?o3mPOgN*2t*?$z75$OJ!9Nv_oOUgC_S~H8$z2EFx@l9 zBuTJIUzRmUyFhllI>PzETc0sdVZ_XQ6bs}I2b{)l_veiViEA+grvWxX>+8L0?xG`Z zJ5GZWNgiDw$hQb~%h02khkzv|pw{8`Yb--_Nm^|;cacFPtLJHDC2Mw5Q0=u4{D$hq z^Q8z10yB*pOZfe$JTld+l+nbOp#P14j*cka$?G{(!Z(?I%ddyUGJ`J06Fn z&kk(~fv7N(Z{FvA&yIfjTAts3`S%}s>)!mjFSt)->>9XC7|iG8_l@Dli?7#y9a{Wy zSzrI*=T#y9o6Gw7s=j?@f4i)ILq0t9TyQY>Kt3>3rgY+XxE~TeOA2RL$~ZHJ<OsWud{Thwjc4i<0DDALmNQZVVXTg1Sk>hlHZMkWXeZ4os=m_> ziPpxE;DCQ~CYALqIXyjzNrD|Pk7*Q%yF^DOOq8X2HMU2gK@q-22S|2+@keYwECHwh zs=Yq1WBSoc29DBVhHjxz0(p_&R@GJqZ;;exc+(Dyp|6YmfJQiZI015Bb(gYzv89H&0Ky)@?gV<2oQ9lm1af1FG7<&fxs^hF^rjY>w+~1m<^; z>-t5o&1IP!7oc}vTsqUC0&uv8Yrlye(w>szN!}8YvOTq7yzmABu&WH!2+I{tZysnY znD}m^EvLom)V7Dow~l%!IyVuiyYk4j{_e;FGdi^t`>-*1jUU(xsobw3dQj0lq283B z;cF!?7l-`PWP8ar_1fsl+?ljiTaFDbsY@Y zr;=WKk6VO7DBNB#j>#H;6P=$FyI^zMw2-NO^%nQ*p}$#B?WW<)XFW7+mGeJ)+N@iL7^n98mzI z|KaQWq+Ky@+6I$?@el~2DfDN5qQChTGmdcV=D54JxyB6zw<>vAt}&lgHAs`0<->PK?etWDuz5k>F*fCdKP^gBno^=6qX8HGWi@SoA7SG%xn;- zTx}o-I)n!uAR|8{dM}+rR=nOh@*@2{mth)zQnH{g4t@dSHHsR2 z8-LNVJfPA&U8cv1$~|a#W8~Kf63}Quc@pn#`o5lNu&x7S{w0|L@D~J$eOW~tPzqxn zSXEz^eZ8d$>=VTE1o~avvgn@Oe*~I9&rF8=of!6PLB2R$0^P`-9X-Ra-+5HrJHM;` z0Rnp~r?BT6c{Yf?A}4=2^8R3SQ5S%uHPBhgg2NdoVp{q|M+03ZZ2;Q$<@w8=ApV!e z>bU*@eBqOK_?MX=lYW!MFq(GbvI1NV&ky~H@Gz(YOt7AoUeo*wyb#!fzm8f!Q~A6# zNXXmrh=VIDs-s;joS=t?&qC5L&+U>XJ97rk&QqN3_U1a$$s(YzQj)^HByaJ(9K)g{ z^ZoS#8TV_`=Ot{|`HGBt*HtQZ$$awI=+a+WrV66c}tD|t-&jTQSm(4hvc^%x zM?9GuZUH)yL>`=jK7^M+!f( zXH!r(p?YXdRBaq8gA0!#51Zv=$lIk^uX4QJPU{80w#VA2PcrQxZ0#3(8Ra+49gf># zy1H=`sFG4YnvFD!y3;tg|vd!j#z$Bk=TX<3}~fj+Gj@Iy4t z1vd+1SzWpE42K|WoklSH@VsL7VQJK-s$?e47S%2pCme6B6f|iXxO=wNP+}mi-Ok&* z)=tq?lTaJo@ivMS(~+a~PFQp2^`_=`%0_40jFIrAcl6@hB7j7dd^Rr1spC+*&TdUl zs3=#QwYHQG?Sl}~FeTUfu)ftuy4?J05p4R|QQR^r~R-S=J6?%0It0sb8!ZuTC@LuVP(FJfH`r-xiukfensCwo~+us9c=>hC#V&96@buCoJD3n2iY)cR2q9iYc|*g85cT3D>#wf1zUU3At;~VyYXSy-aEx_*U`;y<&QcpdFxt+2$u6gQL`1wf zBtEM|{t}e<;7u~ed(mywa?5n}x`{?`m`CSh5fj^@f0n4y+~v}==?SY=3~#$u!`&WT zawT!tA=(;xZzzb$4`3oCSADT43}>h;zdFYL7zQq7VohwULOX8x#Vs>Kj@DGXf)3v1 zh=pkA%>!=m5|l1ILTxiP0RYO`aPBTn$7sws*BOzFGWC)Dj)S3UO#9zeyP<6S@5 z!R|Qdtyc3a>;z^;YkPIC@PkMpCqf}lL##MaQ{tpFQA^2nK=CR=ccp2ZouwCpDQpL0 zS`d?YQJi|g@^+xyZQAZR(Wl(+c7et;dhr6%$NvkLP7a-ubt zgU_5HFVI3`NPy&7l?3fP@~I%h$4R)TXknx)1S95nVval6Y^Ae({`r}EZ=l0t#zN@R z2#N6_9?Qy7y};UHtM<@sHmU?aW&fq7kMmNW)0GKc`d@S2)D$1i0Na z<2r@dY^f5q<)K}BK&sxz#6^vy(w96Ip4>~u=ioHZ3UCka$Ayk@D@2J=l;qu&4rtPQ z?sHBoACd;kdS$oa!K+a3uks9 zE5n9;Yb^tpUjUKNfptx8$3ER%&ZLE2wkyv>IfG~xU;wUAaf(qicwW&0elaq)-tqby+k~D<&sB^B#dwt}(r~#Ppvx@)HhV4xLUz=0b z3>)q%H04Wp91PtGW$lB5`g!(xSI)ko?LaB?h72{~IeNMepGllo>IDc_;5C@nrSr#& za6bKFv~*1pgy%9qmtXE*$N*)hiy5toN4SEc0{oL7nHJDm3-v=$A#i4T9*MpUmciHY znG6O6^d~n5T586ZkKnU(0Bp`3JRme8{PMxRnLx<&l@LMGDR@BOtO1sRsU;uY@Yr7# z)M&{#fQQR72+jqfTv5H=Wile$duKvhKj4C1m2KVHt4fP|Vh$nW#(jGYtR&hSeJ1f1 z=d?H5M(d*(WfyMD!#lkz3!|yP;s?g6nF9s#7?Hh`Ma;IRNb`?Sw=-L8!jRfX&Z zJ^<3;z`GFV_pl%-XLCE>_gF@79jbyWdVO2oVo(CN!=*cqmj@FisDmn|zuoZoomm)- zYn>Ht6axhb$=!aAm2$|p%4x$NIa}Wio>@CEFu6ET7Hzf}b>Z|mR*$s}Nw5b^o_b+V zm_fZH$Wu&%dOyr_sf4U^dp@p(aLYKY`B>+p=?lamvSx<1H;up7C+O`(%b5hsPGCrn zD}7v_L)F>&O}vj?!D=+P2Nnl)!RIoLTzr4!VyxD!<#<%o?Ob6{FiF)iqOVz63q>i~ z!4)V8nuN=|bETAHb=`v@^h`=O#k!NFbd-Z#bk7tQk&BKdq1VUpp8J@9heuG_D>)HHmEd8FOEh*D~kI1^@ls> zS94A{@lWZBj$J`AkWO4pp2_(Q7~h--oz2A_tsb3eD1NDB%2S?S>Qiv}8)YZ>cWn&h+wjuL#K+t~(9* zoEDfM7f?V4%$^dxV>g@uii>6DX02~{#OfgtQM4w3_vIyl#p?zPBeXiEcO|T6%`%OG zR1Y9IkFs@>8wHb?Y2}2m#*-zg+&pE_ar}5jN3k!E@dnVo4h0%sil5ReuzY*d?raY& zR?Rvl(<-Yr z-&nT`VKGIzSQNwD3i##`px~7%?q!{n-qK(5?YQIlV9Q_-MGLN7F1XSz6H43~S!%3d zO(diSsxicK*JZN0vj^gcKGNQ0H;}K>SG~U!cX^lGBy`7kl8~la2H~;9vD-o_^B9m{x1?{CQGyD?CT%0 z>xLTyR|(8VS@D~q;&bx#x9S4Y)}gv+KAGYgb4pTNPh5T6s<_SU4=4!(q~BH-#n08n zQ`ct6l>FgUm7n{u|B77G-UPcpl0LwaO1=D=5Ef9qGGC#o_$(Y`LxVJ@=V)2efDF^K zpzCj5Ga;Iyp1B9m8-!%1g8foqyz7)*&?rN50`hO4|9z7{u=kf5=<~%Z_3dp#N8`Ws zu91Ix+yC8n{gkj}Kd)k+{u^iv!~ZY6+i!a2;+z0)Njk>^zu!ga!eNaD68uCcj@!|M zEE|KwVdj)FYDU7tXceY-QIGar5)26@qzRqQ47YC8T$&|(T>z-)z)GX5mW;59x(7rm z%ym5w?PBI<_*sdPEAiBg*Z?yu2v$E2Wz7?~@hdMkSG zqLAp(ZDVHH!LlP$7sYdJ1X>JXw)XlZdH~=ac0;FrUNv}%30qAGy^ZCDX$^Tnfp!xN zXS$aR$Vi70f<;6h`eJ5!;ro*wN2S@oKrRlpjZ#_MgInHeixAokN}ge$pIz|z$on`K zf)R&%jfwGB$I?|zCFdZ3|OUk=l#2$X2M6GUkM^P&SyVsn4n??T8BUM87#SQ*xkkeVH|53HC%pkwWi_h1to7NuTq zH*8;=db&qjneV}W4(Dyn1I+xGsCRzV$x0g9$s>YuZ{Now3osL!S``Rq{% zWFeHXe1p`%-FP!;prW+9h?4tSUY^iR8ri$6m7={4Gan<%LZ!Y_%6i>hg4raS6Scke z#&sF@&f=QOr%`+#Y$Nqbp5R#j=_LGm+V}(F>zfguBydf!0^L0JC9;>)>~J3$D9s7X z0?GFKN#paN@#UL;{@$O3yvV1LR~|xT`y9{;(xP9o6-yYMY9_Z7BwkJ~K-KM{ENC-i zvL7OcM@N(5m)GNPScP$ARwZ5D5H@hGp#Mhe7FKkw!MaP$ z=mE>tooedVEQXQO&1NN3FkrZJn}+MMk;n%pEUX8pRcGV6i5|@wi}rn><;c^rx&zM% zy(74BN#kvz-b#`+ZXsk9H!0?9FiDkz1}08c5dHgn>vNsuv-I*-==xO{|HE4UNvZo@ z^Zs@9eYw-yPj|XTw)aph>!T(P@Ss=oEq9CPcdQi!?CzTJdKZ)-Zk&f?bvQGj)? z7Fck2KoGWT<4-~fXJud3wl`D9>Xp3nUil*Lu8wCp{2Z0NmBd^<1-}trawciMEu=L_ z*}g8MptF3i9vI5sQU{^IroCWf~yO~2C-d1L5nPq;4YMvj7RXXTF^4Dm4HyfG$+O@$i=vRjmY|-bo(&Zy|%g?Fp}eH zw%^s}cF9U5XT?_2og?)ak7EG(2o0ho9UmBQM-uTtTgKj5hnOmRcse(WOa`D=#Wsld6q# zj9iwOe+KO++uf;QwK)PdZe#4bchDlJ0T0k>eG~SoKWHXDoObW+otGQp=>h*HJmQY* zVp`>(YanSYFsgh>MovQPf}y~ww3{v)Z83=gUAtd%&d9<$&< zlAJa3fpAVXQW>}7J)NVR)DUYAi8t$;$J+KuN!l1??Pb*iZS_2C^7z6Wh3zAjLDjWX z@GuGr!PBT!Ve@6C=S1C<4`mxFduXg5xdtg`Rj8^olhzcoSz5eov)*ob6*4Df?b05c!e6kg!H2PK*z|)b`EVUu=$QN zz6`FtJ@}&4q!ogqW}9hW9TzbwP+_@Jl^q+mq7hX!lRQX4BrGLv7N>k*x5|1;L0H6p zJ^#Zh%s(`%n*s-oG?RV3h9J+*LsJahr^7aGT*AsQ37yr)73|NqZhHSE-r`UUvV)@B!rN;ww}9%$JcHvIK+0cgaVW(P z=j-?3%Cl<$K4Yqj9H?p^r1w#3M$ zTG5lnf^iI*zij(L1f~W$Ja)N0FPG5Ad^AaFD9i3XhM3~G()6Hnvm=-LFr^J0!Tn6P zE)q>F$QuFtCD+)BtgyTV$M!+q)|S#)f-JTV2z>HY) z8qK6T##Vba1f$|khzpr0t6BD9%jFq{xYEmc+T8F3m&|8*d7)0c$!^@maXtGTzq600 zUBuY-Fo}}a=fcQ_Llc3~cRdq$jKqt@d9Qa1kO*9+(00kT&4{93m#78D+B3!>M8sOwL}sI}a$ z_Z_4{LvtlK<#SbTuD7w4h5SX#Kz>DLum_oWgFJyD`6;vcojmg$a|UOjw_EGgHbah> zVwf~>ec3@D!W-D*kIN`sS@J^AsS0S)I!XdcQC>+)V#!kZ2{1}3aS-%Vo;$#e<&Ibi z_~AXN;(bL7+FD64xA%`Bw+51nE&%FeKPMc$U)|BW(?I_0K^S@g3iBvh1DFLdd)f33 zRel^)6URHSX#{EEji*B&q2u*&I^SfS3t5%hW6Xe01sAkgR9AZnh!~it9GPmS`>lf! z1-d|XXS%Fh$l(a8kgw17D$9clG|}c@5R-CCW)Pvp9iiDOrE>rjNPV8B5rS76OrS$* zY$3973*3o`+8WT9LYIO(-7ag%rgE`Y)(%|K?x;BOr7e=IAnG*>qGJJULWgBusRz^3 zgn1+2&4x42p}W+Bri=U)tJpiF*e$Z_O+WwJI?5R4M=AS{^K;PCUsp@evq7BfXYzoi z1ClgV{HwTYMVToN$MHh?zpY$B#|3TG_x_{=P0Y8pDo8FnkXeEa0l!4N1(ZeV{Kl9C zTQPWSxCf+Ny*xHD2oxcV=gXm5;L-=MhF&@@C@^zCGz(C0Ld?DO)N#Sruh&?x76UNd zs-HTpZv=~1o%lAZHKEEKKv=s(09N~vhXCT){qO~`%K&1RJuiRgy8wFV%FkBHAL_?v zd-YAn^|@j$#;q4=w4gY>e9yeZ*V5s^!}bYOy(ZWx0N)QIa?;atwqPK4#DgxEj0)${ zL~iWnbbH{!ymAIqkuS{3F{D19ubW3ftmBET1|S#GV!bW5I|tMl>2#3mQp?sovMe#AQ_Lu}c)f0%<7F2K z3ISuAR%+)huo>0>-mZ(B*I_;Z3iI}1Laa{(4cgRV-ti>g`vp3m zxoJmv^U?^q6L-cng4v^>a?;d;vn6c5++Yzh^q_SM19!b=E%FN7*bM|q(fY4PeqaZEBfQE+)%iMT{rT-` z!5wq(f8Hr8y|_6H)&9JgT@TqDa1#}_Fwd0^?)n51&-;ToPE(l{1{H0H!qXLD!I)bj z%ZC(+DD(tr^I-&(yQE3|b=aB4PEPfcp>M;-KJlHvADjgaQXsQmtx2X`hHN?R2j@nP zyiV4gH{;sY$*(MOpm6s9iBe<%nWF09euGo1?fS=HD0KpOwToL(%3Cml?sr*p_a6Gb zyFJ8mQZUF81feJq?p1~t=F2{q5dGMjz`kS%!xPFvte{JJL(6CtI@f@Kv_OuMagjN2 zbqjFzE5&c3rAF;QpaWf}?MlD8VrP%SRb+?2Koak8T$tE=wQX$c%y(-YwD-WRPr=^u z^oKxHvF)d=5=|p~#2tH0lRyewY1gc1#XM_&TgynAHJ-v2XZuqb__wu;rJtqF_(Rpg zSX+2tXOoy|+h0>tE}iUqW)EUuWBXYcb49Gq{j!704^wfAX|(|e;; zV()K_)<3SoU$i<1oW2E}Q_j!}V07?I{$^=@T>^;wDOj3UUwfXHJUb8*22`$3g6T`W zLcP>0P`nK0dU=$~^P0D%!dhOp0&sgvAGbX&)cX~HT~M4!Pnc>Sj1h8qdRraxUW%93 zhk(E!Ht~eRy(Lq{RIWG%>cjI*qr}jLIE(v2z0hnFqSV3Tu8&1l=Wd2;OKF!Lp^@Qs z_eD>yqZ>}CCha2)Efm~Zt@+_--sqOFAL(UjG{@!AA~uf(!rP8O;bDx{H*V{Ov!Woa5~7msA>HH~-@mZOqew@rPIE%^xViQjMBi@X`?NF_tie}Uqk*`y!qje>cM=`l9gNy~j-PPIyTctUc zz8*HJC1(K}sgSb(F+KOsK* zPt(pDWga$@Cl}k}KiSx?F3(5k8rW~g@IZ7huEmeo>ptwk8k2iYI=r*bzIAF5+7S-s z50@W&CZ6}FUxwL)-^2UcRKfsJAc z6oOD=P%7_0@h9lwCSvOwJj| zUy3_Tsj-S)HrNbpp#nlbWB;Oxg?J{w?I9>4_+AvFm%(pmF%JmF5h2A!+=HtOP1ZNn zuS{u?YM?e??>^N!jUX*KFD06Nv_iMBJZI=FonUktUZ-ItDjPbxZB~jW5O^Knm3TtGnQ(Ry3X*&_n%XDUkpC z*FT5VPwV=Ju;6d&J2yOQ)$M1k3QtW>@~paa^2PMKo&480P(^qSir`WCoD{w3{+2Hy zE)aRcR|djIeagLy4`0^V3>arCKrcKOLmEqAr+Yiu1Lg+mQei1GP`ono@=YV~(`(mX z^7t6YCHf|8cxna_5F@+_S6GsHS%2?@y+jM%w|5E-iKmqvHV_g#SmFE>7JiJQK9=Su zCW-@nDu@Zc3kz=xb4cngXD;HvEqU~;lW?~iV*AtboB;2XwB42vK;~Z@l*PvzN zlHB|K0Kp4zeok44Ojs9ZAvpFD44qhpL*}BDSH19mXnV6JWwCB+`CvP*3XqtmJp@&*+;{_+0LVud z#H)sMsl#zi0dTGhyQkxmU(iOdKwG-Mg0#RO(mEP}h-?wtB=mpFT zsWRQ~LGg~B!`Vc3Pm8|wod?OY<=49S@S*#aes3Se>d=*4ItxxOYPB^8?;aQ-;Mg9 z?*BX_yf>NQgZ|-c{b2|3AS%7;&B{4%2`$sMR(mN)v-c*d90nZi)ZKskRz6)z$A#&@>@`#)^0OA&@1(d~b#b3eu_$HeE0O!9P zi~B!pXJBez(=9=odqAtxn@d(BWKz16Yfbsu+AS_2r06P3yl~XDiub#}f3Qv`J><2q&o*fN1Mm^>?I+a6|U zz_;sgw>v^WDOeB~`4*gM7n-f%L7_&)QVofi_42862``kA;I&|ST@gS#TGk--7JTh` zW7!J?{63$DD>AY;aY$UJz2)Mz$E}XFV3!UtFzNO1cY3f`2vCwytMB(7MAJ_k<>gC} zY$zOjSP;CXDZ6vx($DK~%8=s%)NU1|40c|fL%TZ%Yq65fz*a=33e}+DKOAR3_W69* zosw;ps(b-i;Vy zSksz#dJ!y6(W3Pxx`#9=Z(mQSkTI{2QzFO?|8(s8Rwh_QHKw<}6bgSI0ti1PW61VA zIw#E9L9Wa1K30?YlOfPR^Z7N!{76HBF{beDL-;5K82EuN+#XCQ{SU?e`{oVpuSg22 z_?7zhxj}!lwP5RjsH~T10l+9~^=41}`L;hko3EKFJQ?sLsLTKO+5A*4Am1P5el8bg zU6e9PC6p{Co>>V7TWvqD)4jS%v^eTc<FK_W7qRzdtZ44zl(0Zy)z?wxac1Gq6`~1vYn9fY1Xc*j{Lf^n7+hf>U zcaV^+tcH$Ib_K+KpF=6$1l3Uj0>J|%?A9r{=UnrZtkF^t@ z?@e$j@T=3YDegQFMQjx+;2w}}@m&1VfQQ0yr-x5#FJPvSYXLo$^gQTzm|EMZglC0fxX%|z%v`Py z6yqjoeNX*U2+p<^4hCWbmgy%2U36=xnpvzCugQ%f!n`=&#zJu8A>F-L6U#=7%^D|X##1%v%9&0%&cf!5 zu-aDAtfM&O&_&?&O&nJ8Y1}}nJIiXgCZg+@45NoL1{vjH zEr#{g=YX}1RXD%B3KpP*{hP~pvUn3m>(Y4#31kO6*4q#}$n=$e*!j|i5|FFc1ljFQ z!~=*>pEqEVL60DO=8N$lG^_G1+(EnC25M$+0X9?5-ADpKaKtGjL!Z(6?YjflO;a%`n^eU2FPGymZp_d|e*x z2_ns|TvZd9wPt2y{ZN~@XXg=no=6>xkVDEpKtKUy?0RRN^97*Cl*jWsFh2}c$H-NG zX)tuyzDzygRpF$f_kn~_PC|%qVzCd+3NAouRZZS{POn$T-8q#2sFKlp|r~v&rS?8q3``VAGq}qT#Q5m88?py;?1$})Q_sX2)3rm_pn^C z4CQZjQwqD5x-?)~wSO>v8n#D>xQ9_Q!pZgap=#uG z(2k1Ut7OpK1VaEa`YrS;e|4cRH98o07RD=Hf69ak>TrXl`cc)GUfqUcRm2bFV6Pq# z!sUFq4_3QOUE+ul&xh#ryo3J=&3#}5KRGJi^$b-&zic;WswVD^A9>xsU~Zwb0L<;T?|(npNB$Xe`{9p#DQe63!@=;bsC|pL zwE@(-IM8XXLPf}D9?Du`c z8|H0A;p@O%Ej2$qHn3?R3+JQh?lTb}^ z>7EPuHdjW^VY_JtniIN9DKSnN$T`iyZt^(Sc$7cqnLJZ@$iVuHnA53lJgxwUp`=M@nDHS{YO#GKN4W%*;XxomwA#GUne zk4?Lf;H-%=yA8Qg=tWQS8D*8yvVTH3YaMyU>-Z?Xf*V%DYtfPe9AparJDPQnj{l6b%_jy4&ohs|ZnPQiupu zJ3|%+8vC?m9Uwgw>jGyllnz{A-M+Cj<1nor>}=G2*LQbwXETm`F*7_Ik}0*EyGdYoH_wzq)JKjz>oPa{aRwzj5Fh6B*x^wfKJd8XyMe8Ix4d;Q1O z?EMl>_w;KC{b&Ed-&(T}ItB~m^hGTgE64Cr~f(Fpxut2X0J+W3{-yr)u%&@XIC)baW6K~FJ$P|O+2e9Vh88SF=pc$4t z0qxpPJnncDl@9b$usHg8B3>@Z1~^x6mG&u%knvpU;vpzSckCEfMES2KLq~26WuNv{iuU%az&;CTlki{?kD3xkJVTFbp|*7UH5 z@nHi(QsWeW7)y(8wox~ddL*6!z-DeK1V^!E#tfWd9xSIc4n?%OhZ|E=kB2V49B3oW zaVio0F$AkLB)K}KHY5zWmmc-{vCS}zeKwfhLPd~?F#?5IoVE3JdzAdxbJP|ScDvhR z$u+G$+()w6-S&<B5qGL(I#iUO81R^!HTVQT_2H3^ucrCg3x0+FDPFI6${)gG&#|;cZv1i4It@ z18G@)%7z}Dq7dY>${P?SuKWyJk?D;P-tx=fNKqTW=(9UE^FtmztWA03v79Oceo;czi+|YMMCxotaAfI2 zpV`4kSURV~Sth{=_>47(RkFCfZX-Ip4{o z9eH)9TtwNf)SSEdPd0#-{z{pwoe{&kK2|*3mgX_ZqLjZrNs;Z7bFlGOHDPRX(5wKj z#Fda`w@}Jj$5~uhWgUOZos2y!+@qVB1RzbZW{p=y2R@7&D&b$uzixUf-X?SJc@>-g zfOZn<_pc4%4^Z6K0FV5`0PnM${^$SxbuU3*`m5dJTd}R)%%%vaElg=-w^SE#*!|wh z22jJ_$*V!JZEhgK=%(21q`lY0 zCw}2u|9Q0B^EBk=M`(M`c>jL0A#24UP7L0F06IH1dXE3`R& znZNrbUpX8LP!uu0o;&~f-QM!IY>xLSCHR+KnS!q&<*V!X;oSHbQvR~TB^qb4WwXzCp9&# z^pE5OaHKc`JE&o6nOqRr8BE#dHRZsq*QwrlTl1z(?)TsV+% zbP$tx)VC62+KG4oV2Tv$;j&>4D89KT78cpn4ICg_aiV}`vG2iPQpY}-86u;tj7MtF zq>2JSxLG6g?S|^wE-zNYrT}08wq2goNK-co!>+axNG7CYZ;Y!5oj)K}t!`{*&BWSe z_y&3;s#I`b-g=R(cIXYsu0SjdA65o!Eb(USx^!A~khX>A7~P~cK9dvNq&k1FH}5(PjMwtPw(zS0aB zfT01DZzh zg`D9+S=dXp&&8f)I%zXDWOg`&ta#12`S!oQojQ1AQFJ_g$ZExJ;byVuvukDS~Sq(z>ye`Dp zY|TOH=OsXYQ!zoht^B)Q(hn-dPZ0cPKM5GUPZ%>lK?waq^ZqFDtKQ=P1NTFt^^&%{ z$%@5We3PjRq};e)S+wP`7+yXu5y$dt(;Rc>te@m_ zE(TGC%ZnVgledR+|7_`XdD_oc6gb@yA_^gW7;IysFyn^W=2ORet!S7QYVD;lYF4$L z2K|h8l34Dz&+S3qkgJRb;40ZP=YsJJyTc|B{KB02m zgcbULOpX0@RGrN%u}cV@_ON3?SgFFWHW*WySYeZ^q&C44t>D%Y^0<9k`81{hdNP1~ zz}j!=J8@z|bku-#6P})1xF66TDlc6WBdg zhY1J}4r5vm1TdwLDHmHYX|6aHQVOHV$Z$YdG$#!5wujxRT5rzXcutg<(pNGplx%N+ z!swI^her-xml-h1Qv5hc8B#~{UUrQeDHO#6i@RI5?OKRY1OOLACvoH2Yjgl%9LiK{ zn&)^>OLKQPsf2xS&K>R7(k-|;Wsvz|79fq{2nnG6f~Rh=(8b?|+f%mUCyGl}>)3zd z1)iEvB}M=<+uUW?g->fk2SK?Qh)iYG`%*soK%x&x5IAk*yYzU7B<7urw&&1ba)~3T zL!!y{R!X3>WIwArOC_z#NeYMod@=0^l(1dN|6_CNeTDs&uKLS?)1p6 zTyz@Dhucb}7+r?`THpP)A;ld3*Q+exqR*ciLSFb-11&~EVEZrLvN=9%fgff0Ta<=U z%J1>tB}k-71_BbZ zZnAu}Rk{)e2!dHUK$WEU=F+c*jA?9$WnbKuWPU0yC=xq0u8S3ha7~{uHbPYKop3!9Jmg*tsg=f z6h_^&m96Ah=22k@3Eqai8-&Gaz_WH{Hf8S|uyZpy$!br!r`v(OrUPa5XLKnFEbaFHhv?EH1zFVxCc73KjuIsOScZ#qs~6B9E8J(0gK<}0!gt7F zfap?B{5}%l62tdo+<=-khE-t;BB0S*J1+R`3eo&_yI+MY9H1C=r`--m!{s3V z!@G9;`AVKw%~_MsQVT|7Z?K_Ni&L}%m;lG5i_@Q@4stPFs0hpK4iFQ#4NdA4VYkZ58IFmm_ELzG__?kOf71s0ez1J%GUIYgB=B@|W%)c#@g? z=dpl^%HKJj;oH~bm0amgDW<0_t+70JPcA%ISP!0{oVsNd2T zUxQcEKq=KmP5n*M&3`3j%!h@pK9_Ils_M2w@iw@1em8H0hzTefUg5pp5JnKe_lb;q z2hu`X5)4~k|9%WyWs&)QlYu2&GD2vA<)X9)?Mu$@{(`L z)3S$zaJD$QY;d~|yVgyoL=fgB#n`KZG3&mOaj_Q@U}$iUFP8RMw$Nx@>4q z6EaKU;*9hK0yX?cS?#66wmcj*&wLJjVBPNxa&Wy}`cMzj3KQj8}Ddkxf(xF@swNNjbF*fg3v5_hdQ zw4?YCT&~dgQt!{!fdhH*cAydLC@#Hq28ZCPkzfV^@5QN8`$5wv*I^AIa6((<_xCc~ zh!|vEpzZF+cmhBSRf+W5fWM)<4dm$N2=SM<(@;}i-XBqebiC7#4S3_^Y2IlDqmH^Y z>E32LIU*tQz4IX4=ZC%sh@GG`|BYb!T`$cX-b#3L&%ccXxNWW<>FuSwd|7*5IX!O) z@*Z_XB3!+^ePL1D`!z@X@=^JI=nwaOM!!4YzJ;v7NI>t3v|jtb{Ef-`rg%ta*$4i( z1gJtNAJ&I{^xAt$xfv^1LDsljDhw32RjwP&Jmn|e&XYOXvpS-QyxcQe(B0Fc%u>+B zkYbDX_WL+WA5Cym_BnlmEydOV3mmWHO5ZP&5VeqXUO&{F(A0e&QmC~k@ftDbL}>?E ztn$Xg*Th=qA>afn3pd~IwLKqSmvf*A$6+^=!>MGniu2F|L!DBw0pXlXEC(0nI}G5} zKnEv_8NVCrlZ#8}wFxMluz)|6wPd(}{mTj5J_uJN9p6a(Mw*KgkVyjiq7_SMwLoa3 z!W{G2R$L~!s>o^|3&}(Gt#$)g*|eMsz8znV6LTk}C(`%rV$k4>5g4D!+20d6)bu{J zx9fi_uBiBwVuc$_XuG z0sLlnV2baTPw?}+G3&krxv;qVcI~1GbU(r;1Bl}pX1Fl_ZIs+*N#%4^9?%V+PVdVo z=vR`j{xkyS^%3wMAF)S2uKLikXFmJT-(pgswO+zv`h9EtqlO2E-zVDR$EW;1dBy-8 z{ryw^H_!O9#z$DI7k`OI{ech4T}NqaDdI-NW#Y!}VDo*@O?BU;tE{!qWm@7LC|q~* zjFg&}-HSu6S5&g(%{m7=U0n%=ScHd7;$F^X6Z850&h`iHY-Wafkn?S$>l!pjc zcA&*W%YVm%XnL%()f$9tjM$5qosXw2}l6G;HtLczyb`_r1 zq=68pUOws2#bk=9hQ1~Dn39KFt}hrJL%2mra7TLF(kF9YatcHO2FsDQ=lGHub9YwB z6chmL-HLigrPhcjI>R$NK!Vj(S~v5H6}lY6Hf6F{fI_k7hXG_-(&<)|b~YT*pyTWF zGCdB$`sC5;+ff6*Nf0d?={_RUF_rgV7aSmYD>=ak@+iL%~ z`VcbahHMV+*z=!?doKmD%W4!yW^ZDN_>+h@k-xhcNCkMtKvQJs&@?Dw#eG~b; z0B;op>Z)i*hXXe#g%awZ%Xl(gAG9kcV1RWAba*!}pi_r}Hz0l^+H)FQ(H1LAkF% zYYCK+@-bCUm?Ar zbhzu9z>2%lF%iT^XnwiVQs++HuXe3#Cv1ZhsQL<_w$~g)J<+0lzv%D_`D}ciF9{b9 z&=yK{u_UbB9?;RmLwyt-dCUk799hYE!cG>Xw%+!q{m$Ma(ZRh)Rd!}%{+VM3l5Ev- z*<~l67);`ZrCT_2>;m_BJXr%@pE|45>wGyrn6u}OzUAW2F0KjU!JP^QIigan31Mah z_aPbk<2j3&)ED-XuhL9L&TC^@!*nHw1icEzrXwBGf=;Z70hLDYdRTcWU|XlT`nFT# za81D(46du+lcOO~=>?7g#?vbSemeE^(6YUF1P*;7(Od9ll&{4eiN$+&YTiFWK`lIA zqsq5n%T2Px(gC74-+Sf10{dS00Q8+sl^Y(z7&TIvR|901mx`3u8>R{FhOt5$rUCzf{ZE(j-^aDqU+*-qL1MZ+p?#A78)JolN5oC_mt2$XN4iJ)IS^Qqy__!0)q`#j?nj zZO70AkN`=ANQZVZnc-@3xXSP zqmuq8-AdyYPBXehN3dngby%ONlkThL5r|okuLyy7gmJP)N9ddrvuz*3;c!6i&uYX) zbk4H#zBOs-vL{9_nO2_q&-{Up?iSCo-yLP(Wb>~MGk@Fa*y7dY%D?3uNN74jo;@84 zjAPScTH{)9Ea@Ydf&0s~)F3pMqap16=L;SAzv^(oLI7B~f9P<%rf8oXF8N!BOE6I7 zr`+)O2=FiQ&9_5OJ}C=~iN8PeEN~k@^uC>Wetn6rSBQMW7XHthc(0fEdWA5!_zx=<&z1?fRWmpr|j)F|zro0RUJccRSJJ6A*m8X~`YuFi~7gzA|R zj~B?pi;h111gLYJE!d3T4Ehs*LEzQh`kmm`B)d2v8-qjqh{L>j4(5O;gpYNHdAbPjy7hmfAwyK@}=_Nuv zDMOd#|K=sWULo>-^%7q-(Vr95erik)m$iwCCqY?8nvp|!pcbOgGYA;ev$VxS3j{)l z-QN`HRA08w^sv819jHEL%*3@*ysmHIy>yhs0lUBT3}}45=Of;UeWCB)f^N+0nB*kkhdXpUUa7A)AICt?OU}q zor}X)1iO>O-T3IBsz)pQ&euH%w6fhZ!9+t76CElEp8fH%b&AQzTFr3 z&7FVkC%zat(068%382OuXn`>L(S1-YYjZz%lz^<+04BNZ0^-Fc_Xk3_S;d z=KH4^a=T!x!0ZA^*Sf>?L_&9&g^(?rV#u(+K)!6aZeg6Aw|c1V_cX^N(B}N?7g)s;Eg%pKS{WX`nL(hS; zpTq!fBM%OxUSadM1sohomyce>tG0mpin>Q<_W@3v3rr8+3al^uKFrVOk41X};*bfh z?bqVHDDR|*pKk*Z>^BMCn|BI=+rA6kY;8$Up{k=)84?KJBzOYA$zezuouSf0_YV-f zJ0?raP@e)UKy?{`!IRdWK40z}#sV^0&hBOM*RFY^{vTQpwvDW;vvbp`a? z)5_|@$pQ>^UlVnqA#2x#9@^>}8#|4GBsZf4ZIliC5n^-!1E+7U^+8X9D|8ScF8+x@ zWHuzgLwLoxgC;}5-vjQ-boiq+tTWrqRplb#%I0M=Rx;Y#+M?XDWrC1P|-37EQ#DWBorm?PT>5)gRr|fp~1XpCAT^L-B z09F!|*{l*8WLwF0q|p-0)ppDgmJzamhv=gC^l(@+ywPXOCXguY4hx2Xvu{1t!vWk* zKIUEzy&|mHejOFMy;`28s4LELZqVxo@!*}7`U3!!bB_q+;G<5Ztag0fz@cnxB!l2~!k z19P&LgFFL){FL4friPgh5hnZNzAhC@zFshIeW{v#b-w0D_0}Bk8^RT4fUZUS;TDbO zfMhmla6IB6kZxxiH3mr0gKlX?Do5n+G>DiXqR@5Os>iQ6NF^y90V>{kTXgxurZ(`L9HLql2dr>G7&5J<0f=alyl8&i&fUTM^c(%ch>MdY#{ z$;mz_hbasXYi^(KZ$^0-4i~z8-kL(z?|_&^-`BO@&+9Z9s;K{XvXvgw=cicit-&kO zfYABdqWRY)bN~8i-|MgWoMB_nd2QY#z%yi-WE}-N12O1tmQf&_|7^s05p^IX_U$0@ zBIz?&a)4#=6r8W$sX7Kwb$~`#s(_%Mv?H-4S`W+kxE%654m7uFOk zPUhuvDTV(Bk+J%cI()fAp@_~t?++0*cHrDAfa8A?i9ES7!(_jb^>eg zqH^Y27!?%EpSOW^9>xT+_$AJJbzLFp;_xE-eF;$Dj0&^Fk4Ln>r3Aw(uwW;cQt%oD z_ytJfm-1-AVh^GoxPT$9@Y7>7SGwh@j%hI>)b)=*eAiCP{OkWg-Hp3f1!z-;&spY7 zect~JKUZ0}OCrA}SS8TrgvI+`s5+kLY5|2Zg{b!pi8@su&J0K@79jhc#1(gBj*jNq z2T;*IdDl#K<&&9B*L^&$t9-M5-f!E)?#JSm^a6jw@QCx>IY;QB#Fpj&*o*RM*N$8d z_%*yV3?1E}(+>S1_KM1uk-c6f7JO`P^*U7Uzgg`KX!|IUY{#gO2Y6wx^57gftvkWBeiY{Ib z)EFRZKpPhaF(>%FG_V(tVdhbVS{h)xasl5p$Hz+74B!LFC*NSq!>Q?Dpp~r%+*T&H zf>zvg>99LRFdGv&wPG|;7l`S?J#jlvgXudgbaL0%loa~Bc z_Yt!>h-P%C$lR}6_KD*&QzwbyN;5>`aNEhjmj#W40txU2 zy^D&=QL9x*D%5i6BJ!hWip8R5m7U1eVs>zt&e=^4Pmf69WPX1Xq0Agky`wfDL1%xU0e z2U!xZlOUgNp6~S(iYq2ZbGyaQqK+mhYd5EtybN zg5?}$8Xw!x>HBB*s@{RZnt!%d5z)aq&`OOjxvVTYcW2YRf)QYb`Hc(kIcNKuAOnhM z?*61XH$MY#hi0TjeejbdfCKA&330 zY8Nk>&mxj+UeSFZ0>1eTwt-&1qwKf$W;m?~a*ub7MLgK$c_IS$ygDh6rRiL@`uR-u zJ>5Juukj9CI1O1tb*dt5pQw;2yUzQkFh6+x%BMj^cXQk+{WFZ{v79{{P+f<$aJy$` zYR%D*qI?p!WU!(Gi47w@mCkqDjLH}>%=MwzNS@2sB}9D?`fi5;y*Z*neZYbPN;Jl_ zo1}`gN)ioT`VN(Pz8jw-){N-^0QVFEvfdviV>(}W>`|{gbYB-WYi=y;4 zUt<=n*nI#0W=S5$G2hu!m&PIJ~&-pmH|g3n|MvC!{g&7L z-|y$s(ZnlgYtJdili>FXK7*KaQkz7O|#})$0et*DsLd*Guncu6^C!zMc{MqUrVZX@a@06w}GXY-pB%pQnLmt{!#OG#m;uXpgob_8g>lfO^wSsdnLbv-(oClibCE@M`;NmX` zFm!*DF$ataS%iFPFr=A0Y(4~ZxgQKKRu2$_)9~!R`^b6MWMQE8R-pF&2u|df?)z=* zYsZ=()#Gy}3_I7i{bHKbua`V%AX&NCh*y4h2f%%OzoA&*Ab<_U{J?I!~zBX>Oez4|JXpWYO{H$Zw1TH`@1Q)1Jd?!ZFXE zx>~Yp^CoyP-l7A3c~k+WH1As&`2D~8i$i!R8bGf|;Ardp`+&#C-*+{zO~bbKI#R&l z<>TxEAwAV^-#^&#-!7Hc{qqY?FQ>8@VeTvfwss?i6(X^d4zX)LI0WY{b4bkKa#4rb zB5Z4KC-haLw2cmH$FIf9``}$wY@`u`(zABQvqVGgj<$Cr@Py>a5EPj<*+brgHQ%hv zX;cm&>W$yjLcZ%Wnf-c$$Gi8d?Y2-x3j z#@0l7k$P~=($BW@hje%6t~eOwbNtXOxi(0E?mNv%6j6n{4w3yfCz{0(S%oO7Xs2S? zbLCMa8B+7M_uLw&a+O!D@7Y}&%oHK-tcdo~tMXS={G9W}SbmWZ#6tc@usWu79gjxmTS^f2&gu zw7!dp2{?mJx&Cy(f9h2kFu;RV>8FneOyo>BIK#^Q2Cd`hiVwl|ka`pvLRj9n7(WH< z{Q!n)UYVmLh=$)B&#%_%6O0-d904bAH^1_xUYw>MZk*Kb`mHau+FL&0+pzf6I)#1% zj1GV#Kt>z0iCRh3voa+HrEI0}tpPE~@0zIq(wir(KVnHNM`Ng5;-S z0mfazV5O^nAj7AqU*?nOUB|s2c~=lW-3yA^6l$?DnO!9>({4y3e;^n06w^5rgikOZ z&&@M8VqH7X0Xj>o3-nV_mq?{9Qgd+ukN}9Q#$%2iYnN{TkTA@*r)+vfsdeO2cAYtz z7A6~9aONRx-uo<^|Ig$+Zuqji7+}EY!)>#jWn!wI)Y^D%DgqrZGjVnf(UKEIiQ)#f z0owFQIi19QU6y-?_pdp^H8D^&afg+&&B5HcLrv2=ao-r*n4&s%ps%0|V06wfE9I3FzbzwDWoAU+*hkw4(v?iT8{6!!Zx! z#n)UJuHt`t5$E}pUf&nE64wXB(qS;Gm_yK3168yW~Awg`7`ifL*oa+lU(bOXO}V2lRRTSdPbg zH*S}gyZ9tMmtlp-^%#P{Y>i0}0bp|%K&a88Kj|1;jrqdtYN3g)f0>DK>Ek|ta```YTBX;v{%i&O=TGq|uaVeaSJ~#pR%)SUhQc4} zcjoZh_AQhlKgN(ko)sS}44flg&DRTTs;1~-iKK!n4Z`(AcL=;YWEL3cRf;uJLnt*Zw|0OX&lM2JwU8F?4+o32VFw8* z7uHbMdb{i4V(cw(JH_?A1x@19X;!dVm}@EDK4czlLwPME8ijat z?I3aW-D~};n97)^%{6+Au8qxEUYy&zfKSKa`A9(Z_9nnZUfHeRMYqDa?6=;GKd!8m zXa+aCx{}Z4hVW}LoM3hgTzvijqOoMp<&{DYDaGA=r(ls!(}_z zcW1j?flEe&Wj^kuMF+0^u>ixo}LKn(Qcdpj% zR^eBV2JaN>`OsQgFZBo8Vd?=8O=Wpa#lRDRzCKLaiZZ^8RaFxDQ7AaU1~!j#IWr{163}%5)yQdH5yjZ7W`O*w4~yGr z33!UA(gRxHjS#__VKSxam)K>eQ(hjKqE>j|+fm*6LY`@%o`}*VYX@O#e5-j%d+AOK zp!NI}CFzVCz&7!@5dMB_#y%tPKfD2?#j1_M>TPNLs#JfJ7W{QZg-mEzQNM;{Cx(9e z2U5Mg{^a~NlWYPm6U485a7ZtTZfvUJjpqCgE_sK?eMhB(gH*t!9wf#zA5(lj8KB;| zL?7X)->5zE{0f(N=Zn5$d)@+6-x4QYT1^4yb-#J^m$ms%4-V0;e|hwOF-1aF3Uta$ z(+Dp5datVF4j?4=`6iX^dFC4pX!NatL)RS)NMW*&X68othShLP1GK`4-`I(J;OZR~ zwwZ^ZEhH!Hqhh^;SuJ{?k>82O+KRA%wwBotDGrWrY_ZzXI|5)WawXzgW%I^a!;2G4 z)3h3YN)R?R@xcj_=iLLycf{h(pk)X!n_>4@YpMPa@AZB|@$`wR52kV3fRs-%Qcp)W zc(^O{JB)=pyS#0#S%kSLxt5Ct*;8?!=u+$T@~*+y7qCT8A#9wgMa3D?}_$mrD;n|H#e4(56h2m<^u?bGOj` z*>alhbBY8LY3LF_eDQCWqd!>1ew13_tTd?U03$R0DMFJbUAFhf#R4wSLa*PuDXxpX6G)YY+s6pP24804S1{pgvrV9P^hzeA zg_AF*6Cmb}Q*O&J2B>y=k8g$3nK}RNIQVWeW4ztemaSlFNClZQE4hIXMagL)PL^W! zcE3x@i+ky&lD*@M2hsuk0AX6;N>WO%hc!3TDY+ap)QEU|36yxUG%}(KgjCMUsXqtu zN+axRn|C-gr}y-fg-Mz*Ns*K=(sE z&3ool`X;lok@JQ>$Tx8RKH8W@w}}X-$rZtGcEWDYUcDQ(iqCGs=G&T$IshP-!q9=` zFc%K!y+WVeb@mcJHkdP7dWd(zJRss~e4Jm1lVV=Ia|CfkvZj#k`$G8p6*bk5@<)C8 zJ|50Kvo(?VQOfs@3yT>+cI?#kSc`{uVO32vTx z8{DT%-t`3E-3FCw0xW*w$F@dgo?ku5kCx;ST9RBS!RQ~qYFTHaU4(8SN; z-Mld!I^X4nz7(bOtTxtxHRW15?2fp3ERf1x!Y#O^*dud=SZel;p2uo!1H3tf^eu<= zB;5CSkm)L$GZ(bB0!$1)s{l)!5ChpR)WnL*1zdn!F(SP-6V91ELQ)^+Ski_Eo!_O} zRhELEVeo<3Ofv*oaGSwGySsvY^QK%5q+zi4>s8zJ&|pzT1%gR+wLBvjetT$3Ssp3t z%-yaLEQp6}iTl+#Ar{QOduW)nkeGILbOx*LnQ-c}u0^jV3K+JHOblf(sOwdLx~PVD zMt=*lj2?1RNGk(SoTN?N&JB^}`*xA6J|ixWC@z5B9>nFbSTPpk#(qQ6qAu(qv^z;x z*81Ui61GBkTbqqBDI%uymZ@s>h8ids@A*Am`P6Xe=6zwn3@;+9gXpT>x2_e&@k`5Ob@&h7yRk%#u9tWV; zCG{EChL!GLz}z&o?PA`nd?qgQ^SMUGk-CJZq!D*_0x+jqusUBSf4hmB0})E9@R- zd~m1+c;`22D6}c*SY*5ywn!RAWMG|AP7=aa0gPhr1a~--qM$R~1;X5Zr$>DY@8oGV z(x49yXy?v7JTj4aj1?}k8g{@L6v4zkPz7=T17XmtkM&>~k}0Xf+1d>gELkfCQn6CRDk;2yB} zL9quX+I8M#n{Bz-t{&69w+ctYq6Dq@7i*AW8Ba+t83i|ZbW@e2ta%+#&ks;qR2_>S za)YJua=YHC58}@9ZSpv+qVo&rW|Wq`+u~(S(2mZy0v-FDDtw(WXB|- z4qeiN=tM8DeFF&5BSa6g_=ivfs0q~Vv6@%Cl81YEct(@^KfBT_Ga?lpuEwR0w^{31 zo^UVY#m0p|tKi^oQV*I8=eVd5Rxb9tE*JJWDNrbDa2?;WAwK}KL%*ndl-Oe~q*OwD z4}rgyLE74x#2uA3JjfxC@ziRCMk~Q?VAHkQRZ|QEy@Ion)uwkW zI#+0Duclzw35*OWS=1r%^-R{6sk*=UX(e1o^bthEg3v}JlAKV^Ko6EN0bGOcuwaJO zaZc|xJICH9+f+MO6*^Pe0-f0ka@_AI6qkCqu`+eoZ?4;HlLB9gJ1FUdH0Qm}#g4%C zvx_aGvTX_oJJcHYL@bXm>$Z=Z+J49EJ@NoFOH8h)>7;Cu(kK)P zAxN5cx4_lOO4VMXISXLK2f7$5isxHqfpql3L{?2V_clhmk!1&h~Z2mPKgMW=% z^j{;n{ntpW3|#oj1d=lSmjE}x9}|0Ek-QZYnfDi$%thG#rF(B*e*}E+1m6b!s=xl% zxQDNQ`+f8N8$gxo-@Xx9zyGHAYx9dv@5jFH|F{49W1+)5M|8^%Hz5Igi@(nhp2d*< zH40vX(J@45y=iPXgu;)I%5&PguL#2SxihP&AY@^JLD&u)Cj<&^H9+g-!xaL+eYC0|^>~5+1weo5 zV^FN)r^XS)>eW?JumB)CuRAg=Q8mqPUMSfDmQf?ISsVKoGlD7O1Uk^dv)ee>yrlIq zlx7g_Syd9W0s7l+h@xo59Cjl)iiD|}O=P`&(+JTq1$`1@-s?FJ3PPRD_r7hxbx)2V z&7^TICEeI(y1Br=&)1eY!)pi}P8P_p^Ed72{A|KgxGoqHY?fZd-cy$Z=136uf4l7| zs1UvcPg)E>&M5q~vj+c|M6Is5Q&u_heC|4kNgUg1z^cJPxb@pK77h-0@i7?WRiSM{ zoM;XdgEc6phUi+nhO@O_yuH5g%!r`i7^K`7@bFJ9RFLBJa#}xMI}xhMPp`?SQv~~M z%PXDN7EnOs=e&XOS*w1vZbe={-zFd~ZNVu(zyxyaAxiFVZxhYlfk7f)4TlkyPs8($ zEC4VAk^EB;J`A3YGA(k|Kfn0Q4BNYor`N#j2gPmyx;yZbzdb5RQZ0ijX_0OijnJoW z-xQwFaByq*VdWqSfE6D+On92Scd1$z!q-idgALXghk-si7`)Hm-{)&W^X_ z2aA}pE|fjTmq3iy2&mOH21vE+I`+K6)DL7Gnw)*;#YXbG$3zqY1$7$yj?^v*@46?;N>^Ntda{PV(;e+>Ab8h3Wi`v9IKD1Vbssw`>d+38a`TLdRfs7(9Pec)v(I2F0nU!y zyxB2C>$E8RgrHQj>p(P+=_sn|O)BIJ;>YblI&>FJovy{;q?@poB42sHXQk(OB?1A5 zMi6e9oEMOKCIF^B2th5owDc{lH?b2Vu#t)*@f3m<-Y65waWb;blq%B!;!mlx4!)MV zxD8xSN|QJUhNisiz?(Bc2H?tD@RSDT8nJ5KJK~diUtz_LC!8!AT-VlnZg@MTMg`UkNrfz5E^h!^1->t zphc45$_2kt{EG%+IjHyE+HI7f&y8?nbeHP4K;MF$AE*`hmv<^;@G zG$<(0dd&oRJ*XOY3>$6Bx*MJXXO%{txi&ep@} zVr22QXIvDL#8G9hEKYN*0cvj*MA}IXgk(YE=H&)nVx(iP)*(O-W+Mz-nUaR#-X}U#&K!MX8>n%SVsPMaQ3z1+M|4$SM=Pe5H5j_@e zx&ZjM+lDIJjDz=U1KWmgXCGXxxFsz3pU_?Q*Yi@`V#}?O)a9Mn%i?JkCiTQk{FTXK zABdx^2;L{&Le>Dmq{yO?$8B)qTs^-&K&qs~!sVJzhH!n5JNtnW=p1{i^m5z|vhA9V zyu7pp7(-(902$Acl7B=fZz>mymjmhQVd6~;@%rWRT!a6ElH&gs| z>50JC30ir##%|WuxA@a=U!a(woG&Ph>`~xC_s2@jgbRp<3|FtWqm#iZ=)lrV z=mAFMU@p;YFTz`!FCsSZ4|uI zq-1~qDx)1A-LHXlThbj18Lc{p^|vJ(v!Wf7J3Vp|d@6|ztSJ^tgOBgO8<)}q`xgyM z{kFcB$^WRu`46@-e>zW@-Sa%fKKc^g5RS7NPs$bloB8t@?g&ate0=T*-j7FdWs%xM zFhIKcR6s(R_D`#{7iQ~CnJG}flTx!FLSE%Av<#jNJqUc`_fi+`Wb*V^i}9`WgSHpE zRy<92qr2_Cocg8-hX%q7tEc03`@AQK0&M}6Kc}=$2N>L@!fk+MhudJkf=fm;$ZxF{ zptg>$NAup`Jo_8u-)bWu6HuZ)3i?hnPuyEORx%*BY5_|5y%+PKjS8U7epdJIy~($y zONfmff}r%nwecdVF;BSx4;!HsFu5P>hkp|k;LjWxl6qku`Dca^_=2eJ&TH|Csvd5P zPbfuiZ~G9kVbFMc>n_(rJmy^lduxv}4*moSh?DKda#X3Tw#^~;-3o43RMwUgc0>=^ z^6|*lyG^McL9N*)++#l}<}xXki*2D%tnLx!y`J&8!wl3%qN2!*bK(JzJAp0A{<0G> zmJEc4P|=HI+qCDFEux5uHbR{!+9PPn+|`bq5G}6FB0B8wu?ySkvb^4EBy`#k)Yrx} zY8$+=)4VgpYtCuH360r)r0>~A3Sopv8R(K(VM)SJ$GY~Lj3ESjx3E;N7O2BX0K1Y4 zR0tUoI{Iy}Iz0eAh&JlIV6Lc(UBsb`F-7FO-W0#8}8U-Ko zpx(t`L`$&~;_UJ`=z@oPD)mmu*V}S}SNrZg8reoi(mV6A-j zR*G19M{tm6iPPPoubca0vmX-`;F>2Md1Rd|0LIhW(dv=C-x+(yUAJ0bUi2FqmIYTx zFjbUb2rWBorXME^K2~iA%25mwB*H|UPPc#=~k)M6>&jraa9zJzWk)sQ2ic(M@H^v1=&fpwkrp+0zN;xul$ya(5XYO#- z-liKP>=+h8bcX2ciHGK>Lf}~sY0eJ=@yWvBz2w03N=4_#RqKQfR++_SHu@x2v;-vn zxgafXq_|yg6Ih>5He@O5GArD0VrN?BsT{L4MBy|hq8Te8k3EGJ*h_J}7!rSxHnldj zhe?3<0%WOgf>u$N0t@RpI zR~kwmApE88GjWL@c-{c;w;d#tVcd@o;ksbXvLtT>9$-$RC9c9vwQC@tm_rkKY!UR4 z5!zPHPAIQNFl~X90E(OSYI3Gj&rIiksw*hvIm=8w42mq62NA66<-j8+^P#kGCJ00a3S8>G(nU~{ z)<(8S&6;;(m8~KRjm?-wF)vq1;Al?@jlxjPHR8CBbYs$AB6A%6A&Z|K8%yaxs z56oe6vHC5oh-z0>;^Mg70Bafd>?utF=Wa`Vy<}u983j2Yb@rxGhgP;aF zp>Nq%!Ium_g_K~>n(O{~yz#!>WCBMXiTW;=+0Wk0Pss}OY4~CV>P0cVU<>X7xVB@S zoVCf2vSvM>6zsTiLo+<4;DF4AqpItw;eoO#=&;jj&&Jyo30-mENTrG)I=elWtKK}0 z2P4~p67Fi!lUwMWBX)kUia8AHMSpO&+h|-cnHRy25Q45( z$Oxq$1eIOV`m|nZ4M|>G*WU<+cMC@K3Zf8k!8P^D4sXR{C&Kr?u7Qdq1+77I1m&&R ziag#S6B0_J7U{vvNo~Cj^P0uD$Dz}d`Bg~yt`h2Pu;_zK9+G7Vi`&6?lzY8cUyW>8 z4UmGSNVmdw*PAL&hCA zB4wE;Ux(JG9_o*0mGu<+rRe)iiPjAX|M^@ANDiMwCoor{;5hn#x;^2HfaTdKx(UXV z8PHmr{I znSOK%??>;qMuB*16yC#5DMP*m%U~0>d#0TkOw|0v+UnWEV=rjCrkE+@zF5ZPfj;Q` zWet0tn2+&hbVLR16wgm@aXigI2c>CukFCuTeV`*Y?jvs8%o#CgXRrYB@yI}&Wt+^1 z#d-Uy$Zl>|u=bx_cQiMA??Htq*EgG1b14Se@MZ^o-!05Uh=aC)_xueXP)zc#NpXM_ zc*R;~K2To_1X|F(un#^N=>ZMMVh&5iNHF(BF{_a{Zu*C|P9aefM+d22=#Ce+g52$kg_%A$cNNL~ zL61-pW~=MtEN`%42QBG+vpn-cxWVQcd|bOyd>1AMGicbsulNhs#_jpGd0GLV8>5KO zax7(Ap}%c5mSB@jKq7;B=&RN|yqll?#)$s{Wm|qJh}|1M)_T1;9@jdOM>U5xv~t+{ zmhy9Cz?qP_!RxHTK8*X~Ci>mw1`22^amVBBvT%+nc{+3oTzw|H z4J>w_`B7}aHIc)fzG8LR-oq!DxFZqjd z$6(!H3z2eRa`S|4E2v_31yYQ^kIloY3L?B;@HCj4|JPq9uky;U3IAg6eOQ+TAecU# zcE4P4|M3{SKTEdzhZYYQU_VB&<2(M6&c%m94$JV1ftgC0>R-8xvcc0WKE zMoCsL!~m=5Zve90_p7iiEzCB&z)Ojq%>JbpN&YGdRp-OFw-13ER+v(YQ z74VQ8=UJV0ugQ3ZU0ih=6J3Qwq4H*T8XeDaxV zlv|SLFgxNjlAbrc4~pKfDRQN#CJA!|N;NM+0>^=ObJjh%I8yLYOyX9x>GWErR0mE) zZ2jn?&y`JmW4<>(t`(V&$&D_Xv>~% zTwRONbSw<9Y)Hc%mdkZ>k4|v;O)Z5@s~SX~7|A@OR4+LW<=kV0EU9Rw7i_q}0mBr# zs&Hxg;6$Gb9~gZ+Y5}`v5ej($YYu_GTuE9OixaFUfw6IfDB1pCk2e|+K}-*TisZg1 z>6n(LzV7=yP zH+)3z+a1}Q6#T3TR}lf=&b{4=0*l{@cHOS_I_};Myq{R=Zx@wpcsE`il5?FDUJdNZ zpG%+N7-s)X$jE|fPgeU=_ z43rl+fSK0MLmnpMO=vu8*;mlylWyE>Nk@MxVJ%f18|8aJQI;2N)?u^Pu=^+$N2Rr&Mo5$wg?nc$M^i{ zlV3b@qOw7L+oy_9soxQ2%A)5zDJ1c?FMbM1fJZm+?8hVByS5sEb|wcSYUhLD6_yFB z_i`T*&F?QD&k#VpgY?Pr2?>1{GJU($BtHaCJzrx^dM;!>O%Hy*!IkIaQk)zPjC2aT zCX22YH13C(}&A%$3if-8L@YuXi5=bNw7VwPl?Cj0x(4blC?_IfD%K}@xm

pMdfY) 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%0D68OZ7a~~<^Vo!vc}fuHW*N$ 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

X~E;9!Q2^$~@Dor2{AVw4AWvnIMy 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�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
    ZBrpS6;%x?+uxEPJ-9ewi( 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%0A!7%Ol3@KYb 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 From 969fa70c7bc0b941eaeb652e6c64c1334b0cac24 Mon Sep 17 00:00:00 2001 From: securesubmit-buildmaster Date: Tue, 5 Jan 2021 09:21:19 -0500 Subject: [PATCH 02/13] 20210105 deployment --- phpunit.xml.dist | 96 ++++++++++++++++++++++++------------------------ 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 1993192d..4607ddf2 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,48 +1,48 @@ - - - - - - - - - - - - ./test/ - - - ./test/Unit/ - - - ./test/Integration/ - - - ./test/Integration/Gateways/PorticoConnector/Certifications/ - ./test/Integration/Gateways/RealexConnector/Certifications/ - - - ./test/Integration/Gateways/PorticoConnector/ - - - ./test/Integration/Gateways/RealexConnector/ - - - - - - - ./src/ - - ./test/ - - - - - + + + + + + + + + + + + ./test/ + + + ./test/Unit/ + + + ./test/Integration/ + + + ./test/Integration/Gateways/PorticoConnector/Certifications/ + ./test/Integration/Gateways/RealexConnector/Certifications/ + + + ./test/Integration/Gateways/PorticoConnector/ + + + ./test/Integration/Gateways/RealexConnector/ + + + + + + + ./src/ + + ./test/ + + + + + From ce6f839b86c28b38ea6fe93ee314eab0718aff02 Mon Sep 17 00:00:00 2001 From: securesubmit-buildmaster Date: Tue, 5 Jan 2021 09:22:58 -0500 Subject: [PATCH 03/13] 20210105 deployment --- src/Entities/RecurringEntity.php | 221 ++++++++++++++++--------------- 1 file changed, 111 insertions(+), 110 deletions(-) diff --git a/src/Entities/RecurringEntity.php b/src/Entities/RecurringEntity.php index 3f546dd6..c88cc9ba 100644 --- a/src/Entities/RecurringEntity.php +++ b/src/Entities/RecurringEntity.php @@ -1,110 +1,111 @@ - - */ -abstract class RecurringEntity implements IRecurringEntity -{ - /** - * All resource should be supplied a merchant-/application-defined ID. - * - * @var string - */ - public $id; - - /** - * All resources should be supplied a gateway-defined ID. - * - * @var string - */ - public $key; - - /** - * {@inheritDoc} - */ - public function create() - { - return RecurringService::create($this); - } - - /** - * {@inheritDoc} - */ - public function delete($force = false) - { - try { - return RecurringService::delete($this, $force); - } catch (ApiException $exc) { - throw new ApiException('Failed to delete record, see inner exception for more details', $exc); - } - } - - /** - * {@inheritDoc} - */ - public static function find($id, $configName = 'default') - { - $client = ServicesContainer::instance()->getRecurringClient($configName); - if (!$client->supportsRetrieval) { - throw new UnsupportedTransactionException(); - } - - $identifier = static::getIdentifierName(); - $response = RecurringService::search(static::class) - ->addSearchCriteria($identifier, $id) - ->execute(); - $entity = isset($response[0]) ? $response[0] : null; - - if ($entity !== null) { - return RecurringService::get($entity); - } - - return null; - } - - /** - * {@inheritDoc} - */ - public static function findAll($configName = 'default') - { - $client = ServicesContainer::instance()->getRecurringClient($configName); - if (!$client->supportsRetrieval) { - throw new UnsupportedTransactionException(); - } - - return RecurringService::search(static::class)->execute(); - } - - /** - * {@inheritDoc} - */ - public function saveChanges($configName = 'default') - { - try { - return RecurringService::edit($this); - } catch (ApiException $exc) { - throw new ApiException('Update failed, see inner exception for more details', $exc); - } - } - - protected static function getIdentifierName() - { - if (static::class === Customer::class) { - return 'customerIdentifier'; - } elseif (static::class === RecurringPaymentMethod::class) { - return 'paymentMethodIdentifier'; - } elseif (static::class === Schedule::class) { - return 'scheduleIdentifier'; - } - return ''; - } -} + + */ +abstract class RecurringEntity implements IRecurringEntity +{ + /** + * All resource should be supplied a merchant-/application-defined ID. + * + * @var string + */ + public $id; + + /** + * All resources should be supplied a gateway-defined ID. + * + * @var string + */ + public $key; + + /** + * {@inheritDoc} + */ + public function create() + { + return RecurringService::create($this); + } + + /** + * {@inheritDoc} + */ + public function delete($force = false) + { + try { + return RecurringService::delete($this, $force); + } catch (ApiException $exc) { + throw new ApiException('Failed to delete record, see inner exception for more details', $exc); + } + } + + /** + * {@inheritDoc} + */ + public static function find($id, $configName = 'default') + { + $client = ServicesContainer::instance()->getRecurringClient($configName); + if (!$client->supportsRetrieval) { + throw new UnsupportedTransactionException(); + } + + $identifier = static::getIdentifierName(); + $response = RecurringService::search(static::class) + ->addSearchCriteria($identifier, $id) + ->execute(); + + foreach ($response as $entity) { + if ($entity->id === $id) { + return RecurringService::get($entity); + } + } + + return null; + } + + /** + * {@inheritDoc} + */ + public static function findAll($configName = 'default') + { + $client = ServicesContainer::instance()->getRecurringClient($configName); + if (!$client->supportsRetrieval) { + throw new UnsupportedTransactionException(); + } + + return RecurringService::search(static::class)->execute(); + } + + /** + * {@inheritDoc} + */ + public function saveChanges($configName = 'default') + { + try { + return RecurringService::edit($this); + } catch (ApiException $exc) { + throw new ApiException('Update failed, see inner exception for more details', $exc); + } + } + + protected static function getIdentifierName() + { + if (static::class === Customer::class) { + return 'customerIdentifier'; + } elseif (static::class === RecurringPaymentMethod::class) { + return 'paymentMethodIdentifier'; + } elseif (static::class === Schedule::class) { + return 'scheduleIdentifier'; + } + return ''; + } +} From 5b962f90fdeeeeb9f408d46393dd4046926b6d4d Mon Sep 17 00:00:00 2001 From: securesubmit-buildmaster Date: Tue, 5 Jan 2021 09:24:19 -0500 Subject: [PATCH 04/13] 20210105 deployment --- src/ServiceConfigs/Gateways/TransitConfig.php | 129 +++++++++--------- 1 file changed, 66 insertions(+), 63 deletions(-) diff --git a/src/ServiceConfigs/Gateways/TransitConfig.php b/src/ServiceConfigs/Gateways/TransitConfig.php index 23961027..ac853fe0 100644 --- a/src/ServiceConfigs/Gateways/TransitConfig.php +++ b/src/ServiceConfigs/Gateways/TransitConfig.php @@ -1,63 +1,66 @@ -gatewayProvider = GatewayProvider::TRANSIT; - } - - public function configureContainer($services) { - - $gateway = new TransITConnector(); - $gateway->deviceId = $this->deviceId; - $gateway->developerId = $this->developerId; - $gateway->timeout = $this->timeout; - $gateway->serviceUrl = $this->serviceUrl; - $gateway->requestLogger = $this->requestLogger; - $gateway->acceptorConfig = $this->acceptorConfig; - $gateway->merchantId = $this->merchantId; - $gateway->transactionKey = $this->transactionKey; - - if (empty($this->serviceUrl)) { - $gateway->serviceUrl = $this->environment == Environment::TEST ? ServiceEndpoints::TRANSIT_TEST : ServiceEndpoints::TRANSIT_PRODUCTION; - } - - $services->gatewayConnector = $gateway; - } - - public function validate() - { - parent::validate(); - - if ($this->acceptorConfig == null) { - throw new ConfigurationException("You must provide a valid AcceptorConfig."); - } else { - $this->acceptorConfig->validate(); - } - - if (empty($this->deviceId)) { - throw new ConfigurationException("DeviceId cannot be null."); - } - - if (empty($this->merchantId)) { - throw new ConfigurationException("MerchantId cannot be null."); - } - } -} +gatewayProvider = GatewayProvider::TRANSIT; + } + + public function configureContainer($services) { + + $gateway = new TransITConnector(); + $gateway->deviceId = $this->deviceId; + $gateway->developerId = $this->developerId; + $gateway->timeout = $this->timeout; + $gateway->serviceUrl = $this->serviceUrl; + $gateway->requestLogger = $this->requestLogger; + $gateway->acceptorConfig = $this->acceptorConfig; + $gateway->merchantId = $this->merchantId; + $gateway->transactionKey = $this->transactionKey; + $gateway->userId = $this->username; + $gateway->password = $this->password; + + if (empty($this->serviceUrl)) { + $gateway->serviceUrl = $this->environment == Environment::TEST ? ServiceEndpoints::TRANSIT_TEST : ServiceEndpoints::TRANSIT_PRODUCTION; + } + + $services->gatewayConnector = $gateway; + } + + public function validate() + { + parent::validate(); + + if ($this->acceptorConfig == null) { + throw new ConfigurationException("You must provide a valid AcceptorConfig."); + } else { + $this->acceptorConfig->validate(); + } + + if (empty($this->deviceId)) { + throw new ConfigurationException("DeviceId cannot be null."); + } + + if (empty($this->merchantId)) { + throw new ConfigurationException("MerchantId cannot be null."); + } + } +} From e673774d3307c7a99e6f755a5d41cec5c9d4ce4f Mon Sep 17 00:00:00 2001 From: securesubmit-buildmaster Date: Tue, 5 Jan 2021 09:25:16 -0500 Subject: [PATCH 05/13] 20210105 deployment --- src/ServicesConfig.php | 43 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/ServicesConfig.php diff --git a/src/ServicesConfig.php b/src/ServicesConfig.php new file mode 100644 index 00000000..8ed69065 --- /dev/null +++ b/src/ServicesConfig.php @@ -0,0 +1,43 @@ +gatewayConfig)) { + $this->gatewayConfig->validate(); + } + + if (!empty($this->deviceConnectionConfig)) { + $this->deviceConnectionConfig->validate(); + } + + if (!empty($this->tableServiceConfig)) { + $this->tableServiceConfig->validate(); + } + + if (!empty($this->payrollConfig)) { + $this->payrollConfig->validate(); + } + } +} From 3220d7172f05c85594b2a414fd6243f056c61e26 Mon Sep 17 00:00:00 2001 From: securesubmit-buildmaster Date: Tue, 5 Jan 2021 09:26:02 -0500 Subject: [PATCH 06/13] 20210105 deployment --- test/Data/TestChecks.php | 74 ++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/test/Data/TestChecks.php b/test/Data/TestChecks.php index 70eadaee..22cb4b05 100644 --- a/test/Data/TestChecks.php +++ b/test/Data/TestChecks.php @@ -1,37 +1,37 @@ -accountNumber = '24413815'; - $check->routingNumber = '490000018'; - $check->checkType = $checkType; - $check->accountType = $accountType; - $check->secCode = $secCode; - $check->entryMode = EntryMethod::MANUAL; - $check->checkHolderName = 'John Doe'; - $check->driversLicenseNumber = '09876543210'; - $check->driversLicenseState = 'TX'; - $check->phoneNumber = '8003214567'; - $check->birthYear = '1997'; - $check->ssnLast4 = '4321'; - if (!empty($checkHolderName)) { - $check->checkHolderName = $checkHolderName; - } - return $check; - } -} +accountNumber = '1357902468'; + $check->routingNumber = '122000030'; + $check->checkType = $checkType; + $check->accountType = $accountType; + $check->secCode = $secCode; + $check->entryMode = EntryMethod::MANUAL; + $check->checkHolderName = 'John Doe'; + $check->driversLicenseNumber = '09876543210'; + $check->driversLicenseState = 'TX'; + $check->phoneNumber = '8003214567'; + $check->birthYear = '1997'; + $check->ssnLast4 = '4321'; + if (!empty($checkHolderName)) { + $check->checkHolderName = $checkHolderName; + } + return $check; + } +} From 9bb8288da0ae98c7450ac8b6d4dbe349bd45b9b2 Mon Sep 17 00:00:00 2001 From: securesubmit-buildmaster Date: Tue, 5 Jan 2021 09:28:54 -0500 Subject: [PATCH 07/13] 20210105 deployment --- .../Certifications/CheckTest.php | 859 ++-- .../Certifications/EcommerceCheckTest.php | 216 +- .../Certifications/EcommerceTest.php | 3958 ++++++++-------- .../Certifications/MotoCheckTest.php | 216 +- .../Certifications/MotoTest.php | 3410 +++++++------- .../Certifications/RecurringTest.php | 1256 +++--- .../Certifications/RetailTest.php | 3964 ++++++++--------- 7 files changed, 6901 insertions(+), 6978 deletions(-) diff --git a/test/Integration/Gateways/PorticoConnector/Certifications/CheckTest.php b/test/Integration/Gateways/PorticoConnector/Certifications/CheckTest.php index 3077c4ef..4a32f6d2 100644 --- a/test/Integration/Gateways/PorticoConnector/Certifications/CheckTest.php +++ b/test/Integration/Gateways/PorticoConnector/Certifications/CheckTest.php @@ -1,481 +1,378 @@ -secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - protected function setup() - { - ServicesContainer::configure($this->config()); - - $this->address = new Address(); - $this->address->streetAddress1 = '123 Main St.'; - $this->address->city = 'Downtown'; - $this->address->province = 'NJ'; - $this->address->postalCode = '12345'; - } - - /// ACH Debit - Consumer - - public function test001ConsumerPersonalChecking() - { - $check = TestChecks::certification( - SecCode::PPD, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(11.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 25 - $voidResponse = $response->void()->execute(); - $this->assertNotNull($voidResponse); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test002ConsumerBusinessChecking() - { - $check = TestChecks::certification( - SecCode::PPD, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(12.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test003ConsumerPersonalSavings() - { - $check = TestChecks::certification( - SecCode::PPD, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(13.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test004ConsumerBusinessSavings() - { - $check = TestChecks::certification( - SecCode::PPD, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(14.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test005CorporatePersonalChecking() - { - $check = TestChecks::certification( - SecCode::CCD, - CheckType::PERSONAL, - AccountType::CHECKING, - "Heartland Pays" - ); - - $response = $check->charge(15.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 26 - $voidResponse = $response->void()->execute(); - $this->assertNotNull($voidResponse); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test006CorporateBusinessChecking() - { - $check = TestChecks::certification( - SecCode::CCD, - CheckType::BUSINESS, - AccountType::CHECKING, - "Heartland Pays" - ); - - $response = $check->charge(16.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test007CorporatePersonalSavings() - { - $check = TestChecks::certification( - SecCode::CCD, - CheckType::PERSONAL, - AccountType::SAVINGS, - "Heartland Pays" - ); - - $response = $check->charge(17.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test008CorporateBusinessSavings() - { - $check = TestChecks::certification( - SecCode::CCD, - CheckType::BUSINESS, - AccountType::SAVINGS, - "Heartland Pays" - ); - - $response = $check->charge(18.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test009EgoldPersonalChecking() - { - $check = TestChecks::certification( - SecCode::POP, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(11.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test010EgoldBusinessChecking() - { - $check = TestChecks::certification( - SecCode::CCD, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(12.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test011EgoldPersonalSavings() - { - $check = TestChecks::certification( - SecCode::POP, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(13.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test012EgoldBusinessSavings() - { - $check = TestChecks::certification( - SecCode::POP, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(14.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test013EsilverPersonalChecking() - { - $check = TestChecks::certification( - SecCode::POP, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(15.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test014EsilverBusinessChecking() - { - $check = TestChecks::certification( - SecCode::CCD, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(16.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test015EsilverPersonalSavings() - { - $check = TestChecks::certification( - SecCode::POP, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(17.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test016EsilverBusinessSavings() - { - $check = TestChecks::certification( - SecCode::POP, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(18.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage Processor Configuration error - */ - public function test017EbronzePersonalChecking() - { - $check = TestChecks::certification( - SecCode::EBRONZE, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(19.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage Processor Configuration error - */ - public function test018EbronzeBusinessChecking() - { - $check = TestChecks::certification( - SecCode::EBRONZE, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(20.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage Processor Configuration error - */ - public function test019EbronzePersonalSavings() - { - $check = TestChecks::certification( - SecCode::EBRONZE, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(21.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage Processor Configuration error - */ - public function test020EbronzeBusinessSavings() - { - $check = TestChecks::certification( - SecCode::EBRONZE, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(22.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test021WebPersonalChecking() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(23.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test022WebBusinessChecking() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(24.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test023WebPersonalSavings() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(25.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test024WebBusinessSavings() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(5.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } -} +secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + protected function setup() + { + ServicesContainer::configureService($this->config()); + + $this->address = new Address(); + $this->address->streetAddress1 = '123 Main St.'; + $this->address->city = 'Downtown'; + $this->address->province = 'NJ'; + $this->address->postalCode = '12345'; + } + + /// ACH Debit - Consumer + + public function test001ConsumerPersonalChecking() + { + $check = TestChecks::certification( + SecCode::PPD, + CheckType::PERSONAL, + AccountType::CHECKING + ); + + $response = $check->charge(11.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 25 + $voidResponse = $response->void()->execute(); + $this->assertNotNull($voidResponse); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test002ConsumerBusinessChecking() + { + $check = TestChecks::certification( + SecCode::PPD, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(12.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test003ConsumerPersonalSavings() + { + $check = TestChecks::certification( + SecCode::PPD, + CheckType::PERSONAL, + AccountType::SAVINGS + ); + + $response = $check->charge(13.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test004ConsumerBusinessSavings() + { + $check = TestChecks::certification( + SecCode::PPD, + CheckType::BUSINESS, + AccountType::SAVINGS + ); + + $response = $check->charge(14.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test005CorporatePersonalChecking() + { + $check = TestChecks::certification( + SecCode::CCD, + CheckType::PERSONAL, + AccountType::CHECKING, + "Heartland Pays" + ); + + $response = $check->charge(15.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 26 + $voidResponse = $response->void()->execute(); + $this->assertNotNull($voidResponse); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test006CorporateBusinessChecking() + { + $check = TestChecks::certification( + SecCode::CCD, + CheckType::BUSINESS, + AccountType::CHECKING, + "Heartland Pays" + ); + + $response = $check->charge(16.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test007CorporatePersonalSavings() + { + $check = TestChecks::certification( + SecCode::CCD, + CheckType::PERSONAL, + AccountType::SAVINGS, + "Heartland Pays" + ); + + $response = $check->charge(17.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test008CorporateBusinessSavings() + { + $check = TestChecks::certification( + SecCode::CCD, + CheckType::BUSINESS, + AccountType::SAVINGS, + "Heartland Pays" + ); + + $response = $check->charge(18.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test010EgoldBusinessChecking() + { + $check = TestChecks::certification( + SecCode::CCD, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(12.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test014EsilverBusinessChecking() + { + $check = TestChecks::certification( + SecCode::CCD, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(16.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage Processor Configuration error + */ + public function test017EbronzePersonalChecking() + { + $check = TestChecks::certification( + SecCode::EBRONZE, + CheckType::PERSONAL, + AccountType::CHECKING + ); + + $response = $check->charge(19.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage Processor Configuration error + */ + public function test018EbronzeBusinessChecking() + { + $check = TestChecks::certification( + SecCode::EBRONZE, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(20.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage Processor Configuration error + */ + public function test019EbronzePersonalSavings() + { + $check = TestChecks::certification( + SecCode::EBRONZE, + CheckType::PERSONAL, + AccountType::SAVINGS + ); + + $response = $check->charge(21.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage Processor Configuration error + */ + public function test020EbronzeBusinessSavings() + { + $check = TestChecks::certification( + SecCode::EBRONZE, + CheckType::BUSINESS, + AccountType::SAVINGS + ); + + $response = $check->charge(22.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test021WebPersonalChecking() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::PERSONAL, + AccountType::CHECKING + ); + + $response = $check->charge(23.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test022WebBusinessChecking() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(24.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test023WebPersonalSavings() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::PERSONAL, + AccountType::SAVINGS + ); + + $response = $check->charge(25.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test024WebBusinessSavings() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::BUSINESS, + AccountType::SAVINGS + ); + + $response = $check->charge(5.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } +} diff --git a/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceCheckTest.php b/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceCheckTest.php index 19e5d5a6..3beccb37 100644 --- a/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceCheckTest.php +++ b/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceCheckTest.php @@ -1,108 +1,108 @@ -secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - protected function setup() - { - ServicesContainer::configure($this->config()); - - $this->address = new Address(); - $this->address->streetAddress1 = '123 Main St.'; - $this->address->city = 'Downtown'; - $this->address->province = 'NJ'; - $this->address->postalCode = '12345'; - } - - public function test001ConsumerPersonalChecking() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(19.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test002ConsumerBusinessChecking() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(20.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test003ConsumerPersonalSavings() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(21.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test004ConsumerBusinessSavings() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(22.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } -} +secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + protected function setup() + { + ServicesContainer::configureService($this->config()); + + $this->address = new Address(); + $this->address->streetAddress1 = '123 Main St.'; + $this->address->city = 'Downtown'; + $this->address->province = 'NJ'; + $this->address->postalCode = '12345'; + } + + public function test001ConsumerPersonalChecking() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::PERSONAL, + AccountType::CHECKING + ); + + $response = $check->charge(19.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test002ConsumerBusinessChecking() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(20.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test003ConsumerPersonalSavings() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::PERSONAL, + AccountType::SAVINGS + ); + + $response = $check->charge(21.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test004ConsumerBusinessSavings() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::BUSINESS, + AccountType::SAVINGS + ); + + $response = $check->charge(22.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } +} diff --git a/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceTest.php b/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceTest.php index 304a4166..62320006 100644 --- a/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceTest.php +++ b/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceTest.php @@ -1,1972 +1,1986 @@ -value = $card->value; - $data->encryptionData = $card->encryptionData; - $data->pinBlock = $pinBlock; - return $data; - } - - public static function asEBTTrack($card, $pinBlock) - { - $data = new EBTTrackData(); - $data->value = $card->value; - $data->entryMethod = $card->entryMethod; - $data->encryptionData = $card->encryptionData; - $data->pinBlock = $pinBlock; - return $data; - } - - public static function asEBTManual($card, $pinBlock) - { - $data = new EBTCardData(); - $data->number = $card->number; - $data->expMonth = $card->expMonth; - $data->expYear = $card->expYear; - $data->pinBlock = $pinBlock; - return $data; - } - - public static function visaManual($cardPresent = false, $readerPresent = false) - { - $data = new CreditCardData(); - $data->number = '4012002000060016'; - $data->expMonth = 12; - $data->expYear = self::validCardExpYear(); - $data->cvn = '123'; - $data->cardPresent = $cardPresent; - $data->readerPresent = $readerPresent; - return $data; - } - - public static function visaSwipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B4012002000060016^VI TEST CREDIT^251210118039000000000396?;4012002000060016=25121011803939600000?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function visaSwipeEncrypted($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $encryptionData = new EncryptionData(); - $encryptionData->version = '01'; - - $data = new CreditTrackData(); - $data->value = ';'; - $data->entryMethod = $entryMethod; - $data->encryptionData = $encryptionData; - return $data; - } - - public static function masterCardManual($cardPresent = false, $readerPresent = false) - { - $data = new CreditCardData(); - $data->number = '5473500000000014'; - $data->expMonth = 12; - $data->expYear = self::validCardExpYear(); - $data->cvn = '123'; - $data->cardPresent = $cardPresent; - $data->readerPresent = $readerPresent; - return $data; - } - - public static function masterCardSeries2Manual($cardPresent = false, $readerPresent = false) - { - $data = new CreditCardData(); - $data->number = '2223000010005780'; - $data->expMonth = 12; - $data->expYear = self::validCardExpYear(); - $data->cvn = '123'; - $data->cardPresent = $cardPresent; - $data->readerPresent = $readerPresent; - return $data; - } - - public static function masterCardSwipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B5473500000000014^MC TEST CARD^251210199998888777766665555444433332?;5473500000000014=25121019999888877776?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function masterCard24Swipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B2223000010005780^TEST CARD/EMV BIN-2^19121010000000009210?;2223000010005780=19121010000000009210?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function masterCard25Swipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B2223000010005798^TEST CARD/EMV BIN-2^19121010000000003840?;2223000010005798=19121010000000003840?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function masterCardSwipeEncrypted($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $encryptionData = new EncryptionData(); - $encryptionData->version = '01'; - - $data = new CreditTrackData(); - $data->value = ''; - $data->entryMethod = $entryMethod; - $data->encryptionData = $encryptionData; - return $data; - } - - public static function discoverManual($cardPresent = false, $readerPresent = false) - { - $data = new CreditCardData(); - $data->number = '6011000990156527'; - $data->expMonth = 12; - $data->expYear = self::validCardExpYear(); - $data->cvn = '123'; - $data->cardPresent = $cardPresent; - $data->readerPresent = $readerPresent; - return $data; - } - - public static function discoverSwipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B6011000990156527^DIS TEST CARD^25121011000062111401?;6011000990156527=25121011000062111401?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function discoverSwipeEncrypted($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $encryptionData = new EncryptionData(); - $encryptionData->version = '01'; - - $data = new CreditTrackData(); - $data->value = ''; - $data->entryMethod = $entryMethod; - $data->encryptionData = $encryptionData; - return $data; - } - - public static function amexManual($cardPresent = false, $readerPresent = false) - { - $data = new CreditCardData(); - $data->number = '372700699251018'; - $data->expMonth = 12; - $data->expYear = self::validCardExpYear(); - $data->cvn = '1234'; - $data->cardPresent = $cardPresent; - $data->readerPresent = $readerPresent; - return $data; - } - - public static function amexSwipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B3727 006992 51018^AMEX TEST CARD^2512990502700?;372700699251018=2512990502700?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function jcbManual($cardPresent = false, $readerPresent = false) - { - $data = new CreditCardData(); - $data->number = '3566007770007321'; - $data->expMonth = 12; - $data->expYear = self::validCardExpYear(); - $data->cvn = '123'; - $data->cardPresent = $cardPresent; - $data->readerPresent = $readerPresent; - return $data; - } - - public static function jcbSwipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B3566007770007321^JCB TEST CARD^2512101100000000000000000064300000?;3566007770007321=25121011000000076435?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function giftCard1Swipe() - { - $data = new GiftCard(); - $data->trackData = '%B5022440000000000098^^391200081613?;5022440000000000098=391200081613?'; - return $data; - } - - public static function giftCard2Manual() - { - $data = new GiftCard(); - $data->number = '5022440000000000007'; - return $data; - } - - public static function gsbManual() - { - $data = new CreditCardData(); - $data->number = '6277220572999800'; - $data->expMonth = '12'; - $data->expYear = self::validCardExpYear(); - return $data; - } -} - - - -class EcommerceTest extends TestCase -{ - const NO_TRANS_IN_BATCH = 'Batch close was rejected because no transactions are associated with the currently open batch.'; - const BATCH_NOT_OPEN = 'Transaction was rejected because it requires a batch to be open.'; - - /** @var bool */ - private $useTokens = true; - - /** @var bool */ - private $usePrepaid = false; - - /** @var string */ - private $publicKey = ''; - - /** @var EcommerceInfo */ - private $ecommerceInfo = null; - - /** @var string|null */ - public static $visaToken = null; - - /** @var string|null */ - public static $mastercardToken = null; - - /** @var string|null */ - public static $discoverToken = null; - - /** @var string|null */ - public static $amexToken = null; - - private $enableCryptoUrl = true; - - private function config() - { - $config = new PorticoConfig(); - $config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - protected function setup() : void - { - ServicesContainer::configureService($this->config()); - $this->publicKey = 'pkapi_cert_jKc1FtuyAydZhZfbB3'; - - $this->ecommerceInfo = new EcommerceInfo(); - $this->ecommerceInfo->channel = EcommerceChannel::ECOM; - } - - public function test000CloseBatch() - { - try { - $response = BatchService::closeBatch(); - $this->assertNotNull($response); - } catch (ApiException $e) { - if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) - && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) - ) { - $this->fail($e->getMessage()); - } - } - } - - /// CARD VERIFY - - /// Account Verification - - public function test001VerifyVisa() - { - $card = TestCards::visaManual(); - - $response = $card->verify() - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test002VerifyMasterCard() - { - $card = TestCards::masterCardManual(); - $response = $card->verify() - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test003VerifyDiscover() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::discoverManual(); - - $response = $card->verify() - ->withAddress($address) - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// Address Verification - - public function test004VerifyAmex() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->verify() - ->withAddress($address) - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// Balance Inquiry (for Prepaid Card) - - public function test005BalanceInquiryVisa() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $card = TestCards::visaManual(); - - $response = $card->balanceInquiry() - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// CREDIT SALE (For Multi-Use Token Only) - - public function test006ChargeVisaToken() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(13.01) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals(true, $response->token != null); - self::$visaToken = $response->token; - } - - public function test007ChargeMasterCardToken() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(13.02) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals(true, $response->token != null); - self::$mastercardToken = $response->token; - } - - public function test008ChargeDiscoverToken() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = TestCards::discoverManual(); - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(13.03) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals(true, $response->token != null); - self::$discoverToken = $response->token; - } - - public function test009ChargeAmexToken() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(13.04) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals(true, $response->token != null); - self::$amexToken = $response->token; - } - - /// CREDIT SALE - - public function test010ChargeVisa() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = self::$visaToken; - } - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(17.01) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $voidResponse = $response->void() - ->execute(); - $this->assertEquals(true, $voidResponse != null); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test011ChargeMastercard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = self::$mastercardToken; - } - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(17.02) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test012ChargeDiscover() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = TestCards::discoverManual(); - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = self::$discoverToken; - } - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(17.03) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test013ChargeAmex() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = self::$amexToken; - } - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(17.04) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test014ChargeJcb() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = TestCards::jcbManual(); - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(17.04) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test011bChargeMasterCard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardSeries2Manual(); - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(17.02) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// AUTHORIZATION - - public function test015AuthorizationVisa() - { - # Test 015a Authorization - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - - $card = TestCards::visaManual(); - - $response = $card->authorize(17.06) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - # test 015b Capture/AddToBatch - $capture = $response->capture() - ->execute(); - $this->assertEquals(true, $capture != null); - $this->assertEquals('00', $capture->responseCode); - } - - public function test016AuthorizationMastercard() - { - # Test 016a Authorization - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '750241234'; - - $card = TestCards::masterCardManual(); - - $response = $card->authorize(17.07) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - # test 016b Capture/AddToBatch - $capture = $response->capture() - ->execute(); - $this->assertEquals(true, $capture != null); - $this->assertEquals('00', $capture->responseCode); - } - - public function test017AuthorizationDiscover() - { - # Test 017a Authorization - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::discoverManual(); - - $response = $card->authorize(17.08) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - # test 017b Capture/AddToBatch - # do not capture - } - - /// PARTIALLY - APPROVED SALE - - public function test018PartialApprovalVisa() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(130) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowPartialAuth(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(true, $response->authorizedAmount != null); - $this->assertEquals('110.00', $response->authorizedAmount); - } - - public function test019PartialApprovalDiscover() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::discoverManual(); - - $response = $card->charge(145) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowPartialAuth(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(true, $response->authorizedAmount != null); - $this->assertEquals('65.00', $response->authorizedAmount); - } - - public function test020PartialApprovalMastercard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::discoverManual(); - - $response = $card->charge(155) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowPartialAuth(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(true, $response->authorizedAmount != null); - $this->assertEquals('100.00', $response->authorizedAmount); - - $voidResponse = $response->void() - ->execute(); - $this->assertEquals(true, $voidResponse != null); - $this->assertEquals('00', $voidResponse->responseCode); - } - - /// LEVEL II CORPORATE PURCHASE CARD - - public function test021LevelIIResponseB() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '750241234'; - - $card = TestCards::visaManual(); - - $response = $card->charge(112.34) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('B', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test022LevelIIResponseB() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = TestCards::visaManual(); - - $response = $card->charge(112.34) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('B', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test023LevelIIResponseR() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(123.45) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('R', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test024LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(134.56) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test025LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.06) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test026LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.07) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test027LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.08) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test028LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.09) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test029LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.10) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test030LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.11) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test031LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.12) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test032LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.13) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - /// PRIOR / VOICE AUTHORIZATION - - public function test033OfflineSale() - { - $card = TestCards::visaManual(); - - $response = $card->charge(17.10) - ->withCurrency('USD') - ->withModifier(TransactionModifier::OFFLINE) - ->withOfflineAuthCode('654321') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test033OfflineAuthorization() - { - $card = TestCards::visaManual(); - - $response = $card->authorize(17.10) - ->withCurrency('USD') - ->withModifier(TransactionModifier::OFFLINE) - ->withOfflineAuthCode('654321') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// RETURN - - public function test034OfflineCreditReturn() - { - $card = TestCards::masterCardManual(); - - $response = $card->refund(15.15) - ->withCurrency('USD') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test034bOfflineCreditReturn() - { - $card = TestCards::masterCardManual(); - - $response = $card->refund(15.16) - ->withCurrency('USD') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ONLINE VOID / REVERSAL - - public function test035VoidTest10() - { - // see test 010 - } - - public function test036VoidTest20() - { - // see test 020 - } - - /// Time Out Reversal - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\UnsupportedTransactionException - */ - public function test036bTimeoutReversal() - { - $sale = TestCards::visaManual()->charge(911) - ->withCurrency('USD') - ->withClientTransactionId('987321654') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $sale != null); - $this->assertEquals('91', $sale->responseCode); - - $response = Transaction::fromId(null, PaymentMethodType::CREDIT); - $response->clientTransactionId = '987321654'; - - $response->reverse(911)->execute(); - } - - /// One time bill payment - - public function test010ChargeVisaOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$visaToken; - } else { - $card = TestCards::visaManual(); - } - - $response = $card->charge(13.11) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $void = $response->void()->execute(); - - $this->assertEquals(true, $void != null); - $this->assertEquals('00', $void->responseCode); - } - - public function test011ChargeMasterCardOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$mastercardToken; - } else { - $card = TestCards::masterCardManual(); - } - - $response = $card->charge(13.12) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test012ChargeDiscoverOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$discoverToken; - } else { - $card = TestCards::discoverManual(); - } - - $response = $card->charge(13.13) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test013ChargeAmexOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$amexToken; - } else { - $card = TestCards::amexManual(); - } - - $response = $card->charge(13.14) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test014ChargeJcbOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '3566007770007321'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - $card->cvn = '123'; - - $response = $card->charge(13.15) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ADVANCED FRAUD SCREENING - - /** - * TODO: Change code assertions when AFS is enabled on account - */ - public function test037FraudPreventionSale() - { - $card = TestCards::visaManual(); - - $response = $card->charge(15000) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - // $this->assertEquals('FR', $response->responseCode); - } - - /** - * TODO: Change code assertions when AFS is enabled on account - */ - public function test038FraudPreventionReturn() - { - $card = TestCards::visaManual(); - - $response = $card->refund(15000) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - // $this->assertEquals('41', $response->responseCode); - } - - /// ONE CARD - GSB CARD FUNCTIONS - - /// BALANCE INQUIRY - - public function test037BalanceInquiryGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::gsbManual(); - - $response = $card->balanceInquiry() - ->withAddress($address) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ADD VALUE - - public function test038AddValueGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $card = new CreditTrackData(); - $card->value = '%B6277220572999800^ / ^49121010557010000016000000?F;6277220572999800=49121010557010000016?'; - - $response = $card->addValue(15.00) - ->withCurrency('USD') - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// SALE - - public function test039ChargeGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::gsbManual(); - - $response = $card->charge(2.05) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $voidResponse = $response->void() - ->execute(); - $this->assertEquals(true, $voidResponse != null); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test040ChargeGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::gsbManual(); - - $response = $card->charge(2.10) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ONLINE VOID / REVERSAL - - public function test041VoidGsb() - { - // see test 039 - } - - /// HMS GIFT - REWARDS - - /// ACTIVATE - - public function test042ActivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->activate(6.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test043ActivateGift2() - { - - $card = TestCards::giftCard2Manual(); - - $response = $card->activate(7.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// LOAD / ADD VALUE - - public function test044AddValueGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->addValue(8.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test045AddValueGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->addValue(9.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// BALANCE INQUIRY - - public function test046BalanceInquiryGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - public function test047BalanceInquiryGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - /// REPLACE / TRANSFER - - public function test048ReplaceGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->replaceWith(TestCards::giftCard2Manual()) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - public function test049ReplaceGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->replaceWith(TestCards::giftCard1Swipe()) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - /// SALE / REDEEM - - public function test050SaleGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(1.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test051SaleGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(2.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test052SaleGift1Void() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(3.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $voidResponse = $response->void() - ->execute(); - $this->assertEquals(true, $voidResponse != null); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test053SaleGift2Reversal() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(4.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $reversalResponse = $response->reverse(4.00) - ->execute(); - $this->assertEquals(true, $reversalResponse != null); - $this->assertEquals('00', $reversalResponse->responseCode); - } - - /// VOID - - public function test054VoidGift() - { - // see test 052 - } - - /// REVERSAL - - public function test055ReversalGift() - { - // see test 053 - } - - public function test056ReversalGift2() - { - $card = TestCards::giftCard2Manual(); - - $reversalResponse = $card->reverse(2.00) - ->execute(); - $this->assertEquals(true, $reversalResponse != null); - $this->assertEquals('00', $reversalResponse->responseCode); - } - - /// DEACTIVATE - - public function test057DeactivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->deactivate() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// RECEIPTS MESSAGING - - public function test058ReceiptsMessaging() - { - return; # print and scan receipt for test 51 - } - - /// REWARD - - /// BALANCE INQUIRY - - public function test059BalanceInquiryRewards1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->pointsBalanceAmount); - } - - public function test060BalanceInquiryRewards2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->pointsBalanceAmount); - } - - /// ALIAS - - public function test061CreateAliasGift1() - { - $response = GiftCard::create('9725550100'); - - $this->assertEquals(true, $response != null); - } - - public function test062CreateAliasGift2() - { - $response = GiftCard::create('9725550100'); - - $this->assertEquals(true, $response != null); - } - - public function test063AddAliasGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->addAlias('2145550199') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test064AddAliasGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->addAlias('2145550199') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test065DeleteAliasGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->removeAlias('2145550199') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// SALE / REDEEM - - public function test066RedeemPointsGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(100) - ->withCurrency('POINTS') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test067RedeemPointsGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(200) - ->withCurrency('POINTS') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test068RedeemPointsGift2() - { - $card = new GiftCard(); - $card->alias = '9725550100'; - - $response = $card->charge(300) - ->withCurrency('POINTS') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// REWARDS - - public function test069RewardsGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->rewards(10) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test070RewardsGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->rewards(11) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// REPLACE / TRANSFER - - public function test071ReplaceGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->replaceWith(TestCards::giftCard2Manual()) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test072ReplaceGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->replaceWith(TestCards::giftCard1Swipe()) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// DEACTIVATE - - public function test073DeactivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->deactivate() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test074DeactivateGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->deactivate() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// RECEIPTS MESSAGING - - public function test075ReceiptsMessaging() - { - return; # print and scan receipt for test 51 - } - - /// CLOSE BATCH - - public function test999CloseBatch() - { - try { - $response = BatchService::closeBatch(); - $this->assertNotNull($response); - // printf('batch id: %s', $response->id); - // printf('sequence number: %s', $response->sequenceNumber); - } catch (ApiException $e) { - if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) - && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) - ) { - $this->fail($e->getMessage()); - } - } - } - - public function test100ChargeVisaEcommerceInfo() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $secureEcom = new ThreeDSecure(); - $secureEcom->cavv = 'AAACBllleHchZTBWIGV4AAAAAAA='; - $secureEcom->xid = 'crqAeMwkEL9r4POdxpByWJ1/wYg='; - $secureEcom->eci = '5'; - $secureEcom->paymentDataSource = Secure3dPaymentDataSource::VISA_3DSECURE; - $secureEcom->paymentDataType = '3DSecure'; - - $card = TestCards::visaManual(); - $card->threeDSecure = $secureEcom; - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(13.01) - ->withAddress($address) - // ->withEcommerceInfo($this->ecommerceInfo) - ->withInvoiceNumber('12345') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } -} +value = $card->value; + $data->encryptionData = $card->encryptionData; + $data->pinBlock = $pinBlock; + return $data; + } + + public static function asEBTTrack($card, $pinBlock) + { + $data = new EBTTrackData(); + $data->value = $card->value; + $data->entryMethod = $card->entryMethod; + $data->encryptionData = $card->encryptionData; + $data->pinBlock = $pinBlock; + return $data; + } + + public static function asEBTManual($card, $pinBlock) + { + $data = new EBTCardData(); + $data->number = $card->number; + $data->expMonth = $card->expMonth; + $data->expYear = $card->expYear; + $data->pinBlock = $pinBlock; + return $data; + } + + public static function visaManual($cardPresent = false, $readerPresent = false) + { + $data = new CreditCardData(); + $data->number = '4012002000060016'; + $data->expMonth = 12; + $data->expYear = self::validCardExpYear(); + $data->cvn = '123'; + $data->cardPresent = $cardPresent; + $data->readerPresent = $readerPresent; + return $data; + } + + public static function visaSwipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B4012002000060016^VI TEST CREDIT^251210118039000000000396?;4012002000060016=25121011803939600000?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function visaSwipeEncrypted($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $encryptionData = new EncryptionData(); + $encryptionData->version = '01'; + + $data = new CreditTrackData(); + $data->value = ';'; + $data->entryMethod = $entryMethod; + $data->encryptionData = $encryptionData; + return $data; + } + + public static function masterCardManual($cardPresent = false, $readerPresent = false) + { + $data = new CreditCardData(); + $data->number = '5473500000000014'; + $data->expMonth = 12; + $data->expYear = self::validCardExpYear(); + $data->cvn = '123'; + $data->cardPresent = $cardPresent; + $data->readerPresent = $readerPresent; + return $data; + } + + public static function masterCardSeries2Manual($cardPresent = false, $readerPresent = false) + { + $data = new CreditCardData(); + $data->number = '2223000010005780'; + $data->expMonth = 12; + $data->expYear = self::validCardExpYear(); + $data->cvn = '123'; + $data->cardPresent = $cardPresent; + $data->readerPresent = $readerPresent; + return $data; + } + + public static function masterCardSwipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B5473500000000014^MC TEST CARD^251210199998888777766665555444433332?;5473500000000014=25121019999888877776?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function masterCard24Swipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B2223000010005780^TEST CARD/EMV BIN-2^19121010000000009210?;2223000010005780=19121010000000009210?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function masterCard25Swipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B2223000010005798^TEST CARD/EMV BIN-2^19121010000000003840?;2223000010005798=19121010000000003840?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function masterCardSwipeEncrypted($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $encryptionData = new EncryptionData(); + $encryptionData->version = '01'; + + $data = new CreditTrackData(); + $data->value = ''; + $data->entryMethod = $entryMethod; + $data->encryptionData = $encryptionData; + return $data; + } + + public static function discoverManual($cardPresent = false, $readerPresent = false) + { + $data = new CreditCardData(); + $data->number = '6011000990156527'; + $data->expMonth = 12; + $data->expYear = self::validCardExpYear(); + $data->cvn = '123'; + $data->cardPresent = $cardPresent; + $data->readerPresent = $readerPresent; + return $data; + } + + public static function discoverSwipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B6011000990156527^DIS TEST CARD^25121011000062111401?;6011000990156527=25121011000062111401?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function discoverSwipeEncrypted($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $encryptionData = new EncryptionData(); + $encryptionData->version = '01'; + + $data = new CreditTrackData(); + $data->value = ''; + $data->entryMethod = $entryMethod; + $data->encryptionData = $encryptionData; + return $data; + } + + public static function amexManual($cardPresent = false, $readerPresent = false) + { + $data = new CreditCardData(); + $data->number = '372700699251018'; + $data->expMonth = 12; + $data->expYear = self::validCardExpYear(); + $data->cvn = '1234'; + $data->cardPresent = $cardPresent; + $data->readerPresent = $readerPresent; + return $data; + } + + public static function amexSwipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B3727 006992 51018^AMEX TEST CARD^2512990502700?;372700699251018=2512990502700?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function jcbManual($cardPresent = false, $readerPresent = false) + { + $data = new CreditCardData(); + $data->number = '3566007770007321'; + $data->expMonth = 12; + $data->expYear = self::validCardExpYear(); + $data->cvn = '123'; + $data->cardPresent = $cardPresent; + $data->readerPresent = $readerPresent; + return $data; + } + + public static function jcbSwipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B3566007770007321^JCB TEST CARD^2512101100000000000000000064300000?;3566007770007321=25121011000000076435?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function giftCard1Swipe() + { + $data = new GiftCard(); + $data->trackData = '%B5022440000000000098^^391200081613?;5022440000000000098=391200081613?'; + return $data; + } + + public static function giftCard2Manual() + { + $data = new GiftCard(); + $data->number = '5022440000000000007'; + return $data; + } + + public static function gsbManual() + { + $data = new CreditCardData(); + $data->number = '6277220572999800'; + $data->expMonth = '12'; + $data->expYear = self::validCardExpYear(); + return $data; + } +} + + + +class EcommerceTest extends TestCase +{ + const NO_TRANS_IN_BATCH = 'Batch close was rejected because no transactions are associated with the currently open batch.'; + const BATCH_NOT_OPEN = 'Transaction was rejected because it requires a batch to be open.'; + + /** @var bool */ + private $useTokens = true; + + /** @var bool */ + private $usePrepaid = false; + + /** @var string */ + private $publicKey = ''; + + /** @var EcommerceInfo */ + private $ecommerceInfo = null; + + /** @var string|null */ + public static $visaToken = null; + + /** @var string|null */ + public static $mastercardToken = null; + + /** @var string|null */ + public static $discoverToken = null; + + /** @var string|null */ + public static $amexToken = null; + + private $enableCryptoUrl = true; + + private function config() + { + $config = new PorticoConfig(); + $config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + protected function setup() : void + { + ServicesContainer::configureService($this->config()); + $this->publicKey = 'pkapi_cert_jKc1FtuyAydZhZfbB3'; + + $this->ecommerceInfo = new EcommerceInfo(); + $this->ecommerceInfo->channel = EcommerceChannel::ECOM; + } + + public function test000CloseBatch() + { + try { + $response = BatchService::closeBatch(); + $this->assertNotNull($response); + } catch (ApiException $e) { + if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) + && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) + ) { + $this->fail($e->getMessage()); + } + } + } + + /// CARD VERIFY + + /// Account Verification + + public function test001VerifyVisa() + { + $card = TestCards::visaManual(); + + $response = $card->verify() + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test002VerifyMasterCard() + { + $card = TestCards::masterCardManual(); + $response = $card->verify() + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test003VerifyDiscover() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::discoverManual(); + + $response = $card->verify() + ->withAddress($address) + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// Address Verification + + public function test004VerifyAmex() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->verify() + ->withAddress($address) + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// Balance Inquiry (for Prepaid Card) + + public function test005BalanceInquiryVisa() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $card = TestCards::visaManual(); + + $response = $card->balanceInquiry() + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// CREDIT SALE (For Multi-Use Token Only) + + public function test006ChargeVisaToken() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(13.01) + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals(true, $response->token != null); + self::$visaToken = $response->token; + } + + public function test007ChargeMasterCardToken() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(13.02) + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals(true, $response->token != null); + self::$mastercardToken = $response->token; + } + + public function test008ChargeDiscoverToken() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = TestCards::discoverManual(); + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(13.03) + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals(true, $response->token != null); + self::$discoverToken = $response->token; + } + + public function test009ChargeAmexToken() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(13.04) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withRequestMultiUseToken(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals(true, $response->token != null); + self::$amexToken = $response->token; + } + + /// CREDIT SALE + + public function test010ChargeVisa() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = self::$visaToken; + } + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(17.01) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $voidResponse = $response->void() + ->execute(); + $this->assertEquals(true, $voidResponse != null); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test011ChargeMastercard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = self::$mastercardToken; + } + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(17.02) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test012ChargeDiscover() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = TestCards::discoverManual(); + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = self::$discoverToken; + } + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(17.03) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test013ChargeAmex() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = self::$amexToken; + } + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(17.04) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test014ChargeJcb() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = TestCards::jcbManual(); + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(17.04) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test011bChargeMasterCard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardSeries2Manual(); + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(17.02) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// AUTHORIZATION + + public function test015AuthorizationVisa() + { + # Test 015a Authorization + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + + $card = TestCards::visaManual(); + + $response = $card->authorize(17.06) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + # test 015b Capture/AddToBatch + $capture = $response->capture() + ->execute(); + $this->assertEquals(true, $capture != null); + $this->assertEquals('00', $capture->responseCode); + } + + public function test016AuthorizationMastercard() + { + # Test 016a Authorization + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '750241234'; + + $card = TestCards::masterCardManual(); + + $response = $card->authorize(17.07) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + # test 016b Capture/AddToBatch + $capture = $response->capture() + ->execute(); + $this->assertEquals(true, $capture != null); + $this->assertEquals('00', $capture->responseCode); + } + + public function test017AuthorizationDiscover() + { + # Test 017a Authorization + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::discoverManual(); + + $response = $card->authorize(17.08) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + # test 017b Capture/AddToBatch + # do not capture + } + + /// PARTIALLY - APPROVED SALE + + public function test018PartialApprovalVisa() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(130) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowPartialAuth(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(true, $response->authorizedAmount != null); + $this->assertEquals('110.00', $response->authorizedAmount); + } + + public function test019PartialApprovalDiscover() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::discoverManual(); + + $response = $card->charge(145) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowPartialAuth(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(true, $response->authorizedAmount != null); + $this->assertEquals('65.00', $response->authorizedAmount); + } + + public function test020PartialApprovalMastercard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::discoverManual(); + + $response = $card->charge(155) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowPartialAuth(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(true, $response->authorizedAmount != null); + $this->assertEquals('100.00', $response->authorizedAmount); + + $voidResponse = $response->void() + ->execute(); + $this->assertEquals(true, $voidResponse != null); + $this->assertEquals('00', $voidResponse->responseCode); + } + + /// LEVEL II CORPORATE PURCHASE CARD + + public function test021LevelIIResponseB() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '750241234'; + + $card = TestCards::visaManual(); + + $response = $card->charge(112.34) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('B', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test022LevelIIResponseB() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = TestCards::visaManual(); + + $response = $card->charge(112.34) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('B', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test023LevelIIResponseR() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(123.45) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('R', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test024LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(134.56) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test025LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.06) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test026LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.07) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test027LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.08) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test028LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.09) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test029LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.10) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test030LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.11) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test031LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.12) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test032LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.13) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + /// PRIOR / VOICE AUTHORIZATION + + public function test033OfflineSale() + { + $card = TestCards::visaManual(); + + $response = $card->charge(17.10) + ->withCurrency('USD') + ->withModifier(TransactionModifier::OFFLINE) + ->withOfflineAuthCode('654321') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test033OfflineAuthorization() + { + $card = TestCards::visaManual(); + + $response = $card->authorize(17.10) + ->withCurrency('USD') + ->withModifier(TransactionModifier::OFFLINE) + ->withOfflineAuthCode('654321') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// RETURN + + public function test034OfflineCreditReturn() + { + $card = TestCards::masterCardManual(); + + $response = $card->refund(15.15) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test034bOfflineCreditReturn() + { + $card = TestCards::masterCardManual(); + + $response = $card->refund(15.16) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ONLINE VOID / REVERSAL + + public function test035VoidTest10() + { + // see test 010 + } + + public function test036VoidTest20() + { + // see test 020 + } + + /// Time Out Reversal + public function test036bTimeoutReversal() + { + $sale = TestCards::visaManual()->charge(911) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withClientTransactionId('987321654') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $sale != null); + $this->assertEquals('91', $sale->responseCode); + + $response = Transaction::fromId(null, PaymentMethodType::CREDIT); + $response->clientTransactionId = '987321654'; + + $this->expectException(GatewayException::class); + $response->reverse(911)->execute(); + } + + /// One time bill payment + + public function test010ChargeVisaOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$visaToken; + } else { + $card = TestCards::visaManual(); + } + + $response = $card->charge(13.11) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $void = $response->void()->execute(); + + $this->assertEquals(true, $void != null); + $this->assertEquals('00', $void->responseCode); + } + + public function test011ChargeMasterCardOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$mastercardToken; + } else { + $card = TestCards::masterCardManual(); + } + + $response = $card->charge(13.12) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test012ChargeDiscoverOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$discoverToken; + } else { + $card = TestCards::discoverManual(); + } + + $response = $card->charge(13.13) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test013ChargeAmexOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$amexToken; + } else { + $card = TestCards::amexManual(); + } + + $response = $card->charge(13.14) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test014ChargeJcbOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '3566007770007321'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + $card->cvn = '123'; + + $response = $card->charge(13.15) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ADVANCED FRAUD SCREENING + + /** + * TODO: Change code assertions when AFS is enabled on account + */ + public function test037FraudPreventionSale() + { + $card = TestCards::visaManual(); + + $response = $card->charge(15000) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + // $this->assertEquals('FR', $response->responseCode); + } + + /** + * TODO: Change code assertions when AFS is enabled on account + */ + public function test038FraudPreventionReturn() + { + $card = TestCards::visaManual(); + + $response = $card->refund(15000) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + // $this->assertEquals('41', $response->responseCode); + } + + /// ONE CARD - GSB CARD FUNCTIONS + + /// BALANCE INQUIRY + + public function test037BalanceInquiryGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::gsbManual(); + + $response = $card->balanceInquiry() + ->withAddress($address) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ADD VALUE + + public function test038AddValueGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $card = new CreditTrackData(); + $card->value = '%B6277220572999800^ / ^49121010557010000016000000?F;6277220572999800=49121010557010000016?'; + + $response = $card->addValue(15.00) + ->withCurrency('USD') + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// SALE + + public function test039ChargeGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::gsbManual(); + + $response = $card->charge(2.05) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $voidResponse = $response->void() + ->execute(); + $this->assertEquals(true, $voidResponse != null); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test040ChargeGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::gsbManual(); + + $response = $card->charge(2.10) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ONLINE VOID / REVERSAL + + public function test041VoidGsb() + { + // see test 039 + } + + /// HMS GIFT - REWARDS + + /// ACTIVATE + + public function test042ActivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->activate(6.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test043ActivateGift2() + { + + $card = TestCards::giftCard2Manual(); + + $response = $card->activate(7.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// LOAD / ADD VALUE + + public function test044AddValueGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->addValue(8.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test045AddValueGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->addValue(9.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// BALANCE INQUIRY + + public function test046BalanceInquiryGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + public function test047BalanceInquiryGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + /// REPLACE / TRANSFER + + public function test048ReplaceGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->replaceWith(TestCards::giftCard2Manual()) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + public function test049ReplaceGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->replaceWith(TestCards::giftCard1Swipe()) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + /// SALE / REDEEM + + public function test050SaleGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(1.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test051SaleGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(2.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test052SaleGift1Void() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(3.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $voidResponse = $response->void() + ->execute(); + $this->assertEquals(true, $voidResponse != null); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test053SaleGift2Reversal() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(4.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $reversalResponse = $response->reverse(4.00) + ->execute(); + $this->assertEquals(true, $reversalResponse != null); + $this->assertEquals('00', $reversalResponse->responseCode); + } + + /// VOID + + public function test054VoidGift() + { + // see test 052 + } + + /// REVERSAL + + public function test055ReversalGift() + { + // see test 053 + } + + public function test056ReversalGift2() + { + $card = TestCards::giftCard2Manual(); + + $reversalResponse = $card->reverse(2.00) + ->execute(); + $this->assertEquals(true, $reversalResponse != null); + $this->assertEquals('00', $reversalResponse->responseCode); + } + + /// DEACTIVATE + + public function test057DeactivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->deactivate() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// RECEIPTS MESSAGING + + public function test058ReceiptsMessaging() + { + return; # print and scan receipt for test 51 + } + + /// REWARD + + /// BALANCE INQUIRY + + public function test059BalanceInquiryRewards1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertTrue($response->pointsBalanceAmount > 0); + } + + public function test060BalanceInquiryRewards2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertTrue($response->pointsBalanceAmount > 0); + } + + /// ALIAS + + public function test061CreateAliasGift1() + { + $response = GiftCard::create('9725550100'); + + $this->assertEquals(true, $response != null); + } + + public function test062CreateAliasGift2() + { + $response = GiftCard::create('9725550100'); + + $this->assertEquals(true, $response != null); + } + + public function test063AddAliasGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->addAlias('2145550199') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test064AddAliasGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->addAlias('2145550199') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test065DeleteAliasGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->removeAlias('2145550199') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// SALE / REDEEM + + public function test066RedeemPointsGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(100) + ->withCurrency('POINTS') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test067RedeemPointsGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(200) + ->withCurrency('POINTS') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test068RedeemPointsGift2() + { + $card = new GiftCard(); + $card->alias = '9725550100'; + + $response = $card->charge(300) + ->withCurrency('POINTS') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// REWARDS + + public function test069RewardsGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->rewards(10) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test070RewardsGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->rewards(11) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// REPLACE / TRANSFER + + public function test071ReplaceGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->replaceWith(TestCards::giftCard2Manual()) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test072ReplaceGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->replaceWith(TestCards::giftCard1Swipe()) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// DEACTIVATE + + public function test073DeactivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->deactivate() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test074DeactivateGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->deactivate() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// RECEIPTS MESSAGING + + public function test075ReceiptsMessaging() + { + return; # print and scan receipt for test 51 + } + + /// CLOSE BATCH + + public function test999CloseBatch() + { + try { + $response = BatchService::closeBatch(); + $this->assertNotNull($response); + // printf('batch id: %s', $response->id); + // printf('sequence number: %s', $response->sequenceNumber); + } catch (ApiException $e) { + if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) + && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) + ) { + $this->fail($e->getMessage()); + } + } + } + + public function test100ChargeVisaEcommerceInfo() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $secureEcom = new ThreeDSecure(); + $secureEcom->cavv = 'AAACBllleHchZTBWIGV4AAAAAAA='; + $secureEcom->xid = 'crqAeMwkEL9r4POdxpByWJ1/wYg='; + $secureEcom->eci = '5'; + $secureEcom->paymentDataSource = Secure3dPaymentDataSource::VISA_3DSECURE; + $secureEcom->paymentDataType = '3DSecure'; + + $card = TestCards::visaManual(); + $card->threeDSecure = $secureEcom; + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(13.01) + ->withAddress($address) + // ->withEcommerceInfo($this->ecommerceInfo) + ->withInvoiceNumber('12345') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } +} diff --git a/test/Integration/Gateways/PorticoConnector/Certifications/MotoCheckTest.php b/test/Integration/Gateways/PorticoConnector/Certifications/MotoCheckTest.php index 6400b5c8..72afddf3 100644 --- a/test/Integration/Gateways/PorticoConnector/Certifications/MotoCheckTest.php +++ b/test/Integration/Gateways/PorticoConnector/Certifications/MotoCheckTest.php @@ -1,108 +1,108 @@ -secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - protected function setup() - { - ServicesContainer::configure($this->config()); - - $this->address = new Address(); - $this->address->streetAddress1 = '123 Main St.'; - $this->address->city = 'Downtown'; - $this->address->province = 'NJ'; - $this->address->postalCode = '12345'; - } - - public function test001ConsumerPersonalChecking() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(19.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test002ConsumerBusinessChecking() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(20.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test003ConsumerPersonalSavings() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(21.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test004ConsumerBusinessSavings() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(22.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } -} +secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + protected function setup() + { + ServicesContainer::configureService($this->config()); + + $this->address = new Address(); + $this->address->streetAddress1 = '123 Main St.'; + $this->address->city = 'Downtown'; + $this->address->province = 'NJ'; + $this->address->postalCode = '12345'; + } + + public function test001ConsumerPersonalChecking() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::PERSONAL, + AccountType::CHECKING + ); + + $response = $check->charge(19.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test002ConsumerBusinessChecking() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(20.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test003ConsumerPersonalSavings() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::PERSONAL, + AccountType::SAVINGS + ); + + $response = $check->charge(21.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test004ConsumerBusinessSavings() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::BUSINESS, + AccountType::SAVINGS + ); + + $response = $check->charge(22.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } +} diff --git a/test/Integration/Gateways/PorticoConnector/Certifications/MotoTest.php b/test/Integration/Gateways/PorticoConnector/Certifications/MotoTest.php index fa3efa6d..e73330a9 100644 --- a/test/Integration/Gateways/PorticoConnector/Certifications/MotoTest.php +++ b/test/Integration/Gateways/PorticoConnector/Certifications/MotoTest.php @@ -1,1697 +1,1713 @@ -secretApiKey = 'skapi_cert_MRCQAQBC_VQACBE0rFaZlbDDPieMGP06JDAtjyS7NQ'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - protected function setup() - { - ServicesContainer::configure($this->config()); - - $this->ecommerceInfo = new EcommerceInfo(); - $this->ecommerceInfo->channel = EcommerceChannel::MOTO; - } - - public function test000CloseBatch() - { - try { - $response = BatchService::closeBatch(); - $this->assertNotNull($response); - // print 'batch id: ' . $response->id . "\n"; - // print 'sequence number: ' . $response->sequenceNumber . "\n"; - } catch (ApiException $e) { - if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) - && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) - ) { - $this->fail($e->getMessage()); - } - } - } - - public function test001VerifyVisa() - { - $card = new CreditCardData(); - $card->number = '4484958240202792'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - - $response = $card->verify() - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test002VerifyMasterCard() - { - $card = new CreditCardData(); - $card->number = '5356083898949891'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - - $response = $card->verify() - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test003VerifyDiscover() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '6223971100014620'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - - $response = $card->verify() - ->withAddress($address) - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // StreetAddress verification - - public function test004VerifyAmex() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '345039962663847'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - - $response = $card->verify() - ->withAddress($address) - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Balance Inquiry (for prepaid card) - - public function test005BalanceInquiryVisa() - { - $card = new CreditCardData(); - $card->number = '4664383951958601'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - - $response = $card->balanceInquiry()->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode, $response->responseMessage); - } - - // CREDIT SALE (for multi-use token only) - - public function test006ChargeVisaToken() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '4012002000060016'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - - $response = $card->charge(13.01) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - static::$visaToken = $response->token; - } - - public function test007ChargeMasterCardToken() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '5473500000000014'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - $card->cvn = '123'; - - $response = $card->charge(13.02) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - static::$mastercardToken = $response->token; - } - - public function test008ChargeDiscoverToken() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = new CreditCardData(); - $card->number = '6011000990156527'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - $card->cvn = '123'; - - $response = $card->charge(13.03) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - static::$discoverToken = $response->token; - } - - public function test009ChargeAmexToken() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '372700699251018'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - $card->cvn = '1234'; - - $response = $card->charge(13.04) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - static::$amexToken = $response->token; - } - - // CREDIT SALE - - public function test010ChargeVisa() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$visaToken; - } else { - $card = TestCards::visaManual(); - } - - $response = $card->charge(17.01) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 35 - $void = $response->void()->execute(); - - $this->assertNotNull($void); - $this->assertEquals('00', $void->responseCode); - } - - public function test011ChargeMasterCard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$mastercardToken; - } else { - $card = TestCards::masterCardManual(); - } - - $response = $card->charge(17.02) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test012ChargeDiscover() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$discoverToken; - } else { - $card = TestCards::discoverManual(); - } - - $response = $card->charge(17.03) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test013ChargeAmex() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$amexToken; - } else { - $card = TestCards::amexManual(); - } - - $response = $card->charge(17.04) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test014ChargeJcb() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '750241234'; - - $card = new CreditCardData(); - $card->number = '3566007770007321'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - $card->cvn = '123'; - - $response = $card->charge(17.05) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test011bChargeMasterCard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardSeries2Manual(); - - $response = $card->charge(17.02) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // AUTHORIZATION - - - public function test015AuthorizationVisa() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->authorize(17.06) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 15b - $capture = $response->capture()->execute(); - - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function test016AuthorizationMasterCard() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '750241234'; - - $card = TestCards::masterCardManual(); - - $response = $card->authorize(17.07) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 16b - $capture = $response->capture()->execute(); - - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function test017AuthorizationDiscover() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::discoverManual(); - - $response = $card->authorize(17.08) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test016bAuthorizationMasterCard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardSeries2Manual(); - - $response = $card->authorize(17.02) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // PARTIALLY APPROVED SALE - - public function test018PartialApprovalVisa() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(130) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowPartialAuth(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals('110.00', $response->authorizedAmount); - } - - public function test019PartialApprovalDiscover() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::discoverManual(); - - $response = $card->charge(145) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowPartialAuth(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals('65.00', $response->authorizedAmount); - } - - public function test020PartialApprovalMasterCard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(155) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowPartialAuth(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals('100.00', $response->authorizedAmount); - - // test case 36 - $void = $response->void()->execute(); - - $this->assertNotNull($void); - $this->assertEquals('00', $void->responseCode); - } - /// LEVEL II CORPORATE PURCHASE CARD - - public function test021LevelIIResponseB() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '750241234'; - - $card = TestCards::visaManual(); - - $response = $card->charge(112.34) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('B', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test022LevelIIResponseB() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = TestCards::visaManual(); - - $response = $card->charge(112.34) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('B', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test023LevelIIResponseR() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(123.45) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('R', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test024LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(134.56) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test025LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.06) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test026LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.07) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test027LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.08) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test028LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.09) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test029LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.10) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test030LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.11) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test031LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.12) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test032LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.13) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - /// PRIOR / VOICE AUTHORIZATION - - public function test033OfflineSale() - { - $card = TestCards::visaManual(); - - $response = $card->charge(17.10) - ->withCurrency('USD') - ->withModifier(TransactionModifier::OFFLINE) - ->withOfflineAuthCode('654321') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test033OfflineAuthorization() - { - $card = TestCards::visaManual(); - - $response = $card->authorize(17.10) - ->withCurrency('USD') - ->withModifier(TransactionModifier::OFFLINE) - ->withOfflineAuthCode('654321') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// RETURN - - public function test034OfflineCreditReturn() - { - $card = TestCards::masterCardManual(); - - $response = $card->refund(15.15) - ->withCurrency('USD') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test034bOfflineCreditReturn() - { - $card = TestCards::masterCardManual(); - - $response = $card->refund(15.16) - ->withCurrency('USD') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ONLINE VOID / REVERSAL - - public function test035VoidTest10() - { - // see test 010 - } - - public function test036VoidTest20() - { - // see test 020 - } - - /// Time Out Reversal - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\UnsupportedTransactionException - */ - public function test036bTimeoutReversal() - { - $sale = TestCards::visaManual()->charge(911) - ->withCurrency('USD') - ->withClientTransactionId('987321654') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $sale != null); - $this->assertEquals('91', $sale->responseCode); - - $response = Transaction::fromId(null, PaymentMethodType::CREDIT); - $response->clientTransactionId = '987321654'; - - $response->reverse(911)->execute(); - } - - /// One time bill payment - - public function test010ChargeVisaOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$visaToken; - } else { - $card = TestCards::visaManual(); - } - - $response = $card->charge(13.11) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $void = $response->void()->execute(); - - $this->assertEquals(true, $void != null); - $this->assertEquals('00', $void->responseCode); - } - - public function test011ChargeMasterCardOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$mastercardToken; - } else { - $card = TestCards::masterCardManual(); - } - - $response = $card->charge(13.12) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test012ChargeDiscoverOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$discoverToken; - } else { - $card = TestCards::discoverManual(); - } - - $response = $card->charge(13.13) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test013ChargeAmexOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$amexToken; - } else { - $card = TestCards::amexManual(); - } - - $response = $card->charge(13.14) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test014ChargeJcbOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '3566007770007321'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - $card->cvn = '123'; - - $response = $card->charge(13.15) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ADVANCED FRAUD SCREENING - - /** - * TODO: Change code assertions when AFS is enabled on account - */ - public function test037FraudPreventionSale() - { - $card = TestCards::visaManual(); - - $response = $card->charge(15000) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - // $this->assertEquals('FR', $response->responseCode); - } - - /** - * TODO: Change code assertions when AFS is enabled on account - */ - public function test038FraudPreventionReturn() - { - $card = TestCards::visaManual(); - - $response = $card->refund(15000) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - // $this->assertEquals('41', $response->responseCode); - } - - /// ONE CARD - GSB CARD FUNCTIONS - - /// BALANCE INQUIRY - - public function test037BalanceInquiryGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::gsbManual(); - - $response = $card->balanceInquiry() - ->withAddress($address) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ADD VALUE - - public function test038AddValueGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $card = new CreditTrackData(); - $card->value = '%B6277220572999800^ / ^49121010557010000016000000?F;6277220572999800=49121010557010000016?'; - - $response = $card->addValue(15.00) - ->withCurrency('USD') - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// SALE - - public function test039ChargeGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::gsbManual(); - - $response = $card->charge(2.05) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $voidResponse = $response->void() - ->execute(); - $this->assertEquals(true, $voidResponse != null); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test040ChargeGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::gsbManual(); - - $response = $card->charge(2.10) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ONLINE VOID / REVERSAL - - public function test041VoidGsb() - { - // see test 039 - } - - /// HMS GIFT - REWARDS - - /// ACTIVATE - - public function test042ActivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->activate(6.00) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test043ActivateGift2() - { - - $card = TestCards::giftCard2Manual(); - - $response = $card->activate(7.00) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// LOAD / ADD VALUE - - public function test044AddValueGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->addValue(8.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test045AddValueGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->addValue(9.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// BALANCE INQUIRY - - public function test046BalanceInquiryGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - public function test047BalanceInquiryGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - /// REPLACE / TRANSFER - - public function test048ReplaceGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->replaceWith(TestCards::giftCard2Manual()) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - public function test049ReplaceGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->replaceWith(TestCards::giftCard1Swipe()) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - /// SALE / REDEEM - - public function test050SaleGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(1.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test051SaleGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(2.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test052SaleGift1Void() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(3.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $voidResponse = $response->void() - ->execute(); - $this->assertEquals(true, $voidResponse != null); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test053SaleGift2Reversal() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(4.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $reversalResponse = $response->reverse(4.00) - ->execute(); - $this->assertEquals(true, $reversalResponse != null); - $this->assertEquals('00', $reversalResponse->responseCode); - } - - /// VOID - - public function test054VoidGift() - { - // see test 052 - } - - /// REVERSAL - - public function test055ReversalGift() - { - // see test 053 - } - - public function test056ReversalGift2() - { - $card = TestCards::giftCard2Manual(); - - $reversalResponse = $card->reverse(2.00) - ->execute(); - $this->assertEquals(true, $reversalResponse != null); - $this->assertEquals('00', $reversalResponse->responseCode); - } - - /// DEACTIVATE - - public function test057DeactivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->deactivate() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// RECEIPTS MESSAGING - - public function test058ReceiptsMessaging() - { - return; # print and scan receipt for test 51 - } - - /// REWARD - - /// BALANCE INQUIRY - - public function test059BalanceInquiryRewards1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->pointsBalanceAmount); - } - - public function test060BalanceInquiryRewards2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->pointsBalanceAmount); - } - - /// ALIAS - - public function test061CreateAliasGift1() - { - $response = GiftCard::create('9725550100'); - - $this->assertEquals(true, $response != null); - } - - public function test062CreateAliasGift2() - { - $response = GiftCard::create('9725550100'); - - $this->assertEquals(true, $response != null); - } - - public function test063AddAliasGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->addAlias('2145550199') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test064AddAliasGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->addAlias('2145550199') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test065DeleteAliasGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->removeAlias('2145550199') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// SALE / REDEEM - - public function test066RedeemPointsGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(100) - ->withCurrency('POINTS') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test067RedeemPointsGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(200) - ->withCurrency('POINTS') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test068RedeemPointsGift2() - { - $card = new GiftCard(); - $card->alias = '9725550100'; - - $response = $card->charge(300) - ->withCurrency('POINTS') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// REWARDS - - public function test069RewardsGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->rewards(10) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test070RewardsGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->rewards(11) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// REPLACE / TRANSFER - - public function test071ReplaceGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->replaceWith(TestCards::giftCard2Manual()) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test072ReplaceGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->replaceWith(TestCards::giftCard1Swipe()) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// DEACTIVATE - - public function test073DeactivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->deactivate() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test074DeactivateGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->deactivate() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// RECEIPTS MESSAGING - - public function test075ReceiptsMessaging() - { - return; # print and scan receipt for test 51 - } - - /// CLOSE BATCH - - public function test999CloseBatch() - { - try { - $response = BatchService::closeBatch(); - $this->assertNotNull($response); - // printf('batch id: %s', $response->id); - // printf('sequence number: %s', $response->sequenceNumber); - } catch (ApiException $e) { - if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) - || false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) - ) { - $this->fail($e->getMessage()); - } - } - } -} +secretApiKey = 'skapi_cert_MRCQAQBC_VQACBE0rFaZlbDDPieMGP06JDAtjyS7NQ'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + protected function setup() + { + ServicesContainer::configureService($this->config()); + + $this->ecommerceInfo = new EcommerceInfo(); + $this->ecommerceInfo->channel = EcommerceChannel::MOTO; + } + + public function test000CloseBatch() + { + try { + $response = BatchService::closeBatch(); + $this->assertNotNull($response); + // print 'batch id: ' . $response->id . "\n"; + // print 'sequence number: ' . $response->sequenceNumber . "\n"; + } catch (ApiException $e) { + if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) + && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) + ) { + $this->fail($e->getMessage()); + } + } + } + + public function test001VerifyVisa() + { + $card = new CreditCardData(); + $card->number = '4484958240202792'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + + $response = $card->verify() + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test002VerifyMasterCard() + { + $card = new CreditCardData(); + $card->number = '5356083898949891'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + + $response = $card->verify() + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test003VerifyDiscover() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '6223971100014620'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + + $response = $card->verify() + ->withAddress($address) + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // StreetAddress verification + + public function test004VerifyAmex() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '345039962663847'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + + $response = $card->verify() + ->withAddress($address) + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Balance Inquiry (for prepaid card) + + public function test005BalanceInquiryVisa() + { + $card = new CreditCardData(); + $card->number = '4664383951958601'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + + $response = $card->balanceInquiry()->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode, $response->responseMessage); + } + + // CREDIT SALE (for multi-use token only) + + public function test006ChargeVisaToken() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '4012002000060016'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + + $response = $card->charge(13.01) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + static::$visaToken = $response->token; + } + + public function test007ChargeMasterCardToken() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '5473500000000014'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + $card->cvn = '123'; + + $response = $card->charge(13.02) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + static::$mastercardToken = $response->token; + } + + public function test008ChargeDiscoverToken() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = new CreditCardData(); + $card->number = '6011000990156527'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + $card->cvn = '123'; + + $response = $card->charge(13.03) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + static::$discoverToken = $response->token; + } + + public function test009ChargeAmexToken() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '372700699251018'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + $card->cvn = '1234'; + + $response = $card->charge(13.04) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + static::$amexToken = $response->token; + } + + // CREDIT SALE + + public function test010ChargeVisa() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$visaToken; + } else { + $card = TestCards::visaManual(); + } + + $response = $card->charge(17.01) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 35 + $void = $response->void()->execute(); + + $this->assertNotNull($void); + $this->assertEquals('00', $void->responseCode); + } + + public function test011ChargeMasterCard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$mastercardToken; + } else { + $card = TestCards::masterCardManual(); + } + + $response = $card->charge(17.02) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test012ChargeDiscover() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$discoverToken; + } else { + $card = TestCards::discoverManual(); + } + + $response = $card->charge(17.03) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test013ChargeAmex() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$amexToken; + } else { + $card = TestCards::amexManual(); + } + + $response = $card->charge(17.04) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test014ChargeJcb() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '750241234'; + + $card = new CreditCardData(); + $card->number = '3566007770007321'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + $card->cvn = '123'; + + $response = $card->charge(17.05) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test011bChargeMasterCard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardSeries2Manual(); + + $response = $card->charge(17.02) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // AUTHORIZATION + + + public function test015AuthorizationVisa() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->authorize(17.06) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 15b + $capture = $response->capture()->execute(); + + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function test016AuthorizationMasterCard() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '750241234'; + + $card = TestCards::masterCardManual(); + + $response = $card->authorize(17.07) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 16b + $capture = $response->capture()->execute(); + + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function test017AuthorizationDiscover() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::discoverManual(); + + $response = $card->authorize(17.08) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test016bAuthorizationMasterCard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardSeries2Manual(); + + $response = $card->authorize(17.02) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // PARTIALLY APPROVED SALE + + public function test018PartialApprovalVisa() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(130) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowPartialAuth(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals('110.00', $response->authorizedAmount); + } + + public function test019PartialApprovalDiscover() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::discoverManual(); + + $response = $card->charge(145) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowPartialAuth(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals('65.00', $response->authorizedAmount); + } + + public function test020PartialApprovalMasterCard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(155) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowPartialAuth(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals('100.00', $response->authorizedAmount); + + // test case 36 + $void = $response->void()->execute(); + + $this->assertNotNull($void); + $this->assertEquals('00', $void->responseCode); + } + /// LEVEL II CORPORATE PURCHASE CARD + + public function test021LevelIIResponseB() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '750241234'; + + $card = TestCards::visaManual(); + + $response = $card->charge(112.34) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('B', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test022LevelIIResponseB() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = TestCards::visaManual(); + + $response = $card->charge(112.34) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('B', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test023LevelIIResponseR() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(123.45) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('R', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test024LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(134.56) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test025LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.06) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test026LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.07) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test027LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.08) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test028LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.09) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test029LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.10) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test030LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.11) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test031LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.12) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test032LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.13) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + /// PRIOR / VOICE AUTHORIZATION + + public function test033OfflineSale() + { + $card = TestCards::visaManual(); + + $response = $card->charge(17.10) + ->withCurrency('USD') + ->withModifier(TransactionModifier::OFFLINE) + ->withOfflineAuthCode('654321') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test033OfflineAuthorization() + { + $card = TestCards::visaManual(); + + $response = $card->authorize(17.10) + ->withCurrency('USD') + ->withModifier(TransactionModifier::OFFLINE) + ->withOfflineAuthCode('654321') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// RETURN + + public function test034OfflineCreditReturn() + { + $card = TestCards::masterCardManual(); + + $response = $card->refund(15.15) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test034bOfflineCreditReturn() + { + $card = TestCards::masterCardManual(); + + $response = $card->refund(15.16) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ONLINE VOID / REVERSAL + + public function test035VoidTest10() + { + // see test 010 + } + + public function test036VoidTest20() + { + // see test 020 + } + + /// Time Out Reversal + public function test036bTimeoutReversal() + { + $sale = TestCards::visaManual()->charge(911) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withClientTransactionId('987321654') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $sale != null); + $this->assertEquals('91', $sale->responseCode); + + $response = Transaction::fromId(null, PaymentMethodType::CREDIT); + $response->clientTransactionId = '987321654'; + + $this->expectException(GatewayException::class); + $response->reverse(911)->execute(); + } + + /// One time bill payment + + public function test010ChargeVisaOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$visaToken; + } else { + $card = TestCards::visaManual(); + } + + $response = $card->charge(13.11) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $void = $response->void()->execute(); + + $this->assertEquals(true, $void != null); + $this->assertEquals('00', $void->responseCode); + } + + public function test011ChargeMasterCardOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$mastercardToken; + } else { + $card = TestCards::masterCardManual(); + } + + $response = $card->charge(13.12) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test012ChargeDiscoverOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$discoverToken; + } else { + $card = TestCards::discoverManual(); + } + + $response = $card->charge(13.13) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test013ChargeAmexOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$amexToken; + } else { + $card = TestCards::amexManual(); + } + + $response = $card->charge(13.14) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test014ChargeJcbOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '3566007770007321'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + $card->cvn = '123'; + + $response = $card->charge(13.15) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ADVANCED FRAUD SCREENING + + /** + * TODO: Change code assertions when AFS is enabled on account + */ + public function test037FraudPreventionSale() + { + $card = TestCards::visaManual(); + + $response = $card->charge(15000) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + // $this->assertEquals('FR', $response->responseCode); + } + + /** + * TODO: Change code assertions when AFS is enabled on account + */ + public function test038FraudPreventionReturn() + { + $card = TestCards::visaManual(); + + $response = $card->refund(15000) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + // $this->assertEquals('41', $response->responseCode); + } + + /// ONE CARD - GSB CARD FUNCTIONS + + /// BALANCE INQUIRY + + public function test037BalanceInquiryGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::gsbManual(); + + $response = $card->balanceInquiry() + ->withAddress($address) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ADD VALUE + + public function test038AddValueGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $card = new CreditTrackData(); + $card->value = '%B6277220572999800^ / ^49121010557010000016000000?F;6277220572999800=49121010557010000016?'; + + $response = $card->addValue(15.00) + ->withCurrency('USD') + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// SALE + + public function test039ChargeGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::gsbManual(); + + $response = $card->charge(2.05) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $voidResponse = $response->void() + ->execute(); + $this->assertEquals(true, $voidResponse != null); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test040ChargeGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::gsbManual(); + + $response = $card->charge(2.10) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ONLINE VOID / REVERSAL + + public function test041VoidGsb() + { + // see test 039 + } + + /// HMS GIFT - REWARDS + + /// ACTIVATE + + public function test042ActivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->activate(6.00) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test043ActivateGift2() + { + + $card = TestCards::giftCard2Manual(); + + $response = $card->activate(7.00) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// LOAD / ADD VALUE + + public function test044AddValueGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->addValue(8.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test045AddValueGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->addValue(9.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// BALANCE INQUIRY + + public function test046BalanceInquiryGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + public function test047BalanceInquiryGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + /// REPLACE / TRANSFER + + public function test048ReplaceGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->replaceWith(TestCards::giftCard2Manual()) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + public function test049ReplaceGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->replaceWith(TestCards::giftCard1Swipe()) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + /// SALE / REDEEM + + public function test050SaleGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(1.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test051SaleGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(2.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test052SaleGift1Void() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(3.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $voidResponse = $response->void() + ->execute(); + $this->assertEquals(true, $voidResponse != null); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test053SaleGift2Reversal() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(4.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $reversalResponse = $response->reverse(4.00) + ->execute(); + $this->assertEquals(true, $reversalResponse != null); + $this->assertEquals('00', $reversalResponse->responseCode); + } + + /// VOID + + public function test054VoidGift() + { + // see test 052 + } + + /// REVERSAL + + public function test055ReversalGift() + { + // see test 053 + } + + public function test056ReversalGift2() + { + $card = TestCards::giftCard2Manual(); + + $reversalResponse = $card->reverse(2.00) + ->execute(); + $this->assertEquals(true, $reversalResponse != null); + $this->assertEquals('00', $reversalResponse->responseCode); + } + + /// DEACTIVATE + + public function test057DeactivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->deactivate() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// RECEIPTS MESSAGING + + public function test058ReceiptsMessaging() + { + return; # print and scan receipt for test 51 + } + + /// REWARD + + /// BALANCE INQUIRY + + public function test059BalanceInquiryRewards1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertTrue($response->pointsBalanceAmount > 0); + } + + public function test060BalanceInquiryRewards2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertTrue($response->pointsBalanceAmount > 0); + } + + /// ALIAS + + public function test061CreateAliasGift1() + { + $response = GiftCard::create('9725550100'); + + $this->assertEquals(true, $response != null); + } + + public function test062CreateAliasGift2() + { + $response = GiftCard::create('9725550100'); + + $this->assertEquals(true, $response != null); + } + + public function test063AddAliasGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->addAlias('2145550199') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test064AddAliasGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->addAlias('2145550199') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test065DeleteAliasGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->removeAlias('2145550199') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// SALE / REDEEM + + public function test066RedeemPointsGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(100) + ->withCurrency('POINTS') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test067RedeemPointsGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(200) + ->withCurrency('POINTS') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test068RedeemPointsGift2() + { + $card = new GiftCard(); + $card->alias = '9725550100'; + + $response = $card->charge(300) + ->withCurrency('POINTS') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// REWARDS + + public function test069RewardsGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->rewards(10) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test070RewardsGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->rewards(11) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// REPLACE / TRANSFER + + public function test071ReplaceGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->replaceWith(TestCards::giftCard2Manual()) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test072ReplaceGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->replaceWith(TestCards::giftCard1Swipe()) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// DEACTIVATE + + public function test073DeactivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->deactivate() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test074DeactivateGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->deactivate() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// RECEIPTS MESSAGING + + public function test075ReceiptsMessaging() + { + return; # print and scan receipt for test 51 + } + + /// CLOSE BATCH + + public function test999CloseBatch() + { + try { + $response = BatchService::closeBatch(); + $this->assertNotNull($response); + // printf('batch id: %s', $response->id); + // printf('sequence number: %s', $response->sequenceNumber); + } catch (ApiException $e) { + if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) + || false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) + ) { + $this->fail($e->getMessage()); + } + } + } +} diff --git a/test/Integration/Gateways/PorticoConnector/Certifications/RecurringTest.php b/test/Integration/Gateways/PorticoConnector/Certifications/RecurringTest.php index e615271b..a190fc4b 100644 --- a/test/Integration/Gateways/PorticoConnector/Certifications/RecurringTest.php +++ b/test/Integration/Gateways/PorticoConnector/Certifications/RecurringTest.php @@ -1,630 +1,626 @@ -identifierBase, $this->todayDate, $identifier); - } - - /** - * @return PorticoConfig - */ - private function config() - { - $config = new PorticoConfig(); - $config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - public function setup() : void - { - ServicesContainer::configureService($this->config()); - - $this->todayDate = date('Ymd'); - $this->identifierBase = substr( - sprintf('%s-%%s', GenerationUtils::getGuid()), - 0, - 10 - ); - } - - public function test000CleanUp() - { - try { - $results = Schedule::findAll(); - foreach ($results as $schedule) { - $schedule->delete(true); - } - } catch (\Exception $e) { - } - - try { - $results = RecurringPaymentMethod::findAll(); - foreach ($results as $paymentMethod) { - $paymentMethod->delete(true); - } - } catch (\Exception $e) { - } - - try { - $results = Customer::findAll(); - foreach ($results as $customer) { - $customer->delete(true); - } - } catch (\Exception $e) { - } - } - - // CUSTOMER SETUP - - public function test001AddCustomerPerson() - { - $customer = new Customer(); - $customer->id = $this->getIdentifier('Person'); - $customer->firstName = 'John'; - $customer->lastName = 'Doe'; - $customer->status = 'Active'; - $customer->email = 'john.doe@example.com'; - $customer->address = new Address(); - $customer->address->streetAddress1 = '123 Main St.'; - $customer->address->city = 'Dallas'; - $customer->address->province = 'TX'; - $customer->address->postalCode = '75024'; - $customer->address->country = 'USA'; - $customer->workPhone = '5551112222'; - - $customer = $customer->create(); - - $this->assertNotNull($customer); - $this->assertNotNull($customer->key); - static::$customerPerson = $customer; - - $found = Customer::find($customer->id); - $this->assertNotNull($found); - } - - public function test002AddCustomerBusiness() - { - $customer = new Customer(); - $customer->id = $this->getIdentifier('Business'); - $customer->company = 'AcmeCo'; - $customer->status = 'Active'; - $customer->email = 'john.doe@example.com'; - $customer->address = new Address(); - $customer->address->streetAddress1 = '987 Elm St.'; - $customer->address->city = 'Princeton'; - $customer->address->province = 'NJ'; - $customer->address->postalCode = '12345'; - $customer->address->country = 'USA'; - $customer->workPhone = '5551112222'; - - $customer = $customer->create(); - - $this->assertNotNull($customer); - $this->assertNotNull($customer->key); - static::$customerBusiness = $customer; - } - - // PAYMENT METHOD SETUP - - public function test003AddPaymentCreditVisa() - { - if (static::$customerPerson === null) { - $this->markTestIncomplete(); - } - - $card = new CreditCardData(); - $card->number = '4012002000060016'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - - $paymentMethod = static::$customerPerson->addPaymentMethod( - $this->getIdentifier('CreditV'), - $card - )->create(); - - $this->assertNotNull($paymentMethod); - $this->assertNotNull($paymentMethod->key); - static::$paymentMethodVisa = $paymentMethod; - } - - public function test004AddPaymentCreditMasterCard() - { - if (static::$customerPerson === null) { - $this->markTestIncomplete(); - } - - $card = new CreditCardData(); - $card->number = '5473500000000014'; - $card->expMonth = '12'; - $card->expYear = TestCards::validCardExpYear(); - - $paymentMethod = static::$customerPerson->addPaymentMethod( - $this->getIdentifier('CreditMC'), - $card - )->create(); - - $this->assertNotNull($paymentMethod); - $this->assertNotNull($paymentMethod->key); - static::$paymentMethodMasterCard = $paymentMethod; - } - - public function test005AddPaymentCheckPpd() - { - if (static::$customerPerson === null) { - $this->markTestIncomplete(); - } - - $check = new ECheck(); - $check->accountType = AccountType::CHECKING; - $check->checkType = CheckType::PERSONAL; - $check->secCode = SecCode::PPD; - $check->routingNumber = '122000030'; - $check->driversLicenseNumber = '7418529630'; - $check->driversLicenseState = 'TX'; - $check->accountNumber = '1357902468'; - $check->birthYear = 1989; - - $paymentMethod = static::$customerPerson->addPaymentMethod( - $this->getIdentifier('CheckPpd'), - $check - )->create(); - - $this->assertNotNull($paymentMethod); - $this->assertNotNull($paymentMethod->key); - static::$paymentMethodCheckPpd = $paymentMethod; - } - - public function test006AddPaymentCheckCcd() - { - if (static::$customerBusiness === null) { - $this->markTestIncomplete(); - } - - $check = new eCheck(); - $check->accountType = AccountType::CHECKING; - $check->checkType = CheckType::BUSINESS; - $check->secCode = SecCode::CCD; - $check->routingNumber = '122000030'; - $check->driversLicenseNumber = '7418529630'; - $check->driversLicenseState = 'TX'; - $check->accountNumber = '1357902468'; - $check->birthYear = 1989; - - $paymentMethod = static::$customerBusiness->addPaymentMethod( - $this->getIdentifier('CheckCcd'), - $check - )->create(); - - $this->assertNotNull($paymentMethod); - $this->assertNotNull($paymentMethod->key); - static::$paymentMethodCheckCcd = $paymentMethod; - } - - // PAYMENT SETUP - DECLINED - - /** - * expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function test007AddPaymentCheckPpd() - { - if (static::$customerPerson === null) { - $this->markTestIncomplete(); - } - - $check = new eCheck(); - $check->accountType = AccountType::CHECKING; - $check->checkType = CheckType::PERSONAL; - $check->secCode = SecCode::PPD; - $check->routingNumber = '122000030'; - $check->driversLicenseNumber = '7418529630'; - $check->driversLicenseState = 'TX'; - $check->accountNumber = '1357902468'; - $check->birthYear = 1989; - - static::$customerPerson->addPaymentMethod( - $this->getIdentifier('CheckPpd'), - $check - )->create(); - } - - // Recurring Billing using PayPlan - Managed Schedule - - public function test008AddScheduleCreditVisa() - { - if (static::$paymentMethodVisa === null) { - $this->markTestIncomplete(); - } - - static::$scheduleVisaID = $this->getIdentifier('CreditV'); - - $schedule = static::$paymentMethodVisa->addSchedule( - static::$scheduleVisaID - ) - ->withStatus('Active') - ->withAmount(30.02) - ->withCurrency('USD') - ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) - ->withFrequency(ScheduleFrequency::WEEKLY) - ->withEndDate(\DateTime::createFromFormat('Y-m-d', '2027-04-01')) - ->withReprocessingCount(2) - ->create(); - - $this->assertNotNull($schedule); - $this->assertNotNull($schedule->key); - static::$scheduleVisa = $schedule; - } - - public function test009AddScheduleCreditMasterCard() - { - if (static::$paymentMethodMasterCard == null) { - $this->markTestIncomplete(); - } - - $schedule = static::$paymentMethodMasterCard->addSchedule( - $this->getIdentifier('CreditMC') - ) - ->withStatus('Active') - ->withAmount(30.02) - ->withCurrency('USD') - ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) - ->withFrequency(ScheduleFrequency::WEEKLY) - ->withEndDate(\DateTime::createFromFormat('Y-m-d', '2027-04-01')) - ->withReprocessingCount(2) - ->create(); - $this->assertNotNull($schedule); - $this->assertNotNull($schedule->key); - static::$scheduleMasterCard = $schedule; - } - - public function test010AddScheduleCheckPPD() - { - if (static::$paymentMethodCheckPpd == null) { - $this->markTestIncomplete(); - } - - $schedule = static::$paymentMethodCheckPpd->addSchedule( - $this->getIdentifier('CheckPPD') - ) - ->withStatus('Active') - ->withAmount(30.03) - ->withCurrency('USD') - ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) - ->withFrequency(ScheduleFrequency::MONTHLY) - ->withReprocessingCount(1) - ->withnumberOfPaymentsRemaining(2) - ->create(); - $this->assertNotNull($schedule); - $this->assertNotNull($schedule->key); - static::$scheduleCheckPpd = $schedule; - } - - public function test011AddScheduleCheckCCD() - { - if (static::$paymentMethodCheckCcd == null) { - $this->markTestIncomplete(); - } - - $schedule = static::$paymentMethodCheckCcd->addSchedule( - $this->getIdentifier('CheckCCD') - ) - ->withStatus('Active') - ->withAmount(30.04) - ->withCurrency('USD') - ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) - ->withFrequency(ScheduleFrequency::BI_WEEKLY) - ->withReprocessingCount(1) - ->create(); - $this->assertNotNull($schedule); - $this->assertNotNull($schedule->key); - static::$scheduleCheckCcd = $schedule; - } - - /** - * expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function test012AddScheduleCreditVisa() - { - if (static::$paymentMethodVisa == null) { - $this->markTestIncomplete(); - } - - $schedule = static::$paymentMethodVisa->addSchedule( - $this->getIdentifier('CreditV') - ) - ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) - ->withAmount(30.01) - ->withCurrency('USD') - ->withFrequency(ScheduleFrequency::WEEKLY) - ->withReprocessingCount(1) - ->withStatus('Active') - ->create(); - } - - /** - * expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function test013AddScheduleCCheckPPD() - { - if (static::$paymentMethodCheckPpd == null) { - $this->markTestIncomplete(); - } - - $schedule = static::$paymentMethodCheckPpd->addSchedule( - $this->getIdentifier('CheckPPD') - ) - ->withStatus('Active') - ->withAmount(30.03) - ->withCurrency('USD') - ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) - ->withFrequency(ScheduleFrequency::MONTHLY) - ->withReprocessingCount(1) - ->withnumberOfPaymentsRemaining(2) - ->create(); - } - - // Recurring Billing using PayPlan - Managed Schedule - - public function test014RecurringBillingVisa() - { - if (static::$paymentMethodVisa == null || static::$scheduleVisa == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodVisa->charge(20.01) - ->withCurrency('USD') - ->withScheduleId(static::$scheduleVisa->key) - ->withOneTimePayment(false) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test015RecurringBillingMasterCard() - { - if (true || static::$paymentMethodMasterCard == null || static::$scheduleMasterCard == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodMasterCard->charge(20.02) - ->withCurrency('USD') - ->withScheduleId(static::$scheduleVisa->key) - ->withOneTimePayment(false) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test016RecurringBillingCheckPPD() - { - if (static::$paymentMethodCheckPpd == null || static::$scheduleCheckPpd == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodCheckPpd->charge(20.03) - ->withCurrency('USD') - ->withScheduleId(static::$scheduleVisa->key) - ->withOneTimePayment(false) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test017RecurringBillingCheckCCD() - { - if (static::$paymentMethodCheckCcd == null || static::$scheduleCheckCcd == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodCheckCcd->charge(20.04) - ->withCurrency('USD') - ->withScheduleId(static::$scheduleVisa->key) - ->withOneTimePayment(false) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // One time bill payment - - public function test018RecurringBillingVisa() - { - if (static::$paymentMethodVisa == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodVisa->charge(20.06) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test019RecurringBillingMasterCard() - { - if (static::$paymentMethodMasterCard == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodMasterCard->charge(20.07) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test020RecurringBillingCheckPPD() - { - if (static::$paymentMethodCheckPpd == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodCheckPpd->charge(20.08) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test021RecurringBillingCheckCCD() - { - if (static::$paymentMethodCheckCcd == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodCheckCcd->charge(20.09) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Onetime bill payment - declined - - public function test022RecurringBillingVisa_Decline() - { - if (static::$paymentMethodVisa == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodVisa->charge(10.08) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('51', $response->responseCode); - } - - public function test023RecurringBillingCheckPPD_Decline() - { - if (true || static::$paymentMethodCheckPpd == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodCheckPpd->charge(25.02) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('1', $response->responseCode); - } - - public function test024RecurringBillingVisaWithCOF() - { - if (static::$paymentMethodVisa == null || static::$scheduleVisa == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodVisa->charge(20.01) - ->withCurrency('USD') - ->withScheduleId(static::$scheduleVisa->key) - ->withOneTimePayment(false) - ->withAllowDuplicates(true) - ->withCardBrandStorage(StoredCredentialInitiator::CARDHOLDER) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->cardBrandTransactionId); - - $nextResponse = static::$paymentMethodVisa->charge(20.01) - ->withCurrency('USD') - ->withScheduleId(static::$scheduleVisa->key) - ->withOneTimePayment(false) - ->withAllowDuplicates(true) - ->withCardBrandStorage(StoredCredentialInitiator::MERCHANT, $response->cardBrandTransactionId) - ->execute(); - - $this->assertNotNull($nextResponse); - $this->assertEquals('00', $nextResponse->responseCode); - } - - public function test025EditStartDateUsingString() - { - $schedule = Schedule::find(static::$scheduleVisaID); - $schedule->startDate = '01022026'; - $schedule->saveChanges(); - } - - public function test026EditStartDateUsingDateTimeObj() - { - $updateTimeValueAsObj = new DateTime(); - $updateTimeValueAsObj->add(new DateInterval('P1Y')); - - $schedule = Schedule::find(static::$scheduleVisaID); - $schedule->startDate = $updateTimeValueAsObj; - $schedule->saveChanges(); - } -} +identifierBase, $this->todayDate, $identifier); + } + + /** + * @return PorticoConfig + */ + private function config() + { + $config = new PorticoConfig(); + $config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + public function setup() : void + { + ServicesContainer::configureService($this->config()); + + $this->todayDate = date('Ymd'); + $this->identifierBase = substr( + sprintf('%s-%%s', GenerationUtils::getGuid()), + 0, + 10 + ); + } + + public function test000CleanUp() + { + try { + $results = Schedule::findAll(); + foreach ($results as $schedule) { + $schedule->delete(true); + } + } catch (\Exception $e) { + } + + try { + $results = RecurringPaymentMethod::findAll(); + foreach ($results as $paymentMethod) { + $paymentMethod->delete(true); + } + } catch (\Exception $e) { + } + + try { + $results = Customer::findAll(); + foreach ($results as $customer) { + $customer->delete(true); + } + } catch (\Exception $e) { + } + } + + // CUSTOMER SETUP + + public function test001AddCustomerPerson() + { + $customer = new Customer(); + $customer->id = $this->getIdentifier('Person'); + $customer->firstName = 'John'; + $customer->lastName = 'Doe'; + $customer->status = 'Active'; + $customer->email = 'john.doe@example.com'; + $customer->address = new Address(); + $customer->address->streetAddress1 = '123 Main St.'; + $customer->address->city = 'Dallas'; + $customer->address->province = 'TX'; + $customer->address->postalCode = '75024'; + $customer->address->country = 'USA'; + $customer->workPhone = '5551112222'; + + $customer = $customer->create(); + + $this->assertNotNull($customer); + $this->assertNotNull($customer->key); + static::$customerPerson = $customer; + + $found = Customer::find($customer->id); + $this->assertNotNull($found); + } + + public function test002AddCustomerBusiness() + { + $customer = new Customer(); + $customer->id = $this->getIdentifier('Business'); + $customer->company = 'AcmeCo'; + $customer->status = 'Active'; + $customer->email = 'john.doe@example.com'; + $customer->address = new Address(); + $customer->address->streetAddress1 = '987 Elm St.'; + $customer->address->city = 'Princeton'; + $customer->address->province = 'NJ'; + $customer->address->postalCode = '12345'; + $customer->address->country = 'USA'; + $customer->workPhone = '5551112222'; + + $customer = $customer->create(); + + $this->assertNotNull($customer); + $this->assertNotNull($customer->key); + static::$customerBusiness = $customer; + } + + // PAYMENT METHOD SETUP + + public function test003AddPaymentCreditVisa() + { + if (static::$customerPerson === null) { + $this->markTestIncomplete(); + } + + $card = new CreditCardData(); + $card->number = '4012002000060016'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + + $paymentMethod = static::$customerPerson->addPaymentMethod( + $this->getIdentifier('CreditV'), + $card + )->create(); + + $this->assertNotNull($paymentMethod); + $this->assertNotNull($paymentMethod->key); + static::$paymentMethodVisa = $paymentMethod; + } + + public function test004AddPaymentCreditMasterCard() + { + if (static::$customerPerson === null) { + $this->markTestIncomplete(); + } + + $card = new CreditCardData(); + $card->number = '5473500000000014'; + $card->expMonth = '12'; + $card->expYear = TestCards::validCardExpYear(); + + $paymentMethod = static::$customerPerson->addPaymentMethod( + $this->getIdentifier('CreditMC'), + $card + )->create(); + + $this->assertNotNull($paymentMethod); + $this->assertNotNull($paymentMethod->key); + static::$paymentMethodMasterCard = $paymentMethod; + } + + public function test005AddPaymentCheckPpd() + { + if (static::$customerPerson === null) { + $this->markTestIncomplete(); + } + + $check = new ECheck(); + $check->accountType = AccountType::CHECKING; + $check->checkType = CheckType::PERSONAL; + $check->secCode = SecCode::PPD; + $check->routingNumber = '122000030'; + $check->driversLicenseNumber = '7418529630'; + $check->driversLicenseState = 'TX'; + $check->accountNumber = '1357902468'; + $check->birthYear = 1989; + + $paymentMethod = static::$customerPerson->addPaymentMethod( + $this->getIdentifier('CheckPpd'), + $check + )->create(); + + $this->assertNotNull($paymentMethod); + $this->assertNotNull($paymentMethod->key); + static::$paymentMethodCheckPpd = $paymentMethod; + } + + public function test006AddPaymentCheckCcd() + { + if (static::$customerBusiness === null) { + $this->markTestIncomplete(); + } + + $check = new eCheck(); + $check->accountType = AccountType::CHECKING; + $check->checkType = CheckType::BUSINESS; + $check->secCode = SecCode::CCD; + $check->routingNumber = '122000030'; + $check->driversLicenseNumber = '7418529630'; + $check->driversLicenseState = 'TX'; + $check->accountNumber = '1357902468'; + $check->birthYear = 1989; + + $paymentMethod = static::$customerBusiness->addPaymentMethod( + $this->getIdentifier('CheckCcd'), + $check + )->create(); + + $this->assertNotNull($paymentMethod); + $this->assertNotNull($paymentMethod->key); + static::$paymentMethodCheckCcd = $paymentMethod; + } + + // PAYMENT SETUP - DECLINED + + /** + * expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function test007AddPaymentCheckPpd() + { + if (static::$customerPerson === null) { + $this->markTestIncomplete(); + } + + $check = new eCheck(); + $check->accountType = AccountType::CHECKING; + $check->checkType = CheckType::PERSONAL; + $check->secCode = SecCode::PPD; + $check->routingNumber = '122000030'; + $check->driversLicenseNumber = '7418529630'; + $check->driversLicenseState = 'TX'; + $check->accountNumber = '1357902468'; + $check->birthYear = 1989; + + static::$customerPerson->addPaymentMethod( + $this->getIdentifier('CheckPpd'), + $check + )->create(); + } + + // Recurring Billing using PayPlan - Managed Schedule + + public function test008AddScheduleCreditVisa() + { + if (static::$paymentMethodVisa === null) { + $this->markTestIncomplete(); + } + + static::$scheduleVisaID = $this->getIdentifier('CreditV'); + + $schedule = static::$paymentMethodVisa->addSchedule( + static::$scheduleVisaID + ) + ->withStatus('Active') + ->withAmount(30.02) + ->withCurrency('USD') + ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) + ->withFrequency(ScheduleFrequency::WEEKLY) + ->withEndDate(\DateTime::createFromFormat('Y-m-d', '2027-04-01')) + ->withReprocessingCount(2) + ->create(); + + $this->assertNotNull($schedule); + $this->assertNotNull($schedule->key); + static::$scheduleVisa = $schedule; + } + + public function test009AddScheduleCreditMasterCard() + { + if (static::$paymentMethodMasterCard == null) { + $this->markTestIncomplete(); + } + + $schedule = static::$paymentMethodMasterCard->addSchedule( + $this->getIdentifier('CreditMC') + ) + ->withStatus('Active') + ->withAmount(30.02) + ->withCurrency('USD') + ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) + ->withFrequency(ScheduleFrequency::WEEKLY) + ->withEndDate(\DateTime::createFromFormat('Y-m-d', '2027-04-01')) + ->withReprocessingCount(2) + ->create(); + $this->assertNotNull($schedule); + $this->assertNotNull($schedule->key); + static::$scheduleMasterCard = $schedule; + } + + public function test010AddScheduleCheckPPD() + { + if (static::$paymentMethodCheckPpd == null) { + $this->markTestIncomplete(); + } + + $schedule = static::$paymentMethodCheckPpd->addSchedule( + $this->getIdentifier('CheckPPD') + ) + ->withStatus('Active') + ->withAmount(30.03) + ->withCurrency('USD') + ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) + ->withFrequency(ScheduleFrequency::MONTHLY) + ->withReprocessingCount(1) + ->withnumberOfPaymentsRemaining(2) + ->create(); + $this->assertNotNull($schedule); + $this->assertNotNull($schedule->key); + static::$scheduleCheckPpd = $schedule; + } + + public function test011AddScheduleCheckCCD() + { + if (static::$paymentMethodCheckCcd == null) { + $this->markTestIncomplete(); + } + + $schedule = static::$paymentMethodCheckCcd->addSchedule( + $this->getIdentifier('CheckCCD') + ) + ->withStatus('Active') + ->withAmount(30.04) + ->withCurrency('USD') + ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) + ->withFrequency(ScheduleFrequency::BI_WEEKLY) + ->withReprocessingCount(1) + ->create(); + $this->assertNotNull($schedule); + $this->assertNotNull($schedule->key); + static::$scheduleCheckCcd = $schedule; + } + + /** + * expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function test012AddScheduleCreditVisa() + { + if (static::$paymentMethodVisa == null) { + $this->markTestIncomplete(); + } + + $schedule = static::$paymentMethodVisa->addSchedule( + $this->getIdentifier('CreditV') + ) + ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) + ->withAmount(30.01) + ->withCurrency('USD') + ->withFrequency(ScheduleFrequency::WEEKLY) + ->withReprocessingCount(1) + ->withStatus('Active') + ->create(); + } + + /** + * expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function test013AddScheduleCCheckPPD() + { + if (static::$paymentMethodCheckPpd == null) { + $this->markTestIncomplete(); + } + + $schedule = static::$paymentMethodCheckPpd->addSchedule( + $this->getIdentifier('CheckPPD') + ) + ->withStatus('Active') + ->withAmount(30.03) + ->withCurrency('USD') + ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) + ->withFrequency(ScheduleFrequency::MONTHLY) + ->withReprocessingCount(1) + ->withnumberOfPaymentsRemaining(2) + ->create(); + } + + // Recurring Billing using PayPlan - Managed Schedule + + public function test014RecurringBillingVisa() + { + if (static::$paymentMethodVisa == null || static::$scheduleVisa == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodVisa->charge(20.01) + ->withCurrency('USD') + ->withScheduleId(static::$scheduleVisa->key) + ->withOneTimePayment(false) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test015RecurringBillingMasterCard() + { + if (true || static::$paymentMethodMasterCard == null || static::$scheduleMasterCard == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodMasterCard->charge(20.02) + ->withCurrency('USD') + ->withScheduleId(static::$scheduleVisa->key) + ->withOneTimePayment(false) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test016RecurringBillingCheckPPD() + { + if (static::$paymentMethodCheckPpd == null || static::$scheduleCheckPpd == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodCheckPpd->charge(20.03) + ->withCurrency('USD') + ->withScheduleId(static::$scheduleVisa->key) + ->withOneTimePayment(false) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test017RecurringBillingCheckCCD() + { + if (static::$paymentMethodCheckCcd == null || static::$scheduleCheckCcd == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodCheckCcd->charge(20.04) + ->withCurrency('USD') + ->withScheduleId(static::$scheduleVisa->key) + ->withOneTimePayment(false) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // One time bill payment + + public function test018RecurringBillingVisa() + { + if (static::$paymentMethodVisa == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodVisa->charge(20.06) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test019RecurringBillingMasterCard() + { + if (static::$paymentMethodMasterCard == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodMasterCard->charge(20.07) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test020RecurringBillingCheckPPD() + { + if (static::$paymentMethodCheckPpd == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodCheckPpd->charge(20.08) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test021RecurringBillingCheckCCD() + { + if (static::$paymentMethodCheckCcd == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodCheckCcd->charge(20.09) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Onetime bill payment - declined + + public function test022RecurringBillingVisaDecline() + { + if (static::$paymentMethodVisa == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodVisa->charge(10.08) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('51', $response->responseCode); + } + + public function test023RecurringBillingCheckPPDDecline() + { + if (true || static::$paymentMethodCheckPpd == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodCheckPpd->charge(25.02) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('1', $response->responseCode); + } + + public function test024RecurringBillingVisaWithCOF() + { + if (static::$paymentMethodVisa == null || static::$scheduleVisa == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodVisa->charge(20.01) + ->withCurrency('USD') + ->withScheduleId(static::$scheduleVisa->key) + ->withOneTimePayment(false) + ->withAllowDuplicates(true) + ->withCardBrandStorage(StoredCredentialInitiator::CARDHOLDER) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->cardBrandTransactionId); + + $nextResponse = static::$paymentMethodVisa->charge(20.01) + ->withCurrency('USD') + ->withScheduleId(static::$scheduleVisa->key) + ->withOneTimePayment(false) + ->withAllowDuplicates(true) + ->withCardBrandStorage(StoredCredentialInitiator::MERCHANT, $response->cardBrandTransactionId) + ->execute(); + + $this->assertNotNull($nextResponse); + $this->assertEquals('00', $nextResponse->responseCode); + } + + public function test025EditStartDateUsingString() + { + $schedule = Schedule::find(static::$scheduleVisaID); + $schedule->startDate = '01022026'; + $schedule->saveChanges(); + } + + public function test026EditStartDateUsingDateTimeObj() + { + $updateTimeValueAsObj = new DateTime(); + $updateTimeValueAsObj->add(new DateInterval('P1Y')); + + $schedule = Schedule::find(static::$scheduleVisaID); + $schedule->startDate = $updateTimeValueAsObj; + $schedule->saveChanges(); + } +} diff --git a/test/Integration/Gateways/PorticoConnector/Certifications/RetailTest.php b/test/Integration/Gateways/PorticoConnector/Certifications/RetailTest.php index bf526119..273bb3e8 100644 --- a/test/Integration/Gateways/PorticoConnector/Certifications/RetailTest.php +++ b/test/Integration/Gateways/PorticoConnector/Certifications/RetailTest.php @@ -1,1982 +1,1982 @@ -secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - ServicesContainer::Configure($config); - } - - public function testRetail000CloseBatch() - { - try { - $response = BatchService::closeBatch(); - $this->assertNotNull($response); - // error_log(sprintf('Batch ID: %s', $response->Id)); - // error_log(sprintf('Sequence Number: %s', $response->sequenceNumber)); - } catch (ApiException $e) { - if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) - && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) - ) { - $this->fail($e->getMessage()); - } - } - } - - /* - CREDIT CARD FUNCTIONS - CARD VERIFY - ACCOUNT VERIFICATION - */ - - public function testRetail001CardVerifyVisa() - { - $visaenc = TestCards::visaSwipeEncrypted(); - - $response = $visaenc->verify() - ->withAllowDuplicates(true) - ->withRequestMultiUseToken(static::$useTokens) - ->execute(); - $this->assertNotNull($response, '$response is null'); - $this->assertEquals('00', $response->responseCode, $response->responseMessage); - - if (static::$useTokens) { - $this->assertNotNull($response->token, 'token is null'); - - $token = new CreditCardData(); - $token->token = $response->token; - - $saleResponse = $token->charge(15.01) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals('00', $saleResponse->responseCode); - } - } - - public function testRetail002CardVerifyMastercardSwipe() - { - $cardenc = TestCards::masterCardSwipeEncrypted(); - - $response = $cardenc->verify() - ->withAllowDuplicates(true) - ->withRequestMultiUseToken(static::$useTokens) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - if (static::$useTokens) { - $this->assertNotNull($response->token); - - $token = new CreditCardData(); - $token->token = $response->token; - - $saleResponse = $token->charge(15.02) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals('00', $saleResponse->responseCode); - } - } - - public function testRetail003CardVerifyDiscover() - { - $discoverenc = TestCards::discoverSwipeEncrypted(); - - $response = $discoverenc->verify() - ->withAllowDuplicates(true) - ->withRequestMultiUseToken(static::$useTokens) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - if (static::$useTokens) { - $this->assertNotNull($response->token); - - $token = new CreditCardData(); - $token->token = $response->token; - - $saleResponse = $token->charge(15.03) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals('00', $saleResponse->responseCode); - } - } - - // Address Verification - - public function testRetail004CardVerifyAmex() - { - $address = new Address(); - $address->postalCode = '75024'; - - $manualamex = TestCards::amexManual(false, true); - - $response = $manualamex->verify() - ->withAllowDuplicates(true) - ->withAddress($address) - ->withRequestMultiUseToken(static::$useTokens) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - if (static::$useTokens) { - $this->assertNotNull($response->token); - - $token = new CreditCardData(); - $token->token = $response->token; - - $saleResponse = $token->charge(15.04) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals('00', $saleResponse->responseCode); - } - } - - // Balance Inquiry (for Prepaid) - - public function testRetail005BalanceInquiryVisa() - { - $visaenc = TestCards::visaSwipeEncrypted(); - - $response = $visaenc->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // CREDIT SALE (For multi-use token only) - - public function testRetail006ChargeVisaSwipeToken() - { - $card = TestCards::visaSwipe(); - $response = $card->charge(15.01) - ->withCurrency('USD') - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - static::$visatoken = $response->token; - } - - public function testRetail007ChargeMastercardSwipeToken() - { - $card = TestCards::masterCardSwipe(); - $response = $card->charge(15.02) - ->withCurrency('USD') - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - static::$mastercardtoken = $response->token; - } - - public function testRetail008ChargeDiscoverSwipeToken() - { - $card = TestCards::discoverSwipe(); - $response = $card->charge(15.03) - ->withCurrency('USD') - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - static::$discovertoken = $response->token; - } - - public function testRetail009ChargeAmexSwipeToken() - { - $card = TestCards::amexSwipe(); - $response = $card->charge(15.04) - ->withCurrency('USD') - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - static::$amextoken = $response->token; - } - - /* - CREDIT SALE - SWIPED - */ - - public function testRetail010ChargeVisaSwipe() - { - $card = TestCards::visaSwipe(); - $response = $card->charge(15.01) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test 59 - $reverse = $response->reverse(15.01) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reverse); - $this->assertEquals('00', $reverse->responseCode); - } - - public function testRetail011ChargeMastercardSwipe() - { - $card = TestCards::masterCardSwipe(); - $response = $card->charge(15.02) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail012ChargeDiscoverSwipe() - { - $card = TestCards::discoverSwipe(); - $response = $card->charge(15.03) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail013ChargeAmexSwipe() - { - $card = TestCards::amexSwipe(); - $response = $card->charge(15.04) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail014ChargeJcbSwipe() - { - $card = TestCards::JcbSwipe(); - $response = $card->charge(15.05) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 58 - $refund = $response->refund(15.05) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($refund); - $this->assertEquals('00', $refund->responseCode); - } - - public function testRetail014aChargeRetailMastercard24() - { - $card = TestCards::masterCard24Swipe(); - $response = $card->charge(15.34) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail014bChargeRetailMastercard25() - { - $card = TestCards::masterCard25Swipe(); - $response = $card->charge(15.34) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail015ChargeVisaSwipe() - { - $card = TestCards::visaSwipe(); - $response = $card->charge(15.06) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 63 - $reversal = $response->reverse(15.06) - ->withAllowDuplicates(true) - ->withAuthAmount(5.06) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Manually Entered - Card Present - - public function testRetail016ChargeVisaManualCardPresent() - { - $address = new Address(); - $address->postalCode = '750241234'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $manualcard = TestCards::visaManual(true, true); - $response = $manualcard->charge(16.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail017ChargeMasterCardManualCardPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $manualcard = TestCards::masterCardManual(true, true); - $response = $manualcard->charge(16.02) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 60 - $reverse = $response->reverse(16.02) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reverse); - $this->assertEquals('00', $reverse->responseCode); - } - - public function testRetail018ChargeDiscoverManualCardPresent() - { - $address = new Address(); - $address->postalCode = '750241234'; - - $manualcard = TestCards::discoverManual(true, true); - $response = $manualcard->charge(16.03) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail019ChargeAmexManualCardPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860'; - - $manualcard = TestCards::amexManual(true, true); - $response = $manualcard->charge(16.04) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail020ChargeJcbManualCardPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - - $manualcard = TestCards::JcbManual(true, true); - $response = $manualcard->charge(16.05) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail021ChargeDiscoverManualCardPresent() - { - $address = new Address(); - $address->postalCode = '750241234'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $manualcard = TestCards::discoverManual(true, true); - $response = $manualcard->charge(16.07) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 64 - $reversal = $response->reverse(16.07) - ->withAllowDuplicates(true) - ->withAuthAmount(6.07) - ->execute(); - $this->assertNotNull($reversal); - $this->assertEquals('00', $reversal->responseCode); - } - - // Manually Entered - Card Not Present - - public function testRetail022ChargeVisaManualCardNotPresent() - { - $address = new Address(); - $address->postalCode = '750241234'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $manualcard = null; - if (static::$useTokens) { - $manualcard = new CreditCardData(); - $manualcard->token = static::$visatoken; - } else { - $manualcard = TestCards::visaManual(false, true); - } - - $response = $manualcard->charge(17.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail023ChargeMasterCardManualCardNotPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $manualcard = null; - if (static::$useTokens) { - $manualcard = new CreditCardData(); - $manualcard->token = static::$mastercardtoken; - } else { - $manualcard = TestCards::masterCardManual(false, true); - } - - $response = $manualcard->charge(17.02) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 61 - $reversal = $response->reverse(17.02) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reversal); - $this->assertEquals('00', $reversal->responseCode); - } - - public function testRetail024ChargeDiscoverManualCardNotPresent() - { - $address = new Address(); - $address->postalCode = '750241234'; - - $manualcard = null; - if (static::$useTokens) { - $manualcard = new CreditCardData(); - $manualcard->token = static::$discovertoken; - } else { - $manualcard = TestCards::discoverManual(false, true); - } - - $response = $manualcard->charge(17.03) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail025ChargeAmexManualCardNotPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860'; - - $manualcard = null; - if (static::$useTokens) { - $manualcard = new CreditCardData(); - $manualcard->token = static::$amextoken; - } else { - $manualcard = TestCards::amexManual(false, true); - } - - $response = $manualcard->charge(17.04) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail026ChargeJcbManualCardNotPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - - $manualcard = TestCards::JcbManual(false, true); - $response = $manualcard->charge(17.05) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Contactless - - public function testRetail027ChargeVisaContactless() - { - $card = TestCards::visaSwipe(EntryMethod::PROXIMITY); - $response = $card->charge(18.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail028ChargeMastercardContactless() - { - $card = TestCards::masterCardSwipe(EntryMethod::PROXIMITY); - - $response = $card->charge(18.02) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail029ChargeDiscoverContactless() - { - $card = TestCards::discoverSwipe(EntryMethod::PROXIMITY); - - $response = $card->charge(18.03) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail030ChargeAmexContactless() - { - $card = TestCards::amexSwipe(EntryMethod::PROXIMITY); - - $response = $card->charge(18.04) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // AUTHORIZATION - - public function testRetail031AuthorizeVisaSwipe() - { - $card = TestCards::visaSwipe(); - - // 031a authorize - $response = $card->authorize(15.08) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 031b capture - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail032AuthorizeVisaSwipeAdditionalAuth() - { - $card = TestCards::visaSwipe(); - - // 032a authorize - $response = $card->authorize(15.09) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 032b Additional Auth (restaurant only) - - // 032c Add to batch - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail033AuthorizeMasterCardSwipe() - { - $card = TestCards::masterCardSwipe(); - - // 033a authorize - $response = $card->authorize(15.10) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 033b capture - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail033aAuthorizeDiscoverSwipe() - { - $card = TestCards::discoverSwipe(); - - $response = $card->authorize(15.10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // AUTHORIZATION - Manually Entered, Card Present - - public function testRetail034AuthorizeVisaManualCardPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $card = TestCards::visaManual(true, true); - - // 034a authorize - $response = $card->authorize(16.08) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 034b capture - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail035AuthorizeVisaManualCardPresentAdditionalAuth() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $card = TestCards::visaManual(true, true); - - // 035a authorize - $response = $card->authorize(16.09) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 035b Additional Auth (restaurant only) - - // 035c Add to batch - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail036AuthorizeMasterCardManualCardPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $card = TestCards::masterCardManual(true, true); - - // 036a authorize - $response = $card->authorize(16.10) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 036b capture - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail036aAuthorizeDiscoverManualCardPresent() - { - $address = new Address(); - $address->postalCode = '750241234'; - - $card = TestCards::discoverManual(true, true); - $response = $card->authorize(16.10) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // AUTHORIZATION - Manually Entered, Card Not Present - - public function testRetail037AuthorizeVisaManual() - { - $address = new Address(); - $address->postalCode = '750241234'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $card = TestCards::visaManual(false, true); - - // 034a authorize - $response = $card->authorize(17.08) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 034b capture - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail038AuthorizeMasterCardManual() - { - $address = new Address(); - $address->postalCode = '750241234'; - $address->streetAddress1 = '6860'; - - $card = TestCards::masterCardManual(false, true); - - // 036a authorize - $response = $card->authorize(17.09) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 036b capture - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail038aAuthorizeDiscoverManual() - { - $address = new Address(); - $address->postalCode = '750241234'; - - $card = TestCards::discoverManual(false, true); - - $response = $card->authorize(17.10) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // PARTIALLY APPROVED SALE (Required) - - public function testRetail039ChargeDiscoverSwipePartialApproval() - { - $card = TestCards::discoverSwipe(); - - $response = $card->charge(40.00) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAllowPartialAuth(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(40.00, $response->authorizedAmount); - } - - public function testRetail040ChargeVisaSwipePartialApproval() - { - $card = TestCards::visaSwipe(); - $response = $card->charge(130.00) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAllowPartialAuth(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(110.00, $response->authorizedAmount); - } - - public function testRetail041ChargeDiscoverManualPartialApproval() - { - $address = new Address(); - $address->postalCode = '75024'; - $card = TestCards::discoverManual(true, true); - - $response = $card->charge(145.00) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAllowPartialAuth(true) - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(65.00, $response->authorizedAmount); - } - - public function testRetail042ChargeMasterCardSwipePartialApproval() - { - $card = TestCards::masterCardSwipe(); - $response = $card->charge(155.00) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAllowPartialAuth(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(100.00, $response->authorizedAmount); - - // test case 62 - $reversal = $response->reverse(100.00) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reversal); - $this->assertEquals('00', $reversal->responseCode); - } - - /* - SALE WITH GRATUITY - Tip Edit (Tip at Settlement) - */ - - public function testRetail043ChargeVisaSwipeEditGratuity() - { - $card = TestCards::visaSwipe(); - $response = $card->charge(15.12) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $editResponse = $response->edit() - ->withAllowDuplicates(true) - ->withAmount(18.12) - ->withGratuity(3.00) - ->execute(); - $this->assertNotNull($editResponse); - $this->assertEquals('00', $editResponse->responseCode); - } - - public function testRetail044ChargeMasterCardManualEditGratuity() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(true, true); - $response = $card->charge(15.13) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $editResponse = $response->edit() - ->withAllowDuplicates(true) - ->withAmount(18.13) - ->withGratuity(3.00) - ->execute(); - $this->assertNotNull($editResponse); - $this->assertEquals('00', $editResponse->responseCode); - } - - // Tip on Purchase - - public function testRetail045ChargeVisaManualGratuity() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::visaManual(true, true); - - $response = $card->charge(18.61) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withGratuity(3.50) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail046ChargeMasterCardSwipeGratuity() - { - $card = TestCards::masterCardSwipe(); - - $response = $card->charge(18.62) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withGratuity(3.50) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $editResponse = $response->edit() - ->withAllowDuplicates(true) - ->withAmount(18.12) - ->withGratuity(3.00) - ->execute(); - $this->assertNotNull($editResponse); - $this->assertEquals('00', $editResponse->responseCode); - } - - // LEVEL II CORPORATE PURCHASE CARD - - public function testRetail047LevelIIVisaSwipeResponseB() - { - $card = TestCards::visaSwipe(); - - $response = $card->charge(112.34) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('B', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail047aLevelIIVisaSwipeResponseB() - { - $card = TestCards::visaSwipe(); - - $response = $card->charge(112.34) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('B', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withTaxType(TaxType::NOT_USED) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail048LevelIIVisaSwipeResponseR() - { - $card = TestCards::visaSwipe(); - - $response = $card->charge(123.45) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('R', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail049LevelIIVisaManualResponseS() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::visaManual(true, true); - - $response = $card->charge(134.56) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail050LevelIIMasterCardSwipeResponseS() - { - $card = TestCards::masterCardSwipe(); - - $response = $card->charge(111.06) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail051LevelIIMasterCardManualResponseS() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(true, true); - - $response = $card->charge(111.07) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail051aLevelIIMasterCardManualResponseS() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(true, true); - $response = $card->charge(111.08) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail052LevelIIMasterCardManualResponseS() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(true, true); - $response = $card->charge(111.09) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail053LevelIIAmexSwipeNoResponse() - { - $card = TestCards::amexSwipe(); - $response = $card->charge(111.10) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail054LevelIIAmexManualNoResponse() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::amexManual(true, true); - - $response = $card->charge(111.11) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail055LevelIIAmexManualNoResponse() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::amexManual(true, true); - $response = $card->charge(111.12) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail055aLevelIIAmexManualNoResponse() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::amexManual(true, true); - $response = $card->charge(111.13) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - // OFFLINE SALE / AUTHORIZATION - - public function testRetail056OfflineChargeVisaManual() - { - $card = TestCards::visaManual(false, true); - - $response = $card->charge(15.12) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withOfflineAuthCode('654321') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail056OfflineAuthVisaManual() - { - $card = TestCards::visaManual(false, true); - - $response = $card->authorize(15.11) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withOfflineAuthCode('654321') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // RETURN - - public function testRetail057ReturnMasterCard() - { - $card = TestCards::masterCardManual(false, true); - - $response = $card->refund(15.11) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail057aReturnMasterCardSwipe() - { - $card = TestCards::masterCardSwipe(); - $response = $card->refund(15.15) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail058ReturnJcbTransactionId() - { - // See test 14 - } - - // ONLINE VOID / REVERSAL (Required) - - public function testRetail059ReversalVisa() - { - // see test 10 - } - - public function testRetail060ReversalMasterCard() - { - // see test case 17 - } - - public function testRetail061ReversalMasterCard() - { - // see test case 23 - } - - public function testRetail062ReversalMasterCard() - { - // see test case 42 - } - - public function testRetail063ReversalVisaPartial() - { - // see test case 15 - } - - public function testRetail064ReversalDiscoverPartial() - { - // see test 21 - } - - // PIN DEBIT CARD FUNCTIONS - - public function testRetail065DebitSaleVisaSwipe() - { - $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(14.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail066DebitSaleMasterCardSwipe() - { - $card = TestCards::asDebit(TestCards::masterCardSwipe(), 'F505AD81659AA42A3D123412324000AB'); - - $response = $card->charge(14.02) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 71 - $reversal = $response->reverse(14.02) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reversal); - $this->assertEquals('00', $reversal->responseCode); - } - - public function testRetail067DebitSaleVisaSwipeCashBack() - { - $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(14.03) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCashBack(5.00) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail067aDebitSaleMasterCard() - { - $card = TestCards::asDebit(TestCards::masterCardSwipe(), 'F505AD81659AA42A3D123412324000AB'); - - $response = $card->charge(14.04) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // PARTIALLY APPROVED PURCHASE - - public function testRetail068DebitSaleMasterCardPartialApproval() - { - $card = TestCards::asDebit(TestCards::masterCardSwipe(), 'F505AD81659AA42A3D123412324000AB'); - - $response = $card->charge(33.00) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAllowPartialAuth(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(22.00, $response->authorizedAmount); - } - - public function testRetail069DebitSaleVisaPartialApproval() - { - $this->markTestSkipped(); - - $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(44.00) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAllowPartialAuth(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals(33.00, $response->authorizedAmount); - - // test case 72 - $reversal = $response->reverse(33.00) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reversal); - $this->assertEquals('00', $reversal->responseCode); - } - - // RETURN - - public function testRetail070DebitReturnVisaSwipe() - { - $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->refund(14.07) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail070aDebitReturnVisaSwipe() - { - $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->refund(14.08) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $reversalResponse = $response->reverse(14.08) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reversalResponse); - $this->assertEquals('00', $reversalResponse->responseCode); - } - - // REVERSAL - - public function testRetail071DebitReversalMasterCard() - { - // see test case 66 - } - - public function testRetail072DebitReversalVisa() - { - // see test case 96 - } - - /* - EBT FUNCTIONS - Food Stamp Purchase - */ - - public function testRetail080EbtfsPurchaseVisaSwipe() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(101.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail081EbtfsPurchaseVisaManual() - { - $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(102.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Food Stamp Electronic Voucher (Manual Entry Only) - - public function testRetail082EbtVoucherPurchaseVisa() - { - $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); - $card->SerialNumber = '123456789012345'; - $card->approvalCode = '123456'; - - $response = $card->charge(103.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Food Stamp Balance Inquiry - - public function testRetail083EbtfsReturnVisaSwipe() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->refund(104.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail084EbtfsReturnVisaManual() - { - $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->refund(105.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Food Stamp Balance Inquiry - - public function testRetail085EbtBalanceInquiryVisaSwipe() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail086EbtBalanceInquiryVisaManual() - { - $card = TestCards::asEBTManual(TestCards::visaManual(true, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /* - $this->assertEquals('00', $response->responseCode); - EBT CASH BENEFITS - Cash Back Purchase - */ - - public function testRetail087EbtCashBackPurchaseVisaSwipe() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(106.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCashBack(5.00) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail088EbtCashBackPurchaseVisaManual() - { - $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(107.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCashBack(5.00) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // No Cash Back Purchase - - public function testRetail089EbtCashBackPurchaseVisaSwipeNoCashBack() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(108.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCashBack(0) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail090EbtCashBackPurchaseVisaManualNoCashBack() - { - $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(109.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCashBack(0) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Cash Back Balance Inquiry - - public function testRetail091EbtBalanceInquiryVisaSwipeCash() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->balanceInquiry(InquiryType::CASH)->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail092EbtBalanceInquiryVisaManualCash() - { - $card = TestCards::asEBTManual(TestCards::visaManual(true, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->balanceInquiry(InquiryType::CASH)->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Cash Benefits Withdrawal - - public function testRetail093EbtBenefitWithDrawalVisaSwipe() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(110.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail094EbtBenefitWithDrawalVisaManual() - { - $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(111.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCashBack(0) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /* - HMS GIFT - REWARDS - GIFT - ACTIVATE - */ - - public function testRetail095ActivateGift1Swipe() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->activate(6.00)->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail096ActivateGift2Manual() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->activate(7.00)->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - // ADD VALUE - - public function testRetail097AddValueGift1Swipe() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->addValue(8.00) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail098AddValueGift2Manual() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->activate(9.00)->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - // BALANCE INQUIRY - - public function testRetail099BalanceInquiryGift1Swipe() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals(10.00, $response->balanceAmount); - } - - public function testRetail100BalanceInquiryGift2Manual() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - $this->assertEquals(10.00, $response->balanceAmount); - } - - // REPLACE / TRANSFER - - public function testRetail101ReplaceGift1Swipe() - { - $oldCard = TestCards::giftCard1Swipe(); - $newCard = TestCards::giftCard2Manual(); - - $response = $oldCard->replaceWith($newCard)->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail102ReplaceGift2Manual() - { - $newCard = TestCards::giftCard1Swipe(); - $oldCard = TestCards::giftCard2Manual(); - - $response = $oldCard->replaceWith($newCard)->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - // SALE / REDEEM - - public function testRetail103SaleGift1Swipe() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(1.00) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail104SaleGift2Manual() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(2.00) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail105SaleGift1VoidSwipe() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(3.00) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - - // test case 107 - $voidResponse = $response->void()->execute(); - $this->assertNotNull($voidResponse); - $this->assertEquals('0', $voidResponse->responseCode); - } - - public function testRetail106SaleGift2ReversalManual() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(4.00) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - - //test case 108 - $voidResponse = $response->reverse(4.00)->execute(); - $this->assertNotNull($voidResponse); - $this->assertEquals('0', $voidResponse->responseCode); - } - - // VOID - - public function testRetail107VoidGift() - { - // see test case 105 - } - - // REVERSAL - - public function testRetail108ReversalGift() - { - // see test case 106 - } - - // DEACTIVATE - - public function testRetail109DeactivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->deactivate()->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - // RECEIPTS MESSAGING - - public function testRetail110ReceiptsMessaging() - { - // PRINT AND SCAN RECEIPT FOR TEST 107 - } - - /* - REWARDS - BALANCE INQUIRY - */ - - public function testRetail111BalanceInquiryRewards1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - $this->assertEquals(0, $response->pointsBalanceAmount); - } - - public function testRetail112BalanceInquiryRewards2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - $this->assertEquals(0, $response->pointsBalanceAmount); - } - - // ALIAS - - public function testRetail113CreateAliasGift1() - { - $card = GiftCard::create('9725550100'); - $this->assertNotNull($card); - } - - public function testRetail114CreateAliasGift2() - { - $card = GiftCard::create('9725550100'); - $this->assertNotNull($card); - } - - public function testRetail115AddAliasGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->addAlias('2145550199')->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail116AddAliasGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->addAlias('2145550199')->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail117DeleteAliasGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->removeAlias('2145550199')->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail999CloseBatch() - { - try { - $response = BatchService::closeBatch(); - $this->assertNotNull($response); - // error_log(sprintf('Batch ID: %s', $response->Id)); - // error_log(sprintf('Sequence Number: %s', $response->SequenceNumber)); - } catch (Exception $exec) { - if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) - && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) - ) { - $this->fail($e->getMessage()); - } - } - } -} +secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + ServicesContainer::configureService($config); + } + + public function testRetail000CloseBatch() + { + try { + $response = BatchService::closeBatch(); + $this->assertNotNull($response); + // error_log(sprintf('Batch ID: %s', $response->Id)); + // error_log(sprintf('Sequence Number: %s', $response->sequenceNumber)); + } catch (ApiException $e) { + if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) + && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) + ) { + $this->fail($e->getMessage()); + } + } + } + + /* + CREDIT CARD FUNCTIONS + CARD VERIFY + ACCOUNT VERIFICATION + */ + + public function testRetail001CardVerifyVisa() + { + $visaenc = TestCards::visaSwipeEncrypted(); + + $response = $visaenc->verify() + ->withAllowDuplicates(true) + ->withRequestMultiUseToken(static::$useTokens) + ->execute(); + $this->assertNotNull($response, '$response is null'); + $this->assertEquals('00', $response->responseCode, $response->responseMessage); + + if (static::$useTokens) { + $this->assertNotNull($response->token, 'token is null'); + + $token = new CreditCardData(); + $token->token = $response->token; + + $saleResponse = $token->charge(15.01) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals('00', $saleResponse->responseCode); + } + } + + public function testRetail002CardVerifyMastercardSwipe() + { + $cardenc = TestCards::masterCardSwipeEncrypted(); + + $response = $cardenc->verify() + ->withAllowDuplicates(true) + ->withRequestMultiUseToken(static::$useTokens) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + if (static::$useTokens) { + $this->assertNotNull($response->token); + + $token = new CreditCardData(); + $token->token = $response->token; + + $saleResponse = $token->charge(15.02) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals('00', $saleResponse->responseCode); + } + } + + public function testRetail003CardVerifyDiscover() + { + $discoverenc = TestCards::discoverSwipeEncrypted(); + + $response = $discoverenc->verify() + ->withAllowDuplicates(true) + ->withRequestMultiUseToken(static::$useTokens) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + if (static::$useTokens) { + $this->assertNotNull($response->token); + + $token = new CreditCardData(); + $token->token = $response->token; + + $saleResponse = $token->charge(15.03) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals('00', $saleResponse->responseCode); + } + } + + // Address Verification + + public function testRetail004CardVerifyAmex() + { + $address = new Address(); + $address->postalCode = '75024'; + + $manualamex = TestCards::amexManual(false, true); + + $response = $manualamex->verify() + ->withAllowDuplicates(true) + ->withAddress($address) + ->withRequestMultiUseToken(static::$useTokens) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + if (static::$useTokens) { + $this->assertNotNull($response->token); + + $token = new CreditCardData(); + $token->token = $response->token; + + $saleResponse = $token->charge(15.04) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals('00', $saleResponse->responseCode); + } + } + + // Balance Inquiry (for Prepaid) + + public function testRetail005BalanceInquiryVisa() + { + $visaenc = TestCards::visaSwipeEncrypted(); + + $response = $visaenc->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // CREDIT SALE (For multi-use token only) + + public function testRetail006ChargeVisaSwipeToken() + { + $card = TestCards::visaSwipe(); + $response = $card->charge(15.01) + ->withCurrency('USD') + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + static::$visatoken = $response->token; + } + + public function testRetail007ChargeMastercardSwipeToken() + { + $card = TestCards::masterCardSwipe(); + $response = $card->charge(15.02) + ->withCurrency('USD') + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + static::$mastercardtoken = $response->token; + } + + public function testRetail008ChargeDiscoverSwipeToken() + { + $card = TestCards::discoverSwipe(); + $response = $card->charge(15.03) + ->withCurrency('USD') + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + static::$discovertoken = $response->token; + } + + public function testRetail009ChargeAmexSwipeToken() + { + $card = TestCards::amexSwipe(); + $response = $card->charge(15.04) + ->withCurrency('USD') + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + static::$amextoken = $response->token; + } + + /* + CREDIT SALE + SWIPED + */ + + public function testRetail010ChargeVisaSwipe() + { + $card = TestCards::visaSwipe(); + $response = $card->charge(15.01) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test 59 + $reverse = $response->reverse(15.01) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reverse); + $this->assertEquals('00', $reverse->responseCode); + } + + public function testRetail011ChargeMastercardSwipe() + { + $card = TestCards::masterCardSwipe(); + $response = $card->charge(15.02) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail012ChargeDiscoverSwipe() + { + $card = TestCards::discoverSwipe(); + $response = $card->charge(15.03) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail013ChargeAmexSwipe() + { + $card = TestCards::amexSwipe(); + $response = $card->charge(15.04) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail014ChargeJcbSwipe() + { + $card = TestCards::JcbSwipe(); + $response = $card->charge(15.05) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 58 + $refund = $response->refund(15.05) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($refund); + $this->assertEquals('00', $refund->responseCode); + } + + public function testRetail014aChargeRetailMastercard24() + { + $card = TestCards::masterCard24Swipe(); + $response = $card->charge(15.34) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail014bChargeRetailMastercard25() + { + $card = TestCards::masterCard25Swipe(); + $response = $card->charge(15.34) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail015ChargeVisaSwipe() + { + $card = TestCards::visaSwipe(); + $response = $card->charge(15.06) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 63 + $reversal = $response->reverse(15.06) + ->withAllowDuplicates(true) + ->withAuthAmount(5.06) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Manually Entered - Card Present + + public function testRetail016ChargeVisaManualCardPresent() + { + $address = new Address(); + $address->postalCode = '750241234'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $manualcard = TestCards::visaManual(true, true); + $response = $manualcard->charge(16.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail017ChargeMasterCardManualCardPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $manualcard = TestCards::masterCardManual(true, true); + $response = $manualcard->charge(16.02) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 60 + $reverse = $response->reverse(16.02) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reverse); + $this->assertEquals('00', $reverse->responseCode); + } + + public function testRetail018ChargeDiscoverManualCardPresent() + { + $address = new Address(); + $address->postalCode = '750241234'; + + $manualcard = TestCards::discoverManual(true, true); + $response = $manualcard->charge(16.03) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail019ChargeAmexManualCardPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860'; + + $manualcard = TestCards::amexManual(true, true); + $response = $manualcard->charge(16.04) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail020ChargeJcbManualCardPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + + $manualcard = TestCards::JcbManual(true, true); + $response = $manualcard->charge(16.05) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail021ChargeDiscoverManualCardPresent() + { + $address = new Address(); + $address->postalCode = '750241234'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $manualcard = TestCards::discoverManual(true, true); + $response = $manualcard->charge(16.07) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 64 + $reversal = $response->reverse(16.07) + ->withAllowDuplicates(true) + ->withAuthAmount(6.07) + ->execute(); + $this->assertNotNull($reversal); + $this->assertEquals('00', $reversal->responseCode); + } + + // Manually Entered - Card Not Present + + public function testRetail022ChargeVisaManualCardNotPresent() + { + $address = new Address(); + $address->postalCode = '750241234'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $manualcard = null; + if (static::$useTokens) { + $manualcard = new CreditCardData(); + $manualcard->token = static::$visatoken; + } else { + $manualcard = TestCards::visaManual(false, true); + } + + $response = $manualcard->charge(17.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail023ChargeMasterCardManualCardNotPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $manualcard = null; + if (static::$useTokens) { + $manualcard = new CreditCardData(); + $manualcard->token = static::$mastercardtoken; + } else { + $manualcard = TestCards::masterCardManual(false, true); + } + + $response = $manualcard->charge(17.02) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 61 + $reversal = $response->reverse(17.02) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reversal); + $this->assertEquals('00', $reversal->responseCode); + } + + public function testRetail024ChargeDiscoverManualCardNotPresent() + { + $address = new Address(); + $address->postalCode = '750241234'; + + $manualcard = null; + if (static::$useTokens) { + $manualcard = new CreditCardData(); + $manualcard->token = static::$discovertoken; + } else { + $manualcard = TestCards::discoverManual(false, true); + } + + $response = $manualcard->charge(17.03) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail025ChargeAmexManualCardNotPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860'; + + $manualcard = null; + if (static::$useTokens) { + $manualcard = new CreditCardData(); + $manualcard->token = static::$amextoken; + } else { + $manualcard = TestCards::amexManual(false, true); + } + + $response = $manualcard->charge(17.04) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail026ChargeJcbManualCardNotPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + + $manualcard = TestCards::JcbManual(false, true); + $response = $manualcard->charge(17.05) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Contactless + + public function testRetail027ChargeVisaContactless() + { + $card = TestCards::visaSwipe(EntryMethod::PROXIMITY); + $response = $card->charge(18.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail028ChargeMastercardContactless() + { + $card = TestCards::masterCardSwipe(EntryMethod::PROXIMITY); + + $response = $card->charge(18.02) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail029ChargeDiscoverContactless() + { + $card = TestCards::discoverSwipe(EntryMethod::PROXIMITY); + + $response = $card->charge(18.03) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail030ChargeAmexContactless() + { + $card = TestCards::amexSwipe(EntryMethod::PROXIMITY); + + $response = $card->charge(18.04) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // AUTHORIZATION + + public function testRetail031AuthorizeVisaSwipe() + { + $card = TestCards::visaSwipe(); + + // 031a authorize + $response = $card->authorize(15.08) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 031b capture + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail032AuthorizeVisaSwipeAdditionalAuth() + { + $card = TestCards::visaSwipe(); + + // 032a authorize + $response = $card->authorize(15.09) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 032b Additional Auth (restaurant only) + + // 032c Add to batch + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail033AuthorizeMasterCardSwipe() + { + $card = TestCards::masterCardSwipe(); + + // 033a authorize + $response = $card->authorize(15.10) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 033b capture + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail033aAuthorizeDiscoverSwipe() + { + $card = TestCards::discoverSwipe(); + + $response = $card->authorize(15.10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // AUTHORIZATION - Manually Entered, Card Present + + public function testRetail034AuthorizeVisaManualCardPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $card = TestCards::visaManual(true, true); + + // 034a authorize + $response = $card->authorize(16.08) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 034b capture + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail035AuthorizeVisaManualCardPresentAdditionalAuth() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $card = TestCards::visaManual(true, true); + + // 035a authorize + $response = $card->authorize(16.09) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 035b Additional Auth (restaurant only) + + // 035c Add to batch + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail036AuthorizeMasterCardManualCardPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $card = TestCards::masterCardManual(true, true); + + // 036a authorize + $response = $card->authorize(16.10) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 036b capture + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail036aAuthorizeDiscoverManualCardPresent() + { + $address = new Address(); + $address->postalCode = '750241234'; + + $card = TestCards::discoverManual(true, true); + $response = $card->authorize(16.10) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // AUTHORIZATION - Manually Entered, Card Not Present + + public function testRetail037AuthorizeVisaManual() + { + $address = new Address(); + $address->postalCode = '750241234'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $card = TestCards::visaManual(false, true); + + // 034a authorize + $response = $card->authorize(17.08) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 034b capture + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail038AuthorizeMasterCardManual() + { + $address = new Address(); + $address->postalCode = '750241234'; + $address->streetAddress1 = '6860'; + + $card = TestCards::masterCardManual(false, true); + + // 036a authorize + $response = $card->authorize(17.09) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 036b capture + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail038aAuthorizeDiscoverManual() + { + $address = new Address(); + $address->postalCode = '750241234'; + + $card = TestCards::discoverManual(false, true); + + $response = $card->authorize(17.10) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // PARTIALLY APPROVED SALE (Required) + + public function testRetail039ChargeDiscoverSwipePartialApproval() + { + $card = TestCards::discoverSwipe(); + + $response = $card->charge(40.00) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAllowPartialAuth(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(40.00, $response->authorizedAmount); + } + + public function testRetail040ChargeVisaSwipePartialApproval() + { + $card = TestCards::visaSwipe(); + $response = $card->charge(130.00) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAllowPartialAuth(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(110.00, $response->authorizedAmount); + } + + public function testRetail041ChargeDiscoverManualPartialApproval() + { + $address = new Address(); + $address->postalCode = '75024'; + $card = TestCards::discoverManual(true, true); + + $response = $card->charge(145.00) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAllowPartialAuth(true) + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(65.00, $response->authorizedAmount); + } + + public function testRetail042ChargeMasterCardSwipePartialApproval() + { + $card = TestCards::masterCardSwipe(); + $response = $card->charge(155.00) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAllowPartialAuth(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(100.00, $response->authorizedAmount); + + // test case 62 + $reversal = $response->reverse(100.00) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reversal); + $this->assertEquals('00', $reversal->responseCode); + } + + /* + SALE WITH GRATUITY + Tip Edit (Tip at Settlement) + */ + + public function testRetail043ChargeVisaSwipeEditGratuity() + { + $card = TestCards::visaSwipe(); + $response = $card->charge(15.12) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $editResponse = $response->edit() + ->withAllowDuplicates(true) + ->withAmount(18.12) + ->withGratuity(3.00) + ->execute(); + $this->assertNotNull($editResponse); + $this->assertEquals('00', $editResponse->responseCode); + } + + public function testRetail044ChargeMasterCardManualEditGratuity() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(true, true); + $response = $card->charge(15.13) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $editResponse = $response->edit() + ->withAllowDuplicates(true) + ->withAmount(18.13) + ->withGratuity(3.00) + ->execute(); + $this->assertNotNull($editResponse); + $this->assertEquals('00', $editResponse->responseCode); + } + + // Tip on Purchase + + public function testRetail045ChargeVisaManualGratuity() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::visaManual(true, true); + + $response = $card->charge(18.61) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withGratuity(3.50) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail046ChargeMasterCardSwipeGratuity() + { + $card = TestCards::masterCardSwipe(); + + $response = $card->charge(18.62) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withGratuity(3.50) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $editResponse = $response->edit() + ->withAllowDuplicates(true) + ->withAmount(18.12) + ->withGratuity(3.00) + ->execute(); + $this->assertNotNull($editResponse); + $this->assertEquals('00', $editResponse->responseCode); + } + + // LEVEL II CORPORATE PURCHASE CARD + + public function testRetail047LevelIIVisaSwipeResponseB() + { + $card = TestCards::visaSwipe(); + + $response = $card->charge(112.34) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('B', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail047aLevelIIVisaSwipeResponseB() + { + $card = TestCards::visaSwipe(); + + $response = $card->charge(112.34) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('B', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withTaxType(TaxType::NOT_USED) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail048LevelIIVisaSwipeResponseR() + { + $card = TestCards::visaSwipe(); + + $response = $card->charge(123.45) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('R', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail049LevelIIVisaManualResponseS() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::visaManual(true, true); + + $response = $card->charge(134.56) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail050LevelIIMasterCardSwipeResponseS() + { + $card = TestCards::masterCardSwipe(); + + $response = $card->charge(111.06) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail051LevelIIMasterCardManualResponseS() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(true, true); + + $response = $card->charge(111.07) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail051aLevelIIMasterCardManualResponseS() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(true, true); + $response = $card->charge(111.08) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail052LevelIIMasterCardManualResponseS() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(true, true); + $response = $card->charge(111.09) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail053LevelIIAmexSwipeNoResponse() + { + $card = TestCards::amexSwipe(); + $response = $card->charge(111.10) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail054LevelIIAmexManualNoResponse() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::amexManual(true, true); + + $response = $card->charge(111.11) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail055LevelIIAmexManualNoResponse() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::amexManual(true, true); + $response = $card->charge(111.12) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail055aLevelIIAmexManualNoResponse() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::amexManual(true, true); + $response = $card->charge(111.13) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + // OFFLINE SALE / AUTHORIZATION + + public function testRetail056OfflineChargeVisaManual() + { + $card = TestCards::visaManual(false, true); + + $response = $card->charge(15.12) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withOfflineAuthCode('654321') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail056OfflineAuthVisaManual() + { + $card = TestCards::visaManual(false, true); + + $response = $card->authorize(15.11) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withOfflineAuthCode('654321') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // RETURN + + public function testRetail057ReturnMasterCard() + { + $card = TestCards::masterCardManual(false, true); + + $response = $card->refund(15.11) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail057aReturnMasterCardSwipe() + { + $card = TestCards::masterCardSwipe(); + $response = $card->refund(15.15) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail058ReturnJcbTransactionId() + { + // See test 14 + } + + // ONLINE VOID / REVERSAL (Required) + + public function testRetail059ReversalVisa() + { + // see test 10 + } + + public function testRetail060ReversalMasterCard() + { + // see test case 17 + } + + public function testRetail061ReversalMasterCard() + { + // see test case 23 + } + + public function testRetail062ReversalMasterCard() + { + // see test case 42 + } + + public function testRetail063ReversalVisaPartial() + { + // see test case 15 + } + + public function testRetail064ReversalDiscoverPartial() + { + // see test 21 + } + + // PIN DEBIT CARD FUNCTIONS + + public function testRetail065DebitSaleVisaSwipe() + { + $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(14.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail066DebitSaleMasterCardSwipe() + { + $card = TestCards::asDebit(TestCards::masterCardSwipe(), 'F505AD81659AA42A3D123412324000AB'); + + $response = $card->charge(14.02) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 71 + $reversal = $response->reverse(14.02) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reversal); + $this->assertEquals('00', $reversal->responseCode); + } + + public function testRetail067DebitSaleVisaSwipeCashBack() + { + $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(14.03) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCashBack(5.00) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail067aDebitSaleMasterCard() + { + $card = TestCards::asDebit(TestCards::masterCardSwipe(), 'F505AD81659AA42A3D123412324000AB'); + + $response = $card->charge(14.04) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // PARTIALLY APPROVED PURCHASE + + public function testRetail068DebitSaleMasterCardPartialApproval() + { + $card = TestCards::asDebit(TestCards::masterCardSwipe(), 'F505AD81659AA42A3D123412324000AB'); + + $response = $card->charge(33.00) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAllowPartialAuth(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(22.00, $response->authorizedAmount); + } + + public function testRetail069DebitSaleVisaPartialApproval() + { + $this->markTestSkipped(); + + $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(44.00) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAllowPartialAuth(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals(33.00, $response->authorizedAmount); + + // test case 72 + $reversal = $response->reverse(33.00) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reversal); + $this->assertEquals('00', $reversal->responseCode); + } + + // RETURN + + public function testRetail070DebitReturnVisaSwipe() + { + $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->refund(14.07) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail070aDebitReturnVisaSwipe() + { + $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->refund(14.08) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $reversalResponse = $response->reverse(14.08) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reversalResponse); + $this->assertEquals('00', $reversalResponse->responseCode); + } + + // REVERSAL + + public function testRetail071DebitReversalMasterCard() + { + // see test case 66 + } + + public function testRetail072DebitReversalVisa() + { + // see test case 96 + } + + /* + EBT FUNCTIONS + Food Stamp Purchase + */ + + public function testRetail080EbtfsPurchaseVisaSwipe() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(101.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail081EbtfsPurchaseVisaManual() + { + $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(102.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Food Stamp Electronic Voucher (Manual Entry Only) + + public function testRetail082EbtVoucherPurchaseVisa() + { + $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); + $card->SerialNumber = '123456789012345'; + $card->approvalCode = '123456'; + + $response = $card->charge(103.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Food Stamp Balance Inquiry + + public function testRetail083EbtfsReturnVisaSwipe() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->refund(104.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail084EbtfsReturnVisaManual() + { + $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->refund(105.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Food Stamp Balance Inquiry + + public function testRetail085EbtBalanceInquiryVisaSwipe() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail086EbtBalanceInquiryVisaManual() + { + $card = TestCards::asEBTManual(TestCards::visaManual(true, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /* + $this->assertEquals('00', $response->responseCode); + EBT CASH BENEFITS + Cash Back Purchase + */ + + public function testRetail087EbtCashBackPurchaseVisaSwipe() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(106.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCashBack(5.00) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail088EbtCashBackPurchaseVisaManual() + { + $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(107.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCashBack(5.00) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // No Cash Back Purchase + + public function testRetail089EbtCashBackPurchaseVisaSwipeNoCashBack() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(108.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCashBack(0) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail090EbtCashBackPurchaseVisaManualNoCashBack() + { + $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(109.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCashBack(0) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Cash Back Balance Inquiry + + public function testRetail091EbtBalanceInquiryVisaSwipeCash() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->balanceInquiry(InquiryType::CASH)->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail092EbtBalanceInquiryVisaManualCash() + { + $card = TestCards::asEBTManual(TestCards::visaManual(true, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->balanceInquiry(InquiryType::CASH)->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Cash Benefits Withdrawal + + public function testRetail093EbtBenefitWithDrawalVisaSwipe() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(110.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail094EbtBenefitWithDrawalVisaManual() + { + $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(111.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCashBack(0) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /* + HMS GIFT - REWARDS + GIFT + ACTIVATE + */ + + public function testRetail095ActivateGift1Swipe() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->activate(6.00)->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail096ActivateGift2Manual() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->activate(7.00)->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + // ADD VALUE + + public function testRetail097AddValueGift1Swipe() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->addValue(8.00) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail098AddValueGift2Manual() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->activate(9.00)->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + // BALANCE INQUIRY + + public function testRetail099BalanceInquiryGift1Swipe() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals(10.00, $response->balanceAmount); + } + + public function testRetail100BalanceInquiryGift2Manual() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + $this->assertEquals(10.00, $response->balanceAmount); + } + + // REPLACE / TRANSFER + + public function testRetail101ReplaceGift1Swipe() + { + $oldCard = TestCards::giftCard1Swipe(); + $newCard = TestCards::giftCard2Manual(); + + $response = $oldCard->replaceWith($newCard)->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail102ReplaceGift2Manual() + { + $newCard = TestCards::giftCard1Swipe(); + $oldCard = TestCards::giftCard2Manual(); + + $response = $oldCard->replaceWith($newCard)->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + // SALE / REDEEM + + public function testRetail103SaleGift1Swipe() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(1.00) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail104SaleGift2Manual() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(2.00) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail105SaleGift1VoidSwipe() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(3.00) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + + // test case 107 + $voidResponse = $response->void()->execute(); + $this->assertNotNull($voidResponse); + $this->assertEquals('0', $voidResponse->responseCode); + } + + public function testRetail106SaleGift2ReversalManual() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(4.00) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + + //test case 108 + $voidResponse = $response->reverse(4.00)->execute(); + $this->assertNotNull($voidResponse); + $this->assertEquals('0', $voidResponse->responseCode); + } + + // VOID + + public function testRetail107VoidGift() + { + // see test case 105 + } + + // REVERSAL + + public function testRetail108ReversalGift() + { + // see test case 106 + } + + // DEACTIVATE + + public function testRetail109DeactivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->deactivate()->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + // RECEIPTS MESSAGING + + public function testRetail110ReceiptsMessaging() + { + // PRINT AND SCAN RECEIPT FOR TEST 107 + } + + /* + REWARDS + BALANCE INQUIRY + */ + + public function testRetail111BalanceInquiryRewards1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + $this->assertTrue($response->pointsBalanceAmount > 0); + } + + public function testRetail112BalanceInquiryRewards2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + $this->assertTrue($response->pointsBalanceAmount > 0); + } + + // ALIAS + + public function testRetail113CreateAliasGift1() + { + $card = GiftCard::create('9725550100'); + $this->assertNotNull($card); + } + + public function testRetail114CreateAliasGift2() + { + $card = GiftCard::create('9725550100'); + $this->assertNotNull($card); + } + + public function testRetail115AddAliasGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->addAlias('2145550199')->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail116AddAliasGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->addAlias('2145550199')->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail117DeleteAliasGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->removeAlias('2145550199')->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail999CloseBatch() + { + try { + $response = BatchService::closeBatch(); + $this->assertNotNull($response); + // error_log(sprintf('Batch ID: %s', $response->Id)); + // error_log(sprintf('Sequence Number: %s', $response->SequenceNumber)); + } catch (Exception $e) { + if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) + && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) + ) { + $this->fail($e->getMessage()); + } + } + } +} From 940cd02728e9fde391c50f28327b9c93cd021027 Mon Sep 17 00:00:00 2001 From: securesubmit-buildmaster Date: Tue, 5 Jan 2021 09:29:24 -0500 Subject: [PATCH 08/13] 20210105 deployment From 0daa01f4002aa7752dc744819a2ca6a4e094f3e8 Mon Sep 17 00:00:00 2001 From: securesubmit-buildmaster Date: Tue, 5 Jan 2021 09:33:21 -0500 Subject: [PATCH 09/13] 20210105 deployment --- .../Gateways/PorticoConnector/CreditTest.php | 730 +++++++++--------- .../Gateways/PorticoConnector/DebitTest.php | 147 ++-- .../Gateways/PorticoConnector/EbtTest.php | 180 ++--- .../Gateways/PorticoConnector/GiftTest.php | 238 +++--- .../PorticoReportingTests.php | 593 +++++++------- .../PorticoTokenManagementTest.php | 145 ++-- 6 files changed, 1018 insertions(+), 1015 deletions(-) diff --git a/test/Integration/Gateways/PorticoConnector/CreditTest.php b/test/Integration/Gateways/PorticoConnector/CreditTest.php index 7a4f4550..2a9316bf 100644 --- a/test/Integration/Gateways/PorticoConnector/CreditTest.php +++ b/test/Integration/Gateways/PorticoConnector/CreditTest.php @@ -1,365 +1,365 @@ -card = new CreditCardData(); - $this->card->number = '4111111111111111'; - $this->card->expMonth = 12; - $this->card->expYear = TestCards::validCardExpYear(); - $this->card->cvn = '123'; - $this->card->cardHolderName = 'Joe Smith'; - - - $this->track = new CreditTrackData(); - $this->track->value = ';'; - $this->track->encryptionData = new EncryptionData(); - $this->track->encryptionData->version = '01'; - - ServicesContainer::configure($this->getConfig()); - } - - public function testCreditAuthorization() - { - $authorization = $this->card->authorize(14) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $capture = $authorization->capture(16) - ->withGratuity(2) - ->execute(); - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function testCreditServiceAuth() - { - $service = new CreditService( - $this->getConfig() - ); - - $authorization = $service->authorize(15) - ->withCurrency('USD') - ->withPaymentMethod($this->card) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $capture = $service->capture($authorization->transactionReference->transactionId) - ->withAmount(17) - ->withGratuity(2) - ->execute(); - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function testCreditSale() - { - $response = $this->card->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditOfflineAuth() - { - $response = $this->card->authorize(16) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditOfflineSale() - { - $response = $this->card->charge(16) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditRefund() - { - $response = $this->card->refund(16) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditReverse() - { - $response = $this->card->reverse(15) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditVerify() - { - $response = $this->card->verify() - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeAuthorization() - { - $authorization = $this->track->authorize(14) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $capture = $authorization->capture(16) - ->withGratuity(2) - ->execute(); - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function testCreditServiceSwipeAuth() - { - $service = new CreditService( - $this->getConfig() - ); - - $authorization = $service->authorize(15) - ->withCurrency('USD') - ->withPaymentMethod($this->track) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $capture = $service->capture($authorization->transactionReference->transactionId) - ->withAmount(17) - ->withGratuity(2) - ->execute(); - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function testCreditSwipeSale() - { - $response = $this->track->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeOfflineAuth() - { - $response = $this->track->authorize(16) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeOfflineSale() - { - $response = $this->track->charge(16) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeAddValue() - { - $this->markTestSkipped('GSB not configured'); - - $response = $this->track->addValue(16) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeBalanceInquiry() - { - $response = $this->track->balanceInquiry() - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeRefund() - { - $response = $this->track->refund(16) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeReverse() - { - $response = $this->track->reverse(15) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeVerify() - { - $response = $this->track->verify() - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MTeSAQAfG1UA9qQDrzl-kz4toXvARyieptFwSKP24w'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - public function testCreditSaleWithCOF() - { - $response = $this->card->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->withCardBrandStorage(StoredCredentialInitiator::CARDHOLDER) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->cardBrandTransactionId); - - $nextResponse = $this->card->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->withCardBrandStorage(StoredCredentialInitiator::MERCHANT, $response->cardBrandTransactionId) - ->execute(); - - $this->assertNotNull($nextResponse); - $this->assertEquals('00', $nextResponse->responseCode); - } - - public function testCreditVerifyWithCOF() - { - $response = $this->card->verify() - ->withAllowDuplicates(true) - ->withCardBrandStorage(StoredCredentialInitiator::CARDHOLDER) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->cardBrandTransactionId); - - $nextResponse = $this->card->verify() - ->withAllowDuplicates(true) - ->withCardBrandStorage(StoredCredentialInitiator::MERCHANT, $response->cardBrandTransactionId) - ->execute(); - - $this->assertNotNull($nextResponse); - $this->assertEquals('00', $nextResponse->responseCode); - } - - public function testCreditAuthorizationWithCOF() - { - $response = $this->card->authorize(14) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->withCardBrandStorage(StoredCredentialInitiator::CARDHOLDER) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->cardBrandTransactionId); - - $nextResponse = $this->card->authorize(14) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->withCardBrandStorage(StoredCredentialInitiator::MERCHANT, $response->cardBrandTransactionId) - ->execute(); - - $this->assertNotNull($nextResponse); - $this->assertEquals('00', $nextResponse->responseCode); - - $captureResponse = $nextResponse->capture(16) - ->withGratuity(2) - ->execute(); - - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testCreditReverseViaClientTxnId() - { - $clientTxnId = time(); - - $authorization = $this->card->charge(420.69) - ->withClientTransactionId($clientTxnId) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $reverse = Transaction::fromClientTransactionId($clientTxnId) - ->reverse(420.69) - ->execute(); - - $this->assertNotNull($reverse); - $this->assertEquals('00', $reverse->responseCode); - } -} +card = new CreditCardData(); + $this->card->number = '4111111111111111'; + $this->card->expMonth = 12; + $this->card->expYear = TestCards::validCardExpYear(); + $this->card->cvn = '123'; + $this->card->cardHolderName = 'Joe Smith'; + + + $this->track = new CreditTrackData(); + $this->track->value = ';'; + $this->track->encryptionData = new EncryptionData(); + $this->track->encryptionData->version = '01'; + + ServicesContainer::configureService($this->getConfig()); + } + + public function testCreditAuthorization() + { + $authorization = $this->card->authorize(14) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $capture = $authorization->capture(16) + ->withGratuity(2) + ->execute(); + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function testCreditServiceAuth() + { + $service = new CreditService( + $this->getConfig() + ); + + $authorization = $service->authorize(15) + ->withCurrency('USD') + ->withPaymentMethod($this->card) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $capture = $service->capture($authorization->transactionReference->transactionId) + ->withAmount(17) + ->withGratuity(2) + ->execute(); + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function testCreditSale() + { + $response = $this->card->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditOfflineAuth() + { + $response = $this->card->authorize(16) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditOfflineSale() + { + $response = $this->card->charge(16) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditRefund() + { + $response = $this->card->refund(16) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditReverse() + { + $response = $this->card->reverse(15) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditVerify() + { + $response = $this->card->verify() + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeAuthorization() + { + $authorization = $this->track->authorize(14) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $capture = $authorization->capture(16) + ->withGratuity(2) + ->execute(); + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function testCreditServiceSwipeAuth() + { + $service = new CreditService( + $this->getConfig() + ); + + $authorization = $service->authorize(15) + ->withCurrency('USD') + ->withPaymentMethod($this->track) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $capture = $service->capture($authorization->transactionReference->transactionId) + ->withAmount(17) + ->withGratuity(2) + ->execute(); + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function testCreditSwipeSale() + { + $response = $this->track->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeOfflineAuth() + { + $response = $this->track->authorize(16) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeOfflineSale() + { + $response = $this->track->charge(16) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeAddValue() + { + $this->markTestSkipped('GSB not configured'); + + $response = $this->track->addValue(16) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeBalanceInquiry() + { + $response = $this->track->balanceInquiry() + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeRefund() + { + $response = $this->track->refund(16) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeReverse() + { + $response = $this->track->reverse(15) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeVerify() + { + $response = $this->track->verify() + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + protected function getConfig() + { + $config = new PorticoConfig(); + $config->secretApiKey = 'skapi_cert_MTeSAQAfG1UA9qQDrzl-kz4toXvARyieptFwSKP24w'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + public function testCreditSaleWithCOF() + { + $response = $this->card->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->withCardBrandStorage(StoredCredentialInitiator::CARDHOLDER) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->cardBrandTransactionId); + + $nextResponse = $this->card->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->withCardBrandStorage(StoredCredentialInitiator::MERCHANT, $response->cardBrandTransactionId) + ->execute(); + + $this->assertNotNull($nextResponse); + $this->assertEquals('00', $nextResponse->responseCode); + } + + public function testCreditVerifyWithCOF() + { + $response = $this->card->verify() + ->withAllowDuplicates(true) + ->withCardBrandStorage(StoredCredentialInitiator::CARDHOLDER) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->cardBrandTransactionId); + + $nextResponse = $this->card->verify() + ->withAllowDuplicates(true) + ->withCardBrandStorage(StoredCredentialInitiator::MERCHANT, $response->cardBrandTransactionId) + ->execute(); + + $this->assertNotNull($nextResponse); + $this->assertEquals('00', $nextResponse->responseCode); + } + + public function testCreditAuthorizationWithCOF() + { + $response = $this->card->authorize(14) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->withCardBrandStorage(StoredCredentialInitiator::CARDHOLDER) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->cardBrandTransactionId); + + $nextResponse = $this->card->authorize(14) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->withCardBrandStorage(StoredCredentialInitiator::MERCHANT, $response->cardBrandTransactionId) + ->execute(); + + $this->assertNotNull($nextResponse); + $this->assertEquals('00', $nextResponse->responseCode); + + $captureResponse = $nextResponse->capture(16) + ->withGratuity(2) + ->execute(); + + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testCreditReverseViaClientTxnId() + { + $clientTxnId = time(); + + $authorization = $this->card->charge(420.69) + ->withClientTransactionId($clientTxnId) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $reverse = Transaction::fromClientTransactionId($clientTxnId) + ->reverse(420.69) + ->execute(); + + $this->assertNotNull($reverse); + $this->assertEquals('00', $reverse->responseCode); + } +} diff --git a/test/Integration/Gateways/PorticoConnector/DebitTest.php b/test/Integration/Gateways/PorticoConnector/DebitTest.php index 21e57e46..dc412eb6 100644 --- a/test/Integration/Gateways/PorticoConnector/DebitTest.php +++ b/test/Integration/Gateways/PorticoConnector/DebitTest.php @@ -1,73 +1,74 @@ -track = TestCards::asDebit(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - ServicesContainer::configure($this->getConfig()); - } - - public function testDebitSale() - { - $response = $this->track->charge(17.01) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testDebitAddValue() - { - $this->markTestSkipped('GSB not configured'); - - $response = $this->track->addValue(15.01) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testDebitRefund() - { - $response = $this->track->refund(16.01) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testDebitReverse() - { - $response = $this->track->reverse(17.01) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } -} +track = TestCards::asDebit(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + ServicesContainer::configureService($this->getConfig()); + } + + public function testDebitSale() + { + $response = $this->track->charge(17.01) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testDebitAddValue() + { + $this->markTestSkipped('GSB not configured'); + + $response = $this->track->addValue(15.01) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testDebitRefund() + { + $response = $this->track->refund(16.01) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testDebitReverse() + { + $response = $this->track->reverse(17.01) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + protected function getConfig() + { + $config = new PorticoConfig(); + $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } +} diff --git a/test/Integration/Gateways/PorticoConnector/EbtTest.php b/test/Integration/Gateways/PorticoConnector/EbtTest.php index 902e79cb..a8eb18f8 100644 --- a/test/Integration/Gateways/PorticoConnector/EbtTest.php +++ b/test/Integration/Gateways/PorticoConnector/EbtTest.php @@ -1,90 +1,90 @@ -card = TestCards::asEBTManual(TestCards::visaManual(), '32539F50C245A6A93D123412324000AA'); - $this->track = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - ServicesContainer::configure($this->getConfig()); - } - - public function testEbtBalanceInquiry() - { - $response = $this->card->balanceInquiry() - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testEbtSale() - { - $response = $this->card->charge(10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testEbtRefund() - { - $response = $this->card->refund(10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testEbtSwipeBalanceInquiry() - { - $response = $this->track->balanceInquiry() - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testEbtSwipeSale() - { - $response = $this->track->charge(10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testEbtSwipeRefund() - { - $response = $this->track->refund(10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } -} +card = TestCards::asEBTManual(TestCards::visaManual(), '32539F50C245A6A93D123412324000AA'); + $this->track = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + ServicesContainer::configureService($this->getConfig()); + } + + public function testEbtBalanceInquiry() + { + $response = $this->card->balanceInquiry() + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testEbtSale() + { + $response = $this->card->charge(10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testEbtRefund() + { + $response = $this->card->refund(10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testEbtSwipeBalanceInquiry() + { + $response = $this->track->balanceInquiry() + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testEbtSwipeSale() + { + $response = $this->track->charge(10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testEbtSwipeRefund() + { + $response = $this->track->refund(10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + protected function getConfig() + { + $config = new PorticoConfig(); + $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } +} diff --git a/test/Integration/Gateways/PorticoConnector/GiftTest.php b/test/Integration/Gateways/PorticoConnector/GiftTest.php index 715f04eb..1e136271 100644 --- a/test/Integration/Gateways/PorticoConnector/GiftTest.php +++ b/test/Integration/Gateways/PorticoConnector/GiftTest.php @@ -1,119 +1,119 @@ -card = new GiftCard(); - $this->card->number = '5022440000000000007'; - - $this->track = new GiftCard(); - $this->track->trackData = '%B5022440000000000098^^391200081613?;5022440000000000098=391200081613?'; - - ServicesContainer::configure($this->getConfig()); - } - - public function testGiftCreate() - { - $newCard = GiftCard::create('2145550199'); - $this->assertNotNull($newCard); - $this->assertNotNull($newCard->number); - $this->assertNotNull($newCard->alias); - $this->assertNotNull($newCard->pin); - } - - public function testGiftAddAlias() - { - $response = $this->card->addAlias('2145550199') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftAddValue() - { - $response = $this->card->addValue(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftBalanceInquiry() - { - $response = $this->card->balanceInquiry() - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftSale() - { - $response = $this->card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftDeactivate() - { - $response = $this->card->deactivate() - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftRemoveAlias() - { - $response = $this->card->removeAlias('2145550199') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftReplace() - { - $response = $this->card->replaceWith($this->track) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftReverse() - { - $response = $this->card->reverse(10) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftRewards() - { - $response = $this->card->rewards(10) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } -} +card = new GiftCard(); + $this->card->number = '5022440000000000007'; + + $this->track = new GiftCard(); + $this->track->trackData = '%B5022440000000000098^^391200081613?;5022440000000000098=391200081613?'; + + ServicesContainer::configureService($this->getConfig()); + } + + public function testGiftCreate() + { + $newCard = GiftCard::create('2145550199'); + $this->assertNotNull($newCard); + $this->assertNotNull($newCard->number); + $this->assertNotNull($newCard->alias); + $this->assertNotNull($newCard->pin); + } + + public function testGiftAddAlias() + { + $response = $this->card->addAlias('2145550199') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftAddValue() + { + $response = $this->card->addValue(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftBalanceInquiry() + { + $response = $this->card->balanceInquiry() + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftSale() + { + $response = $this->card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftDeactivate() + { + $response = $this->card->deactivate() + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftRemoveAlias() + { + $response = $this->card->removeAlias('2145550199') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftReplace() + { + $response = $this->card->replaceWith($this->track) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftReverse() + { + $response = $this->card->reverse(10) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftRewards() + { + $response = $this->card->rewards(10) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + protected function getConfig() + { + $config = new PorticoConfig(); + $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } +} diff --git a/test/Integration/Gateways/PorticoConnector/PorticoReportingTests.php b/test/Integration/Gateways/PorticoConnector/PorticoReportingTests.php index c6053fb0..15274506 100644 --- a/test/Integration/Gateways/PorticoConnector/PorticoReportingTests.php +++ b/test/Integration/Gateways/PorticoConnector/PorticoReportingTests.php @@ -1,296 +1,297 @@ -card = new CreditCardData(); - $this->card->number = '4111111111111111'; - $this->card->expMonth = 12; - $this->card->expYear = TestCards::validCardExpYear(); - $this->card->cvn = '123'; - $this->card->cardHolderName = 'Joe Smith'; - - - $this->reportingService = new ReportingService(); - $this->searchCriteria = new SearchCriteriaBuilder(); - - ServicesContainer::configure($this->getConfig()); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - public function testReportActivity() - { - date_default_timezone_set("UTC"); - $dateFormat = 'Y-m-d\TH:i:s.00\Z'; - $dateMinus15days = new DateTime(); - $dateMinus15days->sub(new DateInterval('P15D')); - $dateMinus10Utc = gmdate($dateFormat, $dateMinus15days->Format('U')); - $nowUtc = gmdate($dateFormat); - - $response = $this->reportingService->activity() - ->withStartDate($dateMinus10Utc) - ->withEndDate($nowUtc) - ->execute(); - $this->assertNotNull($response); - $this->assertTrue(count($response) > 0); - } - - public function testReportActivityByDays() - { - date_default_timezone_set("UTC"); - $dateFormat = 'Y-m-d\TH:i:s.00\Z'; - $dateMinus5days = new DateTime(); - $dateMinus5days->sub(new DateInterval('P5D')); - $dateMinus10Utc = gmdate($dateFormat, $dateMinus5days->Format('U')); - $nowUtc = gmdate($dateFormat); - - $response = $this->reportingService->activity() - ->withStartDate($dateMinus10Utc) - ->withEndDate($nowUtc) - ->execute(); - $this->assertNotNull($response); - $this->assertTrue(count($response) > 0); - } - - public function testReportTransactionDetail() - { - $response = $this->reportingService->transactionDetail("1088532284")->execute(); - $this->assertNotNull($response); - } - - public function testInvoiceNumber() - { - $address = new Address(); - $address->postalCode = "12345"; - - $authResponse = $this->card->charge(10) - ->withCurrency("USD") - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($authResponse); - $this->assertEquals('00', $authResponse->responseCode); - $this->assertNotNull($authResponse->transactionId); - - $report = ReportingService::transactionDetail($authResponse->transactionId) - ->execute(); - - $this->assertNotNull($report); - $this->assertEquals('123456', $report->invoiceNumber); - } - - public function testReportCardHolderName() - { - $gateway_response = $this->card->charge(10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $response = $this->reportingService->transactionDetail($gateway_response->transactionId)->execute(); - - $this->assertEquals('Joe', $response->cardHolderFirstName); - $this->assertEquals('Smith', $response->cardHolderLastName); - } - - public function testReportFindTransactionWithTransactionId() - { - $gateway_response = $this->card->charge(10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $response = $this->reportingService->findTransactions($gateway_response->transactionId)->execute(); - $this->assertNotNull($response); - } - - public function testReportFindTransactionNoCriteria() - { - $response = $this->reportingService->findTransactions()->execute(); - $this->assertNotNull($response); - } - - public function testReportFindTransactionWithCriteria() - { - date_default_timezone_set("UTC"); - $dateFormat = 'Y-m-d\TH:i:s.00\Z'; - $dateMinus10days = new DateTime(); - $dateMinus10days->sub(new DateInterval('P5D')); - $dateMinus5Utc = gmdate($dateFormat, $dateMinus10days->Format('U')); - $nowUtc = gmdate($dateFormat); - - $response = $this->reportingService->findTransactions() - ->withTimeZoneConversion(TimeZoneConversion::MERCHANT) - ->where('startDate', $dateMinus5Utc) - ->and('endDate', $nowUtc) - ->execute(); - - $this->assertNotNull($response); - $this->assertTrue(count($response) > 0); - } - - public function testCreditAuthWithConvenienceAmount() - { - $authorization = $this->card->authorize(14) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->withConvenienceAmount(2) - ->execute(); - - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $report = $this->reportingService->transactionDetail($authorization->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->convenienceAmount); - } - - public function testCreditAuthWithShippingAmount() - { - $authorization = $this->card->authorize(14) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->withShippingAmount(2) - ->execute(); - - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $report = $this->reportingService->transactionDetail($authorization->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->shippingAmount); - } - - public function testCreditSaleWithConvenienceAmount() - { - $response = $this->card->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->withConvenienceAmount(2) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->convenienceAmount); - } - - public function testCreditSaleWithShippingAmount() - { - $response = $this->card->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->withShippingAmount(2) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->shippingAmount); - } - - public function testCreditOfflineAuthWithConvenienceAmount() - { - $response = $this->card->authorize(16) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->withConvenienceAmount(2) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->convenienceAmount); - } - - public function testCreditOfflineAuthWithShippingAmount() - { - $response = $this->card->authorize(16) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->withShippingAmount(2) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->shippingAmount); - } - - public function testCreditOfflineSaleWithConvenienceAmount() - { - $response = $this->card->charge(17) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->WithConvenienceAmount(2) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->convenienceAmount); - } - - public function testCreditOfflineSaleWithShippingAmount() - { - $response = $this->card->charge(17) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->withShippingAmount(2) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->shippingAmount); - } -} +card = new CreditCardData(); + $this->card->number = '4111111111111111'; + $this->card->expMonth = 12; + $this->card->expYear = TestCards::validCardExpYear(); + $this->card->cvn = '123'; + $this->card->cardHolderName = 'Joe Smith'; + + + $this->reportingService = new ReportingService(); + $this->searchCriteria = new SearchCriteriaBuilder(); + + ServicesContainer::configureService($this->getConfig()); + } + + protected function getConfig() + { + $config = new PorticoConfig(); + $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + public function testReportActivity() + { + date_default_timezone_set("UTC"); + $dateFormat = 'Y-m-d\TH:i:s.00\Z'; + $dateMinus15days = new DateTime(); + $dateMinus15days->sub(new DateInterval('P15D')); + $dateMinus10Utc = gmdate($dateFormat, $dateMinus15days->Format('U')); + $nowUtc = gmdate($dateFormat); + + $response = $this->reportingService->activity() + ->withStartDate($dateMinus10Utc) + ->withEndDate($nowUtc) + ->execute(); + $this->assertNotNull($response); + $this->assertTrue(count($response) > 0); + } + + public function testReportActivityByDays() + { + date_default_timezone_set("UTC"); + $dateFormat = 'Y-m-d\TH:i:s.00\Z'; + $dateMinus5days = new DateTime(); + $dateMinus5days->sub(new DateInterval('P5D')); + $dateMinus10Utc = gmdate($dateFormat, $dateMinus5days->Format('U')); + $nowUtc = gmdate($dateFormat); + + $response = $this->reportingService->activity() + ->withStartDate($dateMinus10Utc) + ->withEndDate($nowUtc) + ->execute(); + $this->assertNotNull($response); + $this->assertTrue(count($response) > 0); + } + + public function testReportTransactionDetail() + { + $response = $this->reportingService->transactionDetail("1088532284")->execute(); + $this->assertNotNull($response); + } + + public function testInvoiceNumber() + { + $address = new Address(); + $address->postalCode = "12345"; + + $authResponse = $this->card->charge(10) + ->withCurrency("USD") + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($authResponse); + $this->assertEquals('00', $authResponse->responseCode); + $this->assertNotNull($authResponse->transactionId); + + $report = ReportingService::transactionDetail($authResponse->transactionId) + ->execute(); + + $this->assertNotNull($report); + $this->assertEquals('123456', $report->invoiceNumber); + } + + public function testReportCardHolderName() + { + $gateway_response = $this->card->charge(10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $response = $this->reportingService->transactionDetail($gateway_response->transactionId)->execute(); + + $this->assertEquals('Joe', $response->cardHolderFirstName); + $this->assertEquals('Smith', $response->cardHolderLastName); + } + + public function testReportFindTransactionWithTransactionId() + { + $gateway_response = $this->card->charge(10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $response = $this->reportingService->findTransactions($gateway_response->transactionId)->execute(); + $this->assertNotNull($response); + } + + public function testReportFindTransactionNoCriteria() + { + $response = $this->reportingService->findTransactions()->execute(); + $this->assertNotNull($response); + } + + public function testReportFindTransactionWithCriteria() + { + date_default_timezone_set("UTC"); + $dateFormat = 'Y-m-d\TH:i:s.00\Z'; + $dateMinus10days = new DateTime(); + $dateMinus10days->sub(new DateInterval('P5D')); + $dateMinus5Utc = gmdate($dateFormat, $dateMinus10days->Format('U')); + $nowUtc = gmdate($dateFormat); + + $response = $this->reportingService->findTransactions() + ->withTimeZoneConversion(TimeZoneConversion::MERCHANT) + ->where('startDate', $dateMinus5Utc) + ->and('endDate', $nowUtc) + ->execute(); + + $this->assertNotNull($response); + $this->assertTrue(count($response) > 0); + } + + public function testCreditAuthWithConvenienceAmount() + { + $authorization = $this->card->authorize(14) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->withConvenienceAmount(2) + ->execute(); + + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $report = $this->reportingService->transactionDetail($authorization->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->convenienceAmount); + } + + public function testCreditAuthWithShippingAmount() + { + $authorization = $this->card->authorize(14) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->withShippingAmount(2) + ->execute(); + + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $report = $this->reportingService->transactionDetail($authorization->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->shippingAmount); + } + + public function testCreditSaleWithConvenienceAmount() + { + $response = $this->card->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->withConvenienceAmount(2) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->convenienceAmount); + } + + public function testCreditSaleWithShippingAmount() + { + $response = $this->card->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->withShippingAmount(2) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->shippingAmount); + } + + public function testCreditOfflineAuthWithConvenienceAmount() + { + $response = $this->card->authorize(16) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->withConvenienceAmount(2) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->convenienceAmount); + } + + public function testCreditOfflineAuthWithShippingAmount() + { + $response = $this->card->authorize(16) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->withShippingAmount(2) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->shippingAmount); + } + + public function testCreditOfflineSaleWithConvenienceAmount() + { + $response = $this->card->charge(17) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->WithConvenienceAmount(2) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->convenienceAmount); + } + + public function testCreditOfflineSaleWithShippingAmount() + { + $response = $this->card->charge(17) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->withShippingAmount(2) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->shippingAmount); + } +} diff --git a/test/Integration/Gateways/PorticoConnector/PorticoTokenManagementTest.php b/test/Integration/Gateways/PorticoConnector/PorticoTokenManagementTest.php index c17be63a..78117b5a 100644 --- a/test/Integration/Gateways/PorticoConnector/PorticoTokenManagementTest.php +++ b/test/Integration/Gateways/PorticoConnector/PorticoTokenManagementTest.php @@ -1,72 +1,73 @@ -getConfig()); - - try { - $card = new CreditCardData(); - $card->number = '4111111111111111'; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cvn = '123'; - - $this->token = $card->tokenize()->execute()->token; - $this->assertTrue(!empty($this->token), 'TOKEN COULD NOT BE GENERATED.'); - } catch (ApiException $exc) { - $this->fail($exc->message); - } - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; - $config->serviceUrl = 'https://cert.api2.heartlandportico.com'; - return $config; - } - - public function testUpdateToken() - { - $token = new CreditCardData(); - $token->token = $this->token; - $token->expMonth = 12; - $token->expYear = TestCards::validCardExpYear(); - - $this->assertTrue($token->updateTokenExpiry()); - - // should succeed - $response = $token->verify()->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testDeleteToken() - { - $token = new CreditCardData(); - $token->token = $this->token; - - $this->assertTrue($token->deleteToken()); - - // should fail - try { - $response = $token->verify()->execute(); - } catch (GatewayException $exc) { - $this->assertEquals('27', $exc->responseCode); - } - } -} +getConfig()); + + try { + $card = new CreditCardData(); + $card->number = '4111111111111111'; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cvn = '123'; + + $this->token = $card->tokenize()->execute()->token; + $this->assertTrue(!empty($this->token), 'TOKEN COULD NOT BE GENERATED.'); + } catch (ApiException $exc) { + $this->fail($exc->getMessage()); + } + } + + protected function getConfig() + { + $config = new PorticoConfig(); + $config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; + $config->serviceUrl = 'https://cert.api2.heartlandportico.com'; + return $config; + } + + public function testUpdateToken() + { + $token = new CreditCardData(); + $token->token = $this->token; + $token->expMonth = 12; + $token->expYear = TestCards::validCardExpYear(); + + $this->assertTrue($token->updateTokenExpiry()); + + // should succeed + $response = $token->verify()->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testDeleteToken() + { + $token = new CreditCardData(); + $token->token = $this->token; + + $this->assertTrue($token->deleteToken()); + + // should fail + try { + $response = $token->verify()->execute(); + $this->assertTrue(false, 'Expected exception'); + } catch (GatewayException $exc) { + $this->assertEquals('23', $exc->responseCode); + } + } +} From b97b2aae71e1fcdcd48a0a664df783c588a630ef Mon Sep 17 00:00:00 2001 From: securesubmit-buildmaster Date: Tue, 5 Jan 2021 09:36:46 -0500 Subject: [PATCH 10/13] 20210105 deployment --- .../Gateways/RealexConnector/CreditTest.php | 573 +++---- .../Gateways/RealexConnector/HppTest.php | 1511 +++++++++-------- .../Gateways/RealexConnector/HppTestCase.php | 488 +++--- .../RealexConnector/Realex3dSecureTests.php | 1001 ++++++----- .../RealexConnector/RealexApmTest.php | 385 +++-- .../RealexConnector/RecurringTest.php | 782 ++++----- 6 files changed, 2366 insertions(+), 2374 deletions(-) diff --git a/test/Integration/Gateways/RealexConnector/CreditTest.php b/test/Integration/Gateways/RealexConnector/CreditTest.php index 104c718c..13107c87 100644 --- a/test/Integration/Gateways/RealexConnector/CreditTest.php +++ b/test/Integration/Gateways/RealexConnector/CreditTest.php @@ -1,286 +1,287 @@ -number = '4111111111111111'; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cvn = '123'; - $card->cardHolderName = 'Joe Smith'; - $this->card = $card; - - ServicesContainer::configure($this->getConfig()); - } - - public function testCreditAuthorization() - { - $authorization = $this->card->authorize(14) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $capture = $authorization->capture(16) - ->withGratuity(2) - ->execute(); - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function testCreditServiceAuth() - { - $service = new CreditService( - $this->getConfig() - ); - - $authorization = $service->authorize(15) - ->withCurrency('USD') - ->withPaymentMethod($this->card) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $capture = $service->capture($authorization->transactionReference) - ->withAmount(17) - ->withGratuity(2) - ->execute(); - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function testCreditSale() - { - $response = $this->card->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditRefund() - { - $response = $this->card->refund(16) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditRebate() - { - $response = $this->card->charge(17) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode, $response->responseMessage); - - $rebate = $response->refund(17) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($rebate); - $this->assertEquals('00', $rebate->responseCode, $rebate->responseMessage); - } - - public function testCreditVoid() - { - $response = $this->card->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode, $response->responseMessage); - - $voidResponse = $response->void()->execute(); - $this->assertNotNull($voidResponse); - $this->assertEquals('00', $voidResponse->responseCode, $voidResponse->responseMessage); - } - - public function testCreditVerify() - { - $response = $this->card->verify() - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->rebatePassword = 'rebate'; - $config->refundPassword = 'refund'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - return $config; - } - - protected function dccSetup() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "apidcc"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - - ServicesContainer::configure($config); - } - - public function testCreditGetDccInfo() - { - $this->dccSetup(); - - $this->card->number = '4002933640008365'; - $orderId = GenerationUtils::generateOrderId(); - - $dccDetails = $this->card->getDccRate(DccRateType::SALE, 10, 'USD', DccProcessor::FEXCO, $orderId); - - $this->assertNotNull($dccDetails); - $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); - $this->assertNotNull($dccDetails->dccResponseResult); - } - - public function testCreditDccRateAuthorize() - { - $this->dccSetup(); - - $this->card->number = '4006097467207025'; - $orderId = GenerationUtils::generateOrderId(); - - $dccDetails = $this->card->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); - - $this->assertNotNull($dccDetails); - $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); - $this->assertNotNull($dccDetails->dccResponseResult); - - //set Currency conversion rates - $dccValues = new DccRateData(); - $dccValues->orderId = $dccDetails->transactionReference->orderId; - $dccValues->dccProcessor = DccProcessor::FEXCO; - $dccValues->dccType = 1; - $dccValues->dccRateType = DccRateType::SALE; - $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; - $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; - $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; - - $response = $this->card->authorize(1001) - ->withCurrency('EUR') - ->withAllowDuplicates(true) - ->withDccRateData($dccValues) - ->withOrderId($orderId) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode, $response->responseMessage); - } - - public function testCreditDccRateCharge() - { - $this->dccSetup(); - - $this->card->number = '4006097467207025'; - $orderId = GenerationUtils::generateOrderId(); - - $dccDetails = $this->card->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); - - $this->assertNotNull($dccDetails); - $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); - $this->assertNotNull($dccDetails->dccResponseResult); - - //set Currency conversion rates - $dccValues = new DccRateData(); - $dccValues->orderId = $dccDetails->transactionReference->orderId; - $dccValues->dccProcessor = DccProcessor::FEXCO; - $dccValues->dccType = 1; - $dccValues->dccRateType = DccRateType::SALE; - $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; - $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; - $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; - - $response = $this->card->charge(1001) - ->withCurrency('EUR') - ->withAllowDuplicates(true) - ->withDccRateData($dccValues) - ->withOrderId($orderId) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode, $response->responseMessage); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage Unexpected Gateway Response: 105 - Cannot find DCC information for that card - */ - public function testCreditDccInfoNotFound() - { - $this->dccSetup(); - - $this->card->number = '4002933640008365'; - $orderId = GenerationUtils::generateOrderId(); - - $dccDetails = $this->card->getDccRate(DccRateType::SALE, 10, 'EUR', DccProcessor::FEXCO, $orderId); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage Unexpected Gateway Response: 508 - Incorrect DCC information - doesn't correspond to dccrate request - */ - public function testCreditDccInfoMismatch() - { - $this->dccSetup(); - - $this->card->number = '4006097467207025'; - $orderId = GenerationUtils::generateOrderId(); - - $dccDetails = $this->card->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); - - $this->assertNotNull($dccDetails); - $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); - $this->assertNotNull($dccDetails->dccResponseResult); - - $dccValues = new DccRateData(); - $dccValues->orderId = $dccDetails->transactionReference->orderId; - $dccValues->dccProcessor = DccProcessor::FEXCO; - $dccValues->dccType = 1; - $dccValues->dccRateType = DccRateType::SALE; - $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; - $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; - $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; - - $response = $this->card->authorize(100) - ->withCurrency('EUR') - ->withAllowDuplicates(true) - ->withDccRateData($dccValues) - ->withOrderId($orderId) - ->execute(); - } -} +number = '4111111111111111'; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cvn = '123'; + $card->cardHolderName = 'Joe Smith'; + $this->card = $card; + + ServicesContainer::configureService($this->getConfig()); + } + + public function testCreditAuthorization() + { + $authorization = $this->card->authorize(14) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $capture = $authorization->capture(16) + ->withGratuity(2) + ->execute(); + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function testCreditServiceAuth() + { + $service = new CreditService( + $this->getConfig() + ); + + $authorization = $service->authorize(15) + ->withCurrency('USD') + ->withPaymentMethod($this->card) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $capture = $service->capture($authorization->transactionReference) + ->withAmount(17) + ->withGratuity(2) + ->execute(); + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function testCreditSale() + { + $response = $this->card->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditRefund() + { + $response = $this->card->refund(16) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditRebate() + { + $response = $this->card->charge(17) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode, $response->responseMessage); + + $rebate = $response->refund(17) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($rebate); + $this->assertEquals('00', $rebate->responseCode, $rebate->responseMessage); + } + + public function testCreditVoid() + { + $response = $this->card->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode, $response->responseMessage); + + $voidResponse = $response->void()->execute(); + $this->assertNotNull($voidResponse); + $this->assertEquals('00', $voidResponse->responseCode, $voidResponse->responseMessage); + } + + public function testCreditVerify() + { + $response = $this->card->verify() + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + protected function getConfig() + { + $config = new GpEcomConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->rebatePassword = 'rebate'; + $config->refundPassword = 'refund'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + return $config; + } + + protected function dccSetup() + { + $config = new GpEcomConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "apidcc"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + + ServicesContainer::configureService($config); + } + + public function testCreditGetDccInfo() + { + $this->dccSetup(); + + $this->card->number = '4002933640008365'; + $orderId = GenerationUtils::generateOrderId(); + + $dccDetails = $this->card->getDccRate(DccRateType::SALE, 10, 'USD', DccProcessor::FEXCO, $orderId); + + $this->assertNotNull($dccDetails); + $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); + $this->assertNotNull($dccDetails->dccResponseResult); + } + + public function testCreditDccRateAuthorize() + { + $this->dccSetup(); + + $this->card->number = '4006097467207025'; + $orderId = GenerationUtils::generateOrderId(); + + $dccDetails = $this->card->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); + + $this->assertNotNull($dccDetails); + $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); + $this->assertNotNull($dccDetails->dccResponseResult); + + //set Currency conversion rates + $dccValues = new DccRateData(); + $dccValues->orderId = $dccDetails->transactionReference->orderId; + $dccValues->dccProcessor = DccProcessor::FEXCO; + $dccValues->dccType = 1; + $dccValues->dccRateType = DccRateType::SALE; + $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; + $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; + $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; + + $response = $this->card->authorize(1001) + ->withCurrency('EUR') + ->withAllowDuplicates(true) + ->withDccRateData($dccValues) + ->withOrderId($orderId) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode, $response->responseMessage); + } + + public function testCreditDccRateCharge() + { + $this->dccSetup(); + + $this->card->number = '4006097467207025'; + $orderId = GenerationUtils::generateOrderId(); + + $dccDetails = $this->card->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); + + $this->assertNotNull($dccDetails); + $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); + $this->assertNotNull($dccDetails->dccResponseResult); + + //set Currency conversion rates + $dccValues = new DccRateData(); + $dccValues->orderId = $dccDetails->transactionReference->orderId; + $dccValues->dccProcessor = DccProcessor::FEXCO; + $dccValues->dccType = 1; + $dccValues->dccRateType = DccRateType::SALE; + $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; + $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; + $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; + + $response = $this->card->charge(1001) + ->withCurrency('EUR') + ->withAllowDuplicates(true) + ->withDccRateData($dccValues) + ->withOrderId($orderId) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode, $response->responseMessage); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage Unexpected Gateway Response: 105 - Cannot find DCC information for that card + */ + public function testCreditDccInfoNotFound() + { + $this->dccSetup(); + + $this->card->number = '4002933640008365'; + $orderId = GenerationUtils::generateOrderId(); + + $dccDetails = $this->card->getDccRate(DccRateType::SALE, 10, 'EUR', DccProcessor::FEXCO, $orderId); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage Unexpected Gateway Response: 508 - Incorrect DCC information - doesn't correspond to dccrate request + */ + public function testCreditDccInfoMismatch() + { + $this->dccSetup(); + + $this->card->number = '4006097467207025'; + $orderId = GenerationUtils::generateOrderId(); + + $dccDetails = $this->card->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); + + $this->assertNotNull($dccDetails); + $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); + $this->assertNotNull($dccDetails->dccResponseResult); + + $dccValues = new DccRateData(); + $dccValues->orderId = $dccDetails->transactionReference->orderId; + $dccValues->dccProcessor = DccProcessor::FEXCO; + $dccValues->dccType = 1; + $dccValues->dccRateType = DccRateType::SALE; + $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; + $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; + $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; + + $response = $this->card->authorize(100) + ->withCurrency('EUR') + ->withAllowDuplicates(true) + ->withDccRateData($dccValues) + ->withOrderId($orderId) + ->execute(); + } +} diff --git a/test/Integration/Gateways/RealexConnector/HppTest.php b/test/Integration/Gateways/RealexConnector/HppTest.php index a07129ee..a10bea65 100644 --- a/test/Integration/Gateways/RealexConnector/HppTest.php +++ b/test/Integration/Gateways/RealexConnector/HppTest.php @@ -1,755 +1,756 @@ -merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - return new HostedService($config); - } - - public function testCreditAuth() - { - $config = new GpEcomConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - $address = new Address(); - $address->postalCode = "123|56"; - $address->country = "IRELAND"; - - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->authorize(1) - ->withCurrency("EUR") - ->withCustomerId("123456") - ->withAddress($address) - ->serialize(); - - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } - - public function testCreditSale() - { - $config = new GpEcomConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - $address = new Address(); - $address->postalCode = "123|56"; - $address->country = "IRELAND"; - - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->charge(1) - ->withCurrency("EUR") - ->withCustomerId("123456") - ->withAddress($address) - ->serialize(); - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - - $this->assertNotNull($parsedResponse); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } - - /* 03. ProcessPaymentOtbRequest */ - - public function testCreditVerify() - { - $config = new GpEcomConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - $address = new Address(); - $address->postalCode = "123|56"; - $address->country = "IRELAND"; - - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->verify() - ->withCurrency("EUR") - ->withCustomerId("123456") - ->withAddress($address) - ->serialize(); - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - $this->assertNotNull($parsedResponse); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testAuthNoAmount() - { - $service = $this->basicSetup(); - $service->authorize(null)->withCurrency("USD")->serialize(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testAuthNoCurrency() - { - $service = $this->basicSetup(); - $service->authorize(10)->serialize(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testSaleNoAmount() - { - $service = $this->basicSetup(); - $service->charge(null)->withCurrency("USD")->serialize(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testSaleNoCurrency() - { - $service = $this->basicSetup(); - $service->charge(10)->serialize(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testVerifyNoCurrency() - { - $service = $this->basicSetup(); - $service->verify()->serialize(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testVerifyWithAmount() - { - $service = $this->basicSetup(); - $service->verify()->withAmount(10)->serialize(); - } - - /* 05. CardStorageCreatePayerStoreCardRequest */ - - public function testCardStorageCreatePayer() - { - $config = new GpEcomConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "3dsecure"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - // data to be passed to the HPP along with transaction level settings - $hostedPaymentData = new HostedPaymentData(); - $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box - $hostedPaymentData->customerExists = "0"; // new customer - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->charge(15) - ->withCurrency("EUR") - ->withHostedPaymentData($hostedPaymentData) - ->serialize(); - - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - $this->assertNotNull($parsedResponse); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } - - /* 07. CardStorageDisplayStoredCardsRequest */ - - public function testCardStorageDisplayStoredCard() - { - $config = new GpEcomConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "3dsecure"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - // data to be passed to the HPP along with transaction level settings - $hostedPaymentData = new HostedPaymentData(); - $hostedPaymentData->offerToSaveCard = "1"; - $hostedPaymentData->customerExists = "1"; - $hostedPaymentData->customerKey = "5e7e9152-2d53-466d-91bc-6d12ebc56b79"; - - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->charge(15) - ->withCurrency("EUR") - ->withHostedPaymentData($hostedPaymentData) - ->serialize(); - - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - $this->assertNotNull($parsedResponse); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } - - /* 09. ContinuousAuthorityRequest */ - - public function testContinuousAuthorityRequest() - { - $config = new GpEcomConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "3dsecure"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->charge(15) - ->withCurrency("EUR") - ->withRecurringInfo(RecurringType::FIXED, RecurringSequence::FIRST) - ->serialize(); - - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - $this->assertNotNull($parsedResponse); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } - - /* 13. DynamicCurrencyConversionRequest */ - - public function testEnableDynamicCurrencyConversionRequest() - { - //set config for DCC - $config = new GpEcomConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_2; - $config->hostedPaymentConfig->directCurrencyConversionEnabled = "1"; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - //serialize the request - $json = $service->Charge(19) - ->withCurrency("EUR") - ->withTimestamp("20170725154824") - ->withOrderId('GTI5Yxb0SumL_TkDMCAxQA') - ->serialize(); - - $this->assertNotNull($json); - $this->assertEquals($json, '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1900","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","DCC_ENABLE":"1","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","HPP_VERSION":"2","SHA1HASH":"448d742db89b05ce97152beb55157c904f3839cc"}'); - } - - public function testDisableDynamicCurrencyConversionRequest() - { - //set config for DCC - $config = new GpEcomConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_2; - $config->hostedPaymentConfig->directCurrencyConversionEnabled = "0"; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - //serialize the request - $json = $service->Charge(19) - ->withCurrency("EUR") - ->withTimestamp("20170725154824") - ->withOrderId('GTI5Yxb0SumL_TkDMCAxQA') - ->serialize(); - - $this->assertNotNull($json); - $this->assertEquals($json, '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1900","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","DCC_ENABLE":"0","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","HPP_VERSION":"2","SHA1HASH":"448d742db89b05ce97152beb55157c904f3839cc"}'); - } - - /* 11. FraudManagementRequest */ - - public function testFraudManagementRequest() - { - $config = new GpEcomConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "3dsecure"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - $config->hostedPaymentConfig->version = 2; - $config->hostedPaymentConfig->FraudFilterMode = FraudFilterMode::PASSIVE; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "50001|Flat 123"; - $billingAddress->country = "US"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "654|123"; - $shippingAddress->country = "GB"; - - // data to be passed to the HPP along with transaction level settings - $hostedPaymentData = new HostedPaymentData(); - $hostedPaymentData->customerNumber = "E8953893489"; // display the save card tick box - $hostedPaymentData->productId = "SID9838383"; // new customer - - //serialize the request - $json = $service->charge(19) - ->withCurrency("EUR") - ->withAddress($billingAddress, AddressType::BILLING) - ->withAddress($shippingAddress, AddressType::SHIPPING) - //->withProductId("SID9838383") // prodid - ->withClientTransactionId("Car Part HV") // varref - //->withCustomerId("E8953893489") // custnum - ->withCustomerIpAddress("123.123.123.123") - //->withFraudFilter(FraudFilterMode::PASSIVE) - ->withHostedPaymentData($hostedPaymentData) - ->serialize(); - - $this->assertNotNull($json); - - //make API call - $response = $client->sendRequest($json, $config->hostedPaymentConfig->version); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - $this->assertNotNull($parsedResponse); - $this->assertEquals("00", $parsedResponse->responseCode); - } - - /* Serialize methods Test case */ - - public function testBasicAuthHppVersion1() - { - $config = new GpEcomConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_1; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - $json = $service->authorize(19.99) - ->withCurrency("EUR") - ->withTimeStamp("20170725154824") - ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") - ->serialize(); - - $expectedJson = '{"MERCHANT_ID":"TWVyY2hhbnRJZA==","ACCOUNT":"aW50ZXJuZXQ=","ORDER_ID":"R1RJNVl4YjBTdW1MX1RrRE1DQXhRQQ==","AMOUNT":"MTk5OQ==","CURRENCY":"RVVS","TIMESTAMP":"MjAxNzA3MjUxNTQ4MjQ=","AUTO_SETTLE_FLAG":"MA==","HPP_LANG":"R0I=","MERCHANT_RESPONSE_URL":"aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcmVzcG9uc2U=","HPP_VERSION":"MQ==","SHA1HASH":"MDYxNjA5Zjg1YThlMDE5MWRjN2Y0ODdmODI3OGU3MTg5OGEyZWUyZA=="}'; - $this->assertEquals($json, $expectedJson); - } - - public function testBasicAuthHppVersion2() - { - $config = new GpEcomConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_2; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - $json = $service->authorize(19.99) - ->withCurrency("EUR") - ->withTimeStamp("20170725154824") - ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") - ->serialize(); - - $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"0","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","SHA1HASH":"061609f85a8e0191dc7f487f8278e71898a2ee2d"}'; - $this->assertEquals($json, $expectedJson); - } - - public function testBasicSale() - { - $config = new GpEcomConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_2; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - $json = $service->charge(19.99) - ->withCurrency("EUR") - ->withTimeStamp("20170725154824") - ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") - ->serialize(); - - $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","SHA1HASH":"061609f85a8e0191dc7f487f8278e71898a2ee2d"}'; - $this->assertEquals($json, $expectedJson); - } - - public function testBasicHostedPaymentDataHppVersion1() - { - $config = new GpEcomConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_1; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - $hostedPaymentData = new HostedPaymentData(); - $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box - $hostedPaymentData->customerExists = "0"; // new customer - $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; - $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; - - $json = $service->charge(19.99) - ->withCurrency("EUR") - ->withTimeStamp("20170725154824") - ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") - ->WithHostedPaymentData($hostedPaymentData) - ->WithDescription("Mobile Channel") - ->WithClientTransactionId("My Legal Entity") - ->serialize(); - - $expectedJson = '{"MERCHANT_ID":"TWVyY2hhbnRJZA==","ACCOUNT":"aW50ZXJuZXQ=","ORDER_ID":"R1RJNVl4YjBTdW1MX1RrRE1DQXhRQQ==","AMOUNT":"MTk5OQ==","CURRENCY":"RVVS","TIMESTAMP":"MjAxNzA3MjUxNTQ4MjQ=","AUTO_SETTLE_FLAG":"MQ==","COMMENT1":"TW9iaWxlIENoYW5uZWw=","CUST_NUM":"YTAyODc3NGYtYmVmZi00N2JjLWJkNmUtZWQ3ZTA0ZjVkNzU4YTAyODc3NGYtYnRlZmE=","OFFER_SAVE_CARD":"MQ==","PAYER_EXIST":"MA==","PROD_ID":"YTBiMzhkZjUtYjIzYy00ZDgyLTg4ZmUtMmU5YzQ3NDM4OTcyLWIyM2MtNGQ4Mi04OGY=","VAR_REF":"TXkgTGVnYWwgRW50aXR5","HPP_LANG":"R0I=","MERCHANT_RESPONSE_URL":"aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcmVzcG9uc2U=","HPP_VERSION":"MQ==","SHA1HASH":"NzExNmM0OTgyNjM2N2M2NTEzZWZkYzBjYzgxZTI0M2I4MDk1ZDc4Zg=="}'; - $this->assertEquals($json, $expectedJson); - } - - public function testBasicHostedPaymentDataHppVersion2() - { - $config = new GpEcomConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_2; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - $hostedPaymentData = new HostedPaymentData(); - $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box - $hostedPaymentData->customerExists = "0"; // new customer - $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; - $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; - - $json = $service->charge(19.99) - ->withCurrency("EUR") - ->withTimeStamp("20170725154824") - ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") - ->WithHostedPaymentData($hostedPaymentData) - ->WithDescription("Mobile Channel") - ->WithClientTransactionId("My Legal Entity") - ->serialize(); - - $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","COMMENT1":"Mobile Channel","CUST_NUM":"a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa","OFFER_SAVE_CARD":"1","PAYER_EXIST":"0","PROD_ID":"a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f","VAR_REF":"My Legal Entity","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","SHA1HASH":"7116c49826367c6513efdc0cc81e243b8095d78f"}'; - $this->assertEquals($json, $expectedJson); - } - - public function testParseResponse() - { - $config = new GpEcomConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - $address = new Address(); - $address->postalCode = "123|56"; - $address->country = "IRELAND"; - - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->authorize(1) - ->withCurrency("EUR") - ->withCustomerId("123456") - ->withAddress($address) - ->serialize(); - - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - // Base64 encode values - $iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator(json_decode($response, true))); - foreach ($iterator as $key => $value) { - $iterator->getInnerIterator()->offsetSet($key, base64_encode($value)); - } - - $response = json_encode($iterator->getArrayCopy()); - - $parsedResponse = $service->parseResponse($response, true); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } - - public function testHostedPaymentDataSupplementaryDataSerialize() - { - $config = new ServicesConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_2; - $config->gatewayProvider = GatewayProvider::GP_ECOM; - - $service = new HostedService($config); - - $hostedPaymentData = new HostedPaymentData(); - $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box - $hostedPaymentData->customerExists = "0"; // new customer - $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; - $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; - $hostedPaymentData->supplementaryData = ['HPP_FRAUDFILTER_MODE' => 'ACTIVE']; - - $json = $service->charge(19.99) - ->withCurrency("EUR") - ->withTimeStamp("20170725154824") - ->withOrderId("GTI5Yxb0SumL_TkDMCAxQA") - ->withHostedPaymentData($hostedPaymentData) - ->withDescription("Mobile Channel") - ->withClientTransactionId("My Legal Entity") - ->serialize(); - - $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","COMMENT1":"Mobile Channel","CUST_NUM":"a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa","OFFER_SAVE_CARD":"1","PAYER_EXIST":"0","PROD_ID":"a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f","VAR_REF":"My Legal Entity","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_FRAUDFILTER_MODE":"ACTIVE","HPP_VERSION":"2","SHA1HASH":"7116c49826367c6513efdc0cc81e243b8095d78f"}'; - $this->assertEquals($json, $expectedJson); - } - - public function testSupplementaryDataWithOneValueSerialized() { - $config = new ServicesConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_2; - $config->gatewayProvider = GatewayProvider::GP_ECOM; - - $service = new HostedService($config); - - $hostedPaymentData = new HostedPaymentData(); - $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box - $hostedPaymentData->customerExists = "0"; // new customer - $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; - $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; - - $json = $service->charge(19.99) - ->withCurrency("EUR") - ->withTimeStamp("20170725154824") - ->withOrderId("GTI5Yxb0SumL_TkDMCAxQA") - ->withHostedPaymentData($hostedPaymentData) - ->withDescription("Mobile Channel") - ->withClientTransactionId("My Legal Entity") - ->withSupplementaryData('HPP_FRAUDFILTER_MODE', 'ACTIVE') - ->serialize(); - - $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","COMMENT1":"Mobile Channel","CUST_NUM":"a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa","OFFER_SAVE_CARD":"1","PAYER_EXIST":"0","PROD_ID":"a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f","VAR_REF":"My Legal Entity","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","HPP_FRAUDFILTER_MODE":"ACTIVE","SHA1HASH":"7116c49826367c6513efdc0cc81e243b8095d78f"}'; - $this->assertEquals($json, $expectedJson); - } - - public function testSupplementaryDataWithTwoValuesSerialized() - { - $config = new ServicesConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_2; - $config->gatewayProvider = GatewayProvider::GP_ECOM; - - $service = new HostedService($config); - - $hostedPaymentData = new HostedPaymentData(); - $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box - $hostedPaymentData->customerExists = "0"; // new customer - $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; - $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; - - $json = $service->charge(19.99) - ->withCurrency("EUR") - ->withTimeStamp("20170725154824") - ->withOrderId("GTI5Yxb0SumL_TkDMCAxQA") - ->withHostedPaymentData($hostedPaymentData) - ->withDescription("Mobile Channel") - ->withClientTransactionId("My Legal Entity") - ->withSupplementaryData(["RANDOM_KEY1" => "VALUE_1", "RANDOM_KEY2" => "VALUE_2"]) - ->serialize(); - - $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","COMMENT1":"Mobile Channel","CUST_NUM":"a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa","OFFER_SAVE_CARD":"1","PAYER_EXIST":"0","PROD_ID":"a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f","VAR_REF":"My Legal Entity","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","RANDOM_KEY1":"VALUE_1","RANDOM_KEY2":"VALUE_2","SHA1HASH":"7116c49826367c6513efdc0cc81e243b8095d78f"}'; - $this->assertEquals($json, $expectedJson); - } -} +merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + return new HostedService($config); + } + + public function testCreditAuth() + { + $config = new GpEcomConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + $address = new Address(); + $address->postalCode = "123|56"; + $address->country = "IRELAND"; + + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->authorize(1) + ->withCurrency("EUR") + ->withCustomerId("123456") + ->withAddress($address) + ->serialize(); + + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } + + public function testCreditSale() + { + $config = new GpEcomConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + $address = new Address(); + $address->postalCode = "123|56"; + $address->country = "IRELAND"; + + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->charge(1) + ->withCurrency("EUR") + ->withCustomerId("123456") + ->withAddress($address) + ->serialize(); + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + + $this->assertNotNull($parsedResponse); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } + + /* 03. ProcessPaymentOtbRequest */ + + public function testCreditVerify() + { + $config = new GpEcomConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + $address = new Address(); + $address->postalCode = "123|56"; + $address->country = "IRELAND"; + + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->verify() + ->withCurrency("EUR") + ->withCustomerId("123456") + ->withAddress($address) + ->serialize(); + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + $this->assertNotNull($parsedResponse); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testAuthNoAmount() + { + $service = $this->basicSetup(); + $service->authorize(null)->withCurrency("USD")->serialize(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testAuthNoCurrency() + { + $service = $this->basicSetup(); + $service->authorize(10)->serialize(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testSaleNoAmount() + { + $service = $this->basicSetup(); + $service->charge(null)->withCurrency("USD")->serialize(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testSaleNoCurrency() + { + $service = $this->basicSetup(); + $service->charge(10)->serialize(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testVerifyNoCurrency() + { + $service = $this->basicSetup(); + $service->verify()->serialize(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testVerifyWithAmount() + { + $service = $this->basicSetup(); + $service->verify()->withAmount(10)->serialize(); + } + + /* 05. CardStorageCreatePayerStoreCardRequest */ + + public function testCardStorageCreatePayer() + { + $config = new GpEcomConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "3dsecure"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + // data to be passed to the HPP along with transaction level settings + $hostedPaymentData = new HostedPaymentData(); + $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box + $hostedPaymentData->customerExists = "0"; // new customer + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->charge(15) + ->withCurrency("EUR") + ->withHostedPaymentData($hostedPaymentData) + ->serialize(); + + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + $this->assertNotNull($parsedResponse); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } + + /* 07. CardStorageDisplayStoredCardsRequest */ + + public function testCardStorageDisplayStoredCard() + { + $config = new GpEcomConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "3dsecure"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + // data to be passed to the HPP along with transaction level settings + $hostedPaymentData = new HostedPaymentData(); + $hostedPaymentData->offerToSaveCard = "1"; + $hostedPaymentData->customerExists = "1"; + $hostedPaymentData->customerKey = "5e7e9152-2d53-466d-91bc-6d12ebc56b79"; + + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->charge(15) + ->withCurrency("EUR") + ->withHostedPaymentData($hostedPaymentData) + ->serialize(); + + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + $this->assertNotNull($parsedResponse); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } + + /* 09. ContinuousAuthorityRequest */ + + public function testContinuousAuthorityRequest() + { + $config = new GpEcomConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "3dsecure"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->charge(15) + ->withCurrency("EUR") + ->withRecurringInfo(RecurringType::FIXED, RecurringSequence::FIRST) + ->serialize(); + + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + $this->assertNotNull($parsedResponse); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } + + /* 13. DynamicCurrencyConversionRequest */ + + public function testEnableDynamicCurrencyConversionRequest() + { + //set config for DCC + $config = new GpEcomConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_2; + $config->hostedPaymentConfig->directCurrencyConversionEnabled = "1"; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + //serialize the request + $json = $service->Charge(19) + ->withCurrency("EUR") + ->withTimestamp("20170725154824") + ->withOrderId('GTI5Yxb0SumL_TkDMCAxQA') + ->serialize(); + + $this->assertNotNull($json); + $this->assertEquals($json, '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1900","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","DCC_ENABLE":"1","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","HPP_VERSION":"2","SHA1HASH":"448d742db89b05ce97152beb55157c904f3839cc"}'); + } + + public function testDisableDynamicCurrencyConversionRequest() + { + //set config for DCC + $config = new GpEcomConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_2; + $config->hostedPaymentConfig->directCurrencyConversionEnabled = "0"; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + //serialize the request + $json = $service->Charge(19) + ->withCurrency("EUR") + ->withTimestamp("20170725154824") + ->withOrderId('GTI5Yxb0SumL_TkDMCAxQA') + ->serialize(); + + $this->assertNotNull($json); + $this->assertEquals($json, '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1900","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","DCC_ENABLE":"0","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","HPP_VERSION":"2","SHA1HASH":"448d742db89b05ce97152beb55157c904f3839cc"}'); + } + + /* 11. FraudManagementRequest */ + + public function testFraudManagementRequest() + { + $config = new GpEcomConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "3dsecure"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + $config->hostedPaymentConfig->version = 2; + $config->hostedPaymentConfig->FraudFilterMode = FraudFilterMode::PASSIVE; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "50001|Flat 123"; + $billingAddress->country = "US"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "654|123"; + $shippingAddress->country = "GB"; + + // data to be passed to the HPP along with transaction level settings + $hostedPaymentData = new HostedPaymentData(); + $hostedPaymentData->customerNumber = "E8953893489"; // display the save card tick box + $hostedPaymentData->productId = "SID9838383"; // new customer + + //serialize the request + $json = $service->charge(19) + ->withCurrency("EUR") + ->withAddress($billingAddress, AddressType::BILLING) + ->withAddress($shippingAddress, AddressType::SHIPPING) + //->withProductId("SID9838383") // prodid + ->withClientTransactionId("Car Part HV") // varref + //->withCustomerId("E8953893489") // custnum + ->withCustomerIpAddress("123.123.123.123") + //->withFraudFilter(FraudFilterMode::PASSIVE) + ->withHostedPaymentData($hostedPaymentData) + ->serialize(); + + $this->assertNotNull($json); + + //make API call + $response = $client->sendRequest($json, $config->hostedPaymentConfig->version); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + $this->assertNotNull($parsedResponse); + $this->assertEquals("00", $parsedResponse->responseCode); + } + + /* Serialize methods Test case */ + + public function testBasicAuthHppVersion1() + { + $config = new GpEcomConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_1; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + $json = $service->authorize(19.99) + ->withCurrency("EUR") + ->withTimeStamp("20170725154824") + ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") + ->serialize(); + + $expectedJson = '{"MERCHANT_ID":"TWVyY2hhbnRJZA==","ACCOUNT":"aW50ZXJuZXQ=","ORDER_ID":"R1RJNVl4YjBTdW1MX1RrRE1DQXhRQQ==","AMOUNT":"MTk5OQ==","CURRENCY":"RVVS","TIMESTAMP":"MjAxNzA3MjUxNTQ4MjQ=","AUTO_SETTLE_FLAG":"MA==","HPP_LANG":"R0I=","MERCHANT_RESPONSE_URL":"aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcmVzcG9uc2U=","HPP_VERSION":"MQ==","SHA1HASH":"MDYxNjA5Zjg1YThlMDE5MWRjN2Y0ODdmODI3OGU3MTg5OGEyZWUyZA=="}'; + $this->assertEquals($json, $expectedJson); + } + + public function testBasicAuthHppVersion2() + { + $config = new GpEcomConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_2; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + $json = $service->authorize(19.99) + ->withCurrency("EUR") + ->withTimeStamp("20170725154824") + ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") + ->serialize(); + + $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"0","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","SHA1HASH":"061609f85a8e0191dc7f487f8278e71898a2ee2d"}'; + $this->assertEquals($json, $expectedJson); + } + + public function testBasicSale() + { + $config = new GpEcomConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_2; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + $json = $service->charge(19.99) + ->withCurrency("EUR") + ->withTimeStamp("20170725154824") + ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") + ->serialize(); + + $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","SHA1HASH":"061609f85a8e0191dc7f487f8278e71898a2ee2d"}'; + $this->assertEquals($json, $expectedJson); + } + + public function testBasicHostedPaymentDataHppVersion1() + { + $config = new GpEcomConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_1; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + $hostedPaymentData = new HostedPaymentData(); + $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box + $hostedPaymentData->customerExists = "0"; // new customer + $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; + $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; + + $json = $service->charge(19.99) + ->withCurrency("EUR") + ->withTimeStamp("20170725154824") + ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") + ->WithHostedPaymentData($hostedPaymentData) + ->WithDescription("Mobile Channel") + ->WithClientTransactionId("My Legal Entity") + ->serialize(); + + $expectedJson = '{"MERCHANT_ID":"TWVyY2hhbnRJZA==","ACCOUNT":"aW50ZXJuZXQ=","ORDER_ID":"R1RJNVl4YjBTdW1MX1RrRE1DQXhRQQ==","AMOUNT":"MTk5OQ==","CURRENCY":"RVVS","TIMESTAMP":"MjAxNzA3MjUxNTQ4MjQ=","AUTO_SETTLE_FLAG":"MQ==","COMMENT1":"TW9iaWxlIENoYW5uZWw=","CUST_NUM":"YTAyODc3NGYtYmVmZi00N2JjLWJkNmUtZWQ3ZTA0ZjVkNzU4YTAyODc3NGYtYnRlZmE=","OFFER_SAVE_CARD":"MQ==","PAYER_EXIST":"MA==","PROD_ID":"YTBiMzhkZjUtYjIzYy00ZDgyLTg4ZmUtMmU5YzQ3NDM4OTcyLWIyM2MtNGQ4Mi04OGY=","VAR_REF":"TXkgTGVnYWwgRW50aXR5","HPP_LANG":"R0I=","MERCHANT_RESPONSE_URL":"aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcmVzcG9uc2U=","HPP_VERSION":"MQ==","SHA1HASH":"NzExNmM0OTgyNjM2N2M2NTEzZWZkYzBjYzgxZTI0M2I4MDk1ZDc4Zg=="}'; + $this->assertEquals($json, $expectedJson); + } + + public function testBasicHostedPaymentDataHppVersion2() + { + $config = new GpEcomConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_2; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + $hostedPaymentData = new HostedPaymentData(); + $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box + $hostedPaymentData->customerExists = "0"; // new customer + $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; + $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; + + $json = $service->charge(19.99) + ->withCurrency("EUR") + ->withTimeStamp("20170725154824") + ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") + ->WithHostedPaymentData($hostedPaymentData) + ->WithDescription("Mobile Channel") + ->WithClientTransactionId("My Legal Entity") + ->serialize(); + + $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","COMMENT1":"Mobile Channel","CUST_NUM":"a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa","OFFER_SAVE_CARD":"1","PAYER_EXIST":"0","PROD_ID":"a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f","VAR_REF":"My Legal Entity","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","SHA1HASH":"7116c49826367c6513efdc0cc81e243b8095d78f"}'; + $this->assertEquals($json, $expectedJson); + } + + public function testParseResponse() + { + $config = new GpEcomConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + $address = new Address(); + $address->postalCode = "123|56"; + $address->country = "IRELAND"; + + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->authorize(1) + ->withCurrency("EUR") + ->withCustomerId("123456") + ->withAddress($address) + ->serialize(); + + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + // Base64 encode values + $iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator(json_decode($response, true))); + foreach ($iterator as $key => $value) { + $iterator->getInnerIterator()->offsetSet($key, base64_encode($value)); + } + + $response = json_encode($iterator->getArrayCopy()); + + $parsedResponse = $service->parseResponse($response, true); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } + + public function testHostedPaymentDataSupplementaryDataSerialize() + { + $config = new GpEcomConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_2; + $config->gatewayProvider = GatewayProvider::GP_ECOM; + + $service = new HostedService($config); + + $hostedPaymentData = new HostedPaymentData(); + $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box + $hostedPaymentData->customerExists = "0"; // new customer + $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; + $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; + $hostedPaymentData->supplementaryData = ['HPP_FRAUDFILTER_MODE' => 'ACTIVE']; + + $json = $service->charge(19.99) + ->withCurrency("EUR") + ->withTimeStamp("20170725154824") + ->withOrderId("GTI5Yxb0SumL_TkDMCAxQA") + ->withHostedPaymentData($hostedPaymentData) + ->withDescription("Mobile Channel") + ->withClientTransactionId("My Legal Entity") + ->serialize(); + + $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","COMMENT1":"Mobile Channel","CUST_NUM":"a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa","OFFER_SAVE_CARD":"1","PAYER_EXIST":"0","PROD_ID":"a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f","VAR_REF":"My Legal Entity","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_FRAUDFILTER_MODE":"ACTIVE","HPP_VERSION":"2","SHA1HASH":"7116c49826367c6513efdc0cc81e243b8095d78f"}'; + $this->assertEquals($json, $expectedJson); + } + + public function testSupplementaryDataWithOneValueSerialized() { + $config = new GpEcomConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_2; + $config->gatewayProvider = GatewayProvider::GP_ECOM; + + $service = new HostedService($config); + + $hostedPaymentData = new HostedPaymentData(); + $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box + $hostedPaymentData->customerExists = "0"; // new customer + $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; + $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; + + $json = $service->charge(19.99) + ->withCurrency("EUR") + ->withTimeStamp("20170725154824") + ->withOrderId("GTI5Yxb0SumL_TkDMCAxQA") + ->withHostedPaymentData($hostedPaymentData) + ->withDescription("Mobile Channel") + ->withClientTransactionId("My Legal Entity") + ->withSupplementaryData('HPP_FRAUDFILTER_MODE', 'ACTIVE') + ->serialize(); + + $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","COMMENT1":"Mobile Channel","CUST_NUM":"a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa","OFFER_SAVE_CARD":"1","PAYER_EXIST":"0","PROD_ID":"a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f","VAR_REF":"My Legal Entity","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","HPP_FRAUDFILTER_MODE":"ACTIVE","SHA1HASH":"7116c49826367c6513efdc0cc81e243b8095d78f"}'; + $this->assertEquals($json, $expectedJson); + } + + public function testSupplementaryDataWithTwoValuesSerialized() + { + $config = new GpEcomConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_2; + $config->gatewayProvider = GatewayProvider::GP_ECOM; + + $service = new HostedService($config); + + $hostedPaymentData = new HostedPaymentData(); + $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box + $hostedPaymentData->customerExists = "0"; // new customer + $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; + $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; + + $json = $service->charge(19.99) + ->withCurrency("EUR") + ->withTimeStamp("20170725154824") + ->withOrderId("GTI5Yxb0SumL_TkDMCAxQA") + ->withHostedPaymentData($hostedPaymentData) + ->withDescription("Mobile Channel") + ->withClientTransactionId("My Legal Entity") + ->withSupplementaryData(["RANDOM_KEY1" => "VALUE_1", "RANDOM_KEY2" => "VALUE_2"]) + ->serialize(); + + $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","COMMENT1":"Mobile Channel","CUST_NUM":"a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa","OFFER_SAVE_CARD":"1","PAYER_EXIST":"0","PROD_ID":"a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f","VAR_REF":"My Legal Entity","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","RANDOM_KEY1":"VALUE_1","RANDOM_KEY2":"VALUE_2","SHA1HASH":"7116c49826367c6513efdc0cc81e243b8095d78f"}'; + $this->assertEquals($json, $expectedJson); + } +} diff --git a/test/Integration/Gateways/RealexConnector/HppTestCase.php b/test/Integration/Gateways/RealexConnector/HppTestCase.php index 936d6e53..9d000d8d 100644 --- a/test/Integration/Gateways/RealexConnector/HppTestCase.php +++ b/test/Integration/Gateways/RealexConnector/HppTestCase.php @@ -1,247 +1,241 @@ -merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - return $config; - } - - public function setup() - { - $this->service = new HostedService($this->config()); - } - - /* 10. ThreedSecureResponse */ - - public function testThreedSecureResponse() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'hpp'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; - - $service = new HostedService( - $config - ); - - //response - // TODO: grab the response JSON from the client-side for example: - $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"hpp","ORDER_ID":"OTA4NUEzOEEtMkE3RjU2RQ","TIMESTAMP":"20180724124150","RESULT":"00","PASREF":"15324325098818233","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":"123|56","BILLING_CO":"IRELAND","ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":null,"SHA1HASH":"d1ff806b449b86375dbda74e2611760c348fcdeb","DCC_INFO_REQUST":null,"DCC_INFO_RESPONSE":null,"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; - - $parsedResponse = $service->parseResponse($responseJson); - $responseCode = $parsedResponse->responseCode; // 00 - $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised - $responseValues = $parsedResponse->responseValues; // get values accessible by key - - $eci = $responseValues["ECI"]; // 5 - fully authenticated - $cavv = $responseValues["CAVV"]; // AAACBUGDZYYYIgGFGYNlAAAAAAA= - $xid = $responseValues["XID"]; // vJ9NXpFueXsAqeb4iAbJJbe+66s= - // TODO: update your application and display transaction outcome to the customer - - $this->assertNotEquals(null, $parsedResponse); - $this->assertEquals("00", $responseCode); - } - - /* 02. ProcessPaymentConsumeHppResponse */ - - public function testprocessPaymentConsumeResponse() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'hpp'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; - - $service = new HostedService($config); - - $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"hpp","ORDER_ID":"NjMwNkMxMTAtMTA5RUNDRQ","TIMESTAMP":"20180720104340","RESULT":"00","PASREF":"15320798200414985","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":"123|56","BILLING_CO":"IRELAND","ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":"100","SHA1HASH":"32628cf3f887ab9f4f1c547a10ac365c2168f0e2","DCC_INFO":null,"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; - - // create the response object from the response JSON - $parsedResponse = $service->parseResponse($responseJson); - - $orderId = $parsedResponse->orderId; // GTI5Yxb0SumL_TkDMCAxQA - $responseCode = $parsedResponse->responseCode; // 00 - $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised - $responseValues = $parsedResponse->responseValues; // get values accessible by key - //$fraudFilterResult = $responseValues["HPP_FRAUDFILTER_RESULT"]; // PASS - - $this->assertNotEquals(null, $parsedResponse); - $this->assertEquals("00", $responseCode); - } - - /* 06. CardStorageCreatePayerStoreCardResponse */ - - public function testCardStorageCreatePayerStoreCardResponse() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'hpp'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; - - $service = new HostedService( - $config - ); - - // TODO: grab the response JSON from the client-side for example: - //sample response JSON: - $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"3dsecure","ORDER_ID":"NTgxMkMzODUtNTEwMkNCMw","TIMESTAMP":"20180723110112","RESULT":"00","PASREF":"15323400720177562","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":null,"BILLING_CO":null,"ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":"1500","SHA1HASH":"4c7a635401c57371a0931bb3a21a849181cc963d","DCC_INFO":null,"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; - - $parsedResponse = $service->parseResponse($responseJson); - $responseCode = $parsedResponse->responseCode; // 00 - $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised - $responseValues = $parsedResponse->responseValues; // get values accessible by key - /* - // Payer Setup Details - $payerSetupResult = $responseValues["PAYER_SETUP"]; // 00 - $payerSetupMessage = $responseValues["PAYER_SETUP_MSG"]; // Successful - $payerReference = $responseValues["SAVED_PAYER_REF"]; // 5e7e9152-2d53-466d-91bc-6d12ebc56b79 - // Card Setup Details - $cardSetupResult = $responseValues["PMT_SETUP"]; // 00 - $cardSetupMessage = $responseValues["PMT_SETUP_MSG"]; // Successful - $cardReference = $responseValues["SAVED_PMT_REF"]; // ca68dcac-9af2-4d65-b06c-eb54667dcd4a - // Card Details Stored - $cardType = $responseValues["SAVED_PMT_TYPE"]; // MC - $cardDigits = $responseValues["SAVED_PMT_DIGITS"]; // 542523xxxx4415 - $cardExpiry = $responseValues["SAVED_PMT_EXPDATE"]; // 1025 - $cardName = $responseValues["SAVED_PMT_NAME"]; // James Mason - */ - // TODO: update your application and display transaction outcome to the customer - - $this->assertNotEquals(null, $parsedResponse); - $this->assertEquals("00", $responseCode); - } - - /* 08. CardStorageDisplayStoredCardsResponse */ - - public function testCardStorageDisplayStoredCardsResponse() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'hpp'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; - - $service = new HostedService( - $config - ); - - // TODO: grab the response JSON from the client-side for example: - //sample response JSON: - $responseJson = array("MERCHANT_ID" => "MerchantId", "ACCOUNT" => "internet", "ORDER_ID" => "GTI5Yxb0SumL_TkDMCAxQA", "AMOUNT" => "1999", "TIMESTAMP" => "20170725154824", "SHA1HASH" => "843680654f377bfa845387fdbace35acc9d95778", "RESULT" => "00", "AUTHCODE" => "12345", "CARD_PAYMENT_BUTTON" => "Place Order", "AVSADDRESSRESULT" => "M", "AVSPOSTCODERESULT" => "M", "BATCHID" => "445196", "MESSAGE" => "[ test system ] Authorised", "PASREF" => "15011597872195765", "CVNRESULT" => "M", "HPP_FRAUDFILTER_RESULT" => "PASS", "HPP_CHOSEN_PMT_REF" => "099efeb4-eda2-4fd7-a04d-29647bb6c51d", "HPP_EDITED_PMT_REF" => "037bd26a-c76b-4ee4-8063-376d8858f23d", "HPP_DELETED_PMT_REF" => "3db4c72c-cd95-4743-8070-f17e2b56b642"); - - $parsedResponse = $service->parseResponse(json_encode($responseJson)); - $responseCode = $parsedResponse->responseCode; // 00 - $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised - $responseValues = $parsedResponse->responseValues; // get values accessible by key - // card used to complete payment, edited or deleted - $chosenCard = $responseValues["HPP_CHOSEN_PMT_REF"]; // 099efeb4-eda2-4fd7-a04d-29647bb6c51d - $editedCard = $responseValues["HPP_EDITED_PMT_REF"]; // 037bd26a-c76b-4ee4-8063-376d8858f23d - $deletedCard = $responseValues["HPP_DELETED_PMT_REF"]; // 3db4c72c-cd95-4743-8070-f17e2b56b642 - // TODO: update your application and display transaction outcome to the customer - - $this->assertNotEquals(null, $parsedResponse); - $this->assertEquals("00", $responseCode); - } - - /* 12. FraudManagementResponse */ - - public function testFraudManagementResponse() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'hpp'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; - - $service = new HostedService( - $config - ); - - // TODO: grab the response JSON from the client-side for example: - //sample response JSON: - $responseJson = array("MERCHANT_ID" => "MerchantId", "ACCOUNT" => "internet", "ORDER_ID" => "GTI5Yxb0SumL_TkDMCAxQA", "AMOUNT" => "1999", "TIMESTAMP" => "20170725154824", "SHA1HASH" => "843680654f377bfa845387fdbace35acc9d95778", "RESULT" => "00", "AUTHCODE" => "12345", "CARD_PAYMENT_BUTTON" => "Place Order", "AVSADDRESSRESULT" => "M", "AVSPOSTCODERESULT" => "M", "BATCHID" => "445196", "MESSAGE" => "[ test system ] Authorised", "PASREF" => "15011597872195765", "CVNRESULT" => "M", "HPP_FRAUDFILTER_RESULT" => "HOLD", "HPP_FRAUDFILTER_RULE_56257838-4590-4227-b946-11e061fb15fe" => "HOLD", "HPP_FRAUDFILTER_RULE_cf609cf9-9e5a-4700-ac69-8aa09c119305" => "PASS"); - ; - - $parsedResponse = $service->parseResponse(json_encode($responseJson)); - $responseCode = $parsedResponse->responseCode; // 00 - $responseValues = $parsedResponse->responseValues; // get values accessible by key - - $fraudFilterResult = $responseValues["HPP_FRAUDFILTER_RESULT"]; // HOLD - $cardRuleResult = $responseValues["HPP_FRAUDFILTER_RULE_56257838-4590-4227-b946-11e061fb15fe"]; // HOLD - $ipRuleResult = $responseValues["HPP_FRAUDFILTER_RULE_cf609cf9-9e5a-4700-ac69-8aa09c119305"]; // PASS - // TODO: update your application and display transaction outcome to the customer - - $this->assertNotEquals(null, $parsedResponse); - $this->assertEquals("00", $responseCode); - } - - /* 14. DynamicCurrencyConversionResponse */ - - public function testDynamicCurrencyConversionResponse() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'hpp'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; - - $service = new HostedService( - $config - ); - - // TODO: grab the response JSON from the client-side for example: - //sample response JSON: - $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"apidcc","ORDER_ID":"NTQyQzgxREMtMzVFQzlDNw","TIMESTAMP":"20180724095953","RESULT":"00","PASREF":"15324227932436743","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":null,"BILLING_CO":null,"ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":"100100","SHA1HASH":"320c7ddc49d292f5900c676168d5cc1f2a55306c","DCC_INFO_REQUST":{"CCP":"Fexco","TYPE":1,"RATE":"1.7203","RATE_TYPE":"S","AMOUNT":"172202","CURRENCY":"AUD"},"DCC_INFO_RESPONSE":{"cardHolderCurrency":"AUD","cardHolderAmount":"172202","cardHolderRate":"1.7203","merchantCurrency":"EUR","merchantAmount":"100100","marginRatePercentage":"","exchangeRateSourceName":"","commissionPercentage":"","exchangeRateSourceTimestamp":""},"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; - $parsedResponse = $service->parseResponse($responseJson); - - $responseCode = $parsedResponse->responseCode; // 00 - $responseValues = $parsedResponse->responseValues; // get values accessible by key - - $conversionProcessor = $responseValues['DCC_INFO_REQUST']["CCP"]; // fexco - $conversionRate = $responseValues['DCC_INFO_REQUST']["RATE"]; // 1.7203 - $merchantAmount = $responseValues['DCC_INFO_RESPONSE']["merchantAmount"]; // 1999 - $cardholderAmount = $responseValues['DCC_INFO_RESPONSE']["cardHolderAmount"]; // 3439 - $merchantCurrency = $responseValues['DCC_INFO_RESPONSE']["merchantCurrency"]; // EUR - $cardholderCurrency = $responseValues['DCC_INFO_RESPONSE']["cardHolderCurrency"]; // AUD - $marginPercentage = $responseValues['DCC_INFO_RESPONSE']["marginRatePercentage"]; // 3.75 - $exchangeSource = $responseValues['DCC_INFO_RESPONSE']["exchangeRateSourceName"]; // REUTERS WHOLESALE INTERBANK - $commissionPercentage = $responseValues['DCC_INFO_RESPONSE']["commissionPercentage"]; // 0 - $exchangeTimestamp = $responseValues['DCC_INFO_RESPONSE']["exchangeRateSourceTimestamp"]; // 20170518162700 - // TODO: update your application and display transaction outcome to the customer - $this->assertNotEquals(null, $parsedResponse); - $this->assertEquals("00", $responseCode); - } -} +merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + return $config; + } + + public function setup() + { + $this->service = new HostedService($this->config()); + } + + /* 10. ThreedSecureResponse */ + + public function testThreedSecureResponse() + { + $config = new GpEcomConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'hpp'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; + + $service = new HostedService( + $config + ); + + //response + // TODO: grab the response JSON from the client-side for example: + $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"hpp","ORDER_ID":"OTA4NUEzOEEtMkE3RjU2RQ","TIMESTAMP":"20180724124150","RESULT":"00","PASREF":"15324325098818233","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":"123|56","BILLING_CO":"IRELAND","ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":null,"SHA1HASH":"d1ff806b449b86375dbda74e2611760c348fcdeb","DCC_INFO_REQUST":null,"DCC_INFO_RESPONSE":null,"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; + + $parsedResponse = $service->parseResponse($responseJson); + $responseCode = $parsedResponse->responseCode; // 00 + $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised + $responseValues = $parsedResponse->responseValues; // get values accessible by key + + $eci = $responseValues["ECI"]; // 5 - fully authenticated + $cavv = $responseValues["CAVV"]; // AAACBUGDZYYYIgGFGYNlAAAAAAA= + $xid = $responseValues["XID"]; // vJ9NXpFueXsAqeb4iAbJJbe+66s= + // TODO: update your application and display transaction outcome to the customer + + $this->assertNotEquals(null, $parsedResponse); + $this->assertEquals("00", $responseCode); + } + + /* 02. ProcessPaymentConsumeHppResponse */ + + public function testprocessPaymentConsumeResponse() + { + $config = new GpEcomConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'hpp'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; + + $service = new HostedService($config); + + $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"hpp","ORDER_ID":"NjMwNkMxMTAtMTA5RUNDRQ","TIMESTAMP":"20180720104340","RESULT":"00","PASREF":"15320798200414985","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":"123|56","BILLING_CO":"IRELAND","ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":"100","SHA1HASH":"32628cf3f887ab9f4f1c547a10ac365c2168f0e2","DCC_INFO":null,"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; + + // create the response object from the response JSON + $parsedResponse = $service->parseResponse($responseJson); + + $orderId = $parsedResponse->orderId; // GTI5Yxb0SumL_TkDMCAxQA + $responseCode = $parsedResponse->responseCode; // 00 + $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised + $responseValues = $parsedResponse->responseValues; // get values accessible by key + //$fraudFilterResult = $responseValues["HPP_FRAUDFILTER_RESULT"]; // PASS + + $this->assertNotEquals(null, $parsedResponse); + $this->assertEquals("00", $responseCode); + } + + /* 06. CardStorageCreatePayerStoreCardResponse */ + + public function testCardStorageCreatePayerStoreCardResponse() + { + $config = new GpEcomConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'hpp'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; + + $service = new HostedService( + $config + ); + + // TODO: grab the response JSON from the client-side for example: + //sample response JSON: + $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"3dsecure","ORDER_ID":"NTgxMkMzODUtNTEwMkNCMw","TIMESTAMP":"20180723110112","RESULT":"00","PASREF":"15323400720177562","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":null,"BILLING_CO":null,"ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":"1500","SHA1HASH":"4c7a635401c57371a0931bb3a21a849181cc963d","DCC_INFO":null,"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; + + $parsedResponse = $service->parseResponse($responseJson); + $responseCode = $parsedResponse->responseCode; // 00 + $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised + $responseValues = $parsedResponse->responseValues; // get values accessible by key + /* + // Payer Setup Details + $payerSetupResult = $responseValues["PAYER_SETUP"]; // 00 + $payerSetupMessage = $responseValues["PAYER_SETUP_MSG"]; // Successful + $payerReference = $responseValues["SAVED_PAYER_REF"]; // 5e7e9152-2d53-466d-91bc-6d12ebc56b79 + // Card Setup Details + $cardSetupResult = $responseValues["PMT_SETUP"]; // 00 + $cardSetupMessage = $responseValues["PMT_SETUP_MSG"]; // Successful + $cardReference = $responseValues["SAVED_PMT_REF"]; // ca68dcac-9af2-4d65-b06c-eb54667dcd4a + // Card Details Stored + $cardType = $responseValues["SAVED_PMT_TYPE"]; // MC + $cardDigits = $responseValues["SAVED_PMT_DIGITS"]; // 542523xxxx4415 + $cardExpiry = $responseValues["SAVED_PMT_EXPDATE"]; // 1025 + $cardName = $responseValues["SAVED_PMT_NAME"]; // James Mason + */ + // TODO: update your application and display transaction outcome to the customer + + $this->assertNotEquals(null, $parsedResponse); + $this->assertEquals("00", $responseCode); + } + + /* 08. CardStorageDisplayStoredCardsResponse */ + + public function testCardStorageDisplayStoredCardsResponse() + { + $config = new GpEcomConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'hpp'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; + + $service = new HostedService( + $config + ); + + // TODO: grab the response JSON from the client-side for example: + //sample response JSON: + $responseJson = array("MERCHANT_ID" => "MerchantId", "ACCOUNT" => "internet", "ORDER_ID" => "GTI5Yxb0SumL_TkDMCAxQA", "AMOUNT" => "1999", "TIMESTAMP" => "20170725154824", "SHA1HASH" => "843680654f377bfa845387fdbace35acc9d95778", "RESULT" => "00", "AUTHCODE" => "12345", "CARD_PAYMENT_BUTTON" => "Place Order", "AVSADDRESSRESULT" => "M", "AVSPOSTCODERESULT" => "M", "BATCHID" => "445196", "MESSAGE" => "[ test system ] Authorised", "PASREF" => "15011597872195765", "CVNRESULT" => "M", "HPP_FRAUDFILTER_RESULT" => "PASS", "HPP_CHOSEN_PMT_REF" => "099efeb4-eda2-4fd7-a04d-29647bb6c51d", "HPP_EDITED_PMT_REF" => "037bd26a-c76b-4ee4-8063-376d8858f23d", "HPP_DELETED_PMT_REF" => "3db4c72c-cd95-4743-8070-f17e2b56b642"); + + $parsedResponse = $service->parseResponse(json_encode($responseJson)); + $responseCode = $parsedResponse->responseCode; // 00 + $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised + $responseValues = $parsedResponse->responseValues; // get values accessible by key + // card used to complete payment, edited or deleted + $chosenCard = $responseValues["HPP_CHOSEN_PMT_REF"]; // 099efeb4-eda2-4fd7-a04d-29647bb6c51d + $editedCard = $responseValues["HPP_EDITED_PMT_REF"]; // 037bd26a-c76b-4ee4-8063-376d8858f23d + $deletedCard = $responseValues["HPP_DELETED_PMT_REF"]; // 3db4c72c-cd95-4743-8070-f17e2b56b642 + // TODO: update your application and display transaction outcome to the customer + + $this->assertNotEquals(null, $parsedResponse); + $this->assertEquals("00", $responseCode); + } + + /* 12. FraudManagementResponse */ + + public function testFraudManagementResponse() + { + $config = new GpEcomConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'hpp'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; + + $service = new HostedService( + $config + ); + + // TODO: grab the response JSON from the client-side for example: + //sample response JSON: + $responseJson = array("MERCHANT_ID" => "MerchantId", "ACCOUNT" => "internet", "ORDER_ID" => "GTI5Yxb0SumL_TkDMCAxQA", "AMOUNT" => "1999", "TIMESTAMP" => "20170725154824", "SHA1HASH" => "843680654f377bfa845387fdbace35acc9d95778", "RESULT" => "00", "AUTHCODE" => "12345", "CARD_PAYMENT_BUTTON" => "Place Order", "AVSADDRESSRESULT" => "M", "AVSPOSTCODERESULT" => "M", "BATCHID" => "445196", "MESSAGE" => "[ test system ] Authorised", "PASREF" => "15011597872195765", "CVNRESULT" => "M", "HPP_FRAUDFILTER_RESULT" => "HOLD", "HPP_FRAUDFILTER_RULE_56257838-4590-4227-b946-11e061fb15fe" => "HOLD", "HPP_FRAUDFILTER_RULE_cf609cf9-9e5a-4700-ac69-8aa09c119305" => "PASS"); + ; + + $parsedResponse = $service->parseResponse(json_encode($responseJson)); + $responseCode = $parsedResponse->responseCode; // 00 + $responseValues = $parsedResponse->responseValues; // get values accessible by key + + $fraudFilterResult = $responseValues["HPP_FRAUDFILTER_RESULT"]; // HOLD + $cardRuleResult = $responseValues["HPP_FRAUDFILTER_RULE_56257838-4590-4227-b946-11e061fb15fe"]; // HOLD + $ipRuleResult = $responseValues["HPP_FRAUDFILTER_RULE_cf609cf9-9e5a-4700-ac69-8aa09c119305"]; // PASS + // TODO: update your application and display transaction outcome to the customer + + $this->assertNotEquals(null, $parsedResponse); + $this->assertEquals("00", $responseCode); + } + + /* 14. DynamicCurrencyConversionResponse */ + + public function testDynamicCurrencyConversionResponse() + { + $config = new GpEcomConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'hpp'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; + + $service = new HostedService( + $config + ); + + // TODO: grab the response JSON from the client-side for example: + //sample response JSON: + $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"apidcc","ORDER_ID":"NTQyQzgxREMtMzVFQzlDNw","TIMESTAMP":"20180724095953","RESULT":"00","PASREF":"15324227932436743","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":null,"BILLING_CO":null,"ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":"100100","SHA1HASH":"320c7ddc49d292f5900c676168d5cc1f2a55306c","DCC_INFO_REQUST":{"CCP":"Fexco","TYPE":1,"RATE":"1.7203","RATE_TYPE":"S","AMOUNT":"172202","CURRENCY":"AUD"},"DCC_INFO_RESPONSE":{"cardHolderCurrency":"AUD","cardHolderAmount":"172202","cardHolderRate":"1.7203","merchantCurrency":"EUR","merchantAmount":"100100","marginRatePercentage":"","exchangeRateSourceName":"","commissionPercentage":"","exchangeRateSourceTimestamp":""},"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; + $parsedResponse = $service->parseResponse($responseJson); + + $responseCode = $parsedResponse->responseCode; // 00 + $responseValues = $parsedResponse->responseValues; // get values accessible by key + + $conversionProcessor = $responseValues['DCC_INFO_REQUST']["CCP"]; // fexco + $conversionRate = $responseValues['DCC_INFO_REQUST']["RATE"]; // 1.7203 + $merchantAmount = $responseValues['DCC_INFO_RESPONSE']["merchantAmount"]; // 1999 + $cardholderAmount = $responseValues['DCC_INFO_RESPONSE']["cardHolderAmount"]; // 3439 + $merchantCurrency = $responseValues['DCC_INFO_RESPONSE']["merchantCurrency"]; // EUR + $cardholderCurrency = $responseValues['DCC_INFO_RESPONSE']["cardHolderCurrency"]; // AUD + $marginPercentage = $responseValues['DCC_INFO_RESPONSE']["marginRatePercentage"]; // 3.75 + $exchangeSource = $responseValues['DCC_INFO_RESPONSE']["exchangeRateSourceName"]; // REUTERS WHOLESALE INTERBANK + $commissionPercentage = $responseValues['DCC_INFO_RESPONSE']["commissionPercentage"]; // 0 + $exchangeTimestamp = $responseValues['DCC_INFO_RESPONSE']["exchangeRateSourceTimestamp"]; // 20170518162700 + // TODO: update your application and display transaction outcome to the customer + $this->assertNotEquals(null, $parsedResponse); + $this->assertEquals("00", $responseCode); + } +} diff --git a/test/Integration/Gateways/RealexConnector/Realex3dSecureTests.php b/test/Integration/Gateways/RealexConnector/Realex3dSecureTests.php index d409af78..d29cc34f 100644 --- a/test/Integration/Gateways/RealexConnector/Realex3dSecureTests.php +++ b/test/Integration/Gateways/RealexConnector/Realex3dSecureTests.php @@ -1,501 +1,500 @@ -getConfig()); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = '3dsecure'; - $config->sharedSecret = 'secret'; - $config->rebatePassword = 'rebate'; - $config->refundPassword = 'refund'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - return $config; - } - - public function testAcsClient() - { - $authClient = new ThreeDSecureAcsClient('https://pit.3dsecure.net/VbVTestSuiteService/pit1/acsService/paReq?summary=MTNmMzI4NzgtNTdmZi00OWEzLWJhZTAtYzFhNzAxMDJkMGNi'); - $this->assertNotNull($authClient->authenticate('eJxlUsFSwjAQvfsVTO82TSm0MNs4FVBwRkUF8ZomK1Rpimkr6NebYBEdc8jsy27evrwNnO3ydesddZkVKnao6zktVKKQmVrGznx2cRo5Z+wEZiuNOHxAUWtkcI1lyZfYymTs+KIjZYRt30tl0H2WPRpFIuQyDULsdTvoMJgm9/jGoOnCTBPXB3KAhk2LFVcVAy7ezic3LAgD2ouANBBy1JMh6zULyDcGxXNkK+S6WnMll5vS7GmxA7JPgChqVekPFgUekAOAWq/Zqqo2ZZ+Q7Xbr/r/visKtX4HYSiBHcdPaRqVh3mWSJcM7Nb7t0O1iGs6n7cXnI025N7hSk1EMxFaA5BUy36MhpX7Y8r1+J+hTI39/Djy3kqwZRl4DYGN7JE3GJn4fgDFfm+EcnnRAgLtNodBUGFd/YiBHwYOx9VZUxrVxdjEb1aPXy5f5k27Tmzo/v75N4ti6vS+wbJlxikb0m84CIJaCNIMkzfxN9OdffAF4VML9')); - } - - public function testMerchantDataEnumerator() - { - $keys = ['Key1', 'Key2', 'Key3']; - $values = ['Value1', 'Value2', 'Value3']; - - $merchantData = new MerchantDataCollection(); - for ($i=0; $i<3; $i++) { - $merchantData->add($keys[$i], $values[$i]); - } - - $this->assertEquals(3, $merchantData->count()); - - foreach ($merchantData->getKeys() as $key) { - $this->assertTrue(in_array($key, $keys)); - $this->assertTrue(in_array($merchantData->get($key), $values)); - } - } - - public function testMerchantDataWithHiddenValues() - { - $card = new CreditCardData(); - $card->number = 4012001037141112; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'James Mason'; - - $enrolled = $card->verifyEnrolled(100, 'USD'); - $this->assertNotNull($enrolled); - if ($enrolled) { - $merchantData = $card->threeDSecure->getMerchantData(); - - $this->assertNotNull($merchantData); - $this->assertEquals(0, $merchantData->count()); - - $this->assertNull($merchantData->get('amount')); - $this->assertNull($merchantData->get('currency')); - $this->assertNull($merchantData->get('orderId')); - - for ($i=0; $i<3; $i++) { - $merchantData->add('Key'.$i, 'Value'.$i); - - $this->assertNotNull($merchantData->get('Key'.$i)); - $this->assertEquals('Value'.$i, $merchantData->get('Key'.$i)); - } - - $this->assertEquals(3, $merchantData->count()); - } - } - - public function testMerchantDataEncryptAndDecrypt() - { - $merchantData = new MerchantDataCollection(); - $merchantData->add('customerId', '12345'); - $merchantData->add('invoiceNumber', '54321'); - - $encoder = function ($input) { - $encoded = sprintf('%s.%s', $input, 'secret'); - return base64_encode($encoded); - }; - - $encrypted = $merchantData->toString($encoder); - - $decoder = function ($input) { - $decoded = explode('.', (string)base64_decode($input)); - $this->assertEquals('secret', $decoded[1]); - return $decoded[0]; - }; - - $decrypted = $merchantData->parse($encrypted, $decoder); - - $this->assertNotNull($decrypted); - $this->assertNotNull($decrypted->get('customerId')); - $this->assertEquals('12345', $decrypted->get('customerId')); - $this->assertNotNull($decrypted->get('invoiceNumber')); - $this->assertEquals('54321', $decrypted->get('invoiceNumber')); - } - - public function testMerchantDataMultiKey() - { - $this->expectExceptionMessage('Cannot access private property GlobalPayments\Api\Entities\MerchantDataCollection::$collection'); - - $mcd = new MerchantDataCollection(); - array_push($mcd->collection, array('amount'=>'10')); - array_push($mcd->collection, array('amount'=>'10')); - } - - public function testFullCycleWithMerchantData() - { - $card = new CreditCardData(); - $card->number = 4012001037141112; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(1, 'USD'); - if ($enrolled) { - $secureEcom = $card->threeDSecure; - if (!empty($secureEcom)) { - $merchantData = new MerchantDataCollection(); - $merchantData->add('client_txn_id', '123456'); - - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, (string)$secureEcom->getMerchantData()->toString()); - - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - if ($card->verifySignature($payerAuthenticationResponse, $md)) { - $response = $card->charge(1) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - $this->fail('Secure3Data was null.'); - } - } else { - $this->fail('Card not enrolled.'); - } - } - - public function testFullCycleWithNoMerchantData() - { - $card = new CreditCardData(); - $card->number = 4012001037141112; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'James Mason'; - - $amount = 100; - $currency = 'USD'; - $orderId = GenerationUtils::generateOrderId(); - - $enrolled = $card->verifyEnrolled($amount, $currency, $orderId); - - if ($enrolled) { - $secureEcom = $card->threeDSecure; - - if ($secureEcom != null) { - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, (string)$secureEcom->getMerchantData()->toString()); - - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - - if ($card->verifySignature($payerAuthenticationResponse, null, $amount, $currency, $orderId)) { - $response = $card->charge($amount) - ->withCurrency($currency) - ->withOrderId($orderId) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - $this->fail('Secure3Data was null.'); - } - } else { - $this->fail('Card not enrolled.'); - } - } - - public function testVerifyEnrolledTrue() - { - $card = new CreditCardData(); - $card->number = 4012001037141112; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(1, 'USD'); - $this->assertTrue($enrolled); - $this->assertNotNull($card->threeDSecure); - $this->assertNotNull($card->threeDSecure->payerAuthenticationRequest); - $this->assertNotNull($card->threeDSecure->issuerAcsUrl); - $this->assertNotNull($card->threeDSecure->xid); - } - - public function testVerifyEnrolledFalse() - { - $card = new CreditCardData(); - $card->number = 4012001038443335; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(1, 'USD'); - $this->assertFalse($enrolled); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testVerifySignatureBadOrderId() - { - $card = new CreditCardData(); - $card->verifySignature('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', null, 1, 'USD', 'orderId'); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testVerifySignatureNoPaymentResponse() - { - $card = new CreditCardData(); - $card->verifySignature(null); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testVerifySignatureNoAmount() - { - $card = new CreditCardData(); - $card->verifySignature('paymentResponse', null, null, 'USD', 'orderId'); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testVerifySignatureNoCurrency() - { - $card = new CreditCardData(); - $card->verifySignature('paymentResponse', null, 10, null, 'orderId'); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testVerifySignatureNoOrderId() - { - $card = new CreditCardData(); - $card->verifySignature('paymentResponse', null, 10, 'USD', null); - } - - public function testAuthorize3dSecure() - { - $secureEcom = new ThreeDSecure(); - $secureEcom->cavv = 'AAACBllleHchZTBWIGV4AAAAAAA='; - $secureEcom->xid = 'crqAeMwkEL9r4POdxpByWJ1/wYg='; - $secureEcom->eci = '5'; - - $card = new CreditCardData(); - $card->number = 4012001037141112; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'Philip Marlowe'; - $card->threeDSecure = $secureEcom; - - $response = $card->charge(10) - ->withCurrency('EUR') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCardHolderNotEnrolled() - { - $card = new CreditCardData(); - $card->number = 4012001038443335; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertFalse($enrolled); - $this->assertNotNull($card->threeDSecure); - $this->assertEquals('6', $card->threeDSecure->eci); - - // .net test does not have amount or currency but validation would not allow this - $response = $card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testUnableToVerifyEnrollment() - { - $card = new CreditCardData(); - $card->number = 4012001038488884; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertFalse($enrolled); - $this->assertNotNull($card->threeDSecure); - $this->assertEquals('7', $card->threeDSecure->eci); - - $response = $card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testInvalidResponseFromEnrollmentServer() - { - $card = new CreditCardData(); - $card->number = 4012001036298889; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'John Smith'; - - $card->verifyEnrolled(10, 'USD'); - } - - public function testCardHolderIsEnrolledACSAuthFailed() - { - $card = new CreditCardData(); - $card->number = 4012001036853337; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertTrue($enrolled); - - $secureEcom = $card->threeDSecure; - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); - - // $payerAuthenticationResponse = $authResponse->parse(); - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - $verified = $card->verifySignature($payerAuthenticationResponse, $md); - $this->assertFalse($verified); - $this->assertNotNull($card->threeDSecure); - $this->assertEquals(7, $card->threeDSecure->eci); - - $response = $card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCardHolderIsEnrolledACSAcknowledged() - { - $card = new CreditCardData(); - $card->number = 4012001037167778; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertTrue($enrolled); - - $secureEcom = $card->threeDSecure; - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); - - // $payerAuthenticationResponse = $authResponse->parse(); - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - $verified = $card->verifySignature($payerAuthenticationResponse, $md); - $this->assertTrue($verified); - $this->assertEquals('A', $card->threeDSecure->status); - - $response = $card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCardHolderIsEnrolledACSFailed() - { - $card = new CreditCardData(); - $card->number = 4012001037461114; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertTrue($enrolled); - - $secureEcom = $card->threeDSecure; - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); - - // $payerAuthenticationResponse = $authResponse->parse(); - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - $verified = $card->verifySignature($payerAuthenticationResponse, $md); - $this->assertFalse($verified); - $this->assertEquals('N', $card->threeDSecure->status); - $this->assertEquals(7, $card->threeDSecure->eci); - - $response = $card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCardHolderIsEnrolledACSUnavailable() - { - $card = new CreditCardData(); - $card->number = 4012001037484447; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertTrue($enrolled); - - $secureEcom = $card->threeDSecure; - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); - - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - $verified = $card->verifySignature($payerAuthenticationResponse, $md); - $this->assertFalse($verified); - $this->assertEquals('U', $card->threeDSecure->status); - $this->assertEquals(7, $card->threeDSecure->eci); - - $response = $card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testCardHolderIsEnrolledACSInvalid() - { - $card = new CreditCardData(); - $card->number = 4012001037490006; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertTrue($enrolled); - - $secureEcom = $card->threeDSecure; - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); - - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - $card->verifySignature($payerAuthenticationResponse, $md); - } -} +getConfig()); + } + + protected function getConfig() + { + $config = new GpEcomConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = '3dsecure'; + $config->sharedSecret = 'secret'; + $config->rebatePassword = 'rebate'; + $config->refundPassword = 'refund'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + return $config; + } + + public function testAcsClient() + { + $authClient = new ThreeDSecureAcsClient('https://pit.3dsecure.net/VbVTestSuiteService/pit1/acsService/paReq?summary=MTNmMzI4NzgtNTdmZi00OWEzLWJhZTAtYzFhNzAxMDJkMGNi'); + $this->assertNotNull($authClient->authenticate('eJxlUsFSwjAQvfsVTO82TSm0MNs4FVBwRkUF8ZomK1Rpimkr6NebYBEdc8jsy27evrwNnO3ydesddZkVKnao6zktVKKQmVrGznx2cRo5Z+wEZiuNOHxAUWtkcI1lyZfYymTs+KIjZYRt30tl0H2WPRpFIuQyDULsdTvoMJgm9/jGoOnCTBPXB3KAhk2LFVcVAy7ezic3LAgD2ouANBBy1JMh6zULyDcGxXNkK+S6WnMll5vS7GmxA7JPgChqVekPFgUekAOAWq/Zqqo2ZZ+Q7Xbr/r/visKtX4HYSiBHcdPaRqVh3mWSJcM7Nb7t0O1iGs6n7cXnI025N7hSk1EMxFaA5BUy36MhpX7Y8r1+J+hTI39/Djy3kqwZRl4DYGN7JE3GJn4fgDFfm+EcnnRAgLtNodBUGFd/YiBHwYOx9VZUxrVxdjEb1aPXy5f5k27Tmzo/v75N4ti6vS+wbJlxikb0m84CIJaCNIMkzfxN9OdffAF4VML9')); + } + + public function testMerchantDataEnumerator() + { + $keys = ['Key1', 'Key2', 'Key3']; + $values = ['Value1', 'Value2', 'Value3']; + + $merchantData = new MerchantDataCollection(); + for ($i=0; $i<3; $i++) { + $merchantData->add($keys[$i], $values[$i]); + } + + $this->assertEquals(3, $merchantData->count()); + + foreach ($merchantData->getKeys() as $key) { + $this->assertTrue(in_array($key, $keys)); + $this->assertTrue(in_array($merchantData->get($key), $values)); + } + } + + public function testMerchantDataWithHiddenValues() + { + $card = new CreditCardData(); + $card->number = 4012001037141112; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'James Mason'; + + $enrolled = $card->verifyEnrolled(100, 'USD'); + $this->assertNotNull($enrolled); + if ($enrolled) { + $merchantData = $card->threeDSecure->getMerchantData(); + + $this->assertNotNull($merchantData); + $this->assertEquals(0, $merchantData->count()); + + $this->assertNull($merchantData->get('amount')); + $this->assertNull($merchantData->get('currency')); + $this->assertNull($merchantData->get('orderId')); + + for ($i=0; $i<3; $i++) { + $merchantData->add('Key'.$i, 'Value'.$i); + + $this->assertNotNull($merchantData->get('Key'.$i)); + $this->assertEquals('Value'.$i, $merchantData->get('Key'.$i)); + } + + $this->assertEquals(3, $merchantData->count()); + } + } + + public function testMerchantDataEncryptAndDecrypt() + { + $merchantData = new MerchantDataCollection(); + $merchantData->add('customerId', '12345'); + $merchantData->add('invoiceNumber', '54321'); + + $encoder = function ($input) { + $encoded = sprintf('%s.%s', $input, 'secret'); + return base64_encode($encoded); + }; + + $encrypted = $merchantData->toString($encoder); + + $decoder = function ($input) { + $decoded = explode('.', (string)base64_decode($input)); + $this->assertEquals('secret', $decoded[1]); + return $decoded[0]; + }; + + $decrypted = $merchantData->parse($encrypted, $decoder); + + $this->assertNotNull($decrypted); + $this->assertNotNull($decrypted->get('customerId')); + $this->assertEquals('12345', $decrypted->get('customerId')); + $this->assertNotNull($decrypted->get('invoiceNumber')); + $this->assertEquals('54321', $decrypted->get('invoiceNumber')); + } + + public function testMerchantDataMultiKey() + { + $this->expectExceptionMessage('Cannot access private property GlobalPayments\Api\Entities\MerchantDataCollection::$collection'); + + $mcd = new MerchantDataCollection(); + array_push($mcd->collection, array('amount'=>'10')); + array_push($mcd->collection, array('amount'=>'10')); + } + + public function testFullCycleWithMerchantData() + { + $card = new CreditCardData(); + $card->number = 4012001037141112; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(1, 'USD'); + if ($enrolled) { + $secureEcom = $card->threeDSecure; + if (!empty($secureEcom)) { + $merchantData = new MerchantDataCollection(); + $merchantData->add('client_txn_id', '123456'); + + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, (string)$secureEcom->getMerchantData()->toString()); + + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + if ($card->verifySignature($payerAuthenticationResponse, $md)) { + $response = $card->charge(1) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + $this->fail('Secure3Data was null.'); + } + } else { + $this->fail('Card not enrolled.'); + } + } + + public function testFullCycleWithNoMerchantData() + { + $card = new CreditCardData(); + $card->number = 4012001037141112; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'James Mason'; + + $amount = 100; + $currency = 'USD'; + $orderId = GenerationUtils::generateOrderId(); + + $enrolled = $card->verifyEnrolled($amount, $currency, $orderId); + + if ($enrolled) { + $secureEcom = $card->threeDSecure; + + if ($secureEcom != null) { + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, (string)$secureEcom->getMerchantData()->toString()); + + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + + if ($card->verifySignature($payerAuthenticationResponse, null, $amount, $currency, $orderId)) { + $response = $card->charge($amount) + ->withCurrency($currency) + ->withOrderId($orderId) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + $this->fail('Secure3Data was null.'); + } + } else { + $this->fail('Card not enrolled.'); + } + } + + public function testVerifyEnrolledTrue() + { + $card = new CreditCardData(); + $card->number = 4012001037141112; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(1, 'USD'); + $this->assertTrue($enrolled); + $this->assertNotNull($card->threeDSecure); + $this->assertNotNull($card->threeDSecure->payerAuthenticationRequest); + $this->assertNotNull($card->threeDSecure->issuerAcsUrl); + $this->assertNotNull($card->threeDSecure->xid); + } + + public function testVerifyEnrolledFalse() + { + $card = new CreditCardData(); + $card->number = 4012001038443335; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(1, 'USD'); + $this->assertFalse($enrolled); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testVerifySignatureBadOrderId() + { + $card = new CreditCardData(); + $card->verifySignature('eNrVWNmyozqy/ZWK6kfHOcwYOly7Q8yDwWYe3jBgRjPbYL7+4r1r16muWx3RfZ/68oKUSKlU5sqVQod/LLf6yyMdxqJtvn1F/oS/fvnH28HOhzTlrDS+D+nbQUvHMcrSL0Xy7SuNIjEMX1L8iiX4FUcudEQjURzhOEHHaHL9+nY4AzMd3wcTCEbS2Cb6vsDbpv9P9AB9djfNQ5xHzfR2iOKekfU3fI8jNHWAvncPt3SQuTf6+3OAPvoH6K+J5/urNW5mLkXyVvi9feR6zi2AGBCUZax3S3EeCI1T3w7Qa8Qhiab0DYWRPYKg1BcU/jtM/h3DD9C7/NC91IFbe990IzB8gH4WHDZ/DGkTP98ofPv0o3dIl65t0m3Etrkf7QP0l21d1LzBPz3Itvime5MebP/tMBW339r0Lj+MUzTdx7fgAH1vHeLo8XgDALAM5nAuq6OAk/mToTv8DF7Pttf3IYc0Lt5gYjNqe7/PAnXWDsWU316m/rPgAL1Mgd7D93awiqzZFhvSLxtCmvHb13yaur9D0DzPf87Yn+2QQei2EQimoW1AMhbZ375+zEoTubm2/9E0NmrapoijulijaUOGlk55m3z5Ydvv1NjmSxMCmTz7x6bqjxjBmz9eEhhDiE0n9HulP+3s31nlV2OHMfpjzCPktcAvit4OZnpNX4hIvzim/O3r337gnyuydJz+L+t9rvWzhk99blTf07e0Cz2ekj38LKW5mBLXiiFuoZWxN/7b57yPkQfoh4Hfrf8I1U8u+RgYUzvuaUx4FwaJURWc56HH/Yq5TX6sxTUIH7Kxm3TLLCiuVcwIo9nqtl8jNXLXCCmXR6CecFdoVjhC4P0ss+gsd6d67xE6QiD56kCcejLFztTiiAvNZfLHeL1h887PuAlrHBgMsnZf9YZfoTItL9UYe9J5ARby8CUM707lwz+x+lUzLCrHSh492mJNPOddfW8pUpq5py89JfPspIjDqTKDUiiAz3qwq0CU5UKVeyQU3KNmSHust3NjQcmezBAvOSV5ztJ9m1H3heSvdSYxDya+QNxMqTNrQS52c1RdURkVO6pPBdtrqrYwNuqT5nWOWX7p67lbMl1rply2U6rhNPQWdh3/OCdC9u3bT5D5HhE1fX5EwCdgmoum6KPFpsNUXDfsbpSkyTIX2iwLKjQDs8yATHbBSZIUbSr2QSqRbBeaZo3T64pHXJVpABZZqxct+YJxBs+wswM0MVu4FehMprsM0GymZhRXoDnD5l2N0USAODy7aJpbKZ4rumsi6Ejkm7VmwDM7B5xrGCo/m57l6oxmUDNnvMskfg750CPQ0JcX3gbnD/2ZzfL64yLSz8AzH5oxzuzHeJGfFddZQSrM8KKX/KyVYNFKftU4IXrJTtw/yzQJLMIK3O92a9yNeFxu7jVG6+ZS02XoK7BmOjP/YeORA4tn1KET+jrsYG6XiM7C2eD4Mb/VGCFUHJj/yRexxlRmfWnCOi55UwPUhy82RxsoPV4wJQ9FamFXoHyMD2xQu/YWE0YuXzqqPq8KkZ5hBhi8AMCJBQYFXt/ZTN3aPChKJ7Rv9KCfnfwsk6PchIR1U8M48i5zEp0LledpSOG5tbi7ir4Hec0jitt7GL460igVzY4wc1uYey7SfdW1S5k/L3dU4wpyycNsiloIRW6sGtmr7z5Hx9Af7NgB04GanE0umIPQqSxX4ERiWA0/aPKiaiEGY8I9FxktVagm0Mie6yCHw0zfjq3LxbaOKSaxK38DNGlCZ93jqskK9hBDOHkn7oQtMXYZlOPpNT6Fij4n4qmushGzm77B7cezjM+7ihNvqLg/kVe85x2a7vlHGISCrRot3YaKedX2I3dUC0bCgTyeI0BwxaTsl5AQ+diwMtO3XMqWYsNjS3a98hg4ZtE09VLoE4bMAQMwv8M6wLccMYDT+2ITZSu+gxf3dO010B4bFRodi5D7MyPkHMTR/R4ttIZrBm+cqGZ25ztSHsnlKktetpZ+kZQQEWiwaIrHliUSnofTEtu7nrwGbTBZZ4PjvAc7AEdr54WOWa9iNY0M66TH97tThmDoxh3skCgCz9Rk3lQMBJMeWyyqBS+RzUNkzN5dLC6eOtOi7JTRftNTUB92CUEw+ykOUpg44rf5stc78xgaa+pvEUSlNnpk5vV5PnYpSybdIg0R2en6rBaDDldX/o6wyLnMhqeHb4nBqWo3BpBYXMM6ijGrTNR85tNZvndnZfSMUJ661BokqlB8wgn5dKKQnWW70fRgm+xcuPpj5z32i3yAfmWn39EVL77oahY/6coExyCmt6DtJ2uxyULc8bfi5jovGlHUNpTzR6xvqXJkDDBvXjlqoHpPQybXWNfVfk5he0vhLkb55biC6UM22kr9Lsssj4A3SrgHvtldUCK/sIy99dHI02uZF9YYpcvIE+DIo++a2c4ieKcNjl8EL/L1XBbd8oIi0zanDC3GNOxPqgKEZldPjdNWnUteVPXU142mbH7WOQ1/yf67KHbzvyX/6l9m8y+XZfwZcNt3o2W3NgPUIQkhwylnnFurfSUQjR3uT0F/q5A9luGXR4abO1XCkXVa49m562eyHcZdOMYoZAlb4UO1qzYjp/mMboUvz+mWSpjc3SttyjtuTM+lDnsSye2mHkiXErai/pT3OUPdoTqqLXqRLt3jWUE8sYqlaJ/mdisAst9VKXW3SNS+E5KqMuLyyENIscH9mjCPI1bsHK2/Vrq9+AGvAjWBpYKUpOFxqup+5rcDzCh3+BoOXcBB5j3h8MGQxNm3DDiiGH0x1uet9cq2OI2aKwdqhjxqQw5nGh902m0uk9nCCTLUY9wBviX16pwwaCDeOE8O9/N8IUeB2xtCKyqJTflFxUjxxJHnMKWSBuumccM/D0B0Yh4cy9xtYL3iJpkaA64Uz3JABIYEgYwHmmS8sJHIwJw0cZwjIxBCnN/o7VXUQMlk2cBkvMAYMQvMwI8kE465dnNBgiVPAn3h9njbsGDRc4RW88kIZHUOtlg70pZ789EGgZALVugzY/DKA8FsI1/LNgziCQe4zQZG/NffT+92G9S73RuuN9wEs/TCmgmfGCbgBa3N0gqUocDEcgae1dWyIGXbqsIM/5qe2WHkCoDGO2+4IfaOtwlYT0Qa5baiUVQqUoxrz86GhAfpg0jKGXaZx55mE+s5DZqT5VAMp1CwIreOQ9aTrJ/Twm0Jq6kRpnzeK80g+RatfRPLhI0s2fUcjK2Otv5kzWJMFRpwpko25QwJUeqIybfWlfbxObYLz8yHgQLtXXa286SQdeOz3ThRkjpYs28rzt99Uh/ZbvcEnKIE2DASLCjtZ60FhokpIwm4wd5nz9MsXdHpURzVZkJYS5KeO4IlnzgVnfir0t72NjhleF3WVWUKJ5XzHCeuEYWppCldnGML+SHiyrhvHlMVjdUwInN/7ypLpTPwkXEG6ITjxf6xE0MvszWxo9SSX/5NehbKLf0f5Cc9G+l0Ryxt6RpeB01zWpHz7jzZv55uHAFwTPe/qYbXNTB+0Fuu8e6tXgObf2gs/El5t3eZxSiXxqzjG5EnYr2d4oRRFvQ6bsIuQJ3M8PX1gurdB3Xji1iC4JNKefeD3kNvg7mHbDpeMBUYjcF9zn6dFPntxAhWbY3hk9tuMu1X2X9ZWfkP6FmvnGut3rqGQKdAxsKJ0c/eOcBHXFUaSHK9WOB2lltEJ4fxckpMn8n9okMtO4vyVF3V5WEVnGnerCvryArTw17NG9g9BscLxOzk02DORlaMPXbRYTk8ghheJbl7ev79FrXVuB8j88GNEToPlxXiJ6SvNLiEWgl6nIat7KkSrdBEX7E9vpWNkY+fRKPOV67qBPTaVuEEO6oqTIsrxRZ/tnhk1XVkQ/Fi6d3+0fnP5XG0Rhbyk4ES9zaboRfkufieUA5nGLlvMOUbRbWbUMZZ1EnzeSk3NmWv1mhDQHwsXH71zsPAT4C02Zijh1NHc93s64WliOe1ih3Hu0rbb4Cf0WmQFTbf0ige/6Dnu80yU/lRVj/pmbE3Wtzo+f89NTMLJT2jxABejTP3113Rsv0lCnolr79S82bTJzWniIjm5xGAndnqLRy7DbKz05iygsRggLDv2eZIC2ke3fF9ipFXV9SL9VQ9ZZsGktgOpIkc5ShX/R1P3nrDDsa1USwi9xVKpGL4DN+W0rXiy/5ZzQYxM0Hvexp68dWuONpp4HpXBAyC13fIkxZJEwanqDmWt1k3GTBkzwdZI0Z42Tsaxlxpi6jh+yBoR3gDCsXs6bpOCR9D5QddXu/xnYwjeWCO1dlayKDf9VvxHXFKN62TvoPO/Y2WlhmRMOi5ov1RxFdb3i+Ky/FWKPJ+lBxnVvE58mSmPipAzOQkVI9iSemHFzco5CtPp5cBzzCEQJnaZaUQFZ/npMzl+zGVUMS92FDy5CUJ/Iaaob/++aEf9wB/3RC833K+X7y+buZ+vpD9HwzDHH8=', null, 1, 'USD', 'orderId'); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testVerifySignatureNoPaymentResponse() + { + $card = new CreditCardData(); + $card->verifySignature(null); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testVerifySignatureNoAmount() + { + $card = new CreditCardData(); + $card->verifySignature('paymentResponse', null, null, 'USD', 'orderId'); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testVerifySignatureNoCurrency() + { + $card = new CreditCardData(); + $card->verifySignature('paymentResponse', null, 10, null, 'orderId'); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testVerifySignatureNoOrderId() + { + $card = new CreditCardData(); + $card->verifySignature('paymentResponse', null, 10, 'USD', null); + } + + public function testAuthorize3dSecure() + { + $secureEcom = new ThreeDSecure(); + $secureEcom->cavv = 'AAACBllleHchZTBWIGV4AAAAAAA='; + $secureEcom->xid = 'crqAeMwkEL9r4POdxpByWJ1/wYg='; + $secureEcom->eci = '5'; + + $card = new CreditCardData(); + $card->number = 4012001037141112; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'Philip Marlowe'; + $card->threeDSecure = $secureEcom; + + $response = $card->charge(10) + ->withCurrency('EUR') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCardHolderNotEnrolled() + { + $card = new CreditCardData(); + $card->number = 4012001038443335; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertFalse($enrolled); + $this->assertNotNull($card->threeDSecure); + $this->assertEquals('6', $card->threeDSecure->eci); + + // .net test does not have amount or currency but validation would not allow this + $response = $card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testUnableToVerifyEnrollment() + { + $card = new CreditCardData(); + $card->number = 4012001038488884; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertFalse($enrolled); + $this->assertNotNull($card->threeDSecure); + $this->assertEquals('7', $card->threeDSecure->eci); + + $response = $card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testInvalidResponseFromEnrollmentServer() + { + $card = new CreditCardData(); + $card->number = 4012001036298889; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'John Smith'; + + $card->verifyEnrolled(10, 'USD'); + } + + public function testCardHolderIsEnrolledACSAuthFailed() + { + $card = new CreditCardData(); + $card->number = 4012001036853337; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertTrue($enrolled); + + $secureEcom = $card->threeDSecure; + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); + + // $payerAuthenticationResponse = $authResponse->parse(); + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + $verified = $card->verifySignature($payerAuthenticationResponse, $md); + $this->assertFalse($verified); + $this->assertNotNull($card->threeDSecure); + $this->assertEquals(7, $card->threeDSecure->eci); + + $response = $card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCardHolderIsEnrolledACSAcknowledged() + { + $card = new CreditCardData(); + $card->number = 4012001037167778; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertTrue($enrolled); + + $secureEcom = $card->threeDSecure; + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); + + // $payerAuthenticationResponse = $authResponse->parse(); + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + $verified = $card->verifySignature($payerAuthenticationResponse, $md); + $this->assertTrue($verified); + $this->assertEquals('A', $card->threeDSecure->status); + + $response = $card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCardHolderIsEnrolledACSFailed() + { + $card = new CreditCardData(); + $card->number = 4012001037461114; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertTrue($enrolled); + + $secureEcom = $card->threeDSecure; + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); + + // $payerAuthenticationResponse = $authResponse->parse(); + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + $verified = $card->verifySignature($payerAuthenticationResponse, $md); + $this->assertFalse($verified); + $this->assertEquals('N', $card->threeDSecure->status); + $this->assertEquals(7, $card->threeDSecure->eci); + + $response = $card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCardHolderIsEnrolledACSUnavailable() + { + $card = new CreditCardData(); + $card->number = 4012001037484447; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertTrue($enrolled); + + $secureEcom = $card->threeDSecure; + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); + + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + $verified = $card->verifySignature($payerAuthenticationResponse, $md); + $this->assertFalse($verified); + $this->assertEquals('U', $card->threeDSecure->status); + $this->assertEquals(7, $card->threeDSecure->eci); + + $response = $card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testCardHolderIsEnrolledACSInvalid() + { + $card = new CreditCardData(); + $card->number = 4012001037490006; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertTrue($enrolled); + + $secureEcom = $card->threeDSecure; + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); + + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + $card->verifySignature($payerAuthenticationResponse, $md); + } +} diff --git a/test/Integration/Gateways/RealexConnector/RealexApmTest.php b/test/Integration/Gateways/RealexConnector/RealexApmTest.php index a0eddd4f..e52db0c5 100644 --- a/test/Integration/Gateways/RealexConnector/RealexApmTest.php +++ b/test/Integration/Gateways/RealexConnector/RealexApmTest.php @@ -1,194 +1,191 @@ -merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->rebatePassword = 'refund'; - $config->refundPassword = 'refund'; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - return $config; - } - - public function setup() - { - ServicesContainer::configure($this->config()); - } - - public function testApmForCharge() - { - $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); - - $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; - $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; - $paymentMethod->descriptor = 'Test Transaction'; - $paymentMethod->country = 'DE'; - $paymentMethod->accountHolderName = 'James Mason'; - - $response = $paymentMethod->charge(10) - ->withCurrency("EUR") - ->withDescription('New APM') - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the reponse details to save to the DB for future transaction management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; // pasref - $apmResponse = $response->alternativePaymentResponse; - - $this->assertNotNull($response); - $this->assertEquals("01", $response->responseCode); - $this->assertNotNull($response->alternativePaymentResponse); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null for this transaction type - */ - public function testApmWithoutAmount() - { - $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); - - $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; - $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; - $paymentMethod->descriptor = 'Test Transaction'; - $paymentMethod->country = 'DE'; - $paymentMethod->accountHolderName = 'James Mason'; - - $response = $paymentMethod->charge() - ->withCurrency("EUR") - ->withDescription('New APM') - ->execute(); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage currency cannot be null for this transaction type - */ - public function testApmWithoutCurrency() - { - $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); - - $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; - $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; - $paymentMethod->descriptor = 'Test Transaction'; - $paymentMethod->country = 'DE'; - $paymentMethod->accountHolderName = 'James Mason'; - - $response = $paymentMethod->charge(10) - ->withDescription('New APM') - ->execute(); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage returnUrl cannot be null for this transaction type - */ - public function testApmWithoutReturnUrl() - { - $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); - - $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; - $paymentMethod->descriptor = 'Test Transaction'; - $paymentMethod->country = 'DE'; - $paymentMethod->accountHolderName = 'James Mason'; - - $response = $paymentMethod->charge(1001) - ->withCurrency("EUR") - ->withDescription('New APM') - ->execute(); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage statusUpdateUrl cannot be null for this transaction type - */ - public function testApmWithoutstatusUpdateUrl() - { - $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); - - $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; - $paymentMethod->descriptor = 'Test Transaction'; - $paymentMethod->country = 'DE'; - $paymentMethod->accountHolderName = 'James Mason'; - - $response = $paymentMethod->charge(1001) - ->withCurrency("EUR") - ->withDescription('New APM') - ->execute(); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage FAILED - */ - public function testAPMRefundPendingTransaction() - { - $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::TEST_PAY); - - $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; - $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; - $paymentMethod->descriptor = 'Test Transaction'; - $paymentMethod->country = 'DE'; - $paymentMethod->accountHolderName = 'James Mason'; - - $response = $paymentMethod->charge(10) - ->withCurrency("EUR") - ->withDescription('New APM') - ->execute(); - - $this->assertNotEquals(null, $response); - $this->assertEquals("01", $response->responseCode); - - // send the settle request, we must specify the amount and currency - $response = $response->refund(10) - ->withCurrency("EUR") - ->withAlternativePaymentType(AlternativePaymentType::TEST_PAY) - ->execute(); - } - - public function testApmForRefund() - { - // a settle request requires the original order id - $orderId = "20180912050207-5b989dcfc9433"; - // and the payments reference (pasref) from the authorization response - $paymentsReference = "15367285279651634"; - // and the auth code transaction response - $authCode = "12345"; - - // create the rebate transaction object - $transaction = Transaction::fromId($paymentsReference, $orderId); - $transaction->authorizationCode = $authCode; - - // send the settle request, we must specify the amount and currency - $response = $transaction->refund(10) - ->withCurrency("EUR") - ->withAlternativePaymentType(AlternativePaymentType::TEST_PAY) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } -} +merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->rebatePassword = 'refund'; + $config->refundPassword = 'refund'; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + return $config; + } + + public function setup() + { + ServicesContainer::configureService($this->config()); + } + + public function testApmForCharge() + { + $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); + + $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; + $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; + $paymentMethod->descriptor = 'Test Transaction'; + $paymentMethod->country = 'DE'; + $paymentMethod->accountHolderName = 'James Mason'; + + $response = $paymentMethod->charge(10) + ->withCurrency("EUR") + ->withDescription('New APM') + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the reponse details to save to the DB for future transaction management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; // pasref + $apmResponse = $response->alternativePaymentResponse; + + $this->assertNotNull($response); + $this->assertEquals("01", $response->responseCode); + $this->assertNotNull($response->alternativePaymentResponse); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null for this transaction type + */ + public function testApmWithoutAmount() + { + $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); + + $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; + $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; + $paymentMethod->descriptor = 'Test Transaction'; + $paymentMethod->country = 'DE'; + $paymentMethod->accountHolderName = 'James Mason'; + + $response = $paymentMethod->charge() + ->withCurrency("EUR") + ->withDescription('New APM') + ->execute(); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage currency cannot be null for this transaction type + */ + public function testApmWithoutCurrency() + { + $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); + + $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; + $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; + $paymentMethod->descriptor = 'Test Transaction'; + $paymentMethod->country = 'DE'; + $paymentMethod->accountHolderName = 'James Mason'; + + $response = $paymentMethod->charge(10) + ->withDescription('New APM') + ->execute(); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage returnUrl cannot be null for this transaction type + */ + public function testApmWithoutReturnUrl() + { + $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); + + $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; + $paymentMethod->descriptor = 'Test Transaction'; + $paymentMethod->country = 'DE'; + $paymentMethod->accountHolderName = 'James Mason'; + + $response = $paymentMethod->charge(1001) + ->withCurrency("EUR") + ->withDescription('New APM') + ->execute(); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage statusUpdateUrl cannot be null for this transaction type + */ + public function testApmWithoutstatusUpdateUrl() + { + $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); + + $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; + $paymentMethod->descriptor = 'Test Transaction'; + $paymentMethod->country = 'DE'; + $paymentMethod->accountHolderName = 'James Mason'; + + $response = $paymentMethod->charge(1001) + ->withCurrency("EUR") + ->withDescription('New APM') + ->execute(); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage FAILED + */ + public function testAPMRefundPendingTransaction() + { + $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::TEST_PAY); + + $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; + $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; + $paymentMethod->descriptor = 'Test Transaction'; + $paymentMethod->country = 'DE'; + $paymentMethod->accountHolderName = 'James Mason'; + + $response = $paymentMethod->charge(10) + ->withCurrency("EUR") + ->withDescription('New APM') + ->execute(); + + $this->assertNotEquals(null, $response); + $this->assertEquals("01", $response->responseCode); + + // send the settle request, we must specify the amount and currency + $response = $response->refund(10) + ->withCurrency("EUR") + ->withAlternativePaymentType(AlternativePaymentType::TEST_PAY) + ->execute(); + } + + public function testApmForRefund() + { + // a settle request requires the original order id + $orderId = "20180912050207-5b989dcfc9433"; + // and the payments reference (pasref) from the authorization response + $paymentsReference = "15367285279651634"; + // and the auth code transaction response + $authCode = "12345"; + + // create the rebate transaction object + $transaction = Transaction::fromId($paymentsReference, $orderId); + $transaction->authorizationCode = $authCode; + + // send the settle request, we must specify the amount and currency + $response = $transaction->refund(10) + ->withCurrency("EUR") + ->withAlternativePaymentType(AlternativePaymentType::TEST_PAY) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } +} diff --git a/test/Integration/Gateways/RealexConnector/RecurringTest.php b/test/Integration/Gateways/RealexConnector/RecurringTest.php index 83e573c3..f7b6c914 100644 --- a/test/Integration/Gateways/RealexConnector/RecurringTest.php +++ b/test/Integration/Gateways/RealexConnector/RecurringTest.php @@ -1,391 +1,391 @@ -format("Ymd")); - } - - public function getPaymentId($type) - { - return sprintf("%s-Realex-%s", (new \DateTime())->format("Ymd"), $type); - } - - protected function config() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "3dsecure"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - return $config; - } - - protected function dccSetup() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "apidcc"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - - ServicesContainer::configure($config); - } - - public function setup() - { - ServicesContainer::configure($this->config()); - - $this->newCustomer = new Customer(); - $this->newCustomer->key = $this->getCustomerId(); - $this->newCustomer->title = "Mr."; - $this->newCustomer->firstName = "James"; - $this->newCustomer->lastName = "Mason"; - $this->newCustomer->company = "Realex Payments"; - $this->newCustomer->address = new Address(); - $this->newCustomer->address->streetAddress1 = "Flat 123"; - $this->newCustomer->address->streetAddress2 = "House 456"; - $this->newCustomer->address->streetAddress3 = "The Cul-De-Sac"; - $this->newCustomer->address->city = "Halifax"; - $this->newCustomer->address->province = "West Yorkshire"; - $this->newCustomer->address->pstalCode = "W6 9HR"; - $this->newCustomer->address->country = "United Kingdom"; - $this->newCustomer->homePhone = "+35312345678"; - $this->newCustomer->workPhone = "+3531987654321"; - $this->newCustomer->fax = "+124546871258"; - $this->newCustomer->mobilePhone = "+25544778544"; - $this->newCustomer->email = "text@example.com"; - $this->newCustomer->comments = "Campaign Ref E7373G"; - } - - /* 08. Card Storage Create Payer */ - /* Request Type: payer-new */ - - public function testcardStorageCreatePayer() - { - try { - $response = $this->newCustomer->Create(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } catch (GatewayException $exc) { - if ($exc->responseCode != '501' && $exc->responseCode != '520') { - throw $exc; - } - } - } - - /* 09. Card Storage Store Card */ - /* Request Type: card-new */ - - public function testcardStorageStoreCard() - { - $card = new CreditCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 10; - $card->expYear = TestCards::validCardExpYear(); - $card->cvn = '123'; - $card->cardHolderName = 'James Mason'; - - try { - $paymentMethod = $this->newCustomer - ->addPaymentMethod($this->getPaymentId("Credit"), $card) - ->create(); - $this->assertNotNull($paymentMethod); - } catch (GatewayException $exc) { - if ($exc->responseCode != '501' && $exc->responseCode != '520') { - throw $exc; - } - } - } - - /* 10. Card Storage Charge Card */ - /* Request Type: receipt-in */ - - public function testcardStorageChargeCard() - { - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - $response = $paymentMethod->charge(10) - ->withCurrency("EUR") - ->withCvn("123") - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the reponse details to save to the DB for future transaction management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; // pasref - - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /* 11. CardStorage ThreeDSecure Verify Enrolled */ - /* Request Type: realvault-3ds-verifyenrolled */ - - public function testcardStorageThreeDSecureVerifyEnrolled() - { - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - $response = $paymentMethod->verify() - ->withAmount(10) - ->withCurrency('USD') - ->withModifier(TransactionModifier::SECURE3D) - ->execute(); - - // get the response details to update the DB - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /* 12. CardStorage Dcc Rate Lookup */ - /* Request Type: realvault-dccrate */ - - public function testcardStorageDccRateLookup() - { - $this->dccSetup(); - - $orderId = GenerationUtils::generateOrderId(); - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - $dccDetails = $paymentMethod->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); - - $this->assertNotNull($dccDetails); - $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); - $this->assertNotNull($dccDetails->dccResponseResult); - } - - /* 14. CardStorage UpdatePayer */ - /* Request Type: payer-edit */ - - public function testcardStorageUpdatePayer() - { - $customer = new Customer(); - $customer->key = $this->getCustomerId(); - $customer->firstName = "Perry"; - - $response = $customer->saveChanges(); - - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /* 15. CardStorage Continuous Authority First */ - /* Request Type: auth */ - - public function testContinuousAuthorityFirst() - { - // create the card object - $card = new CreditCardData(); - $card->number = '5425230000004415'; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - - // process an auto-settle authorization - $response = $card->charge(15) - ->withCurrency("EUR") - ->withRecurringInfo(RecurringType::VARIABLE, RecurringSequence::FIRST) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the details to save to the DB for future Transaction Management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 15. CardStorage Continuous Authority Subsequent */ - /* Request Type: receipt-in */ - - public function testContinuousAuthoritySubsequent() - { - // create the payment method object - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - // charge the stored card/payment method - $response = $paymentMethod->charge(15) - ->withCurrency("EUR") - ->withCvn("123") - ->withRecurringInfo(RecurringType::VARIABLE, RecurringSequence::SUBSEQUENT) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 15. CardStorage Continuous Authority Last */ - /* Request Type: receipt-in */ - - public function testContinuousAuthorityLast() - { - // create the payment method object - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - // charge the stored card/payment method - $response = $paymentMethod->charge(15) - ->withCurrency("EUR") - ->withCvn("123") - ->withRecurringInfo(RecurringType::VARIABLE, RecurringSequence::LAST) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 16. Card Storage Refund */ - /* Request Type: payment-out */ - - public function testcardStorageRefund() - { - // create the payment method object - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - // charge the stored card/payment method - $response = $paymentMethod->refund(10) - ->withCurrency("EUR") - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 17. Card Storage UpdateCard */ - /* Request Type: card-update-card */ - - public function testcardStorageUpdateCard() - { - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - $paymentMethod->paymentMethod = new CreditCardData(); - $paymentMethod->paymentMethod->number = "5425230000004415"; - $paymentMethod->paymentMethod->expMonth = 10; - $paymentMethod->paymentMethod->expYear = TestCards::validCardExpYear(); - $paymentMethod->paymentMethod->cardHolderName = "Philip Marlowe"; - - $response = $paymentMethod->SaveChanges(); - - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /* 18. Card Storage Verify Card */ - /* Request Type: receipt-in-otb */ - - public function testcardStorageVerifyCard() - { - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - // verify the stored card/payment method is valid and active - $response = $paymentMethod->verify() - ->withCvn("123") - ->execute(); - - // get the response details to update the DB - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 13. CardStorage DeleteCard */ - /* Request Type: card-cancel-card */ - - public function testcardStorageDeleteCard() - { - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - // delete the stored card/payment method - // WARNING! This can't be undone - $response = $paymentMethod->Delete(); - - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /* Request Type: receipt-in */ - - public function testcardStorageChargeCardDCC() - { - $this->dccSetup(); - $this->testcardStorageCreatePayer(); - $this->testcardStorageStoreCard(); - - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - $orderId = GenerationUtils::generateOrderId(); - $dccDetails = $paymentMethod->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); - - $this->assertNotNull($dccDetails); - $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); - $this->assertNotNull($dccDetails->dccResponseResult); - - $dccValues = new DccRateData(); - $dccValues->orderId = $dccDetails->transactionReference->orderId; - $dccValues->dccProcessor = DccProcessor::FEXCO; - $dccValues->dccType = 1; - $dccValues->dccRateType = DccRateType::SALE; - $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; - $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; - $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; - - $response = $paymentMethod->charge(1001) - ->withCurrency("EUR") - ->withCvn("123") - ->withDccRateData($dccValues) - ->withOrderId($orderId) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the reponse details to save to the DB for future transaction management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; // pasref - - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } -} +format("Ymd")); + } + + public function getPaymentId($type) + { + return sprintf("%s-Realex-%s", (new \DateTime())->format("Ymd"), $type); + } + + protected function config() + { + $config = new GpEcomConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "3dsecure"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + return $config; + } + + protected function dccSetup() + { + $config = new GpEcomConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "apidcc"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + + ServicesContainer::configureService($config); + } + + public function setup() + { + ServicesContainer::configureService($this->config()); + + $this->newCustomer = new Customer(); + $this->newCustomer->key = $this->getCustomerId(); + $this->newCustomer->title = "Mr."; + $this->newCustomer->firstName = "James"; + $this->newCustomer->lastName = "Mason"; + $this->newCustomer->company = "Realex Payments"; + $this->newCustomer->address = new Address(); + $this->newCustomer->address->streetAddress1 = "Flat 123"; + $this->newCustomer->address->streetAddress2 = "House 456"; + $this->newCustomer->address->streetAddress3 = "The Cul-De-Sac"; + $this->newCustomer->address->city = "Halifax"; + $this->newCustomer->address->province = "West Yorkshire"; + $this->newCustomer->address->pstalCode = "W6 9HR"; + $this->newCustomer->address->country = "United Kingdom"; + $this->newCustomer->homePhone = "+35312345678"; + $this->newCustomer->workPhone = "+3531987654321"; + $this->newCustomer->fax = "+124546871258"; + $this->newCustomer->mobilePhone = "+25544778544"; + $this->newCustomer->email = "text@example.com"; + $this->newCustomer->comments = "Campaign Ref E7373G"; + } + + /* 08. Card Storage Create Payer */ + /* Request Type: payer-new */ + + public function testcardStorageCreatePayer() + { + try { + $response = $this->newCustomer->Create(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } catch (GatewayException $exc) { + if ($exc->responseCode != '501' && $exc->responseCode != '520') { + throw $exc; + } + } + } + + /* 09. Card Storage Store Card */ + /* Request Type: card-new */ + + public function testcardStorageStoreCard() + { + $card = new CreditCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 10; + $card->expYear = TestCards::validCardExpYear(); + $card->cvn = '123'; + $card->cardHolderName = 'James Mason'; + + try { + $paymentMethod = $this->newCustomer + ->addPaymentMethod($this->getPaymentId("Credit"), $card) + ->create(); + $this->assertNotNull($paymentMethod); + } catch (GatewayException $exc) { + if ($exc->responseCode != '501' && $exc->responseCode != '520') { + throw $exc; + } + } + } + + /* 10. Card Storage Charge Card */ + /* Request Type: receipt-in */ + + public function testcardStorageChargeCard() + { + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + $response = $paymentMethod->charge(10) + ->withCurrency("EUR") + ->withCvn("123") + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the reponse details to save to the DB for future transaction management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; // pasref + + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /* 11. CardStorage ThreeDSecure Verify Enrolled */ + /* Request Type: realvault-3ds-verifyenrolled */ + + public function testcardStorageThreeDSecureVerifyEnrolled() + { + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + $response = $paymentMethod->verify() + ->withAmount(10) + ->withCurrency('USD') + ->withModifier(TransactionModifier::SECURE3D) + ->execute(); + + // get the response details to update the DB + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /* 12. CardStorage Dcc Rate Lookup */ + /* Request Type: realvault-dccrate */ + + public function testcardStorageDccRateLookup() + { + $this->dccSetup(); + + $orderId = GenerationUtils::generateOrderId(); + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + $dccDetails = $paymentMethod->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); + + $this->assertNotNull($dccDetails); + $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); + $this->assertNotNull($dccDetails->dccResponseResult); + } + + /* 14. CardStorage UpdatePayer */ + /* Request Type: payer-edit */ + + public function testcardStorageUpdatePayer() + { + $customer = new Customer(); + $customer->key = $this->getCustomerId(); + $customer->firstName = "Perry"; + + $response = $customer->saveChanges(); + + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /* 15. CardStorage Continuous Authority First */ + /* Request Type: auth */ + + public function testContinuousAuthorityFirst() + { + // create the card object + $card = new CreditCardData(); + $card->number = '5425230000004415'; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + + // process an auto-settle authorization + $response = $card->charge(15) + ->withCurrency("EUR") + ->withRecurringInfo(RecurringType::VARIABLE, RecurringSequence::FIRST) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the details to save to the DB for future Transaction Management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 15. CardStorage Continuous Authority Subsequent */ + /* Request Type: receipt-in */ + + public function testContinuousAuthoritySubsequent() + { + // create the payment method object + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + // charge the stored card/payment method + $response = $paymentMethod->charge(15) + ->withCurrency("EUR") + ->withCvn("123") + ->withRecurringInfo(RecurringType::VARIABLE, RecurringSequence::SUBSEQUENT) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 15. CardStorage Continuous Authority Last */ + /* Request Type: receipt-in */ + + public function testContinuousAuthorityLast() + { + // create the payment method object + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + // charge the stored card/payment method + $response = $paymentMethod->charge(15) + ->withCurrency("EUR") + ->withCvn("123") + ->withRecurringInfo(RecurringType::VARIABLE, RecurringSequence::LAST) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 16. Card Storage Refund */ + /* Request Type: payment-out */ + + public function testcardStorageRefund() + { + // create the payment method object + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + // charge the stored card/payment method + $response = $paymentMethod->refund(10) + ->withCurrency("EUR") + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 17. Card Storage UpdateCard */ + /* Request Type: card-update-card */ + + public function testcardStorageUpdateCard() + { + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + $paymentMethod->paymentMethod = new CreditCardData(); + $paymentMethod->paymentMethod->number = "5425230000004415"; + $paymentMethod->paymentMethod->expMonth = 10; + $paymentMethod->paymentMethod->expYear = TestCards::validCardExpYear(); + $paymentMethod->paymentMethod->cardHolderName = "Philip Marlowe"; + + $response = $paymentMethod->SaveChanges(); + + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /* 18. Card Storage Verify Card */ + /* Request Type: receipt-in-otb */ + + public function testcardStorageVerifyCard() + { + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + // verify the stored card/payment method is valid and active + $response = $paymentMethod->verify() + ->withCvn("123") + ->execute(); + + // get the response details to update the DB + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 13. CardStorage DeleteCard */ + /* Request Type: card-cancel-card */ + + public function testcardStorageDeleteCard() + { + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + // delete the stored card/payment method + // WARNING! This can't be undone + $response = $paymentMethod->Delete(); + + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /* Request Type: receipt-in */ + + public function testcardStorageChargeCardDCC() + { + $this->dccSetup(); + $this->testcardStorageCreatePayer(); + $this->testcardStorageStoreCard(); + + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + $orderId = GenerationUtils::generateOrderId(); + $dccDetails = $paymentMethod->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); + + $this->assertNotNull($dccDetails); + $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); + $this->assertNotNull($dccDetails->dccResponseResult); + + $dccValues = new DccRateData(); + $dccValues->orderId = $dccDetails->transactionReference->orderId; + $dccValues->dccProcessor = DccProcessor::FEXCO; + $dccValues->dccType = 1; + $dccValues->dccRateType = DccRateType::SALE; + $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; + $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; + $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; + + $response = $paymentMethod->charge(1001) + ->withCurrency("EUR") + ->withCvn("123") + ->withDccRateData($dccValues) + ->withOrderId($orderId) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the reponse details to save to the DB for future transaction management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; // pasref + + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } +} From 444141f00f91ad3c86c466f4b6df406e84eda19c Mon Sep 17 00:00:00 2001 From: securesubmit-buildmaster Date: Tue, 5 Jan 2021 09:37:14 -0500 Subject: [PATCH 11/13] 20210105 deployment --- .../RealexConnector/Hpp/RealexHppClient.php | 501 +++++++++--------- 1 file changed, 251 insertions(+), 250 deletions(-) diff --git a/test/Integration/Gateways/RealexConnector/Hpp/RealexHppClient.php b/test/Integration/Gateways/RealexConnector/Hpp/RealexHppClient.php index 8dd1d89a..f67a188e 100644 --- a/test/Integration/Gateways/RealexConnector/Hpp/RealexHppClient.php +++ b/test/Integration/Gateways/RealexConnector/Hpp/RealexHppClient.php @@ -1,250 +1,251 @@ -sharedSecret = $sharedSecret; - } - - public function sendRequest($jsonData, $hppVersion = '') - { - $this->paymentData = GenerationUtils::decodeJson($jsonData, true, $hppVersion); - - $timestamp = $this->getValue('TIMESTAMP'); - $merchantId = $this->getValue('MERCHANT_ID'); - $account = $this->getValue('ACCOUNT'); - $orderId = $this->getValue('ORDER_ID'); - $amount = $this->getValue('AMOUNT'); - $currency = $this->getValue('CURRENCY'); - $autoSettle = $this->getValue('AUTO_SETTLE_FLAG'); - $requestHash = $this->getValue('SHA1HASH'); - $shippingCode = $this->getValue('SHIPPING_CODE'); - $shippingCountry = $this->getValue('SHIPPING_CO'); - $billingCode = $this->getValue('BILLING_CODE'); - $billingCountry = $this->getValue('BILLING_CO'); - - $config = new ServicesConfig(); - $config->merchantId = $merchantId; - $config->accountId = $account; - $config->sharedSecret = $this->sharedSecret; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - $config->hostedPaymentConfig->version = $hppVersion; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4006097467207025'; - $card->expMonth = 12; - $card->expYear = TestCards::validCardExpYear(); - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - // // check hash - $hashParam = [ - $timestamp, - $merchantId, - $orderId, - $amount, - $currency - ]; - - //for stored card - - if (!empty($this->paymentData['OFFER_SAVE_CARD'])) { - $hashParam[] = (!empty($this->paymentData['PAYER_REF'])) ? - $this->paymentData['PAYER_REF'] : null; - $hashParam[] = (!empty($this->paymentData['PMT_REF'])) ? - $this->paymentData['PMT_REF'] : null; - } - - $newHash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', $hashParam) - ); - if ($newHash != $requestHash) { - throw new ApiException("Incorrect hash. Please check your code and the Developers Documentation."); - } - - // build request - if ($amount == null) { - $validate = $this->getValue("VALIDATE_CARD_ONLY"); - if ($validate) { - $gatewayRequest = $card->verify(); - } else { - $gatewayRequest = $card->verify()->WithRequestMultiUseToken(true); - } - } else { - $amount = $amount / 100; - if ($autoSettle) { - $gatewayRequest = $card->charge($amount); - } else { - $gatewayRequest = $card->authorize($amount); - } - } - - try { - $gatewayRequest - ->WithCurrency($currency) - ->WithOrderId($orderId) - ->withTimeStamp($timestamp); - - $this->addAddressDetails($gatewayRequest, $billingCode, $billingCountry, AddressType::BILLING); - $this->addAddressDetails($gatewayRequest, $shippingCode, $shippingCountry, AddressType::SHIPPING); - - //handle DCC - $this->addDCCInfo($gatewayRequest, $orderId); - - //handle fraud management - $this->addFraudManagementInfo($gatewayRequest, $orderId); - - $gatewayResponse = $gatewayRequest->execute(); - - if ($gatewayResponse->responseCode === '00') { - return $this->convertResponse($gatewayResponse); - } - } catch (ApiException $exc) { - throw $exc; - } - return null; - } - - public function getValue($value) - { - if (isset($this->paymentData[$value])) { - return $this->paymentData[$value]; - } - return null; - } - - public function addDCCInfo($gatewayRequest, $orderId) - { - if (!empty($this->paymentData['DCC_ENABLE'])) { - $dccInfo = $this->getValue('DCC_INFO'); - - $dccValues = new DccRateData(); - $dccValues->orderId = $orderId; - $dccValues->dccProcessor = $dccInfo['CCP']; - $dccValues->dccType = $dccInfo['TYPE']; - $dccValues->dccRateType = $dccInfo['RATE_TYPE']; - $dccValues->currency = $dccInfo['CURRENCY']; - $dccValues->dccRate = $dccInfo['RATE']; - $dccValues->amount = $dccInfo['AMOUNT']; - - $gatewayRequest - ->withDccRateData($dccValues); - } - } - - public function addFraudManagementInfo($gatewayRequest, $orderId) - { - if (!empty($this->paymentData['HPP_FRAUD_FILTER_MODE'])) { - $tssInfo = $this->getValue('TSS_INFO'); - - $this->addAddressDetails( - $gatewayRequest, - $tssInfo['BILLING_ADDRESS']['CODE'], - $tssInfo['BILLING_ADDRESS']['COUNTRY'], - AddressType::BILLING - ); - - $this->addAddressDetails( - $gatewayRequest, - $tssInfo['SHIPPING_ADDRESS']['CODE'], - $tssInfo['SHIPPING_ADDRESS']['COUNTRY'], - AddressType::SHIPPING - ); - - $gatewayRequest - ->withProductId($tssInfo['PRODID']) // prodid - ->withClientTransactionId($tssInfo['VARREF']) // varref - ->withCustomerId($tssInfo['CUSTNUM']) // custnum - ->withCustomerIpAddress($tssInfo['CUSTIPADDRESS']) - ->withFraudFilter($this->paymentData['HPP_FRAUD_FILTER_MODE']); - } - } - - public function addAddressDetails($gatewayRequest, $code, $country, $addressType = AddressType::BILLING) - { - if ($code != null || $country != null) { - $address = new Address(); - $address->postalCode = $code; - $address->country = $country; - - $gatewayRequest - ->WithAddress($address, $addressType); - } - } - - public function convertResponse($gatewayResponse) - { - $merchantId = $this->paymentData['MERCHANT_ID']; - $account = $this->paymentData['ACCOUNT']; - - $newHash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', [ - $gatewayResponse->timestamp, - $merchantId, - $gatewayResponse->transactionReference->orderId, - $gatewayResponse->responseCode, - $gatewayResponse->responseMessage, - $gatewayResponse->transactionReference->transactionId, - $gatewayResponse->transactionReference->authCode - ]) - ); - - // begin building response - $response = [ - 'MERCHANT_ID' => $merchantId, - 'ACCOUNT' => $this->getValue('ACCOUNT'), - 'ORDER_ID' => $gatewayResponse->transactionReference->orderId, - 'TIMESTAMP' => $gatewayResponse->timestamp, - 'RESULT' => $gatewayResponse->responseCode, - 'PASREF' => $gatewayResponse->transactionReference->transactionId, - 'AUTHCODE' => $gatewayResponse->transactionReference->authCode, - 'AVSPOSTCODERESULT' => $gatewayResponse->avsResponseCode, - 'CVNRESULT' => $gatewayResponse->cvnResponseCode, - 'HPP_LANG' => $this->getValue('HPP_LANG'), - 'SHIPPING_CODE' => $this->getValue('SHIPPING_CODE'), - 'SHIPPING_CO' => $this->getValue('SHIPPING_CO'), - 'BILLING_CODE' => $this->getValue('BILLING_CODE'), - 'BILLING_CO' => $this->getValue('BILLING_CO'), - 'ECI' => $this->getValue('ECI'), - 'CAVV' => $this->getValue('CAVV'), - 'XID' => $this->getValue('XID'), - 'MERCHANT_RESPONSE_URL' => $this->getValue('MERCHANT_RESPONSE_URL'), - 'CARD_PAYMENT_BUTTON' => $this->getValue('CARD_PAYMENT_BUTTON'), - 'MESSAGE' => $gatewayResponse->responseMessage, - 'AMOUNT' => $this->getValue('AMOUNT'), - 'SHA1HASH' => $newHash, - 'DCC_INFO_REQUST' => $this->getValue('DCC_INFO'), - 'DCC_INFO_RESPONSE' => $gatewayResponse->dccResponseResult, - 'HPP_FRAUD_FILTER_MODE' => $this->getValue('HPP_FRAUD_FILTER_MODE'), - 'TSS_INFO' => $this->getValue('TSS_INFO') - ]; - - return json_encode($response); - } -} +sharedSecret = $sharedSecret; + } + + public function sendRequest($jsonData, $hppVersion = '') + { + $this->paymentData = GenerationUtils::decodeJson($jsonData, true, $hppVersion); + + $timestamp = $this->getValue('TIMESTAMP'); + $merchantId = $this->getValue('MERCHANT_ID'); + $account = $this->getValue('ACCOUNT'); + $orderId = $this->getValue('ORDER_ID'); + $amount = $this->getValue('AMOUNT'); + $currency = $this->getValue('CURRENCY'); + $autoSettle = $this->getValue('AUTO_SETTLE_FLAG'); + $requestHash = $this->getValue('SHA1HASH'); + $shippingCode = $this->getValue('SHIPPING_CODE'); + $shippingCountry = $this->getValue('SHIPPING_CO'); + $billingCode = $this->getValue('BILLING_CODE'); + $billingCountry = $this->getValue('BILLING_CO'); + + $config = new GpEcomConfig(); + $config->merchantId = $merchantId; + $config->accountId = $account; + $config->sharedSecret = $this->sharedSecret; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + $config->hostedPaymentConfig->version = $hppVersion; + + ServicesContainer::configureService($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4006097467207025'; + $card->expMonth = 12; + $card->expYear = TestCards::validCardExpYear(); + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + // // check hash + $hashParam = [ + $timestamp, + $merchantId, + $orderId, + $amount, + $currency + ]; + + //for stored card + + if (!empty($this->paymentData['OFFER_SAVE_CARD'])) { + $hashParam[] = (!empty($this->paymentData['PAYER_REF'])) ? + $this->paymentData['PAYER_REF'] : null; + $hashParam[] = (!empty($this->paymentData['PMT_REF'])) ? + $this->paymentData['PMT_REF'] : null; + } + + $newHash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', $hashParam) + ); + if ($newHash != $requestHash) { + throw new ApiException("Incorrect hash. Please check your code and the Developers Documentation."); + } + + // build request + if ($amount == null) { + $validate = $this->getValue("VALIDATE_CARD_ONLY"); + if ($validate) { + $gatewayRequest = $card->verify(); + } else { + $gatewayRequest = $card->verify()->WithRequestMultiUseToken(true); + } + } else { + $amount = $amount / 100; + if ($autoSettle) { + $gatewayRequest = $card->charge($amount); + } else { + $gatewayRequest = $card->authorize($amount); + } + } + + try { + $gatewayRequest + ->WithCurrency($currency) + ->WithOrderId($orderId) + ->withTimeStamp($timestamp); + + $this->addAddressDetails($gatewayRequest, $billingCode, $billingCountry, AddressType::BILLING); + $this->addAddressDetails($gatewayRequest, $shippingCode, $shippingCountry, AddressType::SHIPPING); + + //handle DCC + $this->addDCCInfo($gatewayRequest, $orderId); + + //handle fraud management + $this->addFraudManagementInfo($gatewayRequest, $orderId); + + $gatewayResponse = $gatewayRequest->execute(); + + if ($gatewayResponse->responseCode === '00') { + return $this->convertResponse($gatewayResponse); + } + } catch (ApiException $exc) { + throw $exc; + } + return null; + } + + public function getValue($value) + { + if (isset($this->paymentData[$value])) { + return $this->paymentData[$value]; + } + return null; + } + + public function addDCCInfo($gatewayRequest, $orderId) + { + if (!empty($this->paymentData['DCC_ENABLE'])) { + $dccInfo = $this->getValue('DCC_INFO'); + + $dccValues = new DccRateData(); + $dccValues->orderId = $orderId; + $dccValues->dccProcessor = $dccInfo['CCP']; + $dccValues->dccType = $dccInfo['TYPE']; + $dccValues->dccRateType = $dccInfo['RATE_TYPE']; + $dccValues->currency = $dccInfo['CURRENCY']; + $dccValues->dccRate = $dccInfo['RATE']; + $dccValues->amount = $dccInfo['AMOUNT']; + + $gatewayRequest + ->withDccRateData($dccValues); + } + } + + public function addFraudManagementInfo($gatewayRequest, $orderId) + { + if (!empty($this->paymentData['HPP_FRAUD_FILTER_MODE'])) { + $tssInfo = $this->getValue('TSS_INFO'); + + $this->addAddressDetails( + $gatewayRequest, + $tssInfo['BILLING_ADDRESS']['CODE'], + $tssInfo['BILLING_ADDRESS']['COUNTRY'], + AddressType::BILLING + ); + + $this->addAddressDetails( + $gatewayRequest, + $tssInfo['SHIPPING_ADDRESS']['CODE'], + $tssInfo['SHIPPING_ADDRESS']['COUNTRY'], + AddressType::SHIPPING + ); + + $gatewayRequest + ->withProductId($tssInfo['PRODID']) // prodid + ->withClientTransactionId($tssInfo['VARREF']) // varref + ->withCustomerId($tssInfo['CUSTNUM']) // custnum + ->withCustomerIpAddress($tssInfo['CUSTIPADDRESS']) + ->withFraudFilter($this->paymentData['HPP_FRAUD_FILTER_MODE']); + } + } + + public function addAddressDetails($gatewayRequest, $code, $country, $addressType = AddressType::BILLING) + { + if ($code != null || $country != null) { + $address = new Address(); + $address->postalCode = $code; + $address->country = $country; + + $gatewayRequest + ->WithAddress($address, $addressType); + } + } + + public function convertResponse($gatewayResponse) + { + $merchantId = $this->paymentData['MERCHANT_ID']; + $account = $this->paymentData['ACCOUNT']; + + $newHash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', [ + $gatewayResponse->timestamp, + $merchantId, + $gatewayResponse->transactionReference->orderId, + $gatewayResponse->responseCode, + $gatewayResponse->responseMessage, + $gatewayResponse->transactionReference->transactionId, + $gatewayResponse->transactionReference->authCode + ]) + ); + + // begin building response + $response = [ + 'MERCHANT_ID' => $merchantId, + 'ACCOUNT' => $this->getValue('ACCOUNT'), + 'ORDER_ID' => $gatewayResponse->transactionReference->orderId, + 'TIMESTAMP' => $gatewayResponse->timestamp, + 'RESULT' => $gatewayResponse->responseCode, + 'PASREF' => $gatewayResponse->transactionReference->transactionId, + 'AUTHCODE' => $gatewayResponse->transactionReference->authCode, + 'AVSPOSTCODERESULT' => $gatewayResponse->avsResponseCode, + 'CVNRESULT' => $gatewayResponse->cvnResponseCode, + 'HPP_LANG' => $this->getValue('HPP_LANG'), + 'SHIPPING_CODE' => $this->getValue('SHIPPING_CODE'), + 'SHIPPING_CO' => $this->getValue('SHIPPING_CO'), + 'BILLING_CODE' => $this->getValue('BILLING_CODE'), + 'BILLING_CO' => $this->getValue('BILLING_CO'), + 'ECI' => $this->getValue('ECI'), + 'CAVV' => $this->getValue('CAVV'), + 'XID' => $this->getValue('XID'), + 'MERCHANT_RESPONSE_URL' => $this->getValue('MERCHANT_RESPONSE_URL'), + 'CARD_PAYMENT_BUTTON' => $this->getValue('CARD_PAYMENT_BUTTON'), + 'MESSAGE' => $gatewayResponse->responseMessage, + 'AMOUNT' => $this->getValue('AMOUNT'), + 'SHA1HASH' => $newHash, + 'DCC_INFO_REQUST' => $this->getValue('DCC_INFO'), + 'DCC_INFO_RESPONSE' => $gatewayResponse->dccResponseResult, + 'HPP_FRAUD_FILTER_MODE' => $this->getValue('HPP_FRAUD_FILTER_MODE'), + 'TSS_INFO' => $this->getValue('TSS_INFO') + ]; + + return json_encode($response); + } +} From 44efdf735a9b27235218b266da072086b3a6545f Mon Sep 17 00:00:00 2001 From: securesubmit-buildmaster Date: Tue, 5 Jan 2021 09:39:10 -0500 Subject: [PATCH 12/13] 20210105 deployment --- .../Certification/Ecommerce_3.php | 1570 +++++++++-------- .../Certification/Token_Request_Only.php | 538 +++--- 2 files changed, 1048 insertions(+), 1060 deletions(-) diff --git a/test/Integration/Gateways/TransITConnector/Certification/Ecommerce_3.php b/test/Integration/Gateways/TransITConnector/Certification/Ecommerce_3.php index 14f3ca79..c9da22ee 100644 --- a/test/Integration/Gateways/TransITConnector/Certification/Ecommerce_3.php +++ b/test/Integration/Gateways/TransITConnector/Certification/Ecommerce_3.php @@ -1,784 +1,786 @@ -getConfig()); - } - - protected function getConfig() { - $config = new ServicesConfig(); - $config->merchantId = '887000003226'; - $config->username = 'TA5622118'; - $config->password = 'Hrcb^619'; - $config->deviceId = '88700000322601'; - $config->transactionKey = '57ZL83P6A2V8KGI49QWK017C7WXG03O8'; - $config->developerId = '003226G001'; - $config->gatewayProvider = GatewayProvider::TRANSIT; - $config->acceptorConfig = new AcceptorConfig(); // might need to adjust this per transaction or per file - return $config; - } - - public static $test20VoidTarget; - public static $test21VoidTarget; - public static $test30MUT; - public static $test31MUT; - - // These are all stolen from dotnet cert file - public function test01VisaLevelII() { - $commercialData = new CommercialData(TaxType::NOT_USED); - $commercialData->poNumber = '9876543210'; - $commercialData->taxAmount = 0; - - $response = $this->getVisa1()->charge(.52) - ->withCurrency("USD") - ->withCommercialData($commercialData) - ->withDescription("test01VisaLevelII") - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test02MasterCardLevelII() { - $commercialData = new CommercialData(TaxType::SALES_TAX); - $commercialData->poNumber = '9876543210'; - $commercialData->taxAmount = .02; - - $response = $this->getMCKeyedTIC()->charge(.52) - ->withCurrency("USD") - ->withCommercialData($commercialData) - ->withDescription("test02MasterCardLevelII") - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test03AmexManualLevelII() { - $commercialData = new CommercialData(TaxType::NOT_USED); - $commercialData->supplierReferenceNumber = "123456"; - $commercialData->customerReferenceId = "987654"; - $commercialData->destinationPostalCode = "85284"; - $commercialData->description = "AMEX LEVEL 2 TEST CASE"; - $commercialData->taxAmount = 0; - - $response = $this->getAmex()->charge(1.50) - ->withCurrency('USD') - ->withCommercialData($commercialData) - ->withDescription('test03AmexManualLevelII') - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test04MasterCard2BINSale() { - $response = $this->getMC2BIN()->charge(11.10) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test04' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test05DiscoverSale() { - $response = $this->getDiscover()->charge(12.00) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test05' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test06DinersAuth() { - $response = $this->getDiners()->authorize(6.00) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test06' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - // $this->assertEquals(5.55, $response->authorizedAmount); test script is wrong, gateway doesn't return partial auth on this test - } - - public function test07MasterCardSale() { - $response = $this->getMCUnclassifiedTIC()->charge(15.00) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test07' . time()) - ->execute(); - - self::$test20VoidTarget = $response->transactionId; - - $this->assertEquals('00', $response->responseCode); - } - - public function test08MasterCardSale() { - $response = $this->getMCUnclassifiedTIC()->charge(34.13) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test08' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test09JCBSale() { - $response = $this->getJCB()->charge(13.00) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test09' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test10AMEX() { - $card = $this->getAmex(); - $card->cvn = null; - - $response = $card->charge(13.50) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test10' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test11VisaSale() { - $response = $this->getVisa1()->charge(32.49) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test11' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test12DiscoverCUPSale() { - $response = $this->getDiscoverCUP()->charge(10.00) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test12' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test13VisaSale() { - $response = $this->getVisa1()->charge(11.12) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test13' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test14AMEXSale() { - $response = $this->getAmex()->charge(4.00) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test14' . time()) - ->execute(); - - self::$test21VoidTarget = $response->transactionId; - - $this->assertEquals('00', $response->responseCode); - } - - public function test15VisaVerify() { - $response = $this->getVisa1()->verify() - ->withRequestMultiUseToken(true) - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test15' . time()) - ->execute(); - - self::$test30MUT = $response->token; - - $this->assertEquals('00', $response->responseCode); - } - - public function test15aVisaVerify() { - $response = $this->getVisa1()->verify() - // ->withRequestMultiUseToken(true) - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test15a' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test16MasterCardVerify() { - $response = $this->getMCUnclassifiedTIC()->verify() - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test16' . time()) - ->withRequestMultiUseToken(true) - ->execute(); - - self::$test31MUT = $response->token; - - $this->assertEquals('00', $response->responseCode); - } - - public function test16aMasterCardVerify() { - $response = $this->getMCUnclassifiedTIC()->verify() - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test16a' . time()) - // ->withRequestMultiUseToken(true) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test17AMEXVerify() { - $response = $this->getAmex()->verify() - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test17' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test18VisaLvl3() { - $commercialData = new CommercialData(TaxType::NOT_USED, CommercialIndicator::LEVEL_III); - $commercialData->poNumber = 1784951399984509620; - $commercialData->taxAmount = .01; - $commercialData->destinationPostalCode = '85212'; - $commercialData->destinationCountryCode = "USA"; - $commercialData->originPostalCode = "22193"; - $commercialData->summaryCommodityCode = "SCC"; - $commercialData->customerVatNumber = "123456789"; - $commercialData->vatInvoiceNumber = "UVATREF162"; - $commercialData->orderDate = date('m/d/Y'); - $commercialData->freightAmount = 0.01; - $commercialData->dutyAmount = 0.01; - $commercialData->additionalTaxDetails = new AdditionalTaxDetails( - .01, - TaxCategory::VAT, - .04, - "VAT" - ); - - $lineItem1 = new CommercialLineItem; - $lineItem1->productCode = "PRDCD1"; - $lineItem1->name = "PRDCD1NAME"; - $lineItem1->unitCost = 0.01; - $lineItem1->quantity = 1; - $lineItem1->unitOfMeasure = "METER"; - $lineItem1->description = "PRODUCT 1 NOTES"; - $lineItem1->commodityCode = "12DIGIT ACCO"; - $lineItem1->alternateTaxId = "1234567890"; - $lineItem1->creditDebitIndicator = CreditDebitIndicator::CREDIT; - $lineItem1->discountDetails = new DiscountDetails( - .50, - "Indep Sale 1", - .1, - "SALE" - ); - $lineItem1->taxAmount = 0; - $lineItem1->taxName = 'item 1 name'; - - $lineItem2 = new CommercialLineItem; - $lineItem2->productCode = "PRDCD2"; - $lineItem2->name = "PRDCD2NAME"; - $lineItem2->unitCost = 0.01; - $lineItem2->quantity = 1; - $lineItem2->unitOfMeasure = "METER"; - $lineItem2->description = "PRODUCT 2 NOTES"; - $lineItem2->commodityCode = "12DIGIT ACCO"; - $lineItem2->alternateTaxId = "1234567890"; - $lineItem2->creditDebitIndicator = CreditDebitIndicator::DEBIT; - $lineItem2->discountDetails = new DiscountDetails( - .50, - "Indep Sale 1", - .1, - "SALE" - ); - $lineItem2->taxAmount = .03; - $lineItem2->taxName = 'a tax name here'; - $lineItem2->taxType = TaxType::SALES_TAX; - $lineItem2->taxPercentage = .69; - - $commercialData->addLineItems($lineItem1, $lineItem2); // can pass multiple line items or just call this function multiple times - - $response = $this->getVisa1()->charge(.53) - ->withCurrency('USD') - ->withCommercialData($commercialData) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test19MasterCardLvl3() { - $commercialData = new CommercialData(TaxType::NOT_USED, CommercialIndicator::LEVEL_III); - $commercialData->poNumber = "9876543210"; - $commercialData->taxAmount = 0.01; - $commercialData->destinationPostalCode = "85212"; - $commercialData->destinationCountryCode = "USA"; - $commercialData->originPostalCode = "22193"; - $commercialData->summaryCommodityCode = "SCC"; - $commercialData->customerVatNumber = "123456789"; - $commercialData->vatInvoiceNumber = "UVATREF162"; - $commercialData->orderDate = date('m/d/Y'); - $commercialData->freightAmount = 0.01; - $commercialData->dutyAmount = 0.01; - $commercialData->additionalTaxDetails = new AdditionalTaxDetails(.01, TaxCategory::VAT, .04, "VAT"); - - $lineItem = new CommercialLineItem; - $lineItem->productCode = "PRDCD1"; - $lineItem->name = "PRDCD1NAME"; - $lineItem->unitCost = 0.01; - $lineItem->quantity = 1; - $lineItem->unitOfMeasure = "METER"; - $lineItem->description = "PRODUCT 1 NOTES"; - $lineItem->commodityCode = "12DIGIT ACCO"; - $lineItem->alternateTaxId = "1234567890"; - $lineItem->creditDebitIndicator = CreditDebitIndicator::CREDIT; - $lineItem->discountDetails = new DiscountDetails( - .01, - 'little discount', - 1, - 'discount type 1' - ); - $lineItem->taxAmount = 1; - $lineItem->taxName = 'a tax name here'; - $lineItem->taxPercentage = 12; - - $commercialData->addLineItems($lineItem); - - $response = $this->getMCUnclassifiedTIC()->charge(.53) - ->withCurrency('USD') - ->withCommercialData($commercialData) - ->withAddress($this->getAVSData()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test20PartialVoid() { - $response = Transaction::fromId(self::$test20VoidTarget) - ->void(5.00) - ->withDescription('PARTIAL_REVERSAL') - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test21FullVoid() { - $response = Transaction::fromId(self::$test21VoidTarget) - ->void() - ->withDescription('POST_AUTH_USER_DECLINE') - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test22Visa3DS () { - $threeDeeInfo = new ThreeDSecure(); - $threeDeeInfo->eci = 5; - $threeDeeInfo->secureCode = '1234567890123456789012345678901234567890'; - // $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; - // $threeDeeInfo->setVersion(Secure3dVersion::ONE); - - $card = $this->getVisa1(); - $card->threeDSecure = $threeDeeInfo; - - $response = $card->charge(1.01) - ->withCurrency('USD') - ->withClientTransactionId('test22_' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test23MC3DS_V1 () { - $threeDeeInfo = new ThreeDSecure(); - $threeDeeInfo->eci = 5; - $threeDeeInfo->secureCode = '12345678901234567890123456789012'; - $threeDeeInfo->authenticationType = '21'; - $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; - $threeDeeInfo->setVersion(Secure3dVersion::ONE); - - $card = $this->getMCUnclassifiedTIC(); - $card->threeDSecure = $threeDeeInfo; - - $response = $card->charge(34.02) - ->withCurrency('USD') - ->withClientTransactionId('test23_' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test24MC3DS_V2 () { - $threeDeeInfo = new ThreeDSecure(); - $threeDeeInfo->eci = 5; - $threeDeeInfo->secureCode = '12345678901234567890123456789012'; - $threeDeeInfo->authenticationType = '21'; - $threeDeeInfo->directoryServerTransactionId = 'c272b04f-6e7b-43a2-bb78-90f4fb94aa25'; - $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; - $threeDeeInfo->setVersion(Secure3dVersion::TWO); - - $card = $this->getMCUnclassifiedTIC(); - $card->threeDSecure = $threeDeeInfo; - - $response = $card->charge(34.06) - ->withCurrency('USD') - ->withClientTransactionId('test24_' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test25Discover3DS () { - $threeDeeInfo = new ThreeDSecure(); - $threeDeeInfo->eci = 5; - $threeDeeInfo->secureCode = '1234567890123456789012345678901234567890'; - // $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; - // $threeDeeInfo->setVersion(Secure3dVersion::ONE); - - $card = $this->getDiscover(); - $card->threeDSecure = $threeDeeInfo; - - $response = $card->charge(45.02) - ->withCurrency('USD') - ->withClientTransactionId('test25_' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test26Amex3DS () { - $threeDeeInfo = new ThreeDSecure(); - $threeDeeInfo->eci = 5; - $threeDeeInfo->secureCode = '1234567890123456789012345678901234567890'; - // $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; - // $threeDeeInfo->setVersion(Secure3dVersion::ONE); - - $card = $this->getAmex(); - $card->threeDSecure = $threeDeeInfo; - - $response = $card->charge(32.02) - ->withCurrency('USD') - ->withClientTransactionId('test26_' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test27MC3DS_V2_2 () { - $threeDeeInfo = new ThreeDSecure(); - $threeDeeInfo->eci = 5; - $threeDeeInfo->authenticationValue = 'ODQzNjgwNjU0ZjM3N2JmYTg0NTM='; - $threeDeeInfo->authenticationType = '24'; - $threeDeeInfo->directoryServerTransactionId = 'c272b04f-6e7b-43a2-bb78-90f4fb94aa25'; - $threeDeeInfo->ucafIndicator = UcafIndicator::MERCHANT_RISK_BASED; - $threeDeeInfo->setVersion(Secure3dVersion::TWO); - - $card = $this->getMCUnclassifiedTIC(); - $card->threeDSecure = $threeDeeInfo; - - $response = $card->charge(34.05) - ->withCurrency('USD') - ->withClientTransactionId('test27_' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test28Visa3DS_ECI6 () { - $threeDeeInfo = new ThreeDSecure(); - $threeDeeInfo->eci = 6; - $threeDeeInfo->secureCode = '1234567890123456789012345678901234567890'; - // $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; - // $threeDeeInfo->setVersion(Secure3dVersion::TWO); - - $card = $this->getVisa1(); - $card->threeDSecure = $threeDeeInfo; - - $response = $card->charge(.81) - ->withCurrency('USD') - ->withClientTransactionId('test28_' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test29MC3DS_ECI6 () { - $threeDeeInfo = new ThreeDSecure(); - $threeDeeInfo->eci = 6; - $threeDeeInfo->secureCode = '12345678901234567890123456789012'; - $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; - $threeDeeInfo->setVersion(Secure3dVersion::ONE); - - $card = $this->getMCUnclassifiedTIC(); - $card->threeDSecure = $threeDeeInfo; - - $response = $card->charge(29.00) - ->withCurrency('USD') - ->withClientTransactionId('test29_' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test30SaleVisaCIT () { - $storedcreds = new StoredCredential; - $storedcreds->initiator = StoredCredentialInitiator::MERCHANT; - - $cardAsMUT = $this->getVisa1(); - $cardAsMUT->number = self::$test30MUT; - - $response = $cardAsMUT->charge(14.00) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test30_' . time()) - ->withStoredCredential($storedcreds) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test31SaleNonVisaCIT () { - $storedcreds = new StoredCredential; - $storedcreds->initiator = StoredCredentialInitiator::MERCHANT; - - $cardAsMUT = $this->getMCUnclassifiedTIC(); - $cardAsMUT->number = self::$test31MUT; - - $response = $cardAsMUT->charge(15.00) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test31_' . time()) - ->withStoredCredential($storedcreds) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test32VisaMultiCapture () { - $response = $this->getVisa1()->authorize(30.00) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test32_' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - - $firstCaptureResponse = $response->capture(15.00) - ->withMultiCapture(1, 2) - ->execute(); - - $this->assertEquals('00', $firstCaptureResponse->responseCode); - - $secondCaptureResponse = $response->capture(15.00) - ->withMultiCapture(2, 2) - ->execute(); - - $this->assertEquals('00', $secondCaptureResponse->responseCode); - } - - public function test33MCMultiCapture () { - $response = $this->getMCUnclassifiedTIC()->authorize(50.00) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test33_' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - - $firstCaptureResponse = $response->capture(30.00) - ->withMultiCapture(1, 3) - ->execute(); - - $this->assertEquals('00', $firstCaptureResponse->responseCode); - - $secondCaptureResponse = $response->capture(10.00) - ->withMultiCapture(2, 3) - ->execute(); - - $this->assertEquals('00', $secondCaptureResponse->responseCode); - - $thirdCaptureResponse = $response->capture(10.00) - ->withMultiCapture(3, 3) - ->execute(); - - $this->assertEquals('00', $thirdCaptureResponse->responseCode); - } - - public function test34MCMultiCapture () { - $response = $this->getMCUnclassifiedTIC()->authorize(60.00) - ->withCurrency('USD') - ->withAddress($this->getAVSData()) - ->withClientTransactionId('test34_' . time()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - - $captureResponse = $response->capture() - ->withMultiCapture() - ->execute(); - - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function test35CloseBatch () { - $response = BatchService::closeBatch(); - - $this->assertEquals('00', $response->responseCode); - } - - public function getVisa1 () { - $card = new CreditCardData; - $card->number = 4012000098765439; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 999; - $card->cardType = CardType::VISA; - return $card; - } - - public function getVisa2 () { - $card = new CreditCardData; - $card->number = 4012881888818888; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 999; - $card->cardType = CardType::VISA; - return $card; - } - - public function getMCUnclassifiedTIC () { - $card = new CreditCardData; - $card->number = 5146315000000055; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 998; - $card->cardType = CardType::MASTERCARD; - return $card; - } - - public function getMCSwipeTIC () { - $card = new CreditCardData; - $card->number = 5146312200000035; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 998; - $card->cardType = CardType::MASTERCARD; - return $card; - } - - public function getMCKeyedTIC () { - $card = new CreditCardData; - $card->number = 5146312620000045; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 998; - $card->cardType = CardType::MASTERCARD; - return $card; - } - - public function getMC2BIN () { - $card = new CreditCardData; - $card->number = 2223000048400011; - $card->expYear = 25; // magic number - $card->expMonth = 12; - $card->cvn = 998; - $card->cardType = CardType::MASTERCARD; - return $card; - } - - public function getAmex () { - $card = new CreditCardData; - $card->number = 371449635392376; - $card->expYear = 25; // magic number - $card->expMonth = 12; - $card->cvn = 9997; - $card->cardType = CardType::AMEX; - return $card; - } - - public function getDiscover () { - $card = new CreditCardData; - $card->number = 6011000993026909; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 996; - $card->cardType = CardType::DISCOVER; - return $card; - } - - public function getDiscoverCUP () { - $card = new CreditCardData; - $card->number = 6282000123842342; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 996; - $card->cardType = CardType::DISCOVER; - return $card; - } - - public function getDiscoverCUP2 () { - $card = new CreditCardData; - $card->number = 6221261111112650; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 996; - $card->cardType = CardType::DISCOVER; - return $card; - } - - public function getDiners () { - $card = new CreditCardData; - $card->number = 3055155515160018; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 996; - $card->cardType = CardType::DINERS; - return $card; - } - - public function getJCB () { - $card = new CreditCardData; - $card->number = 3530142019945859; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 996; - $card->cardType = CardType::JCB; - return $card; - } - - public function getAVSData () { - $address = new Address(); - $address->streetAddress1 = '8320'; - $address->postalCode = '85284'; - return $address; - } -} +getConfig()); + } + + protected function getConfig() { + $config = new TransitConfig(); + $config->merchantId = '887000003226'; + $config->username = 'TA5622118'; + $config->password = 'Hrcb^619'; + $config->deviceId = '88700000322601'; + $config->transactionKey = '57ZL83P6A2V8KGI49QWK017C7WXG03O8'; + $config->developerId = '003226G001'; + $config->gatewayProvider = GatewayProvider::TRANSIT; + $config->acceptorConfig = new AcceptorConfig(); // might need to adjust this per transaction or per file + return $config; + } + + public static $test20VoidTarget; + public static $test21VoidTarget; + public static $test30MUT; + public static $test31MUT; + + // These are all stolen from dotnet cert file + public function test01VisaLevelII() { + $commercialData = new CommercialData(TaxType::NOT_USED); + $commercialData->poNumber = '9876543210'; + $commercialData->taxAmount = 0; + + $response = $this->getVisa1()->charge(.52) + ->withCurrency("USD") + ->withCommercialData($commercialData) + ->withDescription("test01VisaLevelII") + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test02MasterCardLevelII() { + $commercialData = new CommercialData(TaxType::SALES_TAX); + $commercialData->poNumber = '9876543210'; + $commercialData->taxAmount = .02; + + $response = $this->getMCKeyedTIC()->charge(.52) + ->withCurrency("USD") + ->withCommercialData($commercialData) + ->withDescription("test02MasterCardLevelII") + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test03AmexManualLevelII() { + $commercialData = new CommercialData(TaxType::NOT_USED); + $commercialData->supplierReferenceNumber = "123456"; + $commercialData->customerReferenceId = "987654"; + $commercialData->destinationPostalCode = "85284"; + $commercialData->description = "AMEX LEVEL 2 TEST CASE"; + $commercialData->taxAmount = 0; + + $response = $this->getAmex()->charge(1.50) + ->withCurrency('USD') + ->withCommercialData($commercialData) + ->withDescription('test03AmexManualLevelII') + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test04MasterCard2BINSale() { + $response = $this->getMC2BIN()->charge(11.10) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test04' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test05DiscoverSale() { + $response = $this->getDiscover()->charge(12.00) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test05' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test06DinersAuth() { + $response = $this->getDiners()->authorize(6.00) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test06' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + // $this->assertEquals(5.55, $response->authorizedAmount); test script is wrong, gateway doesn't return partial auth on this test + } + + public function test07MasterCardSale() { + $response = $this->getMCUnclassifiedTIC()->charge(15.00) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test07' . time()) + ->execute(); + + self::$test20VoidTarget = $response->transactionId; + + $this->assertEquals('00', $response->responseCode); + } + + public function test08MasterCardSale() { + $response = $this->getMCUnclassifiedTIC()->charge(34.13) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test08' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test09JCBSale() { + $response = $this->getJCB()->charge(13.00) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test09' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test10AMEX() { + $card = $this->getAmex(); + $card->cvn = null; + + $response = $card->charge(13.50) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test10' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test11VisaSale() { + $response = $this->getVisa1()->charge(32.49) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test11' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test12DiscoverCUPSale() { + $response = $this->getDiscoverCUP()->charge(10.00) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test12' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test13VisaSale() { + $response = $this->getVisa1()->charge(11.12) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test13' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test14AMEXSale() { + $response = $this->getAmex()->charge(4.00) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test14' . time()) + ->execute(); + + self::$test21VoidTarget = $response->transactionId; + + $this->assertEquals('00', $response->responseCode); + } + + public function test15VisaVerify() { + $response = $this->getVisa1()->verify() + ->withRequestMultiUseToken(true) + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test15' . time()) + ->execute(); + + self::$test30MUT = $response->token; + + $this->assertEquals('00', $response->responseCode); + } + + public function test15aVisaVerify() { + $response = $this->getVisa1()->verify() + // ->withRequestMultiUseToken(true) + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test15a' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test16MasterCardVerify() { + $response = $this->getMCUnclassifiedTIC()->verify() + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test16' . time()) + ->withRequestMultiUseToken(true) + ->execute(); + + self::$test31MUT = $response->token; + + $this->assertEquals('00', $response->responseCode); + } + + public function test16aMasterCardVerify() { + $response = $this->getMCUnclassifiedTIC()->verify() + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test16a' . time()) + // ->withRequestMultiUseToken(true) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test17AMEXVerify() { + $response = $this->getAmex()->verify() + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test17' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test18VisaLvl3() { + $commercialData = new CommercialData(TaxType::NOT_USED, CommercialIndicator::LEVEL_III); + $commercialData->poNumber = 1784951399984509620; + $commercialData->taxAmount = .01; + $commercialData->destinationPostalCode = '85212'; + $commercialData->destinationCountryCode = "USA"; + $commercialData->originPostalCode = "22193"; + $commercialData->summaryCommodityCode = "SCC"; + $commercialData->customerVatNumber = "123456789"; + $commercialData->vatInvoiceNumber = "UVATREF162"; + $commercialData->orderDate = date('m/d/Y'); + $commercialData->freightAmount = 0.01; + $commercialData->dutyAmount = 0.01; + $commercialData->additionalTaxDetails = new AdditionalTaxDetails( + .01, + TaxCategory::VAT, + .04, + "VAT" + ); + + $lineItem1 = new CommercialLineItem; + $lineItem1->productCode = "PRDCD1"; + $lineItem1->name = "PRDCD1NAME"; + $lineItem1->unitCost = 0.01; + $lineItem1->quantity = 1; + $lineItem1->unitOfMeasure = "METER"; + $lineItem1->description = "PRODUCT 1 NOTES"; + $lineItem1->commodityCode = "12DIGIT ACCO"; + $lineItem1->alternateTaxId = "1234567890"; + $lineItem1->creditDebitIndicator = CreditDebitIndicator::CREDIT; + $lineItem1->discountDetails = new DiscountDetails( + .50, + "Indep Sale 1", + .1, + "SALE" + ); + $lineItem1->taxAmount = 0; + $lineItem1->taxName = 'item 1 name'; + + $lineItem2 = new CommercialLineItem; + $lineItem2->productCode = "PRDCD2"; + $lineItem2->name = "PRDCD2NAME"; + $lineItem2->unitCost = 0.01; + $lineItem2->quantity = 1; + $lineItem2->unitOfMeasure = "METER"; + $lineItem2->description = "PRODUCT 2 NOTES"; + $lineItem2->commodityCode = "12DIGIT ACCO"; + $lineItem2->alternateTaxId = "1234567890"; + $lineItem2->creditDebitIndicator = CreditDebitIndicator::DEBIT; + $lineItem2->discountDetails = new DiscountDetails( + .50, + "Indep Sale 1", + .1, + "SALE" + ); + $lineItem2->taxAmount = .03; + $lineItem2->taxName = 'a tax name here'; + $lineItem2->taxType = TaxType::SALES_TAX; + $lineItem2->taxPercentage = .69; + + $commercialData->addLineItems($lineItem1, $lineItem2); // can pass multiple line items or just call this function multiple times + + $response = $this->getVisa1()->charge(.53) + ->withCurrency('USD') + ->withCommercialData($commercialData) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test19MasterCardLvl3() { + $commercialData = new CommercialData(TaxType::NOT_USED, CommercialIndicator::LEVEL_III); + $commercialData->poNumber = "9876543210"; + $commercialData->taxAmount = 0.01; + $commercialData->destinationPostalCode = "85212"; + $commercialData->destinationCountryCode = "USA"; + $commercialData->originPostalCode = "22193"; + $commercialData->summaryCommodityCode = "SCC"; + $commercialData->customerVatNumber = "123456789"; + $commercialData->vatInvoiceNumber = "UVATREF162"; + $commercialData->orderDate = date('m/d/Y'); + $commercialData->freightAmount = 0.01; + $commercialData->dutyAmount = 0.01; + $commercialData->additionalTaxDetails = new AdditionalTaxDetails(.01, TaxCategory::VAT, .04, "VAT"); + + $lineItem = new CommercialLineItem; + $lineItem->productCode = "PRDCD1"; + $lineItem->name = "PRDCD1NAME"; + $lineItem->unitCost = 0.01; + $lineItem->quantity = 1; + $lineItem->unitOfMeasure = "METER"; + $lineItem->description = "PRODUCT 1 NOTES"; + $lineItem->commodityCode = "12DIGIT ACCO"; + $lineItem->alternateTaxId = "1234567890"; + $lineItem->creditDebitIndicator = CreditDebitIndicator::CREDIT; + $lineItem->discountDetails = new DiscountDetails( + .01, + 'little discount', + 1, + 'discount type 1' + ); + $lineItem->taxAmount = 1; + $lineItem->taxName = 'a tax name here'; + $lineItem->taxPercentage = 12; + + $commercialData->addLineItems($lineItem); + + $response = $this->getMCUnclassifiedTIC()->charge(.53) + ->withCurrency('USD') + ->withCommercialData($commercialData) + ->withAddress($this->getAVSData()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test20PartialVoid() { + $response = Transaction::fromId(self::$test20VoidTarget) + ->void(5.00) + ->withDescription('PARTIAL_REVERSAL') + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test21FullVoid() { + $response = Transaction::fromId(self::$test21VoidTarget) + ->void() + ->withDescription('POST_AUTH_USER_DECLINE') + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test22Visa3DS () { + $threeDeeInfo = new ThreeDSecure(); + $threeDeeInfo->eci = 5; + $threeDeeInfo->secureCode = '1234567890123456789012345678901234567890'; + // $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; + // $threeDeeInfo->setVersion(Secure3dVersion::ONE); + + $card = $this->getVisa1(); + $card->threeDSecure = $threeDeeInfo; + + $response = $card->charge(1.01) + ->withCurrency('USD') + ->withClientTransactionId('test22_' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test23MC3DS_V1 () { + $threeDeeInfo = new ThreeDSecure(); + $threeDeeInfo->eci = 5; + $threeDeeInfo->secureCode = '12345678901234567890123456789012'; + $threeDeeInfo->authenticationType = '21'; + $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; + $threeDeeInfo->setVersion(Secure3dVersion::ONE); + + $card = $this->getMCUnclassifiedTIC(); + $card->threeDSecure = $threeDeeInfo; + + $response = $card->charge(34.02) + ->withCurrency('USD') + ->withClientTransactionId('test23_' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test24MC3DS_V2 () { + $threeDeeInfo = new ThreeDSecure(); + $threeDeeInfo->eci = 5; + $threeDeeInfo->secureCode = '12345678901234567890123456789012'; + $threeDeeInfo->authenticationType = '21'; + $threeDeeInfo->directoryServerTransactionId = 'c272b04f-6e7b-43a2-bb78-90f4fb94aa25'; + $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; + $threeDeeInfo->setVersion(Secure3dVersion::TWO); + + $card = $this->getMCUnclassifiedTIC(); + $card->threeDSecure = $threeDeeInfo; + + $response = $card->charge(34.06) + ->withCurrency('USD') + ->withClientTransactionId('test24_' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test25Discover3DS () { + $threeDeeInfo = new ThreeDSecure(); + $threeDeeInfo->eci = 5; + $threeDeeInfo->secureCode = '1234567890123456789012345678901234567890'; + // $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; + // $threeDeeInfo->setVersion(Secure3dVersion::ONE); + + $card = $this->getDiscover(); + $card->threeDSecure = $threeDeeInfo; + + $response = $card->charge(45.02) + ->withCurrency('USD') + ->withClientTransactionId('test25_' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test26Amex3DS () { + $threeDeeInfo = new ThreeDSecure(); + $threeDeeInfo->eci = 5; + $threeDeeInfo->secureCode = '1234567890123456789012345678901234567890'; + // $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; + // $threeDeeInfo->setVersion(Secure3dVersion::ONE); + + $card = $this->getAmex(); + $card->threeDSecure = $threeDeeInfo; + + $response = $card->charge(32.02) + ->withCurrency('USD') + ->withClientTransactionId('test26_' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test27MC3DS_V2_2 () { + $threeDeeInfo = new ThreeDSecure(); + $threeDeeInfo->eci = 5; + $threeDeeInfo->authenticationValue = 'ODQzNjgwNjU0ZjM3N2JmYTg0NTM='; + $threeDeeInfo->authenticationType = '24'; + $threeDeeInfo->directoryServerTransactionId = 'c272b04f-6e7b-43a2-bb78-90f4fb94aa25'; + $threeDeeInfo->ucafIndicator = UcafIndicator::MERCHANT_RISK_BASED; + $threeDeeInfo->setVersion(Secure3dVersion::TWO); + + $card = $this->getMCUnclassifiedTIC(); + $card->threeDSecure = $threeDeeInfo; + + $response = $card->charge(34.05) + ->withCurrency('USD') + ->withClientTransactionId('test27_' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test28Visa3DS_ECI6 () { + $threeDeeInfo = new ThreeDSecure(); + $threeDeeInfo->eci = 6; + $threeDeeInfo->secureCode = '1234567890123456789012345678901234567890'; + // $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; + // $threeDeeInfo->setVersion(Secure3dVersion::TWO); + + $card = $this->getVisa1(); + $card->threeDSecure = $threeDeeInfo; + + $response = $card->charge(.81) + ->withCurrency('USD') + ->withClientTransactionId('test28_' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test29MC3DS_ECI6 () { + $threeDeeInfo = new ThreeDSecure(); + $threeDeeInfo->eci = 6; + $threeDeeInfo->secureCode = '12345678901234567890123456789012'; + $threeDeeInfo->ucafIndicator = UcafIndicator::FULLY_AUTHENTICATED; + $threeDeeInfo->setVersion(Secure3dVersion::ONE); + + $card = $this->getMCUnclassifiedTIC(); + $card->threeDSecure = $threeDeeInfo; + + $response = $card->charge(29.00) + ->withCurrency('USD') + ->withClientTransactionId('test29_' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test30SaleVisaCIT () { + $storedcreds = new StoredCredential; + $storedcreds->initiator = StoredCredentialInitiator::MERCHANT; + + $cardAsMUT = $this->getVisa1(); + $cardAsMUT->number = self::$test30MUT; + + $response = $cardAsMUT->charge(14.00) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test30_' . time()) + ->withStoredCredential($storedcreds) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test31SaleNonVisaCIT () { + $storedcreds = new StoredCredential; + $storedcreds->initiator = StoredCredentialInitiator::MERCHANT; + + $cardAsMUT = $this->getMCUnclassifiedTIC(); + $cardAsMUT->number = self::$test31MUT; + + $response = $cardAsMUT->charge(15.00) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test31_' . time()) + ->withStoredCredential($storedcreds) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test32VisaMultiCapture () { + $response = $this->getVisa1()->authorize(30.00) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test32_' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + + $firstCaptureResponse = $response->capture(15.00) + ->withMultiCapture(1, 2) + ->execute(); + + $this->assertEquals('00', $firstCaptureResponse->responseCode); + + $secondCaptureResponse = $response->capture(15.00) + ->withMultiCapture(2, 2) + ->execute(); + + $this->assertEquals('00', $secondCaptureResponse->responseCode); + } + + public function test33MCMultiCapture () { + $response = $this->getMCUnclassifiedTIC()->authorize(50.00) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test33_' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + + $firstCaptureResponse = $response->capture(30.00) + ->withMultiCapture(1, 3) + ->execute(); + + $this->assertEquals('00', $firstCaptureResponse->responseCode); + + $secondCaptureResponse = $response->capture(10.00) + ->withMultiCapture(2, 3) + ->execute(); + + $this->assertEquals('00', $secondCaptureResponse->responseCode); + + $thirdCaptureResponse = $response->capture(10.00) + ->withMultiCapture(3, 3) + ->execute(); + + $this->assertEquals('00', $thirdCaptureResponse->responseCode); + } + + public function test34MCMultiCapture () { + $response = $this->getMCUnclassifiedTIC()->authorize(60.00) + ->withCurrency('USD') + ->withAddress($this->getAVSData()) + ->withClientTransactionId('test34_' . time()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + + $captureResponse = $response->capture() + ->withMultiCapture() + ->execute(); + + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function test35CloseBatch () { + $response = BatchService::closeBatch(); + + $this->assertEquals('00', $response->responseCode); + } + + public function getVisa1 () { + $card = new CreditCardData; + $card->number = 4012000098765439; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 999; + $card->cardType = CardType::VISA; + return $card; + } + + public function getVisa2 () { + $card = new CreditCardData; + $card->number = 4012881888818888; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 999; + $card->cardType = CardType::VISA; + return $card; + } + + public function getMCUnclassifiedTIC () { + $card = new CreditCardData; + $card->number = 5146315000000055; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 998; + $card->cardType = CardType::MASTERCARD; + return $card; + } + + public function getMCSwipeTIC () { + $card = new CreditCardData; + $card->number = 5146312200000035; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 998; + $card->cardType = CardType::MASTERCARD; + return $card; + } + + public function getMCKeyedTIC () { + $card = new CreditCardData; + $card->number = 5146312620000045; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 998; + $card->cardType = CardType::MASTERCARD; + return $card; + } + + public function getMC2BIN () { + $card = new CreditCardData; + $card->number = 2223000048400011; + $card->expYear = 25; // magic number + $card->expMonth = 12; + $card->cvn = 998; + $card->cardType = CardType::MASTERCARD; + return $card; + } + + public function getAmex () { + $card = new CreditCardData; + $card->number = 371449635392376; + $card->expYear = 25; // magic number + $card->expMonth = 12; + $card->cvn = 9997; + $card->cardType = CardType::AMEX; + return $card; + } + + public function getDiscover () { + $card = new CreditCardData; + $card->number = 6011000993026909; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 996; + $card->cardType = CardType::DISCOVER; + return $card; + } + + public function getDiscoverCUP () { + $card = new CreditCardData; + $card->number = 6282000123842342; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 996; + $card->cardType = CardType::DISCOVER; + return $card; + } + + public function getDiscoverCUP2 () { + $card = new CreditCardData; + $card->number = 6221261111112650; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 996; + $card->cardType = CardType::DISCOVER; + return $card; + } + + public function getDiners () { + $card = new CreditCardData; + $card->number = 3055155515160018; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 996; + $card->cardType = CardType::DINERS; + return $card; + } + + public function getJCB () { + $card = new CreditCardData; + $card->number = 3530142019945859; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 996; + $card->cardType = CardType::JCB; + return $card; + } + + public function getAVSData () { + $address = new Address(); + $address->streetAddress1 = '8320'; + $address->postalCode = '85284'; + return $address; + } +} diff --git a/test/Integration/Gateways/TransITConnector/Certification/Token_Request_Only.php b/test/Integration/Gateways/TransITConnector/Certification/Token_Request_Only.php index d13e822e..8f218199 100644 --- a/test/Integration/Gateways/TransITConnector/Certification/Token_Request_Only.php +++ b/test/Integration/Gateways/TransITConnector/Certification/Token_Request_Only.php @@ -1,276 +1,262 @@ -getConfig()); - } - - public function getConfig() { - $config = new ServicesConfig(); - $config->merchantId = '887000003226'; - $config->username = 'TA5622118'; - $config->password = 'f8mapGqWrE^rVaA9'; - $config->deviceId = '88700000322601'; - $config->transactionKey = '2HZFSJ98G4XEGHXGP31IRLLG8H3XAWB2'; - $config->developerId = '003226G001'; - $config->gatewayProvider = GatewayProvider::TRANSIT; - $config->acceptorConfig = new AcceptorConfig(); - $config->acceptorConfig->operatingEnvironment = OperatingEnvironment::ON_MERCHANT_PREMISES_ATTENDED; - $config->acceptorConfig->cardDataSource = CardDataSource::INTERNET; - return $config; - } - - public function getMailConfig() { - $mailConfig = $this->getConfig(); - $mailConfig->acceptorConfig->cardDataSource = CardDataSource::MAIL; - $mailConfig->acceptorConfig->operatingEnvironment = OperatingEnvironment::ON_MERCHANT_PREMISES_ATTENDED; - return $mailConfig; - } - - public function getPhoneConfig() { - $phoneConfig = $this->getConfig(); - $phoneConfig->acceptorConfig->cardDataSource = CardDataSource::PHONE; - $phoneConfig->acceptorConfig->operatingEnvironment = OperatingEnvironment::ON_MERCHANT_PREMISES_ATTENDED; - return $phoneConfig; - } - - public function test01GenerateVisaMUT() { - $response = $this->getVisa1()->tokenize()->execute(); - - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->token); - } - - public function test02GenerateMasterCardMUT() { - $response = $this->getMCUnclassifiedTIC()->tokenize()->execute(); - - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->token); - } - - public function test03GenerateMasterCardBin2MUT() { - $response = $this->getMC2BIN()->tokenize()->execute(); - - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->token); - } - - public function test04GenerateDiscoverMUT() { - $response = $this->getDiscover()->tokenize()->execute(); - - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->token); - } - - public function test05GenerateAmexMUT() { - ServicesContainer::configure($this->getPhoneConfig()); - - $response = $this->getAmex()->tokenize()->execute(); - - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->token); - } - - public function test06GenerateJCB_MUT() { - ServicesContainer::configure($this->getMailConfig()); - - $response = $this->getJCB()->tokenize()->execute(); - - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->token); - } - - public function test07GeneratDiscoverCUP_MUT() { - ServicesContainer::configure($this->getMailConfig()); - - $response = $this->getDiscoverCUP()->tokenize()->execute(); - - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->token); - } - - public function test08GenerateDinersMUT() { - ServicesContainer::configure($this->getPhoneConfig()); - - $response = $this->getDiners()->tokenize()->execute(); - - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->token); - } - - public function getVisa1 () { - $card = new CreditCardData; - $card->number = 4012000098765439; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 999; - $card->cardType = CardType::VISA; - // $card->readerPresent = true; - $card->cardPresent = false; - return $card; - } - - public function getVisa2 () { - $card = new CreditCardData; - $card->number = 4012881888818888; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 999; - $card->cardType = CardType::VISA; - // $card->readerPresent = true; - $card->cardPresent = false; - return $card; - } - - public function getMCUnclassifiedTIC () { - $card = new CreditCardData; - $card->number = 5146315000000055; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 998; - $card->cardType = CardType::MASTERCARD; - // $card->readerPresent = true; - $card->cardPresent = false; - return $card; - } - - public function getMCSwipeTIC () { - $card = new CreditCardData; - $card->number = 5146312200000035; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 998; - $card->cardType = CardType::MASTERCARD; - // $card->readerPresent = true; - $card->cardPresent = false; - return $card; - } - - public function getMCKeyedTIC () { - $card = new CreditCardData; - $card->number = 5146312620000045; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 998; - $card->cardType = CardType::MASTERCARD; - // $card->readerPresent = true; - $card->cardPresent = false; - return $card; - } - - public function getMC2BIN () { - $card = new CreditCardData; - $card->number = 2223000048400011; - $card->expYear = 25; // magic number - $card->expMonth = 12; - $card->cvn = 998; - $card->cardType = CardType::MASTERCARD; - // $card->readerPresent = true; - $card->cardPresent = false; - return $card; - } - - public function getAmex () { - $card = new CreditCardData; - $card->number = 371449635392376; - $card->expYear = 25; // magic number - $card->expMonth = 12; - $card->cvn = 9997; - $card->cardType = CardType::AMEX; - // $card->readerPresent = true; - $card->cardPresent = false; - return $card; - } - - public function getDiscover () { - $card = new CreditCardData; - $card->number = 6011000993026909; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 996; - $card->cardType = CardType::DISCOVER; - // $card->readerPresent = true; - $card->cardPresent = false; - return $card; - } - - public function getDiscoverCUP () { - $card = new CreditCardData; - $card->number = 6282000123842342; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 996; - $card->cardType = CardType::DISCOVER; - // $card->readerPresent = true; - $card->cardPresent = false; - return $card; - } - - public function getDiscoverCUP2 () { - $card = new CreditCardData; - $card->number = 6221261111112650; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 996; - $card->cardType = CardType::DISCOVER; - // $card->readerPresent = true; - $card->cardPresent = false; - return $card; - } - - public function getDiners () { - $card = new CreditCardData; - $card->number = 3055155515160018; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 996; - $card->cardType = CardType::DINERS; - // $card->readerPresent = true; - $card->cardPresent = false; - return $card; - } - - public function getJCB () { - $card = new CreditCardData; - $card->number = 3530142019945859; - $card->expYear = 20; // magic number - $card->expMonth = 12; - $card->cvn = 996; - $card->cardType = CardType::JCB; - // $card->readerPresent = true; - $card->cardPresent = false; - return $card; - } - - public function getAVSData () { - $address = new Address(); - $address->streetAddress1 = '8320'; - $address->postalCode = '85284'; - return $address; - } -} +getConfig()); + } + + public function getConfig() { + $config = new TransitConfig(); + $config->merchantId = '887000003226'; + $config->username = 'TA5622118'; + $config->password = 'f8mapGqWrE^rVaA9'; + $config->deviceId = '88700000322601'; + $config->transactionKey = '2HZFSJ98G4XEGHXGP31IRLLG8H3XAWB2'; + $config->developerId = '003226G001'; + $config->acceptorConfig = new AcceptorConfig(); + $config->acceptorConfig->operatingEnvironment = OperatingEnvironment::ON_MERCHANT_PREMISES_ATTENDED; + $config->acceptorConfig->cardDataSource = CardDataSource::INTERNET; + return $config; + } + + public function getMailConfig() { + $mailConfig = $this->getConfig(); + $mailConfig->acceptorConfig->cardDataSource = CardDataSource::MAIL; + $mailConfig->acceptorConfig->operatingEnvironment = OperatingEnvironment::ON_MERCHANT_PREMISES_ATTENDED; + return $mailConfig; + } + + public function getPhoneConfig() { + $phoneConfig = $this->getConfig(); + $phoneConfig->acceptorConfig->cardDataSource = CardDataSource::PHONE; + $phoneConfig->acceptorConfig->operatingEnvironment = OperatingEnvironment::ON_MERCHANT_PREMISES_ATTENDED; + return $phoneConfig; + } + + public function test01GenerateVisaMUT() { + $response = $this->getVisa1()->tokenize()->execute(); + + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->token); + } + + public function test02GenerateMasterCardMUT() { + $response = $this->getMCUnclassifiedTIC()->tokenize()->execute(); + + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->token); + } + + public function test03GenerateMasterCardBin2MUT() { + $response = $this->getMC2BIN()->tokenize()->execute(); + + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->token); + } + + public function test04GenerateDiscoverMUT() { + $response = $this->getDiscover()->tokenize()->execute(); + + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->token); + } + + public function test05GenerateAmexMUT() { + ServicesContainer::configureService($this->getPhoneConfig()); + + $response = $this->getAmex()->tokenize()->execute(); + + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->token); + } + + public function test06GenerateJCB_MUT() { + ServicesContainer::configureService($this->getMailConfig()); + + $response = $this->getJCB()->tokenize()->execute(); + + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->token); + } + + public function test07GeneratDiscoverCUP_MUT() { + ServicesContainer::configureService($this->getMailConfig()); + + $response = $this->getDiscoverCUP()->tokenize()->execute(); + + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->token); + } + + public function test08GenerateDinersMUT() { + ServicesContainer::configureService($this->getPhoneConfig()); + + $response = $this->getDiners()->tokenize()->execute(); + + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->token); + } + + public function getVisa1 () { + $card = new CreditCardData; + $card->number = 4012000098765439; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 999; + $card->cardType = CardType::VISA; + // $card->readerPresent = true; + $card->cardPresent = false; + return $card; + } + + public function getVisa2 () { + $card = new CreditCardData; + $card->number = 4012881888818888; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 999; + $card->cardType = CardType::VISA; + // $card->readerPresent = true; + $card->cardPresent = false; + return $card; + } + + public function getMCUnclassifiedTIC () { + $card = new CreditCardData; + $card->number = 5146315000000055; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 998; + $card->cardType = CardType::MASTERCARD; + // $card->readerPresent = true; + $card->cardPresent = false; + return $card; + } + + public function getMCSwipeTIC () { + $card = new CreditCardData; + $card->number = 5146312200000035; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 998; + $card->cardType = CardType::MASTERCARD; + // $card->readerPresent = true; + $card->cardPresent = false; + return $card; + } + + public function getMCKeyedTIC () { + $card = new CreditCardData; + $card->number = 5146312620000045; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 998; + $card->cardType = CardType::MASTERCARD; + // $card->readerPresent = true; + $card->cardPresent = false; + return $card; + } + + public function getMC2BIN () { + $card = new CreditCardData; + $card->number = 2223000048400011; + $card->expYear = 25; // magic number + $card->expMonth = 12; + $card->cvn = 998; + $card->cardType = CardType::MASTERCARD; + // $card->readerPresent = true; + $card->cardPresent = false; + return $card; + } + + public function getAmex () { + $card = new CreditCardData; + $card->number = 371449635392376; + $card->expYear = 25; // magic number + $card->expMonth = 12; + $card->cvn = 9997; + $card->cardType = CardType::AMEX; + // $card->readerPresent = true; + $card->cardPresent = false; + return $card; + } + + public function getDiscover () { + $card = new CreditCardData; + $card->number = 6011000993026909; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 996; + $card->cardType = CardType::DISCOVER; + // $card->readerPresent = true; + $card->cardPresent = false; + return $card; + } + + public function getDiscoverCUP () { + $card = new CreditCardData; + $card->number = 6282000123842342; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 996; + $card->cardType = CardType::DISCOVER; + // $card->readerPresent = true; + $card->cardPresent = false; + return $card; + } + + public function getDiscoverCUP2 () { + $card = new CreditCardData; + $card->number = 6221261111112650; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 996; + $card->cardType = CardType::DISCOVER; + // $card->readerPresent = true; + $card->cardPresent = false; + return $card; + } + + public function getDiners () { + $card = new CreditCardData; + $card->number = 3055155515160018; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 996; + $card->cardType = CardType::DINERS; + // $card->readerPresent = true; + $card->cardPresent = false; + return $card; + } + + public function getJCB () { + $card = new CreditCardData; + $card->number = 3530142019945859; + $card->expYear = 20; // magic number + $card->expMonth = 12; + $card->cvn = 996; + $card->cardType = CardType::JCB; + // $card->readerPresent = true; + $card->cardPresent = false; + return $card; + } + + public function getAVSData () { + $address = new Address(); + $address->streetAddress1 = '8320'; + $address->postalCode = '85284'; + return $address; + } +} From ea39c077767c89867f2b2c20274819c22b8a3437 Mon Sep 17 00:00:00 2001 From: securesubmit-buildmaster Date: Tue, 5 Jan 2021 09:40:47 -0500 Subject: [PATCH 13/13] 20210105 deployment --- .../TransITConnector/CommercialCardTest.php | 442 ++++++------ .../TransITConnector/TransITAdminTest.php | 190 ++--- .../TransITConnector/TransITDebitTest.php | 107 ++- .../TransITConnector/TransITTests.php | 648 +++++++++--------- 4 files changed, 696 insertions(+), 691 deletions(-) diff --git a/test/Integration/Gateways/TransITConnector/CommercialCardTest.php b/test/Integration/Gateways/TransITConnector/CommercialCardTest.php index 9bac8fe0..f3cafac1 100644 --- a/test/Integration/Gateways/TransITConnector/CommercialCardTest.php +++ b/test/Integration/Gateways/TransITConnector/CommercialCardTest.php @@ -1,221 +1,221 @@ -getConfig()); - } - - protected function getConfig() { - $config = new ServicesConfig(); - $config->merchantId = '887000003226'; - $config->username = 'TA5622118'; - $config->password = 'f8mapGqWrE^rVaA9'; - $config->deviceId = '88700000322602'; - $config->transactionKey = '2HZFSJ98G4XEGHXGP31IRLLG8H3XAWB2'; - $config->developerId = '003226G001'; - $config->gatewayProvider = GatewayProvider::TRANSIT; - $config->acceptorConfig = new AcceptorConfig(); - return $config; - } - - protected function getAddy() { - $addy = new Address(); - $addy->streetAddress1 = 'address line 1 contents'; - $addy->postalCode = '47130'; - return $addy; - } - - protected function getVisaManual() { - $visaManual = new CreditCardData(); - $visaManual->number = '4012000098765439'; - $visaManual->expMonth = 12; - $visaManual->expYear = TestCards::validCardExpYear(); - $visaManual->cvn = '999'; - return $visaManual; - } - - protected function getMasterCardManual() { - $masterCardManual = new CreditCardData(); - $masterCardManual->number = '5146315000000055'; - $masterCardManual->expMonth = 12; - $masterCardManual->expYear = TestCards::validCardExpYear(); - $masterCardManual->cvn = '998'; - return $masterCardManual; - } - - protected function getAmexManual() { - $amexManual = new CreditCardData(); - $amexManual->number = "371449635392376"; - $amexManual->expMonth = 12; - $amexManual->expYear = TestCards::validCardExpYear(); - $amexManual->cvn = "9997"; - return $amexManual; - } - - // These are all stolen from dotnet cert file - public function test01VisaManualLevelII() { - $commercialData = new CommercialData(TaxType::NOT_USED); - $commercialData->poNumber = '9876543210'; - $commercialData->taxAmount = 0; - - $response = $this->getVisaManual()->charge(52) - ->withCurrency("USD") - ->withCommercialData($commercialData) - ->withAddress($this->getAddy()) - ->withDescription("Test_001_Visa_Level_II_Sale") - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test02MasterCardManualLevelII() { - $commercialData = new CommercialData(TaxType::SALES_TAX); - $commercialData->poNumber = '9876543210'; - $commercialData->taxAmount = .02; - - $response = $this->getMasterCardManual()->charge(.52) - ->withCurrency("USD") - ->withCommercialData($commercialData) - ->withAddress($this->getAddy()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test03AmexManualLevelII() { - $commercialData = new CommercialData(TaxType::NOT_USED); - $commercialData->supplierReferenceNumber = "123456"; - $commercialData->customerReferenceId = "987654"; - $commercialData->destinationPostalCode = "85284"; - $commercialData->description = "AMEX LEVEL 2 TEST CASE"; - $commercialData->taxAmount = 0; - - $response = $this->getAmexManual()->charge(1.50) - ->withCurrency('USD') - ->withCommercialData($commercialData) - ->withAddress($this->getAddy()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test04VisaManualLevelIII() { - $commercialData = new CommercialData(TaxType::NOT_USED, CommercialIndicator::LEVEL_III); - $commercialData->poNumber = 1784951399984509620; - $commercialData->taxAmount = .01; - $commercialData->destinationPostalCode = '85212'; - $commercialData->destinationCountryCode = "USA"; - $commercialData->originPostalCode = "22193"; - $commercialData->summaryCommodityCode = "SCC"; - $commercialData->customerVatNumber = "123456789"; - $commercialData->vatInvoiceNumber = "UVATREF162"; - $commercialData->orderDate = date('m/d/Y'); - $commercialData->freightAmount = 0.01; - $commercialData->dutyAmount = 0.01; - $commercialData->additionalTaxDetails = new AdditionalTaxDetails( - .01, - TaxCategory::VAT, - .04, - "VAT" - ); - - $lineItem1 = new CommercialLineItem; - $lineItem1->productCode = "PRDCD1"; - $lineItem1->name = "PRDCD1NAME"; - $lineItem1->unitCost = 0.01; - $lineItem1->quantity = 1; - $lineItem1->unitOfMeasure = "METER"; - $lineItem1->description = "PRODUCT 1 NOTES"; - $lineItem1->commodityCode = "12DIGIT ACCO"; - $lineItem1->alternateTaxId = "1234567890"; - $lineItem1->creditDebitIndicator = CreditDebitIndicator::CREDIT; - $lineItem1->discountDetails = new DiscountDetails( - .50, - "Indep Sale 1", - .1, - "SALE" - ); - - $lineItem2 = new CommercialLineItem; - $lineItem2->productCode = "PRDCD2"; - $lineItem2->name = "PRDCD2NAME"; - $lineItem2->unitCost = 0.01; - $lineItem2->quantity = 1; - $lineItem2->unitOfMeasure = "METER"; - $lineItem2->description = "PRODUCT 2 NOTES"; - $lineItem2->commodityCode = "12DIGIT ACCO"; - $lineItem2->alternateTaxId = "1234567890"; - $lineItem2->creditDebitIndicator = CreditDebitIndicator::DEBIT; - $lineItem2->discountDetails = new DiscountDetails( - .50, - "Indep Sale 1", - .1, - "SALE" - ); - - $commercialData->addLineItems($lineItem1, $lineItem2); // can pass multiple line items or just call this function multiple times - - $response = $this->getVisaManual()->charge(.53) - ->withCurrency('USD') - ->withCommercialData($commercialData) - ->withAddress($this->getAddy()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } - - public function test05MasterCardManualLevelIII() { - $commercialData = new CommercialData(TaxType::NOT_USED, CommercialIndicator::LEVEL_III); - $commercialData->poNumber = "9876543210"; - $commercialData->taxAmount = 0.01; - $commercialData->destinationPostalCode = "85212"; - $commercialData->destinationCountryCode = "USA"; - $commercialData->originPostalCode = "22193"; - $commercialData->summaryCommodityCode = "SCC"; - $commercialData->customerVatNumber = "123456789"; - $commercialData->vatInvoiceNumber = "UVATREF162"; - $commercialData->orderDate = date('m/d/Y'); - $commercialData->freightAmount = 0.01; - $commercialData->dutyAmount = 0.01; - $commercialData->additionalTaxDetails = new AdditionalTaxDetails(.01, TaxCategory::VAT, .04, "VAT"); - - $lineItem = new CommercialLineItem; - $lineItem->productCode = "PRDCD1"; - $lineItem->name = "PRDCD1NAME"; - $lineItem->unitCost = 0.01; - $lineItem->quantity = 1; - $lineItem->unitOfMeasure = "METER"; - $lineItem->description = "PRODUCT 1 NOTES"; - $lineItem->commodityCode = "12DIGIT ACCO"; - $lineItem->alternateTaxId = "1234567890"; - $lineItem->creditDebitIndicator = CreditDebitIndicator::CREDIT; - $commercialData->addLineItems($lineItem); - - $response = $this->getMasterCardManual()->charge(.53) - ->withCurrency('USD') - ->withCommercialData($commercialData) - ->withAddress($this->getAddy()) - ->execute(); - - $this->assertEquals('00', $response->responseCode); - } -} +getConfig()); + } + + protected function getConfig() { + $config = new TransitConfig(); + $config->merchantId = '887000003226'; + $config->username = 'TA5622118'; + $config->password = 'f8mapGqWrE^rVaA9'; + $config->deviceId = '88700000322602'; + $config->transactionKey = '2HZFSJ98G4XEGHXGP31IRLLG8H3XAWB2'; + $config->developerId = '003226G001'; + $config->gatewayProvider = GatewayProvider::TRANSIT; + $config->acceptorConfig = new AcceptorConfig(); + return $config; + } + + protected function getAddy() { + $addy = new Address(); + $addy->streetAddress1 = 'address line 1 contents'; + $addy->postalCode = '47130'; + return $addy; + } + + protected function getVisaManual() { + $visaManual = new CreditCardData(); + $visaManual->number = '4012000098765439'; + $visaManual->expMonth = 12; + $visaManual->expYear = TestCards::validCardExpYear(); + $visaManual->cvn = '999'; + return $visaManual; + } + + protected function getMasterCardManual() { + $masterCardManual = new CreditCardData(); + $masterCardManual->number = '5146315000000055'; + $masterCardManual->expMonth = 12; + $masterCardManual->expYear = TestCards::validCardExpYear(); + $masterCardManual->cvn = '998'; + return $masterCardManual; + } + + protected function getAmexManual() { + $amexManual = new CreditCardData(); + $amexManual->number = "371449635392376"; + $amexManual->expMonth = 12; + $amexManual->expYear = TestCards::validCardExpYear(); + $amexManual->cvn = "9997"; + return $amexManual; + } + + // These are all stolen from dotnet cert file + public function test01VisaManualLevelII() { + $commercialData = new CommercialData(TaxType::NOT_USED); + $commercialData->poNumber = '9876543210'; + $commercialData->taxAmount = 0; + + $response = $this->getVisaManual()->charge(52) + ->withCurrency("USD") + ->withCommercialData($commercialData) + ->withAddress($this->getAddy()) + ->withDescription("Test_001_Visa_Level_II_Sale") + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test02MasterCardManualLevelII() { + $commercialData = new CommercialData(TaxType::SALES_TAX); + $commercialData->poNumber = '9876543210'; + $commercialData->taxAmount = .02; + + $response = $this->getMasterCardManual()->charge(.52) + ->withCurrency("USD") + ->withCommercialData($commercialData) + ->withAddress($this->getAddy()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test03AmexManualLevelII() { + $commercialData = new CommercialData(TaxType::NOT_USED); + $commercialData->supplierReferenceNumber = "123456"; + $commercialData->customerReferenceId = "987654"; + $commercialData->destinationPostalCode = "85284"; + $commercialData->description = "AMEX LEVEL 2 TEST CASE"; + $commercialData->taxAmount = 0; + + $response = $this->getAmexManual()->charge(1.50) + ->withCurrency('USD') + ->withCommercialData($commercialData) + ->withAddress($this->getAddy()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test04VisaManualLevelIII() { + $commercialData = new CommercialData(TaxType::NOT_USED, CommercialIndicator::LEVEL_III); + $commercialData->poNumber = 1784951399984509620; + $commercialData->taxAmount = .01; + $commercialData->destinationPostalCode = '85212'; + $commercialData->destinationCountryCode = "USA"; + $commercialData->originPostalCode = "22193"; + $commercialData->summaryCommodityCode = "SCC"; + $commercialData->customerVatNumber = "123456789"; + $commercialData->vatInvoiceNumber = "UVATREF162"; + $commercialData->orderDate = date('m/d/Y'); + $commercialData->freightAmount = 0.01; + $commercialData->dutyAmount = 0.01; + $commercialData->additionalTaxDetails = new AdditionalTaxDetails( + .01, + TaxCategory::VAT, + .04, + "VAT" + ); + + $lineItem1 = new CommercialLineItem; + $lineItem1->productCode = "PRDCD1"; + $lineItem1->name = "PRDCD1NAME"; + $lineItem1->unitCost = 0.01; + $lineItem1->quantity = 1; + $lineItem1->unitOfMeasure = "METER"; + $lineItem1->description = "PRODUCT 1 NOTES"; + $lineItem1->commodityCode = "12DIGIT ACCO"; + $lineItem1->alternateTaxId = "1234567890"; + $lineItem1->creditDebitIndicator = CreditDebitIndicator::CREDIT; + $lineItem1->discountDetails = new DiscountDetails( + .50, + "Indep Sale 1", + .1, + "SALE" + ); + + $lineItem2 = new CommercialLineItem; + $lineItem2->productCode = "PRDCD2"; + $lineItem2->name = "PRDCD2NAME"; + $lineItem2->unitCost = 0.01; + $lineItem2->quantity = 1; + $lineItem2->unitOfMeasure = "METER"; + $lineItem2->description = "PRODUCT 2 NOTES"; + $lineItem2->commodityCode = "12DIGIT ACCO"; + $lineItem2->alternateTaxId = "1234567890"; + $lineItem2->creditDebitIndicator = CreditDebitIndicator::DEBIT; + $lineItem2->discountDetails = new DiscountDetails( + .50, + "Indep Sale 1", + .1, + "SALE" + ); + + $commercialData->addLineItems($lineItem1, $lineItem2); // can pass multiple line items or just call this function multiple times + + $response = $this->getVisaManual()->charge(.53) + ->withCurrency('USD') + ->withCommercialData($commercialData) + ->withAddress($this->getAddy()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } + + public function test05MasterCardManualLevelIII() { + $commercialData = new CommercialData(TaxType::NOT_USED, CommercialIndicator::LEVEL_III); + $commercialData->poNumber = "9876543210"; + $commercialData->taxAmount = 0.01; + $commercialData->destinationPostalCode = "85212"; + $commercialData->destinationCountryCode = "USA"; + $commercialData->originPostalCode = "22193"; + $commercialData->summaryCommodityCode = "SCC"; + $commercialData->customerVatNumber = "123456789"; + $commercialData->vatInvoiceNumber = "UVATREF162"; + $commercialData->orderDate = date('m/d/Y'); + $commercialData->freightAmount = 0.01; + $commercialData->dutyAmount = 0.01; + $commercialData->additionalTaxDetails = new AdditionalTaxDetails(.01, TaxCategory::VAT, .04, "VAT"); + + $lineItem = new CommercialLineItem; + $lineItem->productCode = "PRDCD1"; + $lineItem->name = "PRDCD1NAME"; + $lineItem->unitCost = 0.01; + $lineItem->quantity = 1; + $lineItem->unitOfMeasure = "METER"; + $lineItem->description = "PRODUCT 1 NOTES"; + $lineItem->commodityCode = "12DIGIT ACCO"; + $lineItem->alternateTaxId = "1234567890"; + $lineItem->creditDebitIndicator = CreditDebitIndicator::CREDIT; + $commercialData->addLineItems($lineItem); + + $response = $this->getMasterCardManual()->charge(.53) + ->withCurrency('USD') + ->withCommercialData($commercialData) + ->withAddress($this->getAddy()) + ->execute(); + + $this->assertEquals('00', $response->responseCode); + } +} diff --git a/test/Integration/Gateways/TransITConnector/TransITAdminTest.php b/test/Integration/Gateways/TransITConnector/TransITAdminTest.php index 9edf946b..0ffd187e 100644 --- a/test/Integration/Gateways/TransITConnector/TransITAdminTest.php +++ b/test/Integration/Gateways/TransITConnector/TransITAdminTest.php @@ -1,93 +1,97 @@ -card = TestCards::visaManual(); - - ServicesContainer::configure($this->getConfig()); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->merchantId = '887000003226'; - $config->username = 'TA5622118'; - $config->password = 'f8mapGqWrE^rVaA9'; - $config->deviceId = '88700000322602'; - $config->transactionKey = '2HZFSJ98G4XEGHXGP31IRLLG8H3XAWB2'; - $config->developerId = '003226G001'; - $config->gatewayProvider = GatewayProvider::TRANSIT; - - return $config; - } - - public function testTokenizeCardKeyed() - { - $token = $this->card->tokenize()->execute(); - $this->assertNotNull($token); - $this->assertEquals('00', $token->responseCode); - $this->assertNotNull($token->token); - } - - public function testCreateManifest() - { - $config = new ServicesConfig(); - $config->merchantId = '887000003226'; - $config->username = 'TA5622118'; - $config->password = 'f8mapGqWrE^rVaA9'; - $config->deviceId = '88700000322602'; - $config->developerId = '003226G001'; - $config->gatewayProvider = GatewayProvider::TRANSIT; - - ServicesContainer::configure($config); - $provider = ServicesContainer::instance()->getClient(); - - //create Transaction Key - $response = $provider->getTransactionKey(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->transactionKey); - - //create Manifest - $provider->transactionKey = $response->transactionKey; - $manifest = $provider->createManifest(); - - $this->assertNotNull($manifest); - } - - public function testDisableTransactionKey() - { - $config = new ServicesConfig(); - $config->merchantId = '887000003226'; - $config->username = 'TA5622118'; - $config->password = 'f8mapGqWrE^rVaA9'; - $config->deviceId = '88700000322602'; - $config->developerId = '003226G001'; - //TransactionKey needs to be disabled. Throw 'Invalid Transaction Key' when key is not in active state - $config->transactionKey = 'F508Z7TIGFORSTDYJQLMK9NGFFPBIXV0'; - $config->gatewayProvider = GatewayProvider::TRANSIT; - - ServicesContainer::configure($config); - $provider = ServicesContainer::instance()->getClient(); - - //create new Transaction Key - $response = $provider->getTransactionKey(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->transactionKey); - } -} +card = TestCards::visaManual(); + + ServicesContainer::configureService($this->getConfig()); + } + + protected function getConfig() + { + $config = new TransitConfig(); + $config->merchantId = '887000003226'; + $config->username = 'TA5622118'; + $config->password = 'f8mapGqWrE^rVaA9'; + $config->deviceId = '88700000322602'; + $config->transactionKey = '2HZFSJ98G4XEGHXGP31IRLLG8H3XAWB2'; + $config->developerId = '003226G001'; + $config->gatewayProvider = GatewayProvider::TRANSIT; + $config->acceptorConfig = new AcceptorConfig(); + + return $config; + } + + public function testTokenizeCardKeyed() + { + $token = $this->card->tokenize()->execute(); + $this->assertNotNull($token); + $this->assertEquals('00', $token->responseCode); + $this->assertNotNull($token->token); + } + + public function testCreateManifest() + { + $config = new TransitConfig(); + $config->merchantId = '887000003226'; + $config->username = 'TA5622118'; + $config->password = 'f8mapGqWrE^rVaA9'; + $config->deviceId = '88700000322602'; + $config->developerId = '003226G001'; + $config->gatewayProvider = GatewayProvider::TRANSIT; + $config->acceptorConfig = new AcceptorConfig(); + + ServicesContainer::configureService($config); + $provider = ServicesContainer::instance()->getClient(); + + //create Transaction Key + $response = $provider->getTransactionKey(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->transactionKey); + + //create Manifest + $provider->transactionKey = $response->transactionKey; + $manifest = $provider->createManifest(); + + $this->assertNotNull($manifest); + } + + public function testDisableTransactionKey() + { + $config = new TransitConfig(); + $config->merchantId = '887000003226'; + $config->username = 'TA5622118'; + $config->password = 'f8mapGqWrE^rVaA9'; + $config->deviceId = '88700000322602'; + $config->developerId = '003226G001'; + //TransactionKey needs to be disabled. Throw 'Invalid Transaction Key' when key is not in active state + $config->transactionKey = 'F508Z7TIGFORSTDYJQLMK9NGFFPBIXV0'; + $config->acceptorConfig = new AcceptorConfig(); + $config->gatewayProvider = GatewayProvider::TRANSIT; + + ServicesContainer::configureService($config); + $provider = ServicesContainer::instance()->getClient(); + + //create new Transaction Key + $response = $provider->getTransactionKey(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->transactionKey); + } +} diff --git a/test/Integration/Gateways/TransITConnector/TransITDebitTest.php b/test/Integration/Gateways/TransITConnector/TransITDebitTest.php index f6d0fd6f..8251e6d7 100644 --- a/test/Integration/Gateways/TransITConnector/TransITDebitTest.php +++ b/test/Integration/Gateways/TransITConnector/TransITDebitTest.php @@ -1,54 +1,53 @@ -track = new DebitTrackData(); - - $encryptionData = new EncryptionData(); - $encryptionData->version = '01'; - $encryptionData->ksn = '000000000000000'; - - $this->track->encryptionData = $encryptionData; - $this->track->pinBlock = '0000'; - $this->track->setValue(';'); - - ServicesContainer::configure($this->getConfig()); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->merchantId = '887000003226'; - $config->username = 'TA5622118'; - $config->password = 'f8mapGqWrE^rVaA9'; - $config->deviceId = '88700000322602'; - $config->transactionKey = '2HZFSJ98G4XEGHXGP31IRLLG8H3XAWB2'; - $config->developerId = '003226G001'; - - $config->gatewayProvider = GatewayProvider::TRANSIT; - return $config; - } - - public function testDebitSale() - { - $response = $this->track->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } -} +track = new DebitTrackData(); + + $encryptionData = new EncryptionData(); + $encryptionData->version = '01'; + $encryptionData->ksn = '000000000000000'; + + $this->track->encryptionData = $encryptionData; + $this->track->pinBlock = '0000'; + $this->track->setValue(';'); + + ServicesContainer::configureService($this->getConfig()); + } + + protected function getConfig() + { + $config = new TransitConfig(); + $config->merchantId = '887000003226'; + $config->username = 'TA5622118'; + $config->password = 'f8mapGqWrE^rVaA9'; + $config->deviceId = '88700000322602'; + $config->transactionKey = '2HZFSJ98G4XEGHXGP31IRLLG8H3XAWB2'; + $config->developerId = '003226G001'; + $config->acceptorConfig = new AcceptorConfig(); + return $config; + } + + public function testDebitSale() + { + $response = $this->track->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } +} diff --git a/test/Integration/Gateways/TransITConnector/TransITTests.php b/test/Integration/Gateways/TransITConnector/TransITTests.php index e6814e59..c1b476d0 100644 --- a/test/Integration/Gateways/TransITConnector/TransITTests.php +++ b/test/Integration/Gateways/TransITConnector/TransITTests.php @@ -1,323 +1,325 @@ -getConfig()); - - $this->address = new Address(); - $this->address->streetAddress1 = '1 Federal Street'; - $this->address->postalCode = '02110'; - - $this->card = TestCards::masterCardManual(); - - $this->track = new CreditTrackData(); - $this->track->setValue(';'); - - $this->tokenizedCard = new CreditCardData(); - $this->tokenizedCard->token = '5RpF5t9Asb9U6527'; - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->merchantId = '887000003226'; - $config->username = 'TA5622118'; - $config->password = 'f8mapGqWrE^rVaA9'; - $config->deviceId = '88700000322602'; - $config->transactionKey = '2HZFSJ98G4XEGHXGP31IRLLG8H3XAWB2'; - $config->developerId = '003226G001'; - $config->gatewayProvider = GatewayProvider::TRANSIT; - return $config; - } - - public function testAdjustTip() - { - $response = $this->card->charge(10) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $adjust = $response->edit() - ->withGratuity(1.05) - ->execute(); - - $this->assertNotNull($adjust); - $this->assertEquals('00', $response->responseCode); - } - - public function testAuthorizeKeyed() - { - $response = $this->card->authorize(10) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertFalse($response->avsResponseCode == '0'); // verify an AVS response of some sort - } - - public function testAuthorizeSwiped() - { - $response = $this->track->authorize(100) - ->withCurrency('USD') - ->withInvoiceNumber('1264') - ->withClientTransactionId('137149') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testAuthorizeToken() - { - $response = $this->tokenizedCard->authorize(10) - ->withCurrency('USD') - ->withInvoiceNumber('1558') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testTokenizedCardSale() - { - $token = $this->card->tokenize()->execute(); - $this->assertNotNull($token); - $this->assertEquals('00', $token->responseCode); - $this->assertNotNull($token->token); - - $tokenizedCard = new CreditCardData(); - $tokenizedCard->token = $token->token; - - $response = $tokenizedCard->charge(10) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testBalanceInquiry() - { - $response = $this->card->balanceInquiry() - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCapture() - { - $response = $this->card->authorize(10) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $captureResponse = $response->capture()->execute(); - - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testSaleKeyed() - { - - $response = $this->card->charge(100) - ->withCurrency('USD') - ->withAllowDuplicates(false) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testSaleSwiped() - { - $response = $this->track->charge(100) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testSaleToken() - { - $response = $this->tokenizedCard->charge(1.29) - ->withCurrency('USD') - ->withCashBack(0) - ->withConvenienceAmount(0) - ->withInvoiceNumber('1559') - ->withClientTransactionId('166909') - ->withAllowPartialAuth(false) - ->withAllowDuplicates(false) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Response not mapping correctly - public function testSettleBatch() - { - $response = BatchService::closeBatch(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertNotNull($response->batchSummary); - $this->assertNotNull($response->batchSummary->totalAmount); - } - - public function testVoid() - { - $response = $this->card->charge(10) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $voidResponse = $response->void() - ->withDescription('DEVICE_UNAVAILABLE') - ->execute(); - - $this->assertNotNull($voidResponse); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function testVerify() - { - $response = $this->card->verify() - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRequestMUTOnSale() { - $response = $this->card->charge(12.34) - ->withCurrency('USD') - ->withRequestMultiUseToken(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertNotNull($response->token); - } - - public function testRefund() - { - $response = $this->card->charge(10) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $refundResponse = $response->refund() - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($refundResponse); - $this->assertEquals('00', $refundResponse->responseCode); - } - - public function testRefundByCard() - { - $response = $this->card->refund(15.11) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRefundBySwipe() - { - $response = $this->track->refund(15.11) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testSaleSwipedTrack1Pattern() - { - $this->track = new CreditTrackData(); - $this->track->setValue('%B5473500000000014^MC TEST CARD^251210199998888777766665555444433332'); - - $response = $this->track->charge(10) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null for this transaction type. - */ - public function testAuthorizeWithoutAmount() - { - $response = $this->card->authorize() - ->withCurrency('USD') - ->execute(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null for this transaction type. - */ - public function testSaleWithoutAmount() - { - $response = $this->card->charge() - ->withCurrency('USD') - ->execute(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null for this transaction type. - */ - public function testRefundWithoutAmount() - { - $response = $this->card->refund() - ->withCurrency('USD') - ->execute(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\ConfigurationException - * @expectedExceptionMessage deviceID is required for this configuration. - */ - public function testCredentialsError() - { - $config = new ServicesConfig(); - $config->gatewayProvider = GatewayProvider::TRANSIT; - - ServicesContainer::configure($config); - } -} +getConfig()); + + $this->address = new Address(); + $this->address->streetAddress1 = '1 Federal Street'; + $this->address->postalCode = '02110'; + + $this->card = TestCards::masterCardManual(); + + $this->track = new CreditTrackData(); + $this->track->setValue(';'); + + $this->tokenizedCard = new CreditCardData(); + $this->tokenizedCard->token = '5RpF5t9Asb9U6527'; + } + + protected function getConfig() + { + $config = new TransitConfig(); + $config->merchantId = '887000003226'; + $config->username = 'TA5622118'; + $config->password = 'f8mapGqWrE^rVaA9'; + $config->deviceId = '88700000322602'; + $config->transactionKey = '2HZFSJ98G4XEGHXGP31IRLLG8H3XAWB2'; + $config->developerId = '003226G001'; + $config->acceptorConfig = new AcceptorConfig(); + return $config; + } + + public function testAdjustTip() + { + $response = $this->card->charge(10) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $adjust = $response->edit() + ->withGratuity(1.05) + ->execute(); + + $this->assertNotNull($adjust); + $this->assertEquals('00', $response->responseCode); + } + + public function testAuthorizeKeyed() + { + $response = $this->card->authorize(10) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertFalse($response->avsResponseCode == '0'); // verify an AVS response of some sort + } + + public function testAuthorizeSwiped() + { + $response = $this->track->authorize(100) + ->withCurrency('USD') + ->withInvoiceNumber('1264') + ->withClientTransactionId('137149') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testAuthorizeToken() + { + $response = $this->tokenizedCard->authorize(10) + ->withCurrency('USD') + ->withInvoiceNumber('1558') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testTokenizedCardSale() + { + $token = $this->card->tokenize()->execute(); + $this->assertNotNull($token); + $this->assertEquals('00', $token->responseCode); + $this->assertNotNull($token->token); + + $tokenizedCard = new CreditCardData(); + $tokenizedCard->token = $token->token; + + $response = $tokenizedCard->charge(10) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testBalanceInquiry() + { + $response = $this->card->balanceInquiry() + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCapture() + { + $response = $this->card->authorize(10) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $captureResponse = $response->capture()->execute(); + + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testSaleKeyed() + { + + $response = $this->card->charge(100) + ->withCurrency('USD') + ->withAllowDuplicates(false) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testSaleSwiped() + { + $response = $this->track->charge(100) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testSaleToken() + { + $response = $this->tokenizedCard->charge(1.29) + ->withCurrency('USD') + ->withCashBack(0) + ->withConvenienceAmount(0) + ->withInvoiceNumber('1559') + ->withClientTransactionId('166909') + ->withAllowPartialAuth(false) + ->withAllowDuplicates(false) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Response not mapping correctly + public function testSettleBatch() + { + $response = BatchService::closeBatch(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertNotNull($response->batchSummary); + $this->assertNotNull($response->batchSummary->totalAmount); + } + + public function testVoid() + { + $response = $this->card->charge(10) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $voidResponse = $response->void() + ->withDescription('DEVICE_UNAVAILABLE') + ->execute(); + + $this->assertNotNull($voidResponse); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function testVerify() + { + $response = $this->card->verify() + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRequestMUTOnSale() { + $response = $this->card->charge(12.34) + ->withCurrency('USD') + ->withRequestMultiUseToken(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertNotNull($response->token); + } + + public function testRefund() + { + $response = $this->card->charge(10) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $refundResponse = $response->refund() + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($refundResponse); + $this->assertEquals('00', $refundResponse->responseCode); + } + + public function testRefundByCard() + { + $response = $this->card->refund(15.11) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRefundBySwipe() + { + $response = $this->track->refund(15.11) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testSaleSwipedTrack1Pattern() + { + $this->track = new CreditTrackData(); + $this->track->setValue('%B5473500000000014^MC TEST CARD^251210199998888777766665555444433332'); + + $response = $this->track->charge(10) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null for this transaction type. + */ + public function testAuthorizeWithoutAmount() + { + $response = $this->card->authorize() + ->withCurrency('USD') + ->execute(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null for this transaction type. + */ + public function testSaleWithoutAmount() + { + $response = $this->card->charge() + ->withCurrency('USD') + ->execute(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null for this transaction type. + */ + public function testRefundWithoutAmount() + { + $response = $this->card->refund() + ->withCurrency('USD') + ->execute(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\ConfigurationException + * @expectedExceptionMessage deviceID is required for this configuration. + */ + public function testCredentialsError() + { + $config = new TransitConfig(); + $config->acceptorConfig = new AcceptorConfig(); + + ServicesContainer::configureService($config); + } +}

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