Wechat.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <?php
  2. /**
  3. * 公众号行为处理
  4. */
  5. namespace app\api\controller;
  6. use think\facade\Db;
  7. use app\api\controller\WechatApi;
  8. use think\facade\Log;
  9. /**
  10. * ============================================================================
  11. * DSMall多用户商城
  12. * ============================================================================
  13. * 版权所有 2014-2028 长沙德尚网络科技有限公司,并保留所有权利。
  14. * 网站地址: http://www.csdeshang.com
  15. * ----------------------------------------------------------------------------
  16. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
  17. * 不允许对程序代码以任何形式任何目的的再发布。
  18. * ============================================================================
  19. * 微信控制器
  20. */
  21. class Wechat extends MobileMall
  22. {
  23. public $type;
  24. public $wxid;
  25. public $data;
  26. public $weixin;
  27. public function index()
  28. {
  29. //获取配置信息
  30. $wxConfig = model('wechat')->getOneWxconfig();
  31. $this->weixin = new WechatApi($wxConfig);
  32. $this->weixin->valid();
  33. $this->type = $this->weixin->getRev()->getRevType(); //获取消息类型MsgType
  34. $this->wxid = $this->weixin->getRev()->getRevFrom(); //获取消息类型MsgId
  35. $this->data = $this->weixin->getRevData(); //把获取的消息进行转码
  36. $reMsg = '';
  37. switch ($this->type) {
  38. //接收普通消息-文本消息
  39. case 'text':
  40. $content = $this->weixin->getRev()->getRevContent();
  41. break;
  42. //接收事件推送 事件类型,subscribe(订阅)、unsubscribe(取消订阅)
  43. case 'event':
  44. $event = $this->weixin->getRev()->getRevEvent();
  45. $content = json_encode($event);
  46. break;
  47. //接收普通消息-图片消息
  48. case 'image':
  49. $content = json_encode($this->weixin->getRev()->getRevPic());
  50. $reMsg = "图片很美!";
  51. break;
  52. default:
  53. $reMsg = '未识别信息';
  54. }
  55. /**
  56. *处理事件
  57. */
  58. if (!empty($reMsg)) {
  59. echo $this->weixin->text($reMsg)->reply();
  60. exit;
  61. }
  62. //一.接收事件推送
  63. if ($this->type == 'event') {
  64. //1.订阅(关注)事件
  65. if (isset($event['event']) && $event['event'] == 'subscribe') {
  66. $welcome = '欢迎关注,推荐置顶公众号';
  67. //当待了事件KEY值,则自动注册 KEY一般为推荐人ID
  68. if($event['key']){
  69. $qrscene=explode("qrscene_", $event['key']);
  70. $inviter_id=intval($qrscene[1]);
  71. $config = model('wechat')->getOneWxconfig();
  72. $wechat=new WechatApi($config);
  73. $expire_time = $config['expires_in'];
  74. if($expire_time > TIMESTAMP){
  75. //有效期内
  76. $wechat->access_token_= $config['access_token'];
  77. }else{
  78. $access_token=$wechat->checkAuth();
  79. $web_expires = TIMESTAMP + 7000; // 提前200秒过期
  80. Db::name('wxconfig')->where(array('id'=>$config['id']))->update(array('access_token'=>$access_token,'expires_in'=>$web_expires));
  81. }
  82. $userinfo=$wechat->getwxUserInfo($this->wxid);
  83. $reg_info = array(
  84. 'member_wxopenid' => $this->wxid,
  85. 'member_wxunionid' => $userinfo['unionid'],
  86. 'nickname' => isset($userinfo['nickname']) ? $userinfo['nickname'] : '',
  87. 'headimgurl' => isset($userinfo['headimgurl']) ? $userinfo['headimgurl'] : '',
  88. 'inviter_id' => $inviter_id
  89. );
  90. $logic_connect_api = model('connectapi', 'logic');
  91. $wx_member = $logic_connect_api->wx_register($reg_info,'wx');
  92. if(!empty($wx_member)){
  93. $member_model = model('member');
  94. $member_model->getBuyerToken($wx_member['member_id'], $wx_member['member_name'], 'wap',$wx_member['member_wxopenid']);
  95. }
  96. }
  97. $mbusertoken=Db::name('mbusertoken')->where('member_openid',$this->wxid)->find();
  98. if(!empty($mbusertoken)){
  99. $ret_url='。系统已为您自动注册了一个账号,请<a href="'.config('ds_config.h5_site_url').'/member/index?key='.$mbusertoken['member_token'].'&username='.$mbusertoken['member_name'].'">点击修改信息</a>';
  100. }else{
  101. $ret_url='';
  102. }
  103. echo $this->weixin->text($welcome.$ret_url)->reply();
  104. exit;
  105. }
  106. //2.扫码已关注
  107. if (isset($event['event']) && $event['event'] == 'SCAN') {
  108. $welcome = '已关注';
  109. echo $this->weixin->text($welcome)->reply();
  110. exit;
  111. }
  112. //4.点击菜单拉取消息时的事件推送
  113. if($event['event'] == 'CLICK'){
  114. $click=$event['key'];
  115. switch ($click) {
  116. case "commend": //店铺推荐商品
  117. case "hot": //点击率商品
  118. case "sale": //销售量
  119. case "colleect": //收藏量
  120. $reMsg = $this->getGoods($click);
  121. if(!empty($reMsg)) {
  122. $this->MsgTypeNews($reMsg);
  123. }else {
  124. echo $this->weixin->text("success")->reply();
  125. exit;
  126. }
  127. break;
  128. case 'group':
  129. $this->weixin->image("IcLjljgPd_iz_PNG1k7xHrqZsbn9CGRPP6sNn5OfDcQ");
  130. exit();
  131. break;
  132. //{后续可待添加}
  133. default :
  134. echo $this->weixin->text("未定义此菜单事件{$click}")->reply();
  135. exit;
  136. }
  137. }
  138. }
  139. //二.文本消息(关键字回复/商品显示)
  140. if ($this->type == 'text') {
  141. //处理关键字
  142. $this->MsgTypeText($content);
  143. //处理商品的情况
  144. $reMsg = $this->getGoodsByKey($content);
  145. if(!empty($reMsg)) {
  146. $this->MsgTypeNews($reMsg);
  147. }
  148. /*处理其他输入文字*/
  149. echo $this->weixin->text("抱歉,暂时无法对您的输入作出处理。")->reply();
  150. exit;
  151. }
  152. }
  153. /**
  154. *文本格式消息回复
  155. */
  156. private function MsgTypeText($content)
  157. {
  158. //先处理是关键字的情况
  159. $value = $this->keywordsReply($content);
  160. if (!empty($value)) {
  161. echo $this->weixin->text($value['text'])->reply();
  162. exit;
  163. }
  164. }
  165. /**商品图文回复*/
  166. private function MsgTypeNews($reMsg){
  167. $k = 0;
  168. foreach ($reMsg as $v) {
  169. $newsData[$k]['Title'] = $v['goods_name'];
  170. $newsData[$k]['Description'] = strip_tags($v['goods_name']);
  171. $newsData[$k]['PicUrl'] = goods_cthumb($v['goods_image']);
  172. $newsData[$k]['Url'] = config('ds_config.h5_site_url') . '/home/goodsdetail?goods_id='.$v['goods_id'];
  173. $k++;
  174. }
  175. echo $this->weixin->news($newsData)->reply();
  176. exit;
  177. }
  178. /**
  179. *关键字回复信息
  180. */
  181. public function keywordsReply($content)
  182. {
  183. //关键字查询
  184. $condition = array();
  185. $condition[]=array('k.keyword','=',$content);
  186. $value = model('wechat')->getOneJoinWxkeyword($condition,$field = 't.text');
  187. return $value;
  188. }
  189. /**关键字商品信息*/
  190. public function getGoodsByKey($key)
  191. {
  192. $condi = "(goods_name like '%{$key}%' or goods_advword like '%{$key}%' or store_name like '%{$key}%')";
  193. $condi .= " and goods_state = 1 and goods_verify = 1";
  194. $res=Db::name('goods')->where($condi)->limit(4)->field('goods_id,goods_name,goods_image')->select()->toArray();
  195. $res=ds_change_arraykey($res,'goods_id');
  196. return $res;
  197. }
  198. /**菜单事件商品信息*/
  199. public function getGoods($type){
  200. //条件
  201. //后续可待添加
  202. $types=array('hot'=>'goods_click','sale'=>'goods_salenum','collect'=>'goods_collect','commend'=>'goods_commend');
  203. $condition = $types[$type].' DESC';
  204. $where = "goods_state = 1 and goods_verify = 1";
  205. $res = Db::name('goods')->field('goods_id,goods_name,goods_image')->where($where)->limit(4)->order($condition)->select()->toArray();
  206. $res=ds_change_arraykey($res,'goods_id');
  207. return $res;
  208. }
  209. }