XmpushServer.class.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. /**
  3. * 小米消息推送
  4. * @author: hyz
  5. */
  6. namespace Common\Server;
  7. use Think\Model;
  8. class XmpushServer {
  9. /**
  10. * 推送接口
  11. * @author: hyz
  12. * uids 用户id,多用户之间用英文逗号隔开, *代表群发所有设备
  13. * title 消息标题
  14. * desc 内容描述
  15. * payload 扩展字段,json格式
  16. */
  17. public function send($uids, $title, $desc, $payload = '{}') {
  18. if (!$uids) return false;
  19. if ($uids == '*') {
  20. $result = $this->ios('*', $title, $desc, $payload);
  21. $return_ios = $this->save_pushlog(array('*'), $result, 1);
  22. $result2 = $this->android('*', $title, $desc, $payload);
  23. $return_android = $this->save_pushlog(array('*'), $result2, 2);
  24. } else {
  25. $device_mod = M('device');
  26. $field = 'uid,xmpush_alias,badge,user_type';
  27. if (stripos($uids, ',')) {
  28. $map['uid'] = array('IN', explode(',', $uids));
  29. } else {
  30. $map['uid'] = $uids;
  31. }
  32. $map['is_last'] = 1;
  33. $map['os_type'] = 1;
  34. //推送给ios
  35. $ios_data = $device_mod->where($map)->field($field)->select();
  36. if ($ios_data) {
  37. foreach ($ios_data as $v) {
  38. $ios_uids[$v['user_type']][] = $v['uid'];
  39. $ios_appids[$v['user_type']][] = $v['xmpush_alias'];
  40. }
  41. if (count($ios_data) == 1) {
  42. $badge = $ios_data[0]['badge'] + 1;
  43. } else {
  44. $badge = 1;
  45. }
  46. $return_ios = 0;
  47. foreach ($ios_uids as $kk => $vv) {
  48. $result = $this->ios($ios_appids[$kk], $title, $desc, $payload, $badge, $kk);
  49. $return_ios += $this->save_pushlog($vv, $result, 1);
  50. }
  51. $device_mod->where($map)->setInc('badge');
  52. }
  53. //推送给android
  54. $map['os_type'] = 2;
  55. $android_data = $device_mod->where($map)->field($field)->select();
  56. if ($android_data) {
  57. foreach ($android_data as $k => $v) {
  58. $android_uids[$v['user_type']][] = $v['uid'];
  59. $android_appids[$v['user_type']][] = $v['xmpush_alias'];
  60. }
  61. $return_android = 0;
  62. foreach ($android_uids as $kk => $vv) {
  63. $result2 = $this->android($android_appids[$kk], $title, $desc, $payload,$kk);
  64. $return_android = $this->save_pushlog($android_uids, $result2, 2);
  65. }
  66. }
  67. }
  68. $return['ios'] = intval($return_ios);
  69. $return['android'] = intval($return_android);
  70. $return['total'] = $return['ios'] + $return['android'];
  71. return $return;
  72. }
  73. /**
  74. * ios推送
  75. * @author: hyz
  76. */
  77. protected function ios($aliasList, $title, $desc, $payload, $badge = 1, $user_type = 0) {
  78. Vendor('xmpush.Message');
  79. Vendor('xmpush.HttpBase');
  80. Vendor('xmpush.Sender');
  81. Vendor('xmpush.Constants');
  82. Vendor('xmpush.Stats');
  83. Vendor('xmpush.Tracer');
  84. Vendor('xmpush.Feedback');
  85. Vendor('xmpush.DevTools');
  86. Vendor('xmpush.Subscription');
  87. Vendor('xmpush.TargetedMessage');
  88. Vendor('xmpush.PushRequestPath');
  89. Vendor('xmpush.PushRequestType');
  90. Vendor('xmpush.Result');
  91. Vendor('xmpush.Server');
  92. Vendor('xmpush.ServerSwitch');
  93. Vendor('xmpush.ErrorCode');
  94. Vendor('xmpush.IOSBuilder');
  95. if ($user_type == 0) {
  96. $secret = I_PUSH_TRAINER_SECRET; //app secret
  97. $package = I_PUSH_TRAINER_PACKAGE; //package
  98. } else {
  99. $secret = I_PUSH_COUCH_SECRET; //app secret
  100. $package = I_PUSH_COUCH_PACKAGE; //package
  101. }
  102. \Constants::setPackage($package);
  103. \Constants::setSecret($secret);
  104. if (APP_DEBUG) {
  105. \Constants::useSandbox();
  106. } else {
  107. \Constants::useOfficial();
  108. }
  109. $message = new \IOSBuilder();
  110. $desc = '【' . $title . '】
  111. ' . $desc;
  112. $message->description($desc);
  113. $message->soundUrl('default');
  114. $message->badge($badge);
  115. $message->extra('payload', $payload);
  116. $message->build();
  117. $sender = new \Sender();
  118. if ($aliasList == '*') {
  119. $data = $sender->broadcastAll($message)->getRaw();
  120. } else {
  121. $data = $sender->sendToAliases($message, $aliasList)->getRaw();
  122. }
  123. return $data;
  124. }
  125. /**
  126. * android推送
  127. * @author: hyz
  128. */
  129. protected function android($aliasList, $title, $desc, $payload,$user_type = 0) {
  130. Vendor('xmpush.Message');
  131. Vendor('xmpush.HttpBase');
  132. Vendor('xmpush.Sender');
  133. Vendor('xmpush.Constants');
  134. Vendor('xmpush.Stats');
  135. Vendor('xmpush.Tracer');
  136. Vendor('xmpush.Feedback');
  137. Vendor('xmpush.DevTools');
  138. Vendor('xmpush.Subscription');
  139. Vendor('xmpush.TargetedMessage');
  140. Vendor('xmpush.PushRequestPath');
  141. Vendor('xmpush.PushRequestType');
  142. Vendor('xmpush.Result');
  143. Vendor('xmpush.Server');
  144. Vendor('xmpush.ServerSwitch');
  145. Vendor('xmpush.ErrorCode');
  146. Vendor('xmpush.Builder');
  147. if ($user_type == 0) {
  148. $package = A_PUSH_TRAINER_PACKAGE;//package
  149. $secret = A_PUSH_TRAINER_SECRET; //app secret
  150. } else {
  151. $secret = A_PUSH_COUCH_SECRET; //app secret
  152. $package = A_PUSH_COUCH_PACKAGE; //package
  153. }
  154. \Constants::setPackage($package);
  155. \Constants::setSecret($secret);
  156. \Constants::useOfficial();
  157. $sender = new \Sender();
  158. $message = new \Builder();
  159. $message->title($title); // 通知栏的title
  160. $message->description($desc); // 通知栏的descption
  161. $message->passThrough(0); // 这是一条通知栏消息,如果需要透传,把这个参数设置成1,同时去掉title和descption两个参数
  162. $message->payload($payload); // 携带的数据,点击后将会通过客户端的receiver中的onReceiveMessage方法传入。
  163. $message->extra(\Builder::notifyEffect, 1); // 此处设置预定义点击行为,1为打开app
  164. $message->extra(\Builder::notifyForeground, 1); // 应用在前台是否展示通知,如果不希望应用在前台时候弹出通知,则设置这个参数为0
  165. $message->notifyId(2); // 通知类型。最多支持0-4 5个取值范围,同样的类型的通知会互相覆盖,不同类型可以在通知栏并存
  166. $message->build();
  167. if ($aliasList == '*') {
  168. $data = $sender->broadcastAll($message)->getRaw();
  169. } else {
  170. $data = $sender->sendToAliases($message, $aliasList)->getRaw();
  171. }
  172. return $data;
  173. }
  174. /**
  175. * 保存推送日志
  176. * @author: hyz
  177. */
  178. protected function save_pushlog($uids, $data, $os_type) {
  179. if ($data['result'] == 'ok') {
  180. preg_match('/\d+/', $data['info'], $mt);
  181. $log['total'] = intval($mt[0]);
  182. $log['trace_id'] = $data['trace_id'];
  183. $log['uids'] = implode(',', $uids);
  184. $log['os_type'] = $os_type;
  185. $log['c_time'] = myDate();
  186. cplog('推送日志:' . var_export($data, true), 'INFO');
  187. cplog('推送结果:' . var_export($log, true), 'INFO');
  188. //M('xmpush_log')->add($log);
  189. return $log['total'];
  190. } else {
  191. cplog('推送日志:' . var_export($data, true));
  192. return 0;
  193. }
  194. }
  195. }