OrderPagopar.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <?php
  2. /**
  3. * Clase del pedido de Pagopar
  4. * @author "Pagopar" <desarrollo@pagopar.com>
  5. * @version 1 3/5/2017
  6. */
  7. require_once 'ItemPagopar.php';
  8. require_once 'BuyerPagopar.php';
  9. class OrderPagopar{
  10. public $order = [];
  11. public $idOrder;
  12. public $publicKey;
  13. public $privateKey;
  14. public $typeOrder;
  15. public $desc;
  16. public $periodOfDaysForPayment = null;
  17. public $periodOfHoursForPayment = null;
  18. /**
  19. * Constructor de la clase
  20. */
  21. public function __construct($id){
  22. $this->idOrder = $id;
  23. $this->order = [
  24. 'tipo_pedido' => null,
  25. 'fecha_maxima_pago' => null,
  26. 'public_key' => null,
  27. 'id_pedido_comercio' => null,
  28. 'monto_total' => null,
  29. 'token' => null,
  30. 'descripcion_resumen' => null,
  31. 'comprador' => null,
  32. 'compras_items' => null
  33. ];
  34. }
  35. /**
  36. * Agrega un producto (item) al pedido
  37. * @param object $item (Obligatorio) Producto
  38. * @throws Exception
  39. */
  40. public function addPagoparItem($item){
  41. $error = $this->validateItemAttributes($item->name, $item->qty, $item->price, $item->cityId);
  42. if($error['status']){
  43. throw new Exception($error['msg']);
  44. }
  45. $this->order['compras_items'][] = $item->formatToArray();
  46. }
  47. /**
  48. * Valida los parámetros pasados al contructor del producto
  49. * @param string $name (Obligatorio) Nombre del producto
  50. * @param int $qty (Obligatorio) Cantidad de unidades del producto
  51. * @param int $price (Obligatorio) Suma total de los precios de los productos
  52. * @param int $cityId (Obligatorio) Id de la ciudad
  53. * @return array $error Array con el status (true|false) y el mensaje de error
  54. */
  55. private function validateItemAttributes($name, $qty, $price, $cityId){
  56. $error = ['status'=>false,'msg'=>''];
  57. if(empty($name)){
  58. $error['status'] = true; $error['msg'] = "Hay un error con el nombre de algún producto";
  59. return $error;
  60. }
  61. if(empty($qty) || !is_numeric($qty) || $qty < 0){
  62. $error['status'] = true; $error['msg'] = "Hay un error en la cantidad del producto con nombre '{$name}'";
  63. return $error;
  64. }
  65. if(empty($price) || !is_numeric($price) || $price < 0){
  66. $error['status'] = true; $error['msg'] = "Hay un error en el precio del producto con nombre '{$name}'";
  67. return $error;
  68. }
  69. if(empty($cityId) || !is_numeric($cityId) || $cityId < 0){
  70. $error['status'] = true; $error['msg'] = "Hay un error en el ID de la ciudad del producto con nombre '{$name}'";
  71. return $error;
  72. }
  73. return $error;
  74. }
  75. /**
  76. * Agrega un comprador al pedido
  77. * @throws Exception
  78. */
  79. public function addPagoparBuyer($buyer){
  80. $error = $this->validateBuyerAttributes($buyer->name,$buyer->email,$buyer->cityId);
  81. if($error['status']){
  82. throw new Exception($error['msg']);
  83. }
  84. $this->order['comprador'] = $buyer->formatToArray();
  85. }
  86. /**
  87. * Valida los parámetros del comprador pasados a addPagoparBuyer
  88. * @param string $name (Obligatorio) Nombre del producto
  89. * @param string $email (Obligatorio) Email del comprador
  90. * @param int $cityId (Obligatorio) Id de la ciudad
  91. * @return array $error Array con el status (true|false) y el mensaje de error
  92. */
  93. private function validateBuyerAttributes($name,$email,$cityId){
  94. $error = ['status'=>false,'msg'=>''];
  95. if(empty($name)){
  96. $error['status'] = true; $error['msg'] = "Hay un error con el nombre del comprador";
  97. return $error;
  98. }
  99. if(empty($email)){
  100. $error['status'] = true; $error['msg'] = "Hay un error con el email del comprador";
  101. return $error;
  102. }
  103. if(empty($cityId) || !is_numeric($cityId) || $cityId < 0){
  104. $error['status'] = true; $error['msg'] = "Hay un error en el ID de la ciudad del comprador";
  105. return $error;
  106. }
  107. return $error;
  108. }
  109. /**
  110. * Valida los parámetros del pedido pasados a makeOrder
  111. * @param string $publicKey (Obligatorio) Clave pública del comercio
  112. * @param string $privateKey (Obligatorio) Clave privada del comercio
  113. * @param int $typeOrder (Obligatorio) Tipo de pedido
  114. * @return array $error Array con el status (true|false) y el mensaje de error
  115. */
  116. public function validateOrderAttributes($publicKey,$privateKey,$typeOrder){
  117. $error = ['status'=>false,'msg'=>''];
  118. //Validamos los keys
  119. if(empty($publicKey)){
  120. $error['status'] = true;$error['msg'] = "Hay un error con la clave pública";
  121. }
  122. if(empty($privateKey)){
  123. $error['status'] = true;$error['msg'] = "Hay un error con la clave privada";
  124. }
  125. //Validamos el tipo de Pedido
  126. if(empty($typeOrder)){
  127. $error['status'] = true;$error['msg'] = "Hay un error con el tipo de Pedido";
  128. }
  129. return $error;
  130. }
  131. /**
  132. * Genera un hash del pedido
  133. * @param int $id Id del pedido
  134. * @param int $amount Monto total del pedido
  135. * @return string Hash del pedido
  136. */
  137. private function generateOrderHash($id = null, $amount = 0, $private_token = null){
  138. return sha1($private_token . $id . $amount);
  139. }
  140. /**
  141. * Genera la máxima fecha de pago
  142. * @return string Fecha en formato yyyy-mm-dd hh:mm:ss
  143. */
  144. private function makeMaxDateForPayment(){
  145. //Transformamos el día a horas
  146. $daysToHours = ($this->periodOfDaysForPayment)?($this->periodOfDaysForPayment*24):0;
  147. return date("Y-m-d H:i:s",mktime(date("h")+$this->periodOfHoursForPayment+$daysToHours,
  148. date("i"),date("s"),date("m"),date("d"),date("Y")));
  149. }
  150. /**
  151. * Obtiene el precio total de la compra
  152. * @return int Suma total del precio de los Items
  153. */
  154. private function getTotalAmount($items){
  155. $totalAmount = 0;
  156. foreach ($items as $item){
  157. $totalAmount += $item['precio_total'];
  158. }
  159. return $totalAmount;
  160. }
  161. /**
  162. * Genera el pedido
  163. * @param int $idOrder Id del pedido
  164. * @param string $publicKey (Obligatorio) Clave pública del comercio
  165. * @param string $privateKey (Obligatorio) Clave privada del comercio
  166. * @param int $typeOrder (Obligatorio) Tipo de pedido
  167. * @param string $desc Descripción del pedido
  168. * @param int $periodDays Periodo máximo de días para completar el pago
  169. * @param int $periodHours Periodo máximo de horas para completar el pago
  170. * @return array Array formado del pedido
  171. * @throws Exception
  172. */
  173. public function makeOrder(){
  174. //Validamos los periodos máximos de compra de días y horas.
  175. //1 día por default
  176. $this->periodOfDaysForPayment =
  177. ($this->periodOfDaysForPayment>=0 && is_numeric($this->periodOfDaysForPayment))?$this->periodOfDaysForPayment:1;
  178. //Solo días y no horas por default
  179. $this->periodOfHoursForPayment =
  180. ($this->periodOfHoursForPayment>=0 && is_numeric($this->periodOfHoursForPayment))?$this->periodOfHoursForPayment:0;
  181. $error = $this->validateOrderAttributes($this->publicKey,$this->privateKey,$this->typeOrder);
  182. if($error['status']){
  183. throw new Exception($error['msg']);
  184. }
  185. $totalAmount = $this->getTotalAmount($this->order['compras_items']);
  186. //Datos de configuración del pedido
  187. $this->order['public_key'] = $this->publicKey;
  188. $this->order['tipo_pedido'] = $this->typeOrder;
  189. $this->order['fecha_maxima_pago'] = $this->makeMaxDateForPayment();
  190. $this->order['id_pedido_comercio'] = $this->idOrder;
  191. $this->order['monto_total'] = $totalAmount;
  192. $this->order['token'] = $this->generateOrderHash($this->idOrder,$totalAmount,$this->privateKey);
  193. $this->order['descripcion_resumen'] = $this->desc;
  194. return $this->order;
  195. }
  196. }