123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- <?php
- /**
- * OaMessage.php UTF-8
- * 公众号消息
- *
- * @date : 2018/9/26 15:16
- *
- * @license 这不是一个自由软件,未经授权不许任何使用和传播。
- * @author : wuyonghong <wyh@huosdk.com>
- * @version : HuoMp 1.0
- */
- namespace huoMpMsg\controller;
- use huo\controller\member\Oauth;
- use huo\controller\request\Channel;
- use huo\controller\request\Device;
- use huo\controller\request\Game;
- use huo\controller\request\Mem;
- use huo\model\member\MemoauthModel;
- use huolib\constant\MemConst;
- use huolib\constant\OauthConst;
- use huolib\constant\WeiXinMenuConst;
- use huomp\model\weixin\MpConfModel;
- use huoMpMsg\constant\OfficialAccountConst;
- use huoMpMsg\model\MpEventMsgLogModel;
- use huoMpMsg\model\MpMsgLogModel;
- use think\Log;
- class OaMessage {
- /**
- * 接收微信数据
- * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453
- *
- * @param string $mp_id 小程序ID
- * @param array $param
- *
- */
- public function receive($mp_id, $param) {
- $_data['mp_id'] = $mp_id;
- $_data['wx_msg_id'] = get_val($param, 'MsgId', 0);
- $_data['source_id'] = get_val($param, 'ToUserName', '');
- $_data['open_id'] = get_val($param, 'FromUserName', '');
- $_data['msg_type'] = get_val($param, 'MsgType', '');
- $_data['pic_url'] = get_val($param, 'PicUrl', '');
- $_data['media_id'] = get_val($param, 'MediaId', '');
- $_data['title'] = get_val($param, 'Title', '');
- $_data['mini_app_id'] = get_val($param, 'AppId', '');
- $_data['page_path'] = get_val($param, 'PagePath', '');
- $_data['thumb_url'] = get_val($param, 'ThumbUrl', '');
- $_data['thumb_media_id'] = get_val($param, 'ThumbMediaId', '');
- $_data['text'] = get_val($param, 'Content', '');
- $_data['wx_create_time'] = get_val($param, 'CreateTime', 0);
- $_model = new MpMsgLogModel();
- $_rs = $_model->hasMsg($_data['wx_msg_id']);
- if (empty($_rs)) {
- $_rs = $_model->insertLog($_data);
- }
- if (false !== $_rs) {
- if (!empty($_data['text'])) {
- $_msg = (new OaReturnMsg())->getKeyReturnMsg($mp_id, $_data['text']);
- if (!empty($_msg)) {
- $this->sendTextMsg($mp_id, $_data['open_id'], $_msg);
- }
- }
- // $this->sendTextMsg($mp_id,$_data['open_id'],'您好');
- die('success');
- }
- die('');
- }
- /**
- * 接收事件推送
- * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454
- *
- * @param string $mp_id 微信ID
- * @param array $param 参数
- *
- */
- public function receiveEventMsg($mp_id, $param) {
- if (empty($mp_id)
- || empty($param)
- || empty($param['Event'])) {
- return;
- }
- $_event = $param['Event'];
- $_data['mp_id'] = $mp_id;
- $_data['source_id'] = get_val($param, 'ToUserName', '');
- $_data['open_id'] = get_val($param, 'FromUserName', '');
- $_data['msg_type'] = get_val($param, 'MsgType', '');
- $_data['event'] = get_val($param, 'Event', '');
- $_data['event_key'] = json_encode(get_val($param, 'EventKey', []));
- $_data['ticket'] = get_val($param, 'Ticket', '');
- $_data['latitude'] = get_val($param, 'Latitude', '');
- $_data['longitude'] = get_val($param, 'Longitude', '');
- $_data['precision'] = get_val($param, 'Precision', '');
- $_data['wx_create_time'] = get_val($param, 'CreateTime', 0);
- $_model = new MpEventMsgLogModel();
- $_rs = $_model->hasMsg($_data['open_id'], $_data['wx_create_time']);
- if (empty($_rs)) {
- $_model->insertLog($_data);
- }
- switch ($_event) {
- case OfficialAccountConst::EVENT_SUBSCRIBE:
- $_event_key = get_val($param, 'EventKey', '');
- if (!empty($_event_key)) {
- /* 扫描带参数二维码事件 用户未关注时,进行关注后的事件推送 */
- break;
- }
- /* 关注事件 */
- $this->subscribe($mp_id, $param);
- break;
- case OfficialAccountConst::EVENT_UNSUBSCRIBE:
- /* 取消关注事件 */
- $this->unsubscribe($mp_id, $param);
- break;
- case OfficialAccountConst::EVENT_SCAN:
- /* 扫描带参数二维码事件 用户已关注时的事件推送 */
- $this->scan($mp_id, $param);
- break;
- case OfficialAccountConst::EVENT_CLICK:
- /* 自定义菜单事件 点击菜单拉取消息时的事件推送 */
- $this->click($mp_id, $param);
- break;
- case OfficialAccountConst::EVENT_VIEW:
- /* 自定义菜单事件 点击菜单跳转链接时的事件推送 */
- $this->view($mp_id, $param);
- break;
- case OfficialAccountConst::EVENT_SCANCODE_PUSH:
- /* 扫码推事件的事件推送 */
- $this->scanCodePush($mp_id, $param);
- break;
- case OfficialAccountConst::EVENT_SCANCODE_WAITMSG:
- /* 扫码推事件且弹出“消息接收中”提示框的事件推送 */
- $this->scanCodeWaitmsg($mp_id, $param);
- break;
- case OfficialAccountConst::EVENT_PIC_SYSPHOTO:
- /* 弹出系统拍照发图的事件推送 */
- $this->picSysPhoto($mp_id, $param);
- break;
- case OfficialAccountConst::EVENT_PIC_PHOTO_OR_ALBUM:
- /* 弹出拍照或者相册发图的事件推送 */
- $this->picPhotoOrAlbum($mp_id, $param);
- break;
- case OfficialAccountConst::EVENT_PIC_WEIXIN:
- /* 弹出微信相册发图器的事件推送 */
- $this->picWeixin($mp_id, $param);
- break;
- case OfficialAccountConst::EVENT_LOCATION_SELECT:
- /* 弹出微信相册发图器的事件推送 */
- $this->locationSelect($mp_id, $param);
- break;
- default:
- break;
- }
- }
- /**
- *
- * 用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑。为保护用户数据隐私,开发者收到用户取消关注事件时需要删除该用户的所有信息。
- *
- * @param string $mp_id 微信ID
- * @param array $param 参数
- *
- *
- * ToUserName 开发者微信号
- * FromUserName 发送方帐号(一个OpenID)
- * CreateTime 消息创建时间 (整型)
- * MsgType 消息类型,event
- * Event 事件类型,subscribe(订阅)、unsubscribe(取消订阅)
- */
- public function subscribe($mp_id, $param) {
- $_open_id = get_val($param, 'FromUserName', '');
- if (empty($_open_id)) {
- die('');
- }
- $_conf_id = (new MpConfModel())->getIdByMpId($mp_id);
- if (empty($_conf_id)) {
- die('');
- }
- $_mo_model = new MemoauthModel();
- $_type = OauthConst::OAUTH_WEIXIN;
- $_mo_data = $_mo_model->getInfoByOpenId($_type, $_open_id);
- if (empty($_mo_data)) {
- /* 注册用户 */
- $_game_rq = new Game();
- $_channel_rq = new Channel();
- $_device_rq = new Device();
- $_mem_rq = new Mem();
- $_oauth_data['token'] = [];
- $_oauth_data['app_key'] = $mp_id;
- $_oauth_data['openid'] = $_open_id;
- $_oauth_data['unionid'] = $_open_id;
- $_oauth_data['channel'] = $_type;
- $_oauth_data['nickname'] = '';
- $_oauth_data['gender'] = '';
- $_oauth_data['avatar'] = '';
- $_oauth_data['token'] = ['openid' => $_open_id, 'access_token' => '', 'expires_in' => 0];
- $_config = [];
- $_wx_app_secret = (new MpConfModel())->getSecretByMpId($mp_id);
- if (!empty($_wx_app_secret)) {
- $_config['APP_KEY'] = $mp_id;
- $_config['APP_SECRET'] = $_wx_app_secret;
- $_config['CALLBACK'] = '';
- }
- (new Oauth())->oAuthReg(
- $_type, $_oauth_data, $_game_rq, $_channel_rq, $_device_rq, $_mem_rq, $_config
- );
- } else {
- /* 更新第三方状态 */
- $_mo_data['status'] = MemConst::STATUS_NORMAL;
- $_mo_model->updateOauth($_mo_data['from'], $_open_id, $_mo_data);
- }
- $_msg = (new OaReturnMsg())->getSubscribeMsg($mp_id);
- if (empty($_msg)) {
- $_msg = '欢迎关注!';
- }
- $this->sendTextMsg($mp_id, $_open_id, $_msg);
- die('success');
- }
- public function unsubscribe($mp_id, $param) {
- $_open_id = get_val($param, 'FromUserName', '');
- if (empty($_open_id)) {
- die('');
- }
- $_conf_id = (new MpConfModel())->getIdByMpId($mp_id);
- if (empty($_conf_id)) {
- die('');
- }
- $_mo_model = new MemoauthModel();
- $_type = OauthConst::OAUTH_WEIXIN;
- $_mo_data = $_mo_model->getInfoByOpenId($_type, $_open_id);
- if (!empty($_mo_data)) {
- $_mo_data['status'] = MemConst::STATUS_TRY;
- $_mo_model->updateOauth($_type, $_open_id, $_mo_data);
- }
- die('');
- }
- public function scan($mp_id, $param) {
- $_open_id = get_val($param, 'FromUserName', '');
- if (empty($_open_id)) {
- die('');
- }
- }
- public function click($mp_id, $param) {
- $_open_id = get_val($param, 'FromUserName', '');
- if (empty($_open_id)) {
- die('');
- }
- $_key = get_val($param, 'EventKey', '');
- if (empty($_key)) {
- die('');
- }
- $_msg = (new OaReturnMsg())->getKeyReturnMsg($mp_id, $_key, WeiXinMenuConst::IS_MENU_2);
- if (!empty($_msg)) {
- $this->sendTextMsg($mp_id, $_open_id, $_msg);
- die('success');
- }
- }
- public function view($mp_id, $param) {
- $_open_id = get_val($param, 'FromUserName', '');
- if (empty($_open_id)) {
- die('');
- }
- }
- public function scanCodePush($mp_id, $param) {
- $_open_id = get_val($param, 'FromUserName', '');
- if (empty($_open_id)) {
- die('');
- }
- }
- public function scanCodeWaitmsg($mp_id, $param) {
- $_open_id = get_val($param, 'FromUserName', '');
- if (empty($_open_id)) {
- die('');
- }
- }
- public function picSysPhoto($mp_id, $param) {
- $_open_id = get_val($param, 'FromUserName', '');
- if (empty($_open_id)) {
- die('');
- }
- }
- public function picPhotoOrAlbum($mp_id, $param) {
- $_open_id = get_val($param, 'FromUserName', '');
- if (empty($_open_id)) {
- die('');
- }
- }
- public function picWeixin($mp_id, $param) {
- $_open_id = get_val($param, 'FromUserName', '');
- if (empty($_open_id)) {
- die('');
- }
- }
- public function locationSelect($mp_id, $param) {
- $_open_id = get_val($param, 'FromUserName', '');
- if (empty($_open_id)) {
- die('');
- }
- }
- /**
- * 发送文本消息
- *
- * @param string $mp_id
- * @param string $open_id 玩家应用ID
- * @param string $text
- *
- * @return bool
- */
- public function sendTextMsg($mp_id, $open_id, $text = '') {
- $_msg_type = 'text';
- $_msg_data = [
- "content" => $text
- ];
- $_mp_conf = (new MpConfModel())->getDataByMpId($mp_id);
- if (empty($_mp_conf)) {
- Log::write(
- "func=".__FUNCTION__."&class=".__CLASS__
- ."&step=1&mp_id=$mp_id&open_id=".$open_id, Log::ERROR
- );
- return false;
- }
- $_wx_app_secret = $_mp_conf['app_secret'];
- (new OfficialAccountApi())->sendMsg($mp_id, $_wx_app_secret, $open_id, $_msg_type, $_msg_data);
- return true;
- }
- }
|