ForceSubscribeDelayMsgService.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: z-yang
  5. * Date: 2020/2/6
  6. * Time: 22:09
  7. */
  8. namespace App\Modules\OfficialAccount\Services;
  9. use App\Jobs\SendNews;
  10. use App\Jobs\SendTexts;
  11. use App\Modules\OfficialAccount\Models\ForceSubscribeDelayMsg;
  12. use App\Http\Controllers\WechatController;
  13. use GuzzleHttp\Client;
  14. use GuzzleHttp\Psr7\Request as GuzzleRequest;
  15. use DB;
  16. class ForceSubscribeDelayMsgService
  17. {
  18. public static function getList($distribution_channel_id){
  19. return ForceSubscribeDelayMsg::where('distribution_channel_id',$distribution_channel_id)
  20. ->where('is_show',1)
  21. ->where('is_enable',1)
  22. ->select('id',
  23. 'distribution_channel_id',
  24. 'title',
  25. 'link',
  26. 'icon',
  27. 'desc',
  28. 'time_delay',
  29. 'is_enable')
  30. ->get();
  31. }
  32. public static function queue($distribution_channel_id,$appid,$openid){
  33. $list = self::getList($distribution_channel_id);
  34. if($list->isEmpty())return ;
  35. foreach ($list as $item){
  36. try{
  37. $inset_data = [
  38. 'openid'=>$openid,
  39. 'title'=>$item->title,
  40. 'link'=>$item->link,
  41. 'icon'=>$item->icon,
  42. 'desc'=>$item->desc,
  43. 'appid'=>$appid,
  44. 'time_delay'=>$item->time_delay,
  45. 'distribution_channel_id'=>$distribution_channel_id
  46. ];
  47. $inset_data['created_at'] = date('Y-m-d H:i:s');
  48. $inset_data['updated_at'] = date('Y-m-d H:i:s');
  49. $inset_data['predict_send_time'] = date('Y-m-d H:i:s',time()+$item->time_delay);
  50. $inset_data['send_status'] = 'ready';
  51. //$id = DB::table('force_subscribe_delay_msg_send_record')->insertGetId($inset_data);
  52. DB::connection('api_mysql')->table('force_subscribe_delay_msg_send_record')->insert($inset_data);
  53. if(stripos($item->link,'?') !== false){
  54. $link = $item->link.'&fromtype=subscribe_delay&send_time='.(time()+$item->time_delay);
  55. }else{
  56. $link = $item->link.'?fromtype=subscribe_delay&send_time='.(time()+$item->time_delay);
  57. }
  58. $send_content = [];
  59. $send_content[] = [
  60. ['title'=>$item->title],
  61. ['description'=>$item->desc],
  62. ['url'=> $link],
  63. ['image'=>$item->icon]
  64. ];
  65. $send_data=array(
  66. 'send_time'=>date("Y-m-d H:i:s"),
  67. 'data' => [
  68. 'openid'=>$openid,
  69. 'appid'=>$appid,
  70. 'type'=>'one_task',
  71. 'task_id'=>3,
  72. 'news_content'=>json_encode($send_content)
  73. ]
  74. );
  75. //$job = (new SendNews($send_data))->onConnection('rabbitmq')->delay($item->time_delay)->onQueue('send_news_list');
  76. //dispatch($job);
  77. }catch (\Exception $e){
  78. }
  79. }
  80. }
  81. public static function dequeue($openid){
  82. DB::connection('api_mysql')->table('force_subscribe_delay_msg_send_record')->where('openid',$openid)
  83. ->where('send_status','ready')->update([
  84. 'send_status'=>'unsubscribe',
  85. 'updated_at'=>date('Y-m-d H:i:s')
  86. ]);
  87. }
  88. public static function getSendList($time_delay){
  89. $result = DB::connection('api_mysql')->table('force_subscribe_delay_msg_send_record')->where('send_status','ready')
  90. ->where('predict_send_time','>=',date('Y-m-d H:i:s',time()-$time_delay*2))
  91. ->where('predict_send_time','<=',date('Y-m-d H:i:s',time()+$time_delay))
  92. ->select('openid','id','desc','link','icon','appid','title','distribution_channel_id','time_delay')
  93. ->get();
  94. if($result){
  95. $client = new Client();
  96. $access_token_list = [];
  97. foreach ($result as $item){
  98. //用户类型是否满足条件
  99. $is_access = self::msgUserTypeIsAccess($item->distribution_channel_id,$item->time_delay,$item->openid,$msg);
  100. if(!$is_access) {
  101. DB::connection('api_mysql')->table('force_subscribe_delay_msg_send_record')->where('id',$item->id)
  102. ->update([
  103. 'send_status'=>$msg,
  104. 'send_time'=>date('Y-m-d H:i:s'),
  105. 'updated_at'=>date('Y-m-d H:i:s'),
  106. 'send_result'=>''
  107. ]);
  108. continue;
  109. }
  110. if(isset($access_token_list[$item->appid])){
  111. $access_token = $access_token_list[$item->appid];
  112. }else{
  113. $access_token = self::getAccessToken($item->appid);
  114. if($access_token){
  115. $access_token_list[$item->appid] = $access_token;
  116. }
  117. }
  118. if(stripos($item->link,'?') !== false){
  119. $link = $item->link.'&fromtype=subscribe_delay_'.$item->id;
  120. }else{
  121. $link = $item->link.'?fromtype=subscribe_delay_'.$item->id;
  122. }
  123. if($access_token){
  124. $result = self::send($client,$access_token,$item->openid,$item->title,$item->desc,$link,$item->icon);
  125. $result_array = \GuzzleHttp\json_decode($result,1);
  126. if(isset($result_array['errcode']) && $result_array['errcode'] == 0){
  127. $send_status = 'send_success';
  128. }else{
  129. $send_status = 'send_fail';
  130. }
  131. DB::connection('api_mysql')->table('force_subscribe_delay_msg_send_record')->where('id',$item->id)
  132. ->update([
  133. 'send_status'=>$send_status,
  134. 'send_time'=>date('Y-m-d H:i:s'),
  135. 'updated_at'=>date('Y-m-d H:i:s'),
  136. 'send_result'=>$result
  137. ]);
  138. }
  139. }
  140. }
  141. }
  142. public static function msgUserTypeIsAccess($distribution_channel_id,$time_delay,$openid,&$msg){
  143. $forceSubscribeDelayMsg = ForceSubscribeDelayMsg::where('distribution_channel_id',$distribution_channel_id)
  144. ->where('time_delay',$time_delay)
  145. ->where('is_show',1)
  146. ->where('is_enable',1)
  147. ->select('user_type')
  148. ->first();
  149. $msg = '';
  150. if(!$forceSubscribeDelayMsg) {
  151. $msg = 'sys-error';
  152. return false;
  153. }
  154. if(strtoupper($forceSubscribeDelayMsg->user_type) == 'ALL') return true;
  155. //已付费用户
  156. $force_subscribe_user = DB::connection('api_mysql')->table('force_subscribe_users')->where('openid',$openid)->where('is_subscribed',1)->select('uid')->first();
  157. if(!$force_subscribe_user) {
  158. $msg = 'no subscribe';
  159. return false;
  160. }
  161. if(!$force_subscribe_user->uid) {
  162. $msg = 'no subscribe uid';
  163. return false;
  164. }
  165. if(strtoupper($forceSubscribeDelayMsg->user_type) == 'PAID'){
  166. $paid_count = DB::connection('api_mysql')->table('orders')->where('uid',$force_subscribe_user->uid)->where('status','PAID')->count();
  167. if($paid_count && $paid_count >0)
  168. return true;
  169. $msg = 'need paid';
  170. return false;
  171. }
  172. //未已付费用户
  173. if(strtoupper($forceSubscribeDelayMsg->user_type) == 'UNPAID'){
  174. $paid_count = DB::connection('api_mysql')->table('orders')->where('uid',$force_subscribe_user->uid)->where('status','PAID')->count();
  175. if($paid_count && $paid_count >0) {
  176. $msg = 'need unpaid';
  177. return false;
  178. }
  179. return true;
  180. }
  181. $msg = 'unknown type';
  182. return false;
  183. }
  184. private static function getAccessToken($appid){
  185. try{
  186. $WechatController = new WechatController($appid);
  187. $accessToken = $WechatController->app->access_token;
  188. $token = $accessToken->getToken();
  189. return $token;
  190. }catch(\Exception $e){
  191. \Log::error($e);
  192. }
  193. return '';
  194. }
  195. private static function send(Client $client,$access_token,$openid,$title,$description,$url,$picurl){
  196. $push_url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$access_token;
  197. $request = new GuzzleRequest('post',$push_url,[],\GuzzleHttp\json_encode([
  198. 'touser'=>$openid,
  199. 'msgtype'=>'news',
  200. 'news'=>[
  201. 'articles'=>[compact('title','description','url','picurl')]
  202. ]
  203. ],JSON_UNESCAPED_UNICODE));
  204. try{
  205. return $client->send($request)->getBody()->getContents();
  206. }catch (\Exception $e){}
  207. return '';
  208. }
  209. }