606 lines
19 KiB
PHP
606 lines
19 KiB
PHP
<?php
|
||
|
||
include_once "endecrypt/wxBizMsgCrypt.php";
|
||
|
||
|
||
class KefuController {
|
||
|
||
|
||
protected function getRedis($accountid)
|
||
{
|
||
|
||
$redis_conf = getRedisConfig(crc32($accountid));
|
||
$r = new phpcommon\Redis(array(
|
||
'host' => $redis_conf['host'],
|
||
'port' => $redis_conf['port'],
|
||
'passwd' => $redis_conf['passwd']
|
||
));
|
||
return $r;
|
||
}
|
||
|
||
protected function getMysql($accountid)
|
||
{
|
||
$mysql_conf = getMysqlConfig(crc32($accountid));
|
||
$conn = new phpcommon\Mysql(array(
|
||
'host' => $mysql_conf['host'],
|
||
'port' => $mysql_conf['port'],
|
||
'user' => $mysql_conf['user'],
|
||
'passwd' => $mysql_conf['passwd'],
|
||
'dbname' => 'kefudb'
|
||
));
|
||
return $conn;
|
||
}
|
||
|
||
private function getAppointMysql($mysql_conf)
|
||
{
|
||
$conn = new phpcommon\Mysql(array(
|
||
'host' => $mysql_conf['host'],
|
||
'port' => $mysql_conf['port'],
|
||
'user' => $mysql_conf['user'],
|
||
'passwd' => $mysql_conf['passwd'],
|
||
'dbname' => 'kefudb'
|
||
));
|
||
return $conn;
|
||
}
|
||
|
||
private function getAllMysql()
|
||
{
|
||
return require('../config/kefu.mysql.cluster.php');
|
||
}
|
||
|
||
|
||
#kefudb_info = array(accountid, channel, gameid, openid, awardtime)
|
||
private function insertKefuInfoToDB($accountid, $kefu_info)
|
||
{
|
||
$conn = $this->getMysql($accountid);
|
||
$tbl_name = 'accounts_kefu';
|
||
$ret = $conn->execScript("INSERT INTO $tbl_name(" .
|
||
'accountid, channel, gameid, openid, awardtime) ' .
|
||
'VALUES(:accountid, :channel, :gameid, :openid, :awardtime);',
|
||
array(
|
||
':accountid' => $kefu_info['accountid'],
|
||
':channel' => $kefu_info['channel'],
|
||
':gameid' => $kefu_info['gameid'],
|
||
':openid' => $kefu_info['openid'],
|
||
':awardtime' => $kefu_info['awardtime']
|
||
));
|
||
return $ret;
|
||
|
||
}
|
||
|
||
private function checkAccountKefuExist($accountid)
|
||
{
|
||
$conn = $this->getMysql($accountid);
|
||
$select_tbl_name = 'accounts_kefu';
|
||
|
||
$row = $conn->execQueryOne('SELECT accountid ' .
|
||
"FROM $select_tbl_name WHERE accountid = :accountid ;",
|
||
array(
|
||
':accountid' => $accountid,
|
||
));
|
||
error_log('check_Exist:' . json_encode($row));
|
||
if ($row) {
|
||
return $row;
|
||
}else{
|
||
return '';
|
||
}
|
||
}
|
||
|
||
private function saveAwardTimeToDB($accountid, $time)
|
||
{
|
||
$conn = $this->getMysql($accountid);
|
||
$select_tbl_name = 'accounts_kefu';
|
||
$row = $conn->execScript("UPDATE $select_tbl_name SET " .
|
||
' awardtime=:awardtime ' .
|
||
'WHERE accountid=:accountid; ',
|
||
array(
|
||
':accountid' => $accountid,
|
||
':awardtime' => $time
|
||
));
|
||
error_log('saveAwartTime:' . json_encode($row));
|
||
return $row;
|
||
|
||
}
|
||
|
||
private function getAwardtimeFromDB($accountid)
|
||
{
|
||
|
||
$conn = $this->getMysql($accountid);
|
||
$select_tbl_name = 'accounts_kefu';
|
||
$row = $conn->execQueryOne('SELECT awardtime ' .
|
||
"FROM $select_tbl_name WHERE accountid = :accountid ;",
|
||
array(
|
||
':accountid' => $accountid,
|
||
));
|
||
|
||
error_log('getAward_row:' . json_encode($row));
|
||
if ($row) {
|
||
return $row['awardtime'];
|
||
} else {
|
||
return '';
|
||
}
|
||
|
||
}
|
||
|
||
private function getAwardDBMaxIdx($conn)
|
||
{
|
||
|
||
$select_tbl_name = 'accounts_kefu';
|
||
$row = $conn->execQueryOne('SELECT idx ' .
|
||
"FROM $select_tbl_name GROUP BY idx DESC LIMIT 1;"
|
||
);
|
||
if ($row) {
|
||
return $row['idx'];
|
||
} else {
|
||
return '';
|
||
}
|
||
|
||
}
|
||
|
||
private function getAccountsKefuInfo($min_idx, $max_idx, $conn)
|
||
{
|
||
|
||
$select_tbl_name = 'accounts_kefu';
|
||
$row = $conn->execQuery("SELECT * FROM $select_tbl_name " .
|
||
"where idx >= :min_idx and idx < :max_idx;",
|
||
array(
|
||
':min_idx' => $min_idx,
|
||
':max_idx' => $max_idx
|
||
));
|
||
error_log('getAccountsKefuInfo:' . json_encode($row));
|
||
if ($row) {
|
||
return $row;
|
||
} else {
|
||
return '';
|
||
}
|
||
|
||
}
|
||
|
||
|
||
private function getAwardConfig($gameid, $condition)
|
||
{
|
||
|
||
$url = '';
|
||
if (SERVER_ENV != _ONLINE) {
|
||
$url = 'https://center-test.kingsome.cn/api/replays/';
|
||
} else {
|
||
$url = 'https://center.kingsome.cn/api/replays/';
|
||
}
|
||
$url .= $gameid . '/' . $condition;
|
||
error_log($url);
|
||
$response = '';
|
||
$params = array();
|
||
if (!phpcommon\HttpClient::get($url,$params,$response)) {
|
||
error_log('奖励配置发送失败');
|
||
die();
|
||
return;
|
||
}
|
||
$ret = json_decode($response, true);
|
||
error_log('awardconfig:' . $response);
|
||
if($ret['errcode'] == 0) {
|
||
return $ret['items'];
|
||
} else {
|
||
return;
|
||
die();
|
||
}
|
||
|
||
}
|
||
|
||
private function translateAttachments($config)
|
||
{
|
||
$attachments = '';
|
||
error_log('config:' . json_encode($config));
|
||
foreach ($config as $attachment) {
|
||
error_log('attachment:'. json_encode($attachment));
|
||
$attachments .= $attachment['item_id'] . ':' . $attachment['count'] . ';';
|
||
}
|
||
return $attachments;
|
||
}
|
||
|
||
|
||
|
||
private function checkAward($accountid)
|
||
{
|
||
$awardtime = $this->getAwardtimeFromDB($accountid);
|
||
if (isset($awardtime) and time() - $awardtime > 60 * 60 * 24 * 1) {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
|
||
private function sendAward($accountid, $config)
|
||
{
|
||
|
||
if (SERVER_ENV != _ONLINE) {
|
||
$url = 'https://gamemail-test.kingsome.cn/webapp/index.php?';
|
||
} else {
|
||
$url = 'https://gamemail.kingsome.cn/webapp/index.php?';
|
||
}
|
||
$to = $accountid;
|
||
$from = 'kefu';
|
||
$mail_type = '1';
|
||
$mail_subtype = '0';
|
||
$subject = '奖励';
|
||
$content = '领取奖励';
|
||
$sendtime = time();
|
||
$ext = '';
|
||
$expire_time = time() + 60 * 60 * 24 * 1;
|
||
error_log('congifsendaward:' . json_encode($config));
|
||
$attachments = $this->translateAttachments($config);
|
||
$game_id = phpcommon\extractGameId($accountid);
|
||
|
||
$url .= "c=Mail&a=sendMail&to=$to&from=$from&mail_type=$mail_type" .
|
||
"&mail_subtype=$mail_subtype&subject=$subject&content=$content&sendtime=$sendtime" .
|
||
"&ext=$ext&expire_time=$expire_time&attachments=$attachments&game_id=$game_id";
|
||
|
||
error_log('sendAward.url:' . $url);
|
||
|
||
$response = '';
|
||
if (!phpcommon\HttpClient::get($url, array(), $response)) {
|
||
error_log('邮件发送失败');
|
||
return;
|
||
}
|
||
$data = json_decode($response, true);
|
||
error_log('邮件返回:' . $response);
|
||
if(isset($data) && $data['errcode'] == 0) {
|
||
return true;
|
||
} else{
|
||
return;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
public function checkServer() // 校验服务器地址URL
|
||
{
|
||
|
||
$gameid = $_REQUEST['gameid'];
|
||
error_log($gameid);
|
||
$config_name = "../config/game$gameid/weixin/config.php";
|
||
require $config_name;
|
||
if ( isset($_REQUEST['echostr'])) {
|
||
$this->valid();
|
||
} else {
|
||
$this->responseMsg();
|
||
}
|
||
|
||
}
|
||
|
||
public function valid()
|
||
{
|
||
|
||
$echoStr = $_REQUEST['echostr'];
|
||
if ($this->checkSignature()) {
|
||
echo $echoStr;
|
||
exit;
|
||
} else {
|
||
echo $echoStr . '+++' . WEIXIN_TOKEN;
|
||
exit;
|
||
}
|
||
|
||
}
|
||
|
||
private function checkSignature()
|
||
{
|
||
$signature = $_REQUEST["signature"];
|
||
$timestamp = $_REQUEST["timestamp"];
|
||
$nonce = $_REQUEST["nonce"];
|
||
|
||
$token = WEIXIN_TOKEN;
|
||
$tmpArr = array ( $token , $timestamp , $nonce );
|
||
sort( $tmpArr , SORT_STRING);
|
||
$tmpStr = implode( $tmpArr );
|
||
$tmpStr = sha1($tmpStr);
|
||
|
||
if ( $tmpStr == $signature ){
|
||
return true ;
|
||
} else {
|
||
return false ;
|
||
}
|
||
}
|
||
|
||
private function encryptJson()
|
||
{
|
||
$pc = new WXBizMsgCrypt(WEIXIN_TOKEN, WEIXIN_MSG_KEY, WEIXIN_APP_ID);
|
||
$encryptMsg = '';
|
||
$text = $postStr;
|
||
$errCode = $pc->encryptJsonMsg($text, $timeStamp, $nonce, $encryptMsg_str);
|
||
if ($errCode == 0) {
|
||
error_log("加密后: " . $encryptMsg_str . "\n");
|
||
$encryptMsg = json_decode($encryptMsg_str, true);
|
||
|
||
$errCode = $pc->decryptJsonMsg($encryptMsg['MsgSignature'], $timeStamp, $nonce,
|
||
$encryptMsg_str, $postStr2);
|
||
error_log('error_log:' . json_encode($errCode));
|
||
if ($errCode == 0) {
|
||
|
||
error_log("解密后: " . $postStr2 . "\n");
|
||
}
|
||
} else {
|
||
error_log($errCode . "\n");
|
||
}
|
||
|
||
}
|
||
|
||
private function sendMsg($data, $accountid)
|
||
{
|
||
$postarray = json_encode( $data ,JSON_UNESCAPED_UNICODE);
|
||
error_log("sendData:" . $postarray);
|
||
//POST发送https请求客服接口api
|
||
$access_token = $this->getAccessToken($accountid);
|
||
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=$access_token";
|
||
|
||
$response = '';
|
||
if (!phpcommon\HttpClient::post($url, $postarray, $response)) {
|
||
phpcommon\sendError(ERR_RETRY, '系统繁忙');
|
||
return;
|
||
}
|
||
$ret_info = json_decode($response, true);
|
||
error_log('sendMsgRet:' . $response);
|
||
if ($ret_info['errcode'] == 0) {
|
||
|
||
} else {
|
||
error_log($response);
|
||
echo(json_encode(array(
|
||
'errcode' => 0,
|
||
'errmsg' => ''
|
||
)));
|
||
}
|
||
}
|
||
|
||
public function mytest()
|
||
{
|
||
error_log('mytest');
|
||
$openid = $_REQUEST['openid'];
|
||
$shareInfo = require('../config/kefu.share.config.php');
|
||
$miniprogrampateInfo = $shareInfo['1011'];
|
||
$data = array (
|
||
"touser" => $openid,
|
||
"msgtype" => "miniprogrampage",
|
||
"miniprogrampage" => $miniprogrampateInfo
|
||
);
|
||
$this->sendMsg($data, $_REQUEST['accountid']);
|
||
die();
|
||
$content = '回复【111】领取奖励!';
|
||
$data = array (
|
||
"touser"=> $_REQUEST['openid'],
|
||
"msgtype"=>"text",
|
||
"text"=> array ("content" => $content)
|
||
);
|
||
|
||
|
||
$this->sendMsg($data, $_REQUEST['accountid']);
|
||
}
|
||
|
||
private function sendMsgSomeUser($arrayInfo)
|
||
{
|
||
|
||
foreach($arrayInfo as $userInfo) {
|
||
|
||
$shareInfo = require('../config/kefu.share.config.php');
|
||
$miniprogrampateInfo = $shareInfo['1011'];
|
||
$data = array (
|
||
"touser" => $userInfo['openid'],
|
||
"msgtype" => "miniprogrampage",
|
||
"miniprogrampage" => $miniprogrampateInfo
|
||
);
|
||
error_log('sendmsg11111:' . json_encode($data));
|
||
$this->sendMsg($data, $userInfo['accountid']);
|
||
}
|
||
}
|
||
|
||
private function sendOneDBInfo($minIdx, $maxIdx, $conn)
|
||
{
|
||
$selectOneCount = 20;
|
||
$selectCount = $maxIdx - $minIdx;
|
||
$remainderTimes = ($selectCount % $selectOneCount) ? 1 : 0;
|
||
$selectTimes = floor($selectCount / $selectOneCount) + $remainderTimes;
|
||
|
||
error_log('selectCount:' . $selectCount);
|
||
error_log('selectTimes:' . $selectTimes);
|
||
|
||
$selectMin = $minIdx;
|
||
for ($i = 0; $i < $selectTimes; $i++ ) {
|
||
error_log('selectMin:' . $selectMin);
|
||
$arrayInfo = $this->getAccountsKefuInfo($selectMin, $selectMin + $selectOneCount, $conn);
|
||
$this->sendMsgSomeUser($arrayInfo);
|
||
$selectMin = $selectMin + $selectOneCount;
|
||
}
|
||
|
||
}
|
||
|
||
public function sendMsgAllUser()
|
||
{
|
||
error_log('sendMsgAllUser:');
|
||
|
||
$mysqls = $this->getAllMysql();
|
||
foreach($mysqls as $mysql_conf) {
|
||
$conn = $this->getAppointMysql($mysql_conf);
|
||
$minIdx = 10000;
|
||
$maxIdx = $this->getAwardDBMaxIdx($conn);
|
||
$this->sendOneDBInfo($minIdx, $maxIdx, $conn);
|
||
}
|
||
}
|
||
|
||
|
||
private function disposeText($postArr, $accountid)
|
||
{
|
||
error_log('text');
|
||
$openid = $postArr['FromUserName'];
|
||
$CreateTime = $postArr['CreateTime'];
|
||
$test = $postArr['Content'];
|
||
$gameid = phpcommon\extractGameId($accountid);
|
||
$awardConfig = $this->getAwardConfig($gameid, $test);
|
||
error_log('awardConfig:' . json_encode($awardConfig));
|
||
if (isset($awardConfig)) {
|
||
$checkTimeRet = $this->checkAward($accountid);
|
||
if ($checkTimeRet)
|
||
{
|
||
$awardRet = $this->sendAward($accountid, $awardConfig);
|
||
if ($awardRet) {
|
||
$time = time();
|
||
$save_ret = $this->saveAwardTimeToDB($accountid, $time);
|
||
if ($save_ret) {
|
||
error_log('save_ret:' . $save_ret);
|
||
$content = '奖励领取成功,请查收邮件!';
|
||
$data = array (
|
||
"touser" => $openid,
|
||
"msgtype" => "text",
|
||
"text" => array ("content" => $content)
|
||
);
|
||
$this->sendMsg($data, $accountid);
|
||
}
|
||
}
|
||
} else {
|
||
$content = "一天内只能领取一次奖励!\n请明天再来!";
|
||
$data = array (
|
||
"touser" => $openid,
|
||
"msgtype" => "text",
|
||
"text" => array ("content" => $content)
|
||
);
|
||
$this->sendMsg($data, $accountid);
|
||
}
|
||
} else {
|
||
$content = '回复指定文字领取奖励!';
|
||
$data = array (
|
||
"touser" => $openid,
|
||
"msgtype" => "text",
|
||
"text" => array ("content" => $content)
|
||
);
|
||
$this->sendMsg($data, $accountid);
|
||
}
|
||
|
||
}
|
||
|
||
private function disposeImage($postArr, $accountid)
|
||
{
|
||
$openid = $postArr['FromUserName'];
|
||
$CreateTime = $postArr['CreateTime'];
|
||
|
||
die();
|
||
}
|
||
|
||
private function disposeEvent($postArr, $accountid)
|
||
{
|
||
|
||
error_log('disposeEvent');
|
||
$openid = $postArr['FromUserName'];
|
||
$CreateTime = $postArr['CreateTime'];
|
||
|
||
if($postArr['Event'] == 'user_enter_tempsession')
|
||
{
|
||
$check_ret = $this->checkAccountKefuExist($accountid);
|
||
error_log('check_ret:' . json_encode($check_ret));
|
||
if (empty($check_ret)) {
|
||
|
||
error_log('dot save to db');
|
||
|
||
$kefu_info = array(
|
||
'accountid' => $accountid,
|
||
'channel' => 6001,
|
||
'gameid' => phpcommon\extractGameId($accountid),
|
||
'openid' => $openid,
|
||
'awardtime' => '0'
|
||
);
|
||
$this->insertKefuInfoToDB($accountid, $kefu_info);
|
||
}
|
||
$content = "您好,有什么能帮助你? \n回复指定文字领取奖励。 ";
|
||
$data = array (
|
||
"touser" => $openid,
|
||
"msgtype" => "text",
|
||
"text" => array ("content" => $content)
|
||
);
|
||
$this->sendMsg($data, $accountid);
|
||
|
||
}
|
||
}
|
||
|
||
public function responseMsg()
|
||
{
|
||
$postStr_key = $GLOBALS ["HTTP_RAW_POST_DATA" ];
|
||
|
||
error_log('!!!begin:' . $postStr_key);
|
||
error_log('request:' . json_encode($_REQUEST));
|
||
$pc = new WXBizMsgCrypt(WEIXIN_TOKEN, WEIXIN_MSG_KEY, WEIXIN_APP_ID);
|
||
|
||
$gameid = $_REQUEST['gameid'];
|
||
|
||
$msg = '';
|
||
$msg_sign = $_REQUEST['msg_signature'];
|
||
$timeStamp = $_REQUEST['timestamp'];
|
||
$nonce = $_REQUEST['nonce'];
|
||
$errCode = $pc->decryptJsonMsg($msg_sign, $timeStamp, $nonce, $postStr_key, $postStr);
|
||
error_log('error_log:' . json_encode($errCode));
|
||
if ($errCode == 0) {
|
||
|
||
error_log("解密后: " . $postStr . "\n");
|
||
|
||
if (!empty( $postStr ) && is_string( $postStr )){
|
||
|
||
$postArr = json_decode( $postStr , true );
|
||
$accountid = phpcommon\createAccountId(6001, $gameid, $postArr['FromUserName']);
|
||
|
||
if (!empty( $postArr ['MsgType']) && $postArr['MsgType'] == 'text'){ // 文本消息
|
||
$this->disposeText($postArr, $accountid);
|
||
} elseif (!empty( $postArr ['MsgType']) && $postArr['MsgType'] == 'image'){ // 图文消息
|
||
$this->disposeImage($postArr, $accountid);
|
||
} elseif (!empty( $postArr ['MsgType']) && $postArr['MsgType'] == 'event' ){ // 进入客服动作
|
||
$this->disposeEvent($postArr, $accountid);
|
||
} else {
|
||
exit ();
|
||
}
|
||
|
||
} else {
|
||
echo "" ;
|
||
exit ;
|
||
}
|
||
|
||
} else {
|
||
error_log($errCode . "\n");
|
||
}
|
||
|
||
}
|
||
|
||
public function getAccessToken($accountid)
|
||
{
|
||
|
||
$r = $this->getRedis($accountid);
|
||
$access_token = $r->get('kf_token:' . $accountid . ':');
|
||
error_log('acc_token:' . $access_token);
|
||
if (!empty($access_token)) {
|
||
return $access_token;
|
||
}
|
||
else {
|
||
$gameid = phpcommon\extractGameId($accountid);
|
||
$config_name = "../config/game$gameid/weixin/config.php";
|
||
require $config_name;
|
||
|
||
$appid = WEIXIN_APP_ID;
|
||
$appkey = WEIXIN_APP_SECRET;
|
||
$url = "https://api.weixin.qq.com/cgi-bin/token?" .
|
||
"grant_type=client_credential&appid=$appid&secret=$appkey";
|
||
$params = array();
|
||
$response = '';
|
||
|
||
if (!phpcommon\HttpClient::get($url, $params, $response)) {
|
||
phpcommon\sendError(ERR_INTERNAL, '系统繁忙');
|
||
return;
|
||
}
|
||
error_log('response_token:' . $response);
|
||
$res = json_decode($response, true);
|
||
if ( isset($res['access_token']) ) {
|
||
//刚获取的token放到redis中 //微信限制过期时间为两小时
|
||
$r->set('kf_token:' . $accountid . ':', $res['access_token']);
|
||
$r->pexpire('kf_token:' . $accountid . ':', 1000 * ($res['expires_in'] - 60 * 1));
|
||
return $res['access_token'];
|
||
} else {
|
||
die;
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
}
|