Wechat.php 7.5 KB

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