ForceSubscribeDelayMsgJob.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. <?php
  2. namespace App\Jobs;
  3. use App\Jobs\Job;
  4. use App\Modules\OfficialAccount\Models\ForceSubscribeDelayMsg;
  5. use GuzzleHttp\Client;
  6. use GuzzleHttp\Psr7\Request as GuzzleRequest;
  7. use Illuminate\Queue\SerializesModels;
  8. use Illuminate\Queue\InteractsWithQueue;
  9. use Illuminate\Contracts\Queue\ShouldQueue;
  10. use Illuminate\Support\Facades\DB;
  11. use Illuminate\Support\Facades\Log;
  12. use App\Http\Controllers\WechatController;
  13. class ForceSubscribeDelayMsgJob extends Job implements ShouldQueue
  14. {
  15. use InteractsWithQueue, SerializesModels;
  16. private $data;
  17. /**
  18. * Create a new job instance.
  19. *
  20. * @return void
  21. */
  22. public function __construct($data)
  23. {
  24. $this->data = $data;
  25. }
  26. /**
  27. * Execute the job.
  28. *
  29. * @return void
  30. */
  31. public function handle()
  32. {
  33. Log::info('~~~~~~~~~~~~~~~~~~开始执行关注后延时回复消息队列~~~~~~~~~~~~~~~~~~');
  34. Log::info('参数: '.json_encode($this->data, 256));
  35. $client = new Client();
  36. $access_token_list = [];
  37. $this->data = (object)$this->data;
  38. //用户类型是否满足条件
  39. $is_access = self::msgUserTypeIsAccess($this->data->distribution_channel_id,$this->data->time_delay,$this->data->openid,$msg);
  40. if(!$is_access) {
  41. DB::connection('api_mysql')->table('force_subscribe_delay_msg_send_record')->where('id',$this->data->id)
  42. ->update([
  43. 'send_status'=>$msg,
  44. 'send_time'=>date('Y-m-d H:i:s'),
  45. 'updated_at'=>date('Y-m-d H:i:s'),
  46. 'send_result'=>''
  47. ]);
  48. }
  49. if(isset($access_token_list[$this->data->appid])){
  50. $access_token = $access_token_list[$this->data->appid];
  51. }else{
  52. $access_token = self::getAccessToken($this->data->appid);
  53. if($access_token){
  54. $access_token_list[$this->data->appid] = $access_token;
  55. }
  56. }
  57. if ($this->data->mode == 1 && $this->data->link) {
  58. if(stripos($this->data->link,'?') !== false){
  59. $link = $this->data->link.'&fromtype=subscribe_delay_'.$this->data->id;
  60. }else{
  61. $link = $this->data->link.'?fromtype=subscribe_delay_'.$this->data->id;
  62. }
  63. }
  64. if($access_token){
  65. if ($this->data->mode == 1) {
  66. $result = self::send($client,$access_token,$this->data->openid,textDecode($this->data->title),textDecode($this->data->desc),$link,$this->data->icon);
  67. }elseif ($this->data->mode == 2) {
  68. $nickname = DB::connection('api_mysql')->table('users')->where(['openid'=>$this->data->openid, 'distribution_channel_id'=>$this->data->distribution_channel_id])->value('nickname');
  69. $content = textDecode(str_replace('{user}', $nickname, $this->data->content));
  70. $result = self::sendMsg($client,$access_token,$this->data->openid,$content);
  71. $content = $nickname = null;
  72. }
  73. $result_array = \GuzzleHttp\json_decode($result,1);
  74. if(isset($result_array['errcode']) && $result_array['errcode'] == 0){
  75. $send_status = 'send_success';
  76. }else{
  77. $send_status = 'send_fail';
  78. }
  79. DB::connection('api_mysql')->table('force_subscribe_delay_msg_send_record')->where('id',$this->data->id)
  80. ->update([
  81. 'send_status'=>$send_status,
  82. 'send_time'=>date('Y-m-d H:i:s'),
  83. 'updated_at'=>date('Y-m-d H:i:s'),
  84. 'send_result'=>$result
  85. ]);
  86. }
  87. Log::info('~~~~~~~~~~~~~~~~~~结束执行关注后延时回复消息队列~~~~~~~~~~~~~~~~~~');
  88. }
  89. public static function msgUserTypeIsAccess($distribution_channel_id,$time_delay,$openid,&$msg){
  90. $forceSubscribeDelayMsg = ForceSubscribeDelayMsg::where('distribution_channel_id',$distribution_channel_id)
  91. ->where('time_delay',$time_delay)
  92. ->where('is_show',1)
  93. ->where('is_enable',1)
  94. ->select('user_type')
  95. ->first();
  96. $msg = '';
  97. if(!$forceSubscribeDelayMsg) {
  98. $msg = 'sys-error';
  99. return false;
  100. }
  101. if(strtoupper($forceSubscribeDelayMsg->user_type) == 'ALL') return true;
  102. //已付费用户
  103. $force_subscribe_user = DB::connection('api_mysql')->table('temp_force_subscribe_users')->where('openid',$openid)->where('is_subscribed',1)->select('uid')->first();
  104. // if(!$force_subscribe_user) {
  105. // $msg = 'no subscribe';
  106. // return false;
  107. // }
  108. // if(!$force_subscribe_user->uid) {
  109. // $msg = 'no subscribe uid';
  110. // return false;
  111. // }
  112. if(strtoupper($forceSubscribeDelayMsg->user_type) == 'PAID'){
  113. if (isset($force_subscribe_user->uid) && !empty($force_subscribe_user->uid)) {
  114. $paid_count = DB::connection('api_mysql')->table('orders')->where('uid',$force_subscribe_user->uid)->where('status','PAID')->count();
  115. if($paid_count && $paid_count >0)
  116. return true;
  117. $msg = 'need paid';
  118. return false;
  119. } else {
  120. return false;
  121. }
  122. }
  123. //未已付费用户
  124. if(strtoupper($forceSubscribeDelayMsg->user_type) == 'UNPAID'){
  125. if (isset($force_subscribe_user->uid) && !empty($force_subscribe_user->uid)) {
  126. $paid_count = DB::connection('api_mysql')->table('orders')->where('uid',$force_subscribe_user->uid)->where('status','PAID')->count();
  127. if($paid_count && $paid_count >0) {
  128. $msg = 'need unpaid';
  129. return false;
  130. }
  131. return true;
  132. }elseif ($force_subscribe_user) {
  133. return true;
  134. }else {
  135. return false;
  136. }
  137. }
  138. $msg = 'unknown type';
  139. return false;
  140. }
  141. private static function getAccessToken($appid){
  142. try{
  143. $WechatController = new WechatController($appid);
  144. $accessToken = $WechatController->app->access_token;
  145. $token = $accessToken->getToken();
  146. return $token;
  147. }catch(\Exception $e){
  148. \Log::error($e);
  149. }
  150. return '';
  151. }
  152. // 发送图文消息
  153. private static function send(Client $client,$access_token,$openid,$title,$description,$url,$picurl){
  154. $push_url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$access_token;
  155. $request = new GuzzleRequest('post',$push_url,[],\GuzzleHttp\json_encode([
  156. 'touser'=>$openid,
  157. 'msgtype'=>'news',
  158. 'news'=>[
  159. 'articles'=>[compact('title','description','url','picurl')]
  160. ]
  161. ],JSON_UNESCAPED_UNICODE));
  162. try{
  163. return $client->send($request)->getBody()->getContents();
  164. }catch (\Exception $e){}
  165. return '';
  166. }
  167. // 发送文字消息
  168. private static function sendMsg(Client $client,$access_token,$openid,$content){
  169. $push_url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$access_token;
  170. $request = new GuzzleRequest('post',$push_url,[],\GuzzleHttp\json_encode([
  171. 'touser'=>$openid,
  172. 'msgtype'=>'text',
  173. 'text'=>[
  174. 'content'=>$content
  175. ]
  176. ],JSON_UNESCAPED_UNICODE));
  177. try{
  178. return $client->send($request)->getBody()->getContents();
  179. }catch (\Exception $e){}
  180. return '';
  181. }
  182. public function failed(\Exception $exception)
  183. {
  184. Log::error('关注后延迟消息发送异常,异常原因: '.$exception->getMessage());
  185. }
  186. }