OrderRepeat.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. /**
  3. * OrderRepeat.php UTF-8
  4. * 通知CP
  5. *
  6. * @date : 2020/7/29 12:00
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : chenbingling <cbl@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace huoOrderRepeat\controller;
  13. use huo\controller\common\Base;
  14. use huo\controller\game\Game;
  15. use huo\controller\pay\SdkOrderCache;
  16. use huo\controller\request\Request;
  17. use huo\model\log\OrderCpLogModel;
  18. use huolib\constant\OrderConst;
  19. use huolib\status\CommonStatus;
  20. use huolib\status\OrderStatus;
  21. use huolib\tool\StrUtils;
  22. use huoOrderRepeat\constant\OrderRepeatConstant;
  23. use huoOrderRepeat\queue\RepeatQueue;
  24. use think\Log;
  25. class OrderRepeat extends Base {
  26. protected function retSucMsg($code, $data = []) {
  27. $_msg = OrderStatus::getMsg($code);
  28. return $this->huoSuccess($code, $_msg, $data);
  29. }
  30. protected function retErrMsg($code) {
  31. $_err_msg = OrderStatus::getMsg($code);
  32. return $this->huoError($code, $_err_msg);
  33. }
  34. /**
  35. * CP通知入队列
  36. *
  37. * @param string $order_id 订单id
  38. * @param int $attempts 任务尝试次数
  39. *
  40. * @return array
  41. */
  42. public function cpNotifyQueue($order_id, $attempts = OrderRepeatConstant::JOB_REPEAT_MAX_CNT) {
  43. $_param['order_id'] = $order_id;
  44. $_param['attempts'] = $attempts;
  45. (new RepeatQueue($_param))->pushQueue();
  46. return $this->retSucMsg(CommonStatus::NO_ERROR);
  47. }
  48. /**
  49. * CP通知
  50. *
  51. * @param string $order_id
  52. *
  53. * @return array|mixed
  54. */
  55. public function notify($order_id = '') {
  56. if (empty($order_id)) {
  57. return $this->retErrMsg(OrderStatus::ORDER_ID_EMPTY);
  58. }
  59. // $_order_model = new OrderModel();
  60. $_order_model = SdkOrderCache::ins();
  61. $_order_data = $_order_model->getInfoByOrderId($order_id);
  62. if (false == $_order_data) {
  63. return $this->retErrMsg(OrderStatus::ORDER_NOT_EXISTS);
  64. }
  65. if (OrderConst::PAY_STATUS_SUC != $_order_data['status']) {
  66. Log::write(
  67. "func=".__FUNCTION__."&class=".__CLASS__."&code=".OrderStatus::ORDER_NOT_PAY.'&order_data.'
  68. .json_encode($_order_data),
  69. LOG::LOG
  70. );
  71. return $this->retErrMsg(OrderStatus::ORDER_NOT_PAY);
  72. }
  73. if (OrderConst::CP_STATUS_SUC == $_order_data['cp_status']) {
  74. return $this->retSucMsg(OrderStatus::NO_ERROR);
  75. }
  76. $_param = $this->setCpParam($_order_data);
  77. // $_cp_url = (new GameModel())->getCpPaybackUrl($_order_data['app_id']);
  78. $_cp_url = (new Game())->getCpPaybackUrl($_order_data['app_id']);
  79. if (empty($_cp_url)) {
  80. Log::write(
  81. "func=".__FUNCTION__."&class=".__CLASS__."&code=".OrderStatus::NOTIFY_URL_EMPTY.'&order_data.'
  82. .json_encode($_order_data),
  83. LOG::ERROR
  84. );
  85. return $this->retErrMsg(OrderStatus::NOTIFY_URL_EMPTY);
  86. }
  87. $_cp_status = $this->notifyCp($_cp_url, $_param);
  88. /* 更新订单信息 */
  89. $_update_order_data['cp_status'] = $_cp_status;
  90. $_update_order_data['notify_cnt'] = $_order_data['notify_cnt'] + 1;
  91. $_update_order_data['last_notify_time'] = time();
  92. if (OrderConst::CP_STATUS_SUC == $_cp_status) {
  93. $_update_order_data['finish_time'] = time();
  94. // $_rs = $_order_model->updateData($_update_order_data, $_order_data['id']);
  95. $_rs = SdkOrderCache::ins()->updateOrder($_order_data['order_id'], $_update_order_data);
  96. if (true == $_rs) {
  97. $_code = OrderStatus::NO_ERROR;
  98. } else {
  99. $_code = OrderStatus::INNER_ERROR;
  100. }
  101. } else {
  102. $_update_order_data['is_handle'] = OrderConst::ORDER_IS_HANDLE;
  103. // $_order_model->updateData($_update_order_data, $_order_data['id']);
  104. SdkOrderCache::ins()->updateOrder($_order_data['order_id'], $_update_order_data);
  105. $_code = OrderStatus::NOTIFY_FAIL;
  106. }
  107. /* 插入通知Log */
  108. $_data['pay_id'] = get_val($_order_data, 'id', 0);
  109. $_data['order_id'] = get_val($_order_data, 'order_id', '');
  110. $_data['cp_order_id'] = get_val($_order_data, 'cp_order_id', 0);
  111. $_data['status'] = get_val($_order_data, 'status', '');
  112. $_data['cp_payback_url'] = $_cp_url;
  113. $_data['params'] = $_param;
  114. $_data['ext'] = get_val($_order_data, 'ext', '');
  115. $_data['cp_status'] = get_val($_update_order_data, 'cp_status', 0);
  116. $_data['notify_cnt'] = get_val($_update_order_data, 'notify_cnt', '');
  117. $_oc_model = new OrderCpLogModel();
  118. $_oc_model->insertLog($_data);
  119. return $this->retSucMsg($_code);
  120. }
  121. /**
  122. * @param $cp_url
  123. * @param $param
  124. *
  125. * @return int
  126. */
  127. public function notifyCp($cp_url, $param) {
  128. $_cp_rs = Request::cpPayback($cp_url, $param);
  129. if ($_cp_rs > 0) {
  130. $_cp_status = 2;
  131. } else {
  132. $_cp_status = 3;
  133. }
  134. return $_cp_status;
  135. }
  136. /**
  137. * 设置通知CP参数
  138. *
  139. * @param array $order_data
  140. *
  141. * @return bool|string
  142. */
  143. public function setCpParam($order_data = []) {
  144. $_cp_rq_data['app_id'] = get_val($order_data, 'app_id');
  145. $_cp_rq_data['cp_order_id'] = get_val($order_data, 'cp_order_id');
  146. $_cp_rq_data['mem_id'] = get_val($order_data, 'mg_mem_id', 0);/* 使用游戏玩家ID */
  147. $_cp_rq_data['order_id'] = get_val($order_data, 'order_id');
  148. $_cp_rq_data['order_status'] = get_val($order_data, 'status');
  149. $_cp_rq_data['pay_time'] = get_val($order_data, 'create_time');
  150. $_cp_rq_data['product_id'] = get_val($order_data, 'product_id');
  151. $_cp_rq_data['product_name'] = get_val($order_data, 'product_name');
  152. $_cp_rq_data['product_price'] = get_val($order_data, 'amount');
  153. $_cp_rq_data['ext'] = get_val($order_data, 'ext');
  154. $_param = StrUtils::argSort($_cp_rq_data);
  155. $_signstr = StrUtils::createLinkString($_param);
  156. /* 获取游戏信息 */
  157. $_app_key = (new Game())->getAppKey($_cp_rq_data['app_id']);
  158. if (empty($_app_key)) {
  159. return false;
  160. }
  161. $_sign = md5($_signstr."&app_key=".$_app_key);
  162. $_cp_rq_data['sign'] = $_sign;
  163. return $_signstr."&sign=".$_sign;
  164. }
  165. }