WechatOpen.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
  4. * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
  5. * @author pillar<ltmn@qq.com>
  6. * 微信第三方开放平台开放-接入
  7. */
  8. namespace app\system\controller\event;
  9. use think\Controller;
  10. use app\common\facade\WechatMp;
  11. use app\common\facade\WechatProgram;
  12. use app\common\model\SystemMemberMiniapp;
  13. use app\common\model\SystemMemberKeyword;
  14. use app\common\model\SystemMemberMiniappToken;
  15. use EasyWeChat\OpenPlatform\Server\Guard;
  16. use EasyWeChat\Kernel\Messages\Text;
  17. use EasyWeChat\Kernel\Messages\Image;
  18. use EasyWeChat\Kernel\Messages\News;
  19. use EasyWeChat\Kernel\Messages\NewsItem;
  20. use EasyWeChat\Kernel\Messages\Media;
  21. use think\facade\Log;
  22. use Exception;
  23. class WechatOpen extends Controller{
  24. /**
  25. * 微信开放平台推送车票(1次/10分钟)
  26. * 有了车票要保存下来,获取授权时要用
  27. * @return json
  28. */
  29. public function ticket(){
  30. try {
  31. $server = WechatMp::openConfig()->server;
  32. // 处理授权成功事件
  33. $server->push(function ($message) {
  34. Log::write($message,'EVENT_AUTHORIZED');
  35. }, Guard::EVENT_AUTHORIZED);
  36. // 处理授权更新事件
  37. $server->push(function ($message) {
  38. Log::write($message,'EVENT_UPDATE_AUTHORIZED');
  39. }, Guard::EVENT_UPDATE_AUTHORIZED);
  40. //处理授权取消事件
  41. $server->push(function ($message) {
  42. SystemMemberMiniappToken::where(['authorizer_appid' => $message['AuthorizerAppid']])->delete();
  43. Log::write($message,'EVENT_UNAUTHORIZED');
  44. }, Guard::EVENT_UNAUTHORIZED);
  45. $server->serve();
  46. return response("success");
  47. }catch (Exception $e) {
  48. $this->error($e->getMessage());
  49. }
  50. }
  51. /**
  52. * 微信开放平台事件接受
  53. * @return json
  54. */
  55. public function message($appid){
  56. try {
  57. //公众号和小程序开放平台接入验证
  58. if ($appid == 'wx570bc396a51b8ff8' || $appid == 'wxd101a85aa106f53e') {
  59. $app = $appid == 'wx570bc396a51b8ff8' ? WechatMp::openConfig()->officialAccount($appid) : WechatMp::openConfig()->miniProgram($appid);
  60. $app->server->push(function ($message) {
  61. switch ($message['MsgType']) {
  62. case 'event':
  63. return $message['Event'].'from_callback';
  64. break;
  65. case 'text':
  66. if ($message['Content'] == "TESTCOMPONENT_MSG_TYPE_TEXT") {
  67. return 'TESTCOMPONENT_MSG_TYPE_TEXT_callback';
  68. } else {
  69. $authCode = explode(":",$message['Content'])[1];
  70. return new Text($authCode."_from_api");
  71. }
  72. break;
  73. default;
  74. return new Text("wecaht open account verify");
  75. break;
  76. }
  77. });
  78. } else {
  79. $miniapp = SystemMemberMiniapp::whereOr(['miniapp_appid' => $appid,'mp_appid' => $appid])->field('id,miniapp_appid,mp_appid')->find();
  80. if(empty($miniapp)){
  81. return response("fail");
  82. }
  83. $member_miniapp_id = $miniapp->id;
  84. $is_miniapp = 0;
  85. if($miniapp->mp_appid == $appid){
  86. $app = WechatMp::isTypes($member_miniapp_id);
  87. }else{
  88. $app = WechatProgram::isTypes($member_miniapp_id);
  89. $is_miniapp = 1;
  90. }
  91. $app->server->push(function($message) use ($member_miniapp_id,$is_miniapp){
  92. if($message['MsgType'] == 'event'){
  93. $keyword = isset($message['EventKey']) ? $message['EventKey'] : $message['Event'];
  94. }else{
  95. $keyword = $message['Content'];
  96. }
  97. $rel = SystemMemberKeyword::where(['member_miniapp_id' => $member_miniapp_id,'is_miniapp' => $is_miniapp,'keyword' => $keyword])->find();
  98. if(empty($rel)){
  99. return;
  100. }
  101. switch ($rel->type) {
  102. case 'link':
  103. $item = ['title' => $rel->title,'description' => $rel->content,'url' => $rel->url];
  104. if($is_miniapp){
  105. $item['thumb_url'] = $rel->image;
  106. }else{
  107. $item['image'] = $rel->image;
  108. }
  109. $items = [new NewsItem($item)];
  110. $msg = new News($items);
  111. break;
  112. case 'image':
  113. $msg = new Image($rel->media_id);
  114. break;
  115. case 'media':
  116. $msg = new Media($rel->media_id,'mpnews'); //mpnews、mpvideo、voice、image
  117. break;
  118. default:
  119. $msg = new Text($rel->content);
  120. break;
  121. }
  122. if($is_miniapp){
  123. WechatProgram::isTypes($member_miniapp_id)->customer_service->message($msg)->to($message['FromUserName'])->send();
  124. }else{
  125. return $msg;
  126. }
  127. });
  128. }
  129. $app->server->serve()->send();
  130. }catch (Exception $e) {
  131. $this->error($e->getMessage());
  132. }
  133. }
  134. }