Index.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <?php
  2. namespace addons\wechat\controller;
  3. use app\common\model\WechatAutoreply;
  4. use app\common\model\WechatContext;
  5. use app\common\model\WechatResponse;
  6. use app\common\model\WechatConfig;
  7. use EasyWeChat\Foundation\Application;
  8. use EasyWeChat\Payment\Order;
  9. use addons\wechat\library\Wechat as WechatService;
  10. use addons\wechat\library\Config as ConfigService;
  11. use think\Log;
  12. /**
  13. * 微信接口
  14. */
  15. class Index extends \think\addons\Controller
  16. {
  17. public $app = null;
  18. public function _initialize()
  19. {
  20. parent::_initialize();
  21. $this->app = new Application(ConfigService::load());
  22. }
  23. /**
  24. *
  25. */
  26. public function index()
  27. {
  28. $this->error("当前插件暂无前台页面");
  29. }
  30. /**
  31. * 微信API对接接口
  32. */
  33. public function api()
  34. {
  35. $this->app->server->setMessageHandler(function ($message) {
  36. $WechatService = new WechatService;
  37. $WechatContext = new WechatContext;
  38. $WechatResponse = new WechatResponse;
  39. $openid = $message->FromUserName;
  40. $to_openid = $message->ToUserName;
  41. $event = $message->Event;
  42. $eventkey = $message->EventKey ? $message->EventKey : $message->Event;
  43. $unknownmessage = WechatConfig::value('default.unknown.message');
  44. $unknownmessage = $unknownmessage ? $unknownmessage : "对找到对应指令!";
  45. switch ($message->MsgType)
  46. {
  47. case 'event': //事件消息
  48. switch ($event)
  49. {
  50. case 'subscribe'://添加关注
  51. $subscribemessage = WechatConfig::value('default.subscribe.message');
  52. $subscribemessage = $subscribemessage ? $subscribemessage : "欢迎关注我们!";
  53. return $subscribemessage;
  54. case 'unsubscribe'://取消关注
  55. return '';
  56. case 'LOCATION'://获取地理位置
  57. return '';
  58. case 'VIEW': //跳转链接,eventkey为链接
  59. return '';
  60. default:
  61. break;
  62. }
  63. $response = $WechatResponse->where(["eventkey" => $eventkey, 'status' => 'normal'])->find();
  64. if ($response)
  65. {
  66. $content = (array) json_decode($response['content'], TRUE);
  67. $context = $WechatContext->where(['openid' => $openid])->find();
  68. $data = ['eventkey' => $eventkey, 'command' => '', 'refreshtime' => time(), 'openid' => $openid];
  69. if ($context)
  70. {
  71. $WechatContext->data($data)->where('id', $context['id'])->update();
  72. $data['id'] = $context['id'];
  73. }
  74. else
  75. {
  76. $id = $WechatContext->data($data)->save();
  77. $data['id'] = $id;
  78. }
  79. $result = $WechatService->response($this, $openid, $content, $data);
  80. if ($result)
  81. {
  82. return $result;
  83. }
  84. }
  85. return $unknownmessage;
  86. case 'text': //文字消息
  87. case 'image': //图片消息
  88. case 'voice': //语音消息
  89. case 'video': //视频消息
  90. case 'location': //坐标消息
  91. case 'link': //链接消息
  92. default: //其它消息
  93. //上下文事件处理
  94. $context = $WechatContext->where(['openid' => ['=', $openid], 'refreshtime' => ['>=', time() - 1800]])->find();
  95. if ($context && $context['eventkey'])
  96. {
  97. $response = $WechatResponse->where(['eventkey' => $context['eventkey'], 'status' => 'normal'])->find();
  98. if ($response)
  99. {
  100. $WechatContext->data(array('refreshtime' => time()))->where('id', $context['id'])->update();
  101. $content = (array) json_decode($response['content'], TRUE);
  102. $result = $WechatService->command($this, $openid, $content, $context);
  103. if ($result)
  104. {
  105. return $result;
  106. }
  107. }
  108. }
  109. //自动回复处理
  110. if ($message->MsgType == 'text')
  111. {
  112. $wechat_autoreply = new WechatAutoreply();
  113. $autoreply = $wechat_autoreply->where(['text' => $message->Content, 'status' => 'normal'])->find();
  114. if ($autoreply)
  115. {
  116. $response = $WechatResponse->where(["eventkey" => $autoreply['eventkey'], 'status' => 'normal'])->find();
  117. if ($response)
  118. {
  119. $content = (array) json_decode($response['content'], TRUE);
  120. $context = $WechatContext->where(['openid' => $openid])->find();
  121. $result = $WechatService->response($this, $openid, $content, $context);
  122. if ($result)
  123. {
  124. return $result;
  125. }
  126. }
  127. }
  128. }
  129. return $unknownmessage;
  130. }
  131. return ""; //SUCCESS
  132. });
  133. $response = $this->app->server->serve();
  134. // 将响应输出
  135. $response->send();
  136. }
  137. /**
  138. * 登录回调
  139. */
  140. public function callback()
  141. {
  142. }
  143. /**
  144. * 支付回调
  145. */
  146. public function notify()
  147. {
  148. Log::record(file_get_contents('php://input'), "notify");
  149. $response = $this->app->payment->handleNotify(function($notify, $successful) {
  150. // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
  151. $orderinfo = Order::findByTransactionId($notify->transaction_id);
  152. if ($orderinfo)
  153. {
  154. //订单已处理
  155. return true;
  156. }
  157. $orderinfo = Order::get($notify->out_trade_no);
  158. if (!$orderinfo)
  159. { // 如果订单不存在
  160. return 'Order not exist.'; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
  161. }
  162. // 如果订单存在
  163. // 检查订单是否已经更新过支付状态,已经支付成功了就不再更新了
  164. if ($orderinfo['paytime'])
  165. {
  166. return true;
  167. }
  168. // 用户是否支付成功
  169. if ($successful)
  170. {
  171. // 请在这里编写处理成功的处理逻辑
  172. return true; // 返回处理完成
  173. }
  174. else
  175. { // 用户支付失败
  176. return true;
  177. }
  178. });
  179. $response->send();
  180. }
  181. }