MPush.Class.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. /**
  3. * 亿成推送队列任务
  4. * Created by PhpStorm.
  5. * User: phperstar
  6. * Date: 2018/6/10
  7. * Time: 下午3:38
  8. */
  9. namespace Jobs\Model\MTopic\Push;
  10. use Jobs\Model\Middleware;
  11. use Jobs\Dao\DMessageTemplate;
  12. use Jobs\Dao\DTmsMessageTemplate;
  13. use Jobs\Dao\DUserMessage;
  14. class MPush
  15. {
  16. private $objDMessageTemplate;
  17. public function __construct()
  18. {
  19. }
  20. /**
  21. * 推送消息
  22. * @param array $params 推送任务参数
  23. * @param string $callback_params 回调参数
  24. */
  25. public function push($params)
  26. {
  27. self::initDao($params['push_source']);
  28. // 1.读取推送任务模板
  29. $template_id = intval($params['push_template_id']);
  30. if(!$template_id){
  31. echo '未指定推送模板id'.PHP_EOL;
  32. return false;
  33. }
  34. $template_data = self::getMessageTemplateById($template_id);
  35. if(empty($template_data)){
  36. echo '指定的推送消息不存在'.PHP_EOL.$this->objDMessageTemplate->error();
  37. return false;
  38. }
  39. if($template_data['status'] != 1){
  40. echo '指定的推送消息未启用'.PHP_EOL;
  41. return false;
  42. }
  43. // 2.获取推送的内容
  44. $message_content = self::paseTemplateContent($template_data['template_content'], $params['push_template_params']);
  45. if($message_content){
  46. // 3.开启推送
  47. self::pushMessage($message_content, $template_data, $params);
  48. }
  49. }
  50. /*
  51. * 初始化库
  52. */
  53. public function initDao($push_source)
  54. {
  55. switch ($push_source){
  56. case 'wuliu':
  57. $this->objDMessageTemplate = new DTmsMessageTemplate('wuliu');
  58. break;
  59. case 'pifabbc':
  60. $this->objDMessageTemplate = new DMessageTemplate('newcloud');
  61. break;
  62. default:
  63. $this->objDMessageTemplate = new DMessageTemplate('cloud');
  64. break;
  65. }
  66. }
  67. /**
  68. * 获取推送模板数据
  69. * @param int $template_id 模板id
  70. */
  71. public function getMessageTemplateById($template_id)
  72. {
  73. return $this->objDMessageTemplate->get($template_id);
  74. }
  75. /**
  76. * 渲染模板消息中的参数
  77. * @param string $template_content 模板内容
  78. * @param array $template_params 模板参数
  79. * @return string
  80. */
  81. public function paseTemplateContent($template_content, $template_params)
  82. {
  83. // 比对模板参数数量和传输过来的替换的参数数量是否一致
  84. preg_match_all('/<{(.*?)}>/', $template_content, $matchs);
  85. if(count($matchs[0]) != count($template_params)){
  86. var_dump($matchs);
  87. echo '要替换的模板参数数量和实际模板参数数量不一致'.PHP_EOL;
  88. return false;
  89. }
  90. foreach ($template_params as $key => $value){
  91. if(empty($value) && $value != ''){
  92. echo '模板变量'.$key.'的值为空'.PHP_EOL;
  93. return false;
  94. }
  95. if(!in_array($key,$matchs[1])){
  96. echo '传输过来的模板变量'.$key.'不在模板中'.PHP_EOL;
  97. return false;
  98. }
  99. }
  100. return str_replace($matchs[0], $template_params, $template_content);
  101. }
  102. /**
  103. * 开启推送
  104. * @param string $message_content 推送内容
  105. * @param int $push_to_userId 推送给的用户
  106. * @param array $message_template_data 推送任务模板数据
  107. */
  108. public function pushMessage($message_content, $message_template_data, $params)
  109. {
  110. if(empty($message_content)){
  111. echo '推送内容为空'.PHP_EOL;
  112. return false;
  113. }
  114. $message_template_data['send_type'] = json_decode($message_template_data['send_type'],true);
  115. $appPushData = [
  116. 'push_source' => $params['push_source'],
  117. 'pushPlatForm' => $params['pushPlatForm'],
  118. 'pushType' => $params['pushType'],
  119. 'alias' => $params['alias'],
  120. 'content' => $message_content,
  121. 'apns_production' => $params['apns_production'],
  122. 'extras' => isset($params['extras']) ? $params['extras'] : [],
  123. ];
  124. foreach ($message_template_data['send_type'] as $key => $value){
  125. switch($value){
  126. case 1: // app 推送消息
  127. self::appPush($appPushData);
  128. break;
  129. case 2: // 站内消息
  130. self::siteMessagePush($message_content, $params['push_to_userId'], $params['push_source'], $message_template_data, $params['order_id']);
  131. break;
  132. }
  133. }
  134. echo '推送完成'.PHP_EOL;
  135. return true;
  136. }
  137. /**
  138. * 极光app推送方式
  139. */
  140. public function appPush($appPushData)
  141. {
  142. /* 老版请求云端
  143. $i = 1;
  144. do{
  145. $url = 'http://devcloud.91youxian.net/v2/baseinfo/aurora/jpush?message='.$message_content.'&user_id='.$push_to_userId;
  146. $result = request($url, null, 5);
  147. if($result['httpcode'] != 200){
  148. file_put_contents('/tmp/jipush.log',date('Y-m-d H:i:s').var_export($result,true).PHP_EOL,FILE_APPEND);
  149. echo '请求极光推送失败'.PHP_EOL;
  150. }
  151. $i ++;
  152. sleep(1);
  153. }while($result['httpcode'] != 200 && $i <= 3);*/
  154. $i = 1;
  155. do{
  156. switch ($appPushData['pushType']){
  157. case 'all':
  158. $swResult = Middleware::getInstance('ThirdPartyService')->sendSwoole('Jpush', 'broadcastPush', $appPushData);
  159. break;
  160. case 'alias':
  161. $swResult = Middleware::getInstance('ThirdPartyService')->sendSwoole('Jpush', 'aliasPush', $appPushData);
  162. break;
  163. }
  164. if( !$swResult['state'] ){
  165. file_put_contents('/tmp/jipush.log',date('Y-m-d H:i:s').var_export($swResult['data'],true).PHP_EOL,FILE_APPEND);
  166. echo '请求极光推送失败'.PHP_EOL;
  167. }else{
  168. $jpushResult = $swResult['data'];
  169. }
  170. $i ++;
  171. sleep(1);
  172. }while( !$swResult['state'] && $i <= 3);
  173. echo '请求极光推送完成'.json_encode($jpushResult).PHP_EOL;
  174. return true;
  175. }
  176. /**
  177. * 站内信推送方式
  178. */
  179. public function siteMessagePush($message_content, $push_to_userId, $push_source, $message_template_data, $order_id)
  180. {
  181. if($push_source == 'pifabbc'){
  182. $objDUserMessage = new DUserMessage('pifabbc');
  183. }else{
  184. $objDUserMessage = new DUserMessage('bbc');
  185. }
  186. if($message_template_data['type'] == 1){
  187. $order_id = 0;
  188. }
  189. $data = [
  190. 'message_name' => $message_template_data['template_name'],
  191. 'message_content' => $message_content,
  192. 'message_from' => 1,
  193. 'message_to' => $push_to_userId,
  194. 'type' => $message_template_data['type'],
  195. 'create_time' => time(),
  196. 'order_id' => $order_id,
  197. ];
  198. $result = $objDUserMessage->insert($data);
  199. if(!$result){
  200. echo '操作数据库失败'.PHP_EOL;
  201. return false;
  202. }
  203. echo '站内消息推送完成'.PHP_EOL;
  204. return true;
  205. }
  206. }