| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- <?php
- namespace common\components;
- class push
- {
- // 消息类型
- const MSG_TYPE_ORDER = 'order'; // 订单消息
- const MSG_TYPE_LOGISTICS = 'logistics'; // 物流消息
- const MSG_TYPE_ACCOUNT = 'account'; // 账户消息
- const MSG_TYPE_WORK = 'work'; // 工作事项提醒
- const MSG_TYPE_SUBSCRIPTION = 'subscription'; // 订阅消息
- const SECRET = 'RIVATE_KEY_S^@VJDy7'; // 👈 与云函数中保持一致
- const GHS_URL = 'https://fc-mp-42d1a66f-2aec-4fc5-9d92-4d176bf3d337.next.bspapp.com/ghs/push';
- const HD_URL = 'https://fc-mp-027cce01-d39a-4ed2-8b09-1f4ff43ec945.next.bspapp.com/hd/push';
- // 私有属性
- private $url = '';
- private $msgType = '';
- public function __construct($client, $msgType) {
- if ($client == 'ghs') {
- $this->url = self::GHS_URL;
- } else if ($client == 'hd') {
- $this->url = self::HD_URL;
- } else {
- throw new \Exception('client not found');
- }
- $this->msgType = $msgType;
- }
- /**
- * 实现部分厂商特定功能,包括仅部分厂商支持、不常用或厂商临时新增的功能(不依赖 uni-push,厂商文档支持的参数可直接使用)。
- * 例如:推送渠道 ID、消息分类(部分厂商未配置时可能被限量推送或静默推送,即静音且需下拉系统通知栏才可见通知内容)、通知栏富文本
- */
- public function initOptions() {
- $optionsArr = [];
- switch ($this->msgType) {
- case self::MSG_TYPE_ORDER:
- $optionsArr = [ "android" =>
- [
- "XM" => [
- "/extra.channel_id" => "142743" //小米后台申请的通知类别id -- https://admin.xmpush.xiaomi.com/zh_CN/channel/list?appId=2882303761520146676
- ],
- "HW" => [
- "/message/android/category" => "EXPRESS"
- ],
- "VV" => [
- "/category" => "ORDER"
- ],
- ]
- ];
- break;
- case self::MSG_TYPE_LOGISTICS:
- $optionsArr = [ "android" =>
- [
- "XM" => [
- "/extra.channel_id" => "142744"
- ],
- "HW" => [
- "/message/android/category" => "EXPRESS"
- ],
- "VV" => [
- "/category" => "ORDER"
- ],
- ]
- ];
- break;
- case self::MSG_TYPE_ACCOUNT:
- $optionsArr = [ "android" =>
- [
- "XM" => [
- "/extra.channel_id" => "142895"
- ],
- "HW" => [
- "/message/android/category" => "ACCOUNT"
- ],
- "VV" => [
- "/category" => "ACCOUNT"
- ],
- ]
- ];
- break;
- case self::MSG_TYPE_WORK:
- $optionsArr = [ "android" =>
- [
- "XM" => [
- "/extra.channel_id" => "142892"
- ],
- "HW" => [
- "/message/android/category" => "WORK"
- ],
- "VV" => [
- "/category" => "TODO"
- ],
- ]
- ];
- break;
- case self::MSG_TYPE_SUBSCRIPTION:
- $optionsArr = [ "android" =>
- [
- "XM" => [
- "/extra.channel_id" => "0" // TODO 暂无
- ],
- "HW" => [
- "/message/android/category" => "SUBSCRIPTION"
- ],
- "VV" => [
- "/category" => "SUBSCRIPTION"
- ],
- ]
- ];
- break;
- }
- return $optionsArr;
- }
- public function pushByCloud($cids, $title, $content, $payload = [])
- {
- $sign = md5($title . $content . self::SECRET);
- $optionsArr = $this->initOptions();
- // 测试环境的特殊处理
- if ( getenv('YII_ENV') == 'dev') {
- $optionsArr["android"]["HW"]["/message/android/target_user_type"] = 1; //华为 -- 值为int 类型。1 表示华为测试消息,华为每个应用每日可发送该测试消息500条,此target_user_type 参数请勿发布至线上。
- $optionsArr["android"]["VV"]["/pushMode"] = 1; //VIVO -- 值为int 类型。0 表示正式推送;1 表示测试推送,不填默认为0。线上请勿使用测试推送
- $optionsArr["android"]["HO"]["/android/targetUserType"] = 1; //荣耀 -- 值为int 类型。1 表示测试推送,不填默认为0。荣耀每个应用每日可发送该测试消息1000条。此测试参数请勿发布至线上。
- }
- $data = [
- 'cid' => is_array($cids) ? $cids : [$cids],
- 'title' => $title,
- 'content' => $content,
- 'payload' => $payload,
- 'force_notification' => true, // true: 无论是离线推送还是在线推送,都自创建通知栏消息
- 'sign' => $sign,
- 'options' => $optionsArr
- ];
- $ch = curl_init($this->url);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_HTTPHEADER, [
- 'Content-Type: application/json'
- ]);
- curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
- $res = curl_exec($ch);
- curl_close($ch);
- return json_decode($res, true);
- }
- }
|