| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- <?php
- namespace app\common\services;
- use app\common\events\message\SendMessageEvent;
- use app\common\facades\EasyWeChat;
- use app\common\models\AccountWechats;
- use app\common\models\Member;
- use app\common\models\notice\MessageTemp;
- use app\common\models\TemplateMessageRecord;
- use app\Jobs\DispatchesJobs;
- use app\Jobs\MessageNoticeJob;
- use Exception;
- use app\Jobs\MiniMessageNoticeJob;
- use app\common\models\FormId;
- class MessageService
- {
- /**
- * 消息推送,暂时使用,需要优化
- *
- * @param int $member_id
- * @param int $template_id
- * @param array $params
- * @param string $url
- * @return bool
- */
- public function push($member_id, $temp_id, array $params, $url='', $uniacid='')
- {
- if ($uniacid) {
- \Setting::$uniqueAccountId = \YunShop::app()->uniacid = $uniacid;
- } else{
- \Setting::$uniqueAccountId = \YunShop::app()->uniacid;
- }
-
- if(\Setting::get('shop.notice.toggle') == false){
- return false;
- }
- if (!$member_id || !$temp_id) {
- return false;
- }
- $temp = MessageTemp::withoutGlobalScopes(['uniacid'])->whereId($temp_id)->first();
- if (!$temp) {
- return false;
- }
- $template_id = $temp->template_id;
- if (!$template_id) {
- \Log::error("微信消息推送:MessageTemp::template_id参数不存在");
- return false;
- }
- $send_msg = $this->getSendMsg($temp, $params);
- $memberModel = $this->getMemberModel($member_id);
- if (!$memberModel) {
- return false;
- }
- $config = $this->getConfiguration($uniacid);
- try {
- if(empty($url)){
- $url = $temp->news_link;//todo 没有链接就是用模板设置的链接
- }
- $app = EasyWeChat::officialAccount($config);
- $userService = $app->user;
- $user = $userService->get($memberModel->hasOneFans->openid);
- if ($user['subscribe'] != 1 && $user->subscribe != 1) {
- \Log::debug('微信消息推送:用户未关注公众号',$user);
- return false;
- }
- $app->template_message->send([
- 'touser' => $memberModel->hasOneFans->openid,
- 'template_id' => $template_id,
- 'url' => $url,
- 'data' => $send_msg,
- ]);
- } catch (Exception $error) {
- TemplateMessageRecord::create([
- 'uniacid' => \YunShop::app()->uniacid,
- 'member_id' => $member_id,
- 'template_id' => $template_id,
- 'url' => $url?:'无',
- 'openid' => $memberModel->hasOneFans->openid ?: 0,
- 'data' => json_encode($send_msg),
- 'send_time' => time(),
- 'status' => -1,
- 'extend_data' => $error->getMessage(),
- ]);
- return true;
- }
- return true;
- }
- /**
- * 会员信息
- *
- * @param $member_id
- * @return bool
- */
- private function getMemberModel($member_id)
- {
- if (!$member_id) {
- \Log::error("微信消息推送:uid参数不存在");
- return false;
- }
- $memberModel = Member::whereUid($member_id)->with([
- 'hasOneFans' => function($q) {
- $q->uniacid();
- }])->first();
- if (!isset($memberModel)) {
- \Log::error("微信消息推送:未找到uid:{$member_id}的用户");
- return false;
- }
- if (!$memberModel->isFollow()) {
- \Log::error("微信消息推送:会员uid:{$member_id}未关注公众号");
- return false;
- }
- if (!$memberModel->hasOneFans->openid) {
- \Log::error("微信消息推送:会员uid:{$member_id} 没有openid");
- return false;
- }
- return $memberModel;
- }
- /**
- * 获取公众号配置信息
- *
- * @return array|bool
- */
- public function getConfiguration($uniacid)
- {
- if ($uniacid) {
- \Setting::$uniqueAccountId = \YunShop::app()->uniacid = $uniacid;
- } else{
- \Setting::$uniqueAccountId = \YunShop::app()->uniacid;
- }
- $accountWechat = AccountWechats::getAccountByUniacid(\YunShop::app()->uniacid);
- if (!isset($accountWechat)) {
- \Log::error("微信消息推送:未找到uniacid:{$uniacid}的配置信息");
- return false;
- }
- return ['app_id' => $accountWechat->key, 'secret' => $accountWechat->secret];
- }
- private function getSendMsg($temp, $params)
- {
- $msg = [
- 'first' => [
- 'value' => $this->replaceTemplate($temp->first, $params),
- 'color' => $temp->first_color
- ],
- 'remark' => [
- 'value' => $this->replaceTemplate($temp->remark, $params),
- 'color' => $temp->remark_color
- ]
- ];
- foreach ($temp->data as $row) {
- $msg[$row['keywords']] = [
- 'value' => $this->replaceTemplate($row['value'], $params),
- 'color' => $row['color']
- ];
- }
- return $msg;
- }
- private function replaceTemplate($str, $datas = array())
- {
- foreach ($datas as $row ) {
- $str = str_replace('[' . $row['name'] . ']', $row['value'], $str);
- }
- return $str;
- }
- /*todo 一下代码需要重构,重新分化类功能 2018-03-23 yitian*/
- /**
- * 发送微信模板消息
- *
- * @param $templateId
- * @param $data
- * @param $uid
- * @param string $uniacid
- * @param string $url
- * @return bool
- */
- public static function MiniNotice($templateId, $data, $uid, $uniacid = '', $url = '',$scene = '')
- {
- \Log::debug('==============miniApp===================',[$templateId,$data,$uid]);
- // $res = AccountWechats::getAccountByUniacid(\YunShop::app()->uniacid);
- $res = \Setting::get('plugin.min_app');
- $options = [
- 'app_id' => $res['key'],
- 'secret' => $res['secret'],
- ];
- $member = Member::whereUid($uid)->first();
- if (!isset($member)) {
- \Log::error("小程序消息推送失败,未找到uid:{$uid}的用户");
- return false;
- }
- if(empty($scene)){
- $createTime = $member->hasOneMiniApp->formId_create_time;
- $time=strtotime (date("Y-m-d H:i:s")); //当前时间
- $minute=floor(($time-$createTime) % (86400/60));
- \Log::info('小程序消息推送时间',$createTime."----".$time."----".$minute);
- if ($minute > 10080 && empty($createTime)){
- \Log::error("小程序消息推送失败,formId失效");
- return false;
- }
- // $scene = $member->hasOneMiniApp->formId;
- // $pieces = explode("#", $scene);
- // $scene = array_shift($pieces);//获取首个元素并删除
- // $str = implode("#", $pieces);
- // MemberMiniAppModel::where('member_id',$uid)->uniacid()->update(['formId'=>$str]);
- $scene = FormId::orderBy('addtime','desc')->first();
- $scene = empty($scene) ? array() : $scene->toArray();
- \Log::info('小程序scene',$scene);
- }
- \Log::info('小程序消息scene',$scene);
- if(empty($scene)){
- \Log::error("小程序消息推送失败,formId失效");
- return false;
- }
- $job = new MiniMessageNoticeJob($options, $templateId, $data,$member->hasOneMiniApp->openid, $url,$scene['formid'] );
- DispatchesJobs::dispatch($job,DispatchesJobs::LOW);
- FormId::where('id',$scene['id'])->delete();//删除formid减少消耗
- }
- public static function notice($templateId, $data, $uid, $uniacid = '', $url = '',$miniApp = [])
- {
- if (\Setting::get('shop.notice.toggle') == false) {
- return false;
- }
- $member = Member::whereUid($uid)->first();
- if (!isset($member)) {
- \Log::error("微信消息推送失败,未找到uid:{$uid}的用户");
- return false;
- }
- if (!$member->isFollow()) {
- return false;
- }
- $job = new MessageNoticeJob($templateId, $data, $member->hasOneFans->openid, $url);
- DispatchesJobs::dispatch($job,DispatchesJobs::LOW);
- }
- public static function getWechatTemplates()
- {
- $app = app('wechat');
- $notice = $app->notice;
- return $notice->getPrivateTemplates();
- }
- /**
- * 验证"模板消息ID" 是否有效
- * @param $template_id
- * @return array
- */
- public static function verifyTemplateId($template_id)
- {
- $templates = self::getWechatTemplates()->get('template_list');
- if (!isset($templates)) {
- return [
- 'status' => -1,
- 'msg' => '任务处理通知模板id错误'
- ];
- }
- $template = collect($templates)->where('template_id', $template_id)->first();
- if (!isset($template)) {
- return [
- 'status' => -1,
- 'msg' => '任务处理通知模板id错误'
- ];
- }
- return [
- 'status' => 1
- ];
- }
- /**
- * 发送微信"客服消息"
- * @param $openid
- * @param $data
- * 文本消息: $data = new Text(['content' => 'Hello']);
- * 图文消息:
- * $data = new News([
- * 'title' => 'your_title',
- * 'image' => 'your_image',
- * 'description' => 'your_description',
- * 'url' => 'your_url',
- * ]);
- */
- public static function sendCustomerServiceNotice($openid, $data)
- {
- $app = app('wechat');
- if (array_key_exists('content', $data)) {
- $data = new Text($data); //发送文本消息
- } else {
- $data = new News($data); //发送图文消息
- }
- $app->staff->message($data)->to($openid)->send();
- }
- }
|