gzh_app_id=$data[1];
v('$this->gzh_app_id');v($this->gzh_app_id);
// 如果redis没有公众号信息,则直接返回,防止被刷
$redis_offcial_account_key = env('redis_offcial_account_key');
if(!empty($redis_offcial_account_key)){
$redis_offcial_account_key = $redis_offcial_account_key.$this->gzh_app_id;
$official_account = Redis::hGet($redis_offcial_account_key,'official_account_info');
$official_account = objectToArray(json_decode($official_account));
if(empty($official_account)){
v('construct_not_has_redis_official_account_return:'.$this->gzh_app_id);
die('');
}else{
v('construct_has_redis_official_account:'.$this->gzh_app_id);
}
}
v('construct_check_end:'.$this->gzh_app_id);
parent::__construct($this->gzh_app_id);
$this->Staff = new StaffsController($this->param);
$this->Material = new MaterialsController($this->param);
$this->UserInfo = new UserInfosController($this->param);
}
/**
* 接收微信回调
http://zydy/wxdbc486f1b4f6a8c3/callback?signature=7aa9eb2a2fd0a0b4c4b4b7acd45f4b77ed990165×tamp=1506838034&nonce=244404927&openid=oAcqg1LRHNKN2jaEkJ5v56HOwPEQ&encrypt_type=aes&msg_signature=8599ff0fec541a4dfe5ccdd3e50a85d56514a5e6
*/
public function index(Request $request)
{
v('gzh_msg_index_start');
if(!$this->checkSignature($request)){
v('return_fail:');
// exit;
}else{
v('return_success:');
}
v('start_setmessagehander:'.env('DEVELOP_MODE'));
if(env('DEVELOP_MODE') == 'local'){
v('local_test');
$message = $this->get_fake_data();
$res = $this->deal_callback($message);
}else{
v('start-server');
$this->app->server->setMessageHandler(function ($message) {
v('start_deal_callback');
return $this->deal_callback($message);
});
}
v('last_echo');
$response = $this->app->server->serve();
// 将响应输出
return $response;
}
function deal_callback($message){
// 开关
$wechat_callback_switch = Redis::get('wechat_callback_switch');
if($wechat_callback_switch){
v('wechat_callback_switch_direct_return:');
return '';
}
try{
v('gzh_start_setmessagehander_in');
// 微信全网发布公众号,在第三方框架里面已经做了回应检测了,这里需要直接返回不然有bug
if($this->gzh_app_id == 'wx570bc396a51b8ff8'){
v('deal_callback_wxtest_direct_return:'.$this->gzh_app_id);
return '';
}
v($message);
if(isset($this->official_account) && in_array($this->official_account['official_account_type'],array('third_platform_default_login','third_platform_pay'))){
v('deal_callback_myown_direct_return:'.$this->gzh_app_id);
return '';
}
$openid = isset($message->FromUserName)?$message->FromUserName:'';
$this->param['openid'] = $openid;
$distribution_channel_id = isset($this->official_account['distribution_channel_id'])?$this->official_account['distribution_channel_id']:'';
// 模板消息发送成功,微信回调直接Return
if($message->Event == 'TEMPLATESENDJOBFINISH'){
v('event_template_send_job_finish_return:'.$openid);
return '';
}
$wx_user = $this->WechatApi->get_force_wx_user($this->gzh_app_id,$openid);
//增加客服消息实际可送达用户记录
try {
ForceSubscribeService::updateGzhUserCustomActive(['openid' => $openid, 'appid' => $this->gzh_app_id, 'distribution_channel_id' => $distribution_channel_id, 'force_user' => $wx_user]);
}catch (\Exception $e)
{
//\Log::error('custom active error:'.$e->getMessage().':'.$e->getFile().':'.$e->getLine());
}
switch ($message->MsgType) {
case 'event':
// 如果关注,则判断是否保存user
if($message->Event == 'subscribe'){
v('subscribe:'.$openid);
// 如果是微信素材直接进来的关注,则要先判断有没有建立强关场景值映射关系,有的话,直接赋值下EventKey
$material_force_subscribe_mapping = $this->WechatApi->get_material_force_subscribe_mapping($this->official_account['distribution_channel_id'],$openid);
v('material_force_subscribe_mapping:'.json_encode($material_force_subscribe_mapping));
if(isset($material_force_subscribe_mapping['uid']) && !empty($material_force_subscribe_mapping['uid'])){
$message->EventKey = 'qrscene_'.$material_force_subscribe_mapping['uid'];
v('material_force_subscribe_mapping_eventkey:'.$message->EventKey);
}
// {"ToUserName":"gh_0fdfe1e4f56c","FromUserName":"ovuI01FHKJuIR8wNkJ_7qj1o9_gY","CreateTime":"1507710568","MsgType":"event","Event":"subscribe","EventKey":"qrscene_999","Ticket":"gQF78DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyWUs2UlZsLXljUWsxNVB5NXhxMUsAAgRz1d1ZAwQAjScA"}
// 强制关注 qrscene_osCoL1iAhr_htstSO6XIKvguBs34
$force_subscribe_sceneId = '';
if(!empty($message->EventKey) && strpos($message->EventKey,'qrscene_') === 0){
$force_subscribe_sceneId = str_replace('qrscene_','',$message->EventKey);
v('subscribe_openid:'.$openid.' force_subscribe_sceneId:'.$force_subscribe_sceneId);
}
// 先判断存在性
if(!empty($wx_user)){
v('exist:'.$openid);
v('subscribe:'.$openid);
$this->WechatApi->subscribe_wx_user($this->gzh_app_id,$openid);
}
// 还没访问我们网站,直接关注公众号,TODO暂时原则是要访问了才记录用户信息
else{
v('not_exist:'.$openid);
// 有场景值才更新,强制关注新的公众号的时候,肯定是空的
// 站外推广
if(strpos($force_subscribe_sceneId,'outer') > -1){
v('outer_subscribe:'.$openid.' sceneId:'.$force_subscribe_sceneId);
}
// 如果场景值是其他类型的,则用户不保存
else{
if(!empty($force_subscribe_sceneId)){
v('not_exist_user_save_force_subscribe:'.$openid.' $force_subscribe_sceneId:'.$force_subscribe_sceneId);
$data = $this->UserInfo->get_oauth_user_info($openid,$force_subscribe_sceneId);
// 保存用户信息
$this->WechatApi->save_force_wx_user($data);
}
}
}
ForceSubscribeDelayMsgService::queue($distribution_channel_id,$this->gzh_app_id,$openid);
}
elseif($message->Event == 'unsubscribe'){
v('unsubscribe:'.$openid);
$this->WechatApi->unsubscribe_wx_user($this->gzh_app_id,$openid);
ForceSubscribeDelayMsgService::dequeue($openid);
}
// 扫描事件
elseif($message->Event == 'SCAN'){
$force_subscribe_sceneId = $message->EventKey;
v('event_scan:'.$openid.' force_subscribe_sceneId:'.$force_subscribe_sceneId);
// {"ToUserName":"gh_0fdfe1e4f56c","FromUserName":"ovuI01FHKJuIR8wNkJ_7qj1o9_gY","CreateTime":"1507710445","MsgType":"event","Event":"SCAN","EventKey":"999","Ticket":"gQF78DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyWUs2UlZsLXljUWsxNVB5NXhxMUsAAgRz1d1ZAwQAjScA"}
if(!empty($message->EventKey)){
// 强制关注,提前关注的老用户,存储下
if(empty($wx_user)){
v('scan_not_exist_user_save_force_subscribe');
$data = $this->UserInfo->get_oauth_user_info($openid,$force_subscribe_sceneId);
// 保存用户信息
$this->WechatApi->save_force_wx_user($data);
}
// FIXME 针对扫错二维码的用户,强制更新uid,防止一直扫描,对h5的uid还是自己的不影响
else{
$origin_uid = isset($wx_user['uid'])?$wx_user['uid']:'';
v('scan_exist_user_update_uid:'.$openid.' scenid:'.$force_subscribe_sceneId.' origin_uid:'.$origin_uid);
$this->WechatApi->update_force_wx_user($openid,$force_subscribe_sceneId);
}
}
}
// 点击事件
elseif($message->Event == 'CLICK'){
v('event_click:'.$openid);
}
// 点击事件
elseif($message->Event == 'TEMPLATESENDJOBFINISH'){
v('event_template_send_job_finish:'.$openid);
return '';
}
// 点击view
elseif($message->Event == 'VIEW' || $message->Event == 'view'){
v('event_view_direct_return:'.$openid);
return '';
}
// 群发消息,返回成功人数
elseif($message->Event == 'MASSSENDJOBFINISH'){
v('event_msg_job_finish:'.$openid);
WechatMaterialSendMsgService::update_wechat_material_send_msg_info($message);
return '';
}
// 统一推送消息
$send_event_content = $this->WechatApi->get_event_content($message->Event,$message->EventKey,$this->gzh_app_id,$openid);
v('$send_event_content');v($send_event_content);
return $this->Staff->batch_send_wechat_content($openid,$send_event_content,'direct_return');
return '';
break;
case 'text':
try{
if(!empty($message->Content)){
if($message->Content == 't'){
$send_event_content = array();
$send_event_content['text'] = $openid;
return $this->Staff->batch_send_wechat_content($openid,$send_event_content,'direct_return');
}else{
// 兼容图片和文字
$send_event_content = $this->WechatApi->get_event_content($message->MsgType,$message->Content,$this->gzh_app_id,$openid);
return $this->Staff->batch_send_wechat_content($openid,$send_event_content,'direct_return');
}
}
}
catch(\Exception $e){
v('text_ept:'.$openid.' info:'.$e->getMessage());
}
return '';
break;
case 'image':
$encode_distribution_channel_id = encodeDistributionChannelId($distribution_channel_id);
$WECHAT_CUSTOM_HOST = env('WECHAT_CUSTOM_HOST');
$feedback_content = '未找到相关小说,'."\n".'您可以试试:'."\n"."\n".'查看阅读记录 >> '."\n"."\n".'去书城首页看看 >> '."\n"."\n".'点此联系客服';
$send_event_content = array();
$send_event_content['text'] = $feedback_content;
return $this->Staff->batch_send_wechat_content($openid,$send_event_content,'direct_return');
return '';
break;
case 'voice':
return '';
break;
case 'media':
return '';
break;
case 'location':
return '';
break;
case 'link':
return '';
break;
// ... 其它消息
default:
return '';
break;
}
return '';
}
catch(\Exception $e){
v('deal_call_ept:'.$this->gzh_app_id.' info:'.$e->getMessage());
}
return '';
}
private function checkSignature($request)
{
v('checksign_start');v($request->all());
$signature = $request->get('signature');
$timestamp = $request->get('timestamp');
$nonce = $request->get('nonce');
$echostr = $request->get('echostr');
// $msg = '';
// $errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $from_xml, $msg);
// $token = 'd4352c0225d5da500b176cf3464e9822';
$tmpArr = array($this->token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
v('tmpStr:'.$tmpStr.' signature:'.$signature);
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
function get_fake_data(){
$message = new \stdClass();
$test = 'daily_sign';
$openid = 'oTsZb0cLT7kg3RnxGkfabuRapxMA';
$openid = 'oAcqg1LRHNKN2jaEkJ5v56HOwPEQ';
// $openid = 'oTsZb0cLT7kg3RnxGkfabuRapxMA--9';
if($test == 'subscribe'){
//
//
// 1497423859
//
//
//
//
//
$message->ToUserName = 'gh_0fdfe1e4f56c';
$message->FromUserName =$openid;
$message->Event = 'subscribe';
$message->EventKey= 'qrscene_outer:1564_752019';
// $message->Event = 'click';
$message->MsgType = 'event';
}elseif($test == 'unsubscribe'){
//
//
// 1497423859
//
//
//
//
//
$message->ToUserName = 'gh_0fdfe1e4f56c';
$message->FromUserName = $openid;
$message->Event = 'unsubscribe';
$message->EventKey= 'unsubscribe';
// $message->Event = 'click';
$message->MsgType = 'event';
}elseif($test == 'recent_read'){
$message->ToUserName = 'gh_0fdfe1e4f56c';
$message->FromUserName = $openid;
$message->EventKey= 'recent_read';
$message->Event = 'click';
$message->MsgType = 'event';
}elseif($test == 'daily_sign'){
$message->ToUserName = 'gh_0fdfe1e4f56c';
$message->FromUserName = $openid;
$message->EventKey= 'daily_sign';
$message->Event = 'click';
$message->MsgType = 'event';
}elseif($test == 'contact_customer'){
$message->FromUserName = $openid;
$message->Event = 'CLICK';
$message->MsgType = 'event';
$message->EventKey= 'contact_customer';
// $message->Content = '获取我的推广卡';
}elseif($test == 'text'){
$message->FromUserName = $openid;
$message->Event = 'text';
$message->MsgType = 'text';
$message->EventKey= 'text';
$message->Content = '我123';
}
// 扫描进来,判断来源
elseif($test == 'scan'){
//
//
// 1497423781
//
//
//
//
//
// gh_b31f44e696d8
$message->FromUserName = $openid;
$message->Event = 'SCAN';
$message->MsgType = 'event';
$message->EventKey= '6';
}
return $message;
}
}