123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- <?php
- /**
- * 小米消息推送
- * @author: hyz
- */
- namespace Common\Server;
- use Think\Model;
- class XmpushServer {
- /**
- * 推送接口
- * @author: hyz
- * uids 用户id,多用户之间用英文逗号隔开, *代表群发所有设备
- * title 消息标题
- * desc 内容描述
- * payload 扩展字段,json格式
- */
- public function send($uids, $title, $desc, $payload = '{}') {
- if (!$uids) return false;
- if ($uids == '*') {
- $result = $this->ios('*', $title, $desc, $payload);
- $return_ios = $this->save_pushlog(array('*'), $result, 1);
- $result2 = $this->android('*', $title, $desc, $payload);
- $return_android = $this->save_pushlog(array('*'), $result2, 2);
- } else {
- $device_mod = M('device');
- $field = 'uid,xmpush_alias,badge,user_type';
- if (stripos($uids, ',')) {
- $map['uid'] = array('IN', explode(',', $uids));
- } else {
- $map['uid'] = $uids;
- }
- $map['is_last'] = 1;
- $map['os_type'] = 1;
- //推送给ios
- $ios_data = $device_mod->where($map)->field($field)->select();
- if ($ios_data) {
- foreach ($ios_data as $v) {
- $ios_uids[$v['user_type']][] = $v['uid'];
- $ios_appids[$v['user_type']][] = $v['xmpush_alias'];
- }
- if (count($ios_data) == 1) {
- $badge = $ios_data[0]['badge'] + 1;
- } else {
- $badge = 1;
- }
- $return_ios = 0;
- foreach ($ios_uids as $kk => $vv) {
- $result = $this->ios($ios_appids[$kk], $title, $desc, $payload, $badge, $kk);
- $return_ios += $this->save_pushlog($vv, $result, 1);
- }
- $device_mod->where($map)->setInc('badge');
- }
- //推送给android
- $map['os_type'] = 2;
- $android_data = $device_mod->where($map)->field($field)->select();
- if ($android_data) {
- foreach ($android_data as $k => $v) {
- $android_uids[$v['user_type']][] = $v['uid'];
- $android_appids[$v['user_type']][] = $v['xmpush_alias'];
- }
- $return_android = 0;
- foreach ($android_uids as $kk => $vv) {
- $result2 = $this->android($android_appids[$kk], $title, $desc, $payload,$kk);
- $return_android = $this->save_pushlog($android_uids, $result2, 2);
- }
- }
- }
- $return['ios'] = intval($return_ios);
- $return['android'] = intval($return_android);
- $return['total'] = $return['ios'] + $return['android'];
- return $return;
- }
- /**
- * ios推送
- * @author: hyz
- */
- protected function ios($aliasList, $title, $desc, $payload, $badge = 1, $user_type = 0) {
- Vendor('xmpush.Message');
- Vendor('xmpush.HttpBase');
- Vendor('xmpush.Sender');
- Vendor('xmpush.Constants');
- Vendor('xmpush.Stats');
- Vendor('xmpush.Tracer');
- Vendor('xmpush.Feedback');
- Vendor('xmpush.DevTools');
- Vendor('xmpush.Subscription');
- Vendor('xmpush.TargetedMessage');
- Vendor('xmpush.PushRequestPath');
- Vendor('xmpush.PushRequestType');
- Vendor('xmpush.Result');
- Vendor('xmpush.Server');
- Vendor('xmpush.ServerSwitch');
- Vendor('xmpush.ErrorCode');
- Vendor('xmpush.IOSBuilder');
- if ($user_type == 0) {
- $secret = I_PUSH_TRAINER_SECRET; //app secret
- $package = I_PUSH_TRAINER_PACKAGE; //package
- } else {
- $secret = I_PUSH_COUCH_SECRET; //app secret
- $package = I_PUSH_COUCH_PACKAGE; //package
- }
- \Constants::setPackage($package);
- \Constants::setSecret($secret);
- if (APP_DEBUG) {
- \Constants::useSandbox();
- } else {
- \Constants::useOfficial();
- }
- $message = new \IOSBuilder();
- $desc = '【' . $title . '】
- ' . $desc;
- $message->description($desc);
- $message->soundUrl('default');
- $message->badge($badge);
- $message->extra('payload', $payload);
- $message->build();
- $sender = new \Sender();
- if ($aliasList == '*') {
- $data = $sender->broadcastAll($message)->getRaw();
- } else {
- $data = $sender->sendToAliases($message, $aliasList)->getRaw();
- }
- return $data;
- }
- /**
- * android推送
- * @author: hyz
- */
- protected function android($aliasList, $title, $desc, $payload,$user_type = 0) {
- Vendor('xmpush.Message');
- Vendor('xmpush.HttpBase');
- Vendor('xmpush.Sender');
- Vendor('xmpush.Constants');
- Vendor('xmpush.Stats');
- Vendor('xmpush.Tracer');
- Vendor('xmpush.Feedback');
- Vendor('xmpush.DevTools');
- Vendor('xmpush.Subscription');
- Vendor('xmpush.TargetedMessage');
- Vendor('xmpush.PushRequestPath');
- Vendor('xmpush.PushRequestType');
- Vendor('xmpush.Result');
- Vendor('xmpush.Server');
- Vendor('xmpush.ServerSwitch');
- Vendor('xmpush.ErrorCode');
- Vendor('xmpush.Builder');
- if ($user_type == 0) {
- $package = A_PUSH_TRAINER_PACKAGE;//package
- $secret = A_PUSH_TRAINER_SECRET; //app secret
- } else {
- $secret = A_PUSH_COUCH_SECRET; //app secret
- $package = A_PUSH_COUCH_PACKAGE; //package
- }
- \Constants::setPackage($package);
- \Constants::setSecret($secret);
- \Constants::useOfficial();
- $sender = new \Sender();
- $message = new \Builder();
- $message->title($title); // 通知栏的title
- $message->description($desc); // 通知栏的descption
- $message->passThrough(0); // 这是一条通知栏消息,如果需要透传,把这个参数设置成1,同时去掉title和descption两个参数
- $message->payload($payload); // 携带的数据,点击后将会通过客户端的receiver中的onReceiveMessage方法传入。
- $message->extra(\Builder::notifyEffect, 1); // 此处设置预定义点击行为,1为打开app
- $message->extra(\Builder::notifyForeground, 1); // 应用在前台是否展示通知,如果不希望应用在前台时候弹出通知,则设置这个参数为0
- $message->notifyId(2); // 通知类型。最多支持0-4 5个取值范围,同样的类型的通知会互相覆盖,不同类型可以在通知栏并存
- $message->build();
- if ($aliasList == '*') {
- $data = $sender->broadcastAll($message)->getRaw();
- } else {
- $data = $sender->sendToAliases($message, $aliasList)->getRaw();
- }
- return $data;
- }
- /**
- * 保存推送日志
- * @author: hyz
- */
- protected function save_pushlog($uids, $data, $os_type) {
- if ($data['result'] == 'ok') {
- preg_match('/\d+/', $data['info'], $mt);
- $log['total'] = intval($mt[0]);
- $log['trace_id'] = $data['trace_id'];
- $log['uids'] = implode(',', $uids);
- $log['os_type'] = $os_type;
- $log['c_time'] = myDate();
- cplog('推送日志:' . var_export($data, true), 'INFO');
- cplog('推送结果:' . var_export($log, true), 'INFO');
- //M('xmpush_log')->add($log);
- return $log['total'];
- } else {
- cplog('推送日志:' . var_export($data, true));
- return 0;
- }
- }
- }
|