UcController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <?php
  2. /**
  3. * Uc.php UTF-8
  4. * 汇川uc
  5. *
  6. * @date : 2018/7/27 23:07
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : ouzhongfu <ozf@huosdk.com>
  10. * @version : HUOSDK 7.2
  11. */
  12. namespace api\promotion\controller\v8;
  13. use huolib\promotion\Base;
  14. use Think\Config;
  15. use think\Controller;
  16. use think\Db;
  17. use Think\Log;
  18. class UcController extends BaseController {
  19. protected $logtable = 'promotion_uc_log';
  20. protected $usertable = 'promotion_uc_user';
  21. public $uc_conf
  22. = array(
  23. 'uc_key' => '', /* key */
  24. );
  25. function _initialize() {
  26. parent::_initialize();
  27. }
  28. private function ucReturn($status = '0') {
  29. return parent::hs_api_responce($status);
  30. }
  31. /**
  32. * 点击数据记录
  33. */
  34. public function start() {
  35. $_rs = $this->checkLogTable();
  36. if (false == $_rs) {
  37. return false;
  38. }
  39. /* 1 查询是否具有访问权限 */
  40. $_urldata = $this->request->param();
  41. if (empty($_urldata)) {
  42. $this->ucReturn(300);
  43. }
  44. /*验证渠道信息*/
  45. $_pmt_id = $this->request->param('pmtid');
  46. $_pmt_data = $this->getPmtData($_pmt_id);
  47. if (!$_pmt_data) {
  48. $this->ucReturn(301);
  49. }
  50. /*1 查看参数是否配置*/
  51. $_rs = $this->check($_pmt_data['app_id'], $_pmt_data['agent_id']);
  52. if (!$_rs) {
  53. $this->ucReturn(302);
  54. }
  55. /*sign 验证*/
  56. /*$_rrs = $this->varifySign($_urldata);
  57. if (!$_rrs) {
  58. $this->ucReturn(303);
  59. }*/
  60. $_data['agent_id'] = $_pmt_data['agent_id'];
  61. $_data['app_id'] = $_pmt_data['app_id'];
  62. $_data['imei_md5'] = get_val($_urldata, 'imei', '');
  63. $_data['idfa'] = get_val($_urldata, 'idfa', '');
  64. $_data['os'] = get_val($_urldata, 'os', '');
  65. $_data['ip'] = get_val($_urldata, 'ip', '');
  66. $_data['ua'] = get_val($_urldata, 'ua', '');
  67. $_data['ts'] = get_val($_urldata, 'time', '');
  68. $_data['create_time'] = time();
  69. $_data['callback_url'] = get_val($_urldata, 'callback', '');
  70. /*保存数据*/
  71. if (empty($_data)) {
  72. $this->ucReturn(304);
  73. } else {
  74. $_rs = Db::name($this->logtable)->insert($_data);
  75. if ($_rs) {
  76. $_user_table_check = $this->checkUserTable();
  77. if (false == $_user_table_check) {
  78. return false;
  79. }
  80. $_rs = $this->userInsert($_data);
  81. $this->ucReturn();
  82. }
  83. }
  84. }
  85. /**插入promotion_toutiao_user表中
  86. *
  87. * @param $data
  88. *
  89. * @return bool|int|string
  90. */
  91. public function userInsert($data) {
  92. //$_check_map['agent_id'] = $data['agent_id'];
  93. $_check_map['app_id'] = $data['app_id'];
  94. $_check_map['os'] = $data['os'];
  95. if (1 == $data['os']) {
  96. $_check_map['imei_md5'] = $data['imei_md5'];
  97. $_from = 3;
  98. } elseif (0 == $data['os']) {
  99. $_check_map['idfa'] = $data['idfa'];
  100. $_from = 4;
  101. } else {
  102. $_check_map['imei_md5'] = $data['imei_md5'];
  103. $_from = 3;
  104. }
  105. $_is_md5 = true;
  106. $_check = Db::name($this->usertable)->where($_check_map)->find();
  107. $_base_class = new \huolib\promotion\Base();
  108. $_base_class->entVisitLog($data['agent_id'], $data['app_id']);
  109. $_uc_class = new \huolib\promotion\Uc();
  110. $_is_while = $_uc_class->isWhile($_from, $data['imei_md5'], $data['idfa'], $_is_md5);
  111. $_rs = false;
  112. if (empty($_check) || $_is_while) {
  113. $_data['agent_id'] = $data['agent_id'];
  114. $_data['app_id'] = $data['app_id'];
  115. $_data['os'] = $data['os'];
  116. $_data['imei_md5'] = $data['imei_md5'];
  117. $_data['idfa'] = $data['idfa'];
  118. $_data['create_time'] = $data['create_time'];
  119. $_data['update_time'] = $data['create_time'];
  120. $_data['status'] = 1;
  121. $_data['callback_url'] = $data['callback_url'];
  122. if ($_is_while) {
  123. $_data['is_test'] = 1;
  124. } else {
  125. $_data['is_test'] = 2;
  126. }
  127. $_rs = Db::name($this->usertable)->insert($_data);
  128. }
  129. if (empty($_check)) {
  130. $is_distinct = 1;
  131. $_rs = $_base_class->entVisitLog($data['agent_id'], $data['app_id'], $is_distinct);
  132. }
  133. return $_rs;
  134. }
  135. /**通过pmt_id获取agent_id跟app_id
  136. *
  137. * @param $pmt_id
  138. *
  139. * @return array|bool|false|\PDOStatement|string|\think\Model
  140. */
  141. public function getPmtData($pmt_id = 0) {
  142. if (empty($pmt_id)) {
  143. return false;
  144. }
  145. $_map['id'] = $pmt_id;
  146. $_data = Db::name('promotion_detail')->where($_map)->find();
  147. if (empty($_data)) {
  148. return false;
  149. }
  150. if (is_object($_data)) {
  151. $_data = $_data->toArray();
  152. }
  153. return $_data;
  154. }
  155. /**验证是否配置
  156. *
  157. * @param int $app_id
  158. * @param int $agent_id
  159. *
  160. * @return bool
  161. * @internal param array $params
  162. *
  163. */
  164. public function check($app_id = 0, $agent_id = 0) {
  165. if (empty($app_id) || empty($agent_id)) {
  166. return false;
  167. }
  168. $_map['app_id'] = $app_id;
  169. $_map['agent_id'] = $agent_id;
  170. $_key = Db::name('promotion_detail')->where($_map)->value('toutiao_key');
  171. if (empty($_key)) {
  172. return false;
  173. }
  174. $this->uc_conf['uc_key'] = $_key;
  175. return true;
  176. }
  177. /**sign验证
  178. *
  179. * @param $urldata
  180. *
  181. * @return bool
  182. */
  183. public function varifySign($urldata) {
  184. $_url = $this->request->server('REQUEST_SCHEME').'://'.$this->request->server('HTTP_HOST')
  185. .$this->request->server('REQUEST_URI');
  186. $_check = stripos($_url, "&sign=");
  187. if (!$_check) {
  188. return false;
  189. }
  190. $_check_string = substr($_url, 0, $_check).$this->uc_conf['uc_key'];
  191. $_sign = $urldata['sign'];
  192. $_check_sign = md5($_check_string);
  193. if ($_sign == $_check_sign) {
  194. return true;
  195. }
  196. }
  197. /**
  198. * @return bool
  199. */
  200. private function checkLogTable() {
  201. $_table_name = Config::get('database.prefix').$this->logtable;
  202. $_sql = '';
  203. $_sql .= "CREATE TABLE IF NOT EXISTS `".$_table_name."` (";
  204. $_sql .= " `id` int(11) NOT NULL AUTO_INCREMENT,";
  205. $_sql .= " `app_id` INT(11) NOT NULL DEFAULT 0 COMMENT '游戏id',";
  206. $_sql .= " `agent_id` INT(11) NOT NULL DEFAULT 0 COMMENT '子渠道id',";
  207. $_sql .= " `imei_md5` VARCHAR(64) NOT NULL COMMENT '用户终端的IMEI码md5后的值',";
  208. $_sql .= " `idfa` VARCHAR(64) NOT NULL COMMENT 'iOS 手机广告唯一标识',";
  209. $_sql .= " `os` VARCHAR(10) NOT NULL DEFAULT '' COMMENT '客户端操作系统的类型,0表示Ios ,1表示Android,2其他',";
  210. $_sql .= " `ip` VARCHAR(32) NOT NULL DEFAULT '未知ip' COMMENT '百度信息流返回玩家ip',";
  211. $_sql .= " `ua` VARCHAR(518) NOT NULL DEFAULT '' COMMENT 'userua信息', ";
  212. $_sql .= " `android_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '用户终端的AndroidID',";
  213. $_sql .= " `ts` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '百度信息流返回时间戳',";
  214. $_sql .= " `aid` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '创意ID',";
  215. $_sql .= " `click_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '点击唯一标识',";
  216. $_sql .= " `callback_url` VARCHAR(1000) NOT NULL DEFAULT '' COMMENT '回调地址',";
  217. $_sql .= " `create_time` INT(11) NOT NULL DEFAULT 0 COMMENT '创建时间戳',";
  218. $_sql .= " PRIMARY KEY (`id`)";
  219. $_sql .= " )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='uc点击数据记录';";
  220. try {
  221. $_rs = db()->execute($_sql);
  222. if (false === $_rs) {
  223. Log::write("uc_log create table ".$_table_name." failed1", 'error');
  224. return false;
  225. }
  226. return true;
  227. } catch (Exception $_e) {
  228. Log::write("uc_log create table ".$_table_name." failed2", 'error');
  229. return false;
  230. }
  231. }
  232. /**
  233. * @return bool
  234. */
  235. private function checkUserTable() {
  236. $_table_name = Config::get('database.prefix').$this->usertable;
  237. $_sql = '';
  238. $_sql .= "CREATE TABLE IF NOT EXISTS `".$_table_name."` (";
  239. $_sql .= " `id` int(11) NOT NULL AUTO_INCREMENT,";
  240. $_sql .= " `app_id` INT(11) NOT NULL DEFAULT 0 COMMENT '游戏id',";
  241. $_sql .= " `agent_id` INT(11) NOT NULL DEFAULT 0 COMMENT '子渠道id',";
  242. $_sql .= " `imei_md5` VARCHAR(64) NOT NULL COMMENT '用户终端的IMEI码md5后的值',";
  243. $_sql .= " `idfa` VARCHAR(64) NOT NULL COMMENT 'iOS 手机广告唯一标识',";
  244. $_sql .= " `os` VARCHAR(10) NOT NULL DEFAULT '' COMMENT '客户端操作系统的类型,0表示Ios ,1表示Android,2其他',";
  245. $_sql .= " `callback_url` VARCHAR(1000) NOT NULL DEFAULT '' COMMENT '回调地址',";
  246. $_sql .= " `create_time` INT(11) NOT NULL DEFAULT 0 COMMENT '创建时间戳',";
  247. $_sql .= " `update_time` INT(11) NOT NULL DEFAULT 0 COMMENT '更新时间戳',";
  248. $_sql .= " `status` TINYINT(2) NOT NULL DEFAULT 1 COMMENT '状态,1为待激活,2为已激活',";
  249. $_sql .= " `is_test` TINYINT(2) NOT NULL DEFAULT 2 COMMENT '是否测试数据,1是,2不是',";
  250. $_sql .= " PRIMARY KEY (`id`)";
  251. $_sql .= " )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='uc点击用户';";
  252. try {
  253. $_rs = db()->execute($_sql);
  254. if (false === $_rs) {
  255. Log::write("uc_log create table ".$_table_name." failed1", 'error');
  256. return false;
  257. }
  258. return true;
  259. } catch (Exception $_e) {
  260. Log::write("uc_log create table ".$_table_name." failed2", 'error');
  261. return false;
  262. }
  263. }
  264. }