OrderPagopar.php 8.3 KB

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