mostly filebased Content Presentation System
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

checkout.php 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. <?php
  2. namespace Controller;
  3. class Checkout {
  4. public $saksnummer;
  5. public $sak;
  6. public $DB = null;
  7. private $hydrated = false;
  8. function __construct($folder = null) {
  9. $f3 = \Base::instance();
  10. $saksnummer = $f3->get('SESSION.saksnummer');
  11. if ($saksnummer) {
  12. $this->saksnummer = $saksnummer;
  13. } else {
  14. $this->saksnummer = md5(sprintf("%s%f",$_SERVER['REMOTE_ADDR'],$_SERVER['REQUEST_TIME_FLOAT']));
  15. $f3->set('SESSION.saksnummer', $this->saksnummer);
  16. }
  17. if (is_object($folder)) {
  18. $folder = $f3->get('POST.datapath');
  19. }
  20. if (!is_string($folder)) {
  21. $folder = $f3->get('SESSION.checkout_folder');
  22. }
  23. if (is_string($folder)) {
  24. $f3->set('SESSION.checkout_folder', $folder);
  25. $this->DB = new \DB\SQL(sprintf("sqlite:%sdatabase.sqlite",$folder));
  26. }
  27. }
  28. function hydrate_framework_variables() {
  29. if($this->hydrated) {
  30. return false;
  31. }
  32. $f3 = \Base::instance();
  33. $sak = new \DB\SQL\Mapper($this->DB,'saklist');
  34. $a = new \DB\SQL\Mapper($this->DB,'addresses');
  35. $contact = new \DB\SQL\Mapper($this->DB,'contacts');
  36. $sak->load(['id=?', $this->saksnummer]);
  37. $f3->mset([
  38. 'full_cart' => $this->html_cart(),
  39. 'contact' => $contact->load(['id=?',$sak->kContact]),
  40. 'shipping' => $a->load(['id=?',$sak->kShipping]),
  41. 'billing' => $sak->kBilling ? $a->load(['id=?',$sak->kBilling]) : $a
  42. ]);
  43. $this->hydrated = true;
  44. }
  45. function overview() {
  46. $f3 = \Base::instance();
  47. $tpl = \Template::instance();
  48. $this->hydrate_framework_variables();
  49. return $tpl->render('checkout_overview.htm',true);
  50. }
  51. function index() {
  52. $f3 = \Base::instance();
  53. $sak = new \DB\SQL\Mapper($this->DB,'saklist');
  54. if ($sak->load(['id=?',$this->saksnummer]) === false) {
  55. $sak->id = $this->saksnummer;
  56. $sak->save();
  57. }
  58. if ($sak->kContact === null) {
  59. $f3->reroute('/checkout/contact');
  60. }
  61. if ($sak->kShipping === null) {
  62. $f3->reroute('/checkout/shipping_address');
  63. }
  64. return $this->overview();
  65. }
  66. function save_address() {
  67. $f3 = \Base::instance();
  68. $a = new \DB\SQL\Mapper($this->DB,'addresses');
  69. $a->name = $f3->get('POST.name');
  70. $a->address1 = $f3->get('POST.address1');
  71. $a->address2 = $f3->get('POST.address2');
  72. $a->zip = $f3->get('POST.zip');
  73. $a->place = $f3->get('POST.town');
  74. $a->country = $f3->get('POST.country');
  75. $a->save();
  76. return $a->id;
  77. }
  78. function save_contact() {
  79. $f3 = \Base::instance();
  80. $a = new \DB\SQL\Mapper($this->DB,'contacts');
  81. //$a->name = $f3->get('POST.name');
  82. $a->email = $f3->get('POST.email');
  83. $a->save();
  84. return $a->id;
  85. }
  86. function place_order() {
  87. // fails silently, producing potentially weird untrackable faults if more than 10000 orders happen on one day
  88. $info = new \DB\SQL\Mapper($this->DB,'info');
  89. for ($i=0;$i<9999;$i++) {
  90. $candidate = strval(sprintf('%s%04d',date('Ymd'),$i));
  91. if (!$info->load(['ordernumber=?',$candidate])) {
  92. $info->ordernumber = $candidate;
  93. $info->save();
  94. break;
  95. }
  96. }
  97. return $info->id;
  98. }
  99. function email_to_merchant() {
  100. $f3 = \Base::instance();
  101. $tpl = \Template::instance();
  102. $c = $f3->get('checkout_data.emailconfig');
  103. $subject = $f3->get('checkout_data.subject');
  104. $smtp = new \SMTP(
  105. $c['host'],
  106. $c['port'],
  107. $c['scheme'],
  108. $c['user'],
  109. $c['pass'],
  110. );
  111. $headers = [
  112. "MIME-Version"=>"1.0",
  113. "Content-type"=>"text/html",
  114. "From" => $c['from']
  115. ];
  116. $smtp->set('To', $c['admin']);
  117. $smtp->set('Subject',$subject);
  118. foreach ($headers as $k=>$v) {
  119. $smtp->set($k,$v);
  120. }
  121. $f3->set('order_summary', $this->overview());
  122. $f3->set('order_summary', $tpl->render('checkout_overview_kunde.htm',true));
  123. $f3->set('UI', $f3->get('UI').";".$f3->get('form_path'));
  124. $email = $tpl->render($f3->get('checkout_data.template'),true);
  125. if ($smtp->send($email)) {
  126. return true;
  127. } else {
  128. return false;
  129. }
  130. }
  131. function email_to_client($recipient) {
  132. $f3 = \Base::instance();
  133. $tpl = \Template::instance();
  134. $c = $f3->get('checkout_data.emailconfig');
  135. $subject = $f3->get('checkout_data.subject');
  136. $smtp = new \SMTP(
  137. $c['host'],
  138. $c['port'],
  139. $c['scheme'],
  140. $c['user'],
  141. $c['pass'],
  142. );
  143. $headers = [
  144. "MIME-Version"=>"1.0",
  145. "Content-type"=>"text/html",
  146. "From" => $c['from']
  147. ];
  148. $smtp->set('To', $recipient);
  149. $smtp->set('Subject',$subject);
  150. foreach ($headers as $k=>$v) {
  151. $smtp->set($k,$v);
  152. }
  153. $f3->set('order_summary', $this->overview());
  154. $f3->set('order_summary', $tpl->render('checkout_overview_kunde.htm',true));
  155. $f3->set('UI', $f3->get('UI').";".$f3->get('form_path'));
  156. $email = $tpl->render($f3->get('checkout_data.template'), true);
  157. if ($smtp->send($email)) {
  158. return true;
  159. } else {
  160. return false;
  161. }
  162. }
  163. /**
  164. * buyer has approved all details and decided which payment method to use
  165. */
  166. function buy() {
  167. // set up environment
  168. $f3 = \Base::instance();
  169. $sak = new \DB\SQL\Mapper($this->DB,'saklist');
  170. $info = new \DB\SQL\Mapper($this->DB,'info');
  171. $contact = new \DB\SQL\Mapper($this->DB,'contacts');
  172. $sak->load(['id=?',$this->saksnummer]);
  173. //$datapath = $f3->get('POST.datapath');
  174. // generate an order number
  175. $sak->kInfo = $this->place_order();
  176. $sak->status = 1; // 1 := ordernumber is generated
  177. $sak->save();
  178. // load data needed o finish transaction
  179. $info->load(['id=?',$sak->kInfo]);
  180. $contact->load(['id=?', $sak->kContact]);
  181. // finish transaction
  182. switch ($f3->get('POST.payment')) {
  183. case 'transfer':
  184. $email = new Email();
  185. $email->load_form_config($f3->get('POST.xss-token'));
  186. //var_dump($f3->get('private'));
  187. if ($this->email_to_merchant() &&
  188. $this->email_to_client($contact->email)) {
  189. $f3->set('SESSION',[]);
  190. $f3->reroute('/checkout/success');
  191. } else {
  192. $f3->reroute('/checkout/failure');
  193. }
  194. break;
  195. case 'paypal':
  196. $f3->set('SESSION.xss-token',$f3->get('POST.xss-token'));
  197. $f3->reroute('/checkout/paypal');
  198. break;
  199. case 'approve':
  200. $email = new Email();
  201. $email->load_form_config($f3->get('SESSION.xss-token'));
  202. if ($this->email_to_merchant() &&
  203. $this->email_to_client($contact->email)) {
  204. $f3->set('SESSION',[]);
  205. header('Content-Type: application/json; charset=utf-8');
  206. echo json_encode(['redirect' => '/checkout/success']);
  207. die;
  208. } else {
  209. header('Content-Type: application/json; charset=utf-8');
  210. echo json_encode(['redirect' => '/checkout/failure']);
  211. die;
  212. }
  213. break;
  214. default:
  215. $f3->set('POST.tesst',"asdasd");
  216. header('Content-Type: application/json; charset=utf-8');
  217. echo json_encode($_POST);
  218. die;
  219. break;
  220. }
  221. }
  222. function api(\Base $f3, $params) {
  223. $sak = new \DB\SQL\Mapper($this->DB,'saklist');
  224. if ($sak->load(['id=?',$this->saksnummer]) !== false) {
  225. switch ($params['method']) {
  226. case "contact":
  227. $sak->kContact = $this->save_contact();
  228. $sak->save();
  229. $f3->reroute('/checkout');
  230. break;
  231. case "shipping_address":
  232. $sak->kShipping = $this->save_address();
  233. $sak->save();
  234. $f3->reroute('/checkout');
  235. break;
  236. case "billing_address":
  237. $sak->kBilling = $this->save_address();
  238. $sak->save();
  239. $f3->reroute('/checkout');
  240. break;
  241. case "buy":
  242. $sak->status = $this->buy();
  243. // $sak->save();
  244. // $f3->reroute('/checkout/success');
  245. break;
  246. case "paypalapprove":
  247. //$f3->set('POST.payment', 'approve');
  248. $sak->status = $this->buy();
  249. break;
  250. default:
  251. header('Content-Type: application/json; charset=utf-8');
  252. echo json_encode(['test' => 2]);
  253. die;
  254. break;
  255. }
  256. } else {
  257. header('Content-Type: application/json; charset=utf-8');
  258. echo json_encode(['error' => "no saksnummer"]);
  259. die;
  260. }
  261. }
  262. function html_cart() {
  263. $t = \Template::instance();
  264. return $t->render("checkout.htm");
  265. }
  266. }