ChannelCa.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. <?php
  2. /**
  3. * 渠道通信密钥管理
  4. *
  5. * @category Controller
  6. * @author SHUI
  7. * @since 2018/9/26
  8. */
  9. namespace app\admin\controller;
  10. use app\common\model\ChannelCa as ChannelCaModel;
  11. use think\Db;
  12. use think\Validate;
  13. use think\Exception;
  14. use app\common\model\ChannelApiRequestAuth;
  15. class ChannelCa extends Admin {
  16. private $_channelCaModel = null;
  17. public function _initialize() {
  18. parent::_initialize();
  19. $this->_channelCaModel = new ChannelCaModel;
  20. }
  21. /**
  22. * 显示已经配置的秘钥对列表
  23. */
  24. public function encryptionKeyList() {
  25. $where =[];
  26. $list = $this->cyModel('channel_ca')
  27. ->alias("a")
  28. ->join("nw_channel b", 'a.ca_channel_id = b.id', 'left')
  29. ->field("a.ca_id as id, a.ca_public_key, a.ca_encryption_key_type, a.ca_enable_status, a.ca_realname, a.ca_mobile, a.ca_mail, a.ca_create_time, a.ca_channel_id as channel_id, b.name as channel_name")
  30. ->where($where)
  31. ->order("a.ca_id desc")
  32. ->paginate(10, false, ['query' => $where])->each(function($item, $key){
  33. // 顶级渠道
  34. $item['top_channel_name'] = get_top_channel($item['channel_id'])['name'];
  35. return $item;
  36. });
  37. $page = $list->render();
  38. $this->assign('total', $list->total());
  39. $this->assign("page", $page);
  40. $this->assign('list', $list);
  41. return $this->fetch('encryptionKeyList');
  42. }
  43. /**
  44. * 密钥对编辑和添加公用的页面
  45. */
  46. public function encryptionKeyEdit() {
  47. if ( request()->isGet() ) {
  48. $id = input('id', 0, 'intval');
  49. $info = [];
  50. if ( ! empty($id) ) {
  51. $info = $this->_channelCaModel->where(['ca_id' => $id])->find();
  52. }
  53. $channelList= model('Channel')->field('id,name')->where(['status'=>1,'flag'=>3])->order('name asc')->select();
  54. $this->assign('channel_list', $channelList);
  55. $this->assign('info', $info);
  56. return $this->fetch('encryptionKeyEdit');
  57. }
  58. if ( request()->isPost() ) {
  59. $param = input('param.');
  60. $validate = new Validate([
  61. ['ca_private_key', 'isValidPrivatekey:1', '私钥信息错误'],
  62. ['ca_public_key', 'isValidPublickey:1', '公钥信息错误'],
  63. ['ca_realname', 'require', '请填写联系人姓名'],
  64. ['ca_mobile', 'require', '请填写联系人手机号'],
  65. ['ca_mail', 'email', '请正确填写联系人邮箱'],
  66. ]);
  67. $validate->extend([
  68. 'isValidPrivatekey' => function ($value, $rule) {
  69. if ( empty($value) ) {
  70. return false;
  71. }
  72. $resource_id = openssl_pkey_get_private($value);
  73. if ( empty($resource_id) ) {
  74. return false;
  75. }
  76. return true;
  77. },
  78. 'isValidPublickey' => function ($value, $rule) {
  79. if ( empty($value) ) {
  80. return false;
  81. }
  82. $resource_id = openssl_pkey_get_public($value);
  83. if ( empty($resource_id) ) {
  84. return false;
  85. }
  86. return true;
  87. }
  88. ]);
  89. $result = $validate->check($param);
  90. if ( true !== $result ) {
  91. $this->error($validate->getError());
  92. }
  93. $id = isset($param['id']) ? (int)$param['id'] : 0;
  94. unset($param['id']);
  95. if ( 0 < $id ) {
  96. $param['ca_update_time'] = NOW_TIMESTAMP;
  97. unset($param['ca_channel_id'],$param['ca_private_key'],$param['ca_public_key']);
  98. $result = $this->_channelCaModel->allowField(true)->save($param, ['ca_id' => $id]);
  99. } else {
  100. if ( ! $this->_channelCaModel->isValidEncryptionKey($param['ca_private_key'], $param['ca_public_key']) ) {
  101. $this->error('公钥和私钥不匹配,请重新生成或填写');
  102. }
  103. if ( $this->_channelCaModel->where(['ca_channel_id' => $param['ca_channel_id']])->count() ) {
  104. $this->error('已添加该渠道,请勿重复添加');
  105. }
  106. $param['ca_create_time'] = NOW_TIMESTAMP;
  107. $result = $this->_channelCaModel->allowField(true)->save($param);
  108. }
  109. if ( false === $result ) {
  110. $this->error('操作失败');
  111. } else {
  112. $this->success('操作成功','ChannelCa/encryptionKeyList');
  113. }
  114. }
  115. }
  116. /**
  117. * 秘钥对记录删除
  118. */
  119. public function encryptionKeyDelete() {
  120. $id = input('id', 0, 'intval');
  121. if ( empty($id) ) {
  122. $this->error('参数错误');
  123. }
  124. $info = $this->_channelCaModel->where(['ca_id' => $id])->find();
  125. if ( empty($info) ) {
  126. $this->error('记录不存在');
  127. }
  128. if ( $info['ca_enable_status'] != '0' ) {
  129. $this->error('请先禁用该密钥对');
  130. }
  131. $result = $this->_channelCaModel->where(['ca_id' => $id])->delete();
  132. if ( false === $result ) {
  133. $this->error('删除失败');
  134. } else {
  135. $content = '删除了渠道:'.model('Channel')->where(['id' => $info['ca_channel_id']])->value('name').'的密钥对';
  136. $this->insertLog($this->current_node, $content, 63);
  137. $this->success('删除成功','ChannelCa/encryptionKeyList');
  138. }
  139. }
  140. /**
  141. * @param $data
  142. * @return array
  143. */
  144. private function getChange($data){
  145. $limit = $this->_freezingLimit(); //限制的接口
  146. $limit = explode(',',$limit); //转化成数组
  147. $limit_open = $data; //可以访问的接口
  148. $limit_open = explode(',',$limit_open); //转化成数组
  149. $diff = array_diff($limit,$limit_open); //差集
  150. $intersect = array_intersect($limit,$limit_open); //交集
  151. $limit_diff = array_flip($diff);
  152. foreach($limit_diff as $k => $v){
  153. $limit_diff[$k] = 0;
  154. }
  155. $limit_intersect = array_flip($intersect);
  156. foreach($limit_intersect as $k => $v){
  157. $limit_intersect[$k] = 1;
  158. }
  159. $data_limit = array_merge($limit_diff,$limit_intersect);
  160. return $data_limit;
  161. }
  162. /*
  163. * 外部渠道冻结管理
  164. */
  165. public function freezing()
  166. {
  167. $channel_name = $this->request->get('channel_name','','trim');
  168. $condition = [];
  169. if(!is_null($channel_name)){
  170. $condition['n.name'] = ['like','%'.$channel_name.'%'];
  171. }
  172. $freezingModel = new ChannelApiRequestAuth;
  173. $list = $freezingModel->alias('a')
  174. ->join('nw_channel n','a.channel_id = n.id','LEFT')
  175. ->field('a.*,n.name')
  176. ->where($condition)
  177. ->order('id desc')
  178. ->paginate(10, false, ['query' => input('get.')]);
  179. foreach ($list as &$item){
  180. $data_limit = $this->getChange($item['allow_action']);
  181. $item['game_list'] = $data_limit['game_list'];
  182. $item['member_recharge'] = $data_limit['member_recharge'];
  183. $item['query_discount'] = $data_limit['query_discount'];
  184. $item['login_list'] = $data_limit['login_list'];
  185. $item['register_list'] = $data_limit['register_list'];
  186. $item['pay_list'] = $data_limit['pay_list'];
  187. $item['sub_package'] = $data_limit['sub_package'];
  188. $item['detect_channel'] = $data_limit['detect_channel'];
  189. $item['detect_user'] = $data_limit['detect_user'];
  190. $item['subchannel_recharge'] = $data_limit['subchannel_recharge'];
  191. $item['create_channel'] = $data_limit['create_channel'];
  192. $item['check_balance'] = $data_limit['check_balance'];
  193. $item['channel_discount'] = $data_limit['channel_discount'];
  194. $item['operate_package'] = $data_limit['operate_package'];
  195. $item['game_point'] = $data_limit['game_point'];
  196. $item['sub_packageurl'] = $data_limit['sub_packageurl'];
  197. }
  198. $this->assign('list', $list);
  199. $this->assign('total', $list->total());
  200. $this->assign('page', $list->render());
  201. return $this->fetch('freezing');
  202. }
  203. /**
  204. * 获取聚合渠道列表
  205. * @return array
  206. */
  207. protected function _getChannelList() {
  208. $channelModel = new \app\common\model\Channel();
  209. $channel_id = Db::table('cy_channel_ca')->column('ca_channel_id');
  210. $where = array(
  211. 'id' => array('IN',$channel_id)
  212. );
  213. $list = $channelModel->field(['id', 'name'])->order('id desc')->where($where)->select();
  214. return $list ?: [];
  215. }
  216. /*
  217. *外部渠道冻结管理添加
  218. */
  219. public function addFreezing()
  220. {
  221. if($this->request->isPost()){
  222. $freezingModel = new ChannelApiRequestAuth;
  223. $data = [
  224. 'channel_id' => input('post.channel_id'),
  225. 'create_time' => time(),
  226. 'per_hour_max_request_times' => '1000',
  227. 'allow_action' => $this->getFreezing()
  228. ];
  229. $check = $freezingModel->where('channel_id',$data['channel_id'])->find();
  230. if ($check){
  231. $this->error('该渠道存在,请不要重复添加');
  232. }
  233. $result = $this->validate($data,[
  234. ['channel_id','require','渠道名称不能为空'],
  235. ]);
  236. if (true !== $result) {
  237. $this->error($result);
  238. }
  239. if ($freezingModel->allowField(true)->save($data)) {
  240. $content = '新增渠道冻结管理:'.model('Channel')->where(['id' => $data['channel_id']])->value('name');
  241. $this->insertLog($this->current_node, $content, 64);
  242. $this->success('添加成功',url('freezing'));
  243. }
  244. $this->error($freezingModel->getError() ?: '添加失败');
  245. }
  246. $this->assign('channel_list', $this->_getChannelList());
  247. return $this->fetch('addFreezing');
  248. }
  249. /*
  250. * 外部渠道冻结管理编辑
  251. */
  252. public function editFreezing()
  253. {
  254. $id = $this->request->param('id',0,'intval');
  255. $freezingModel = new ChannelApiRequestAuth;
  256. $list = $freezingModel->where('id',$id)->find();
  257. if ($this->request->isPost()){
  258. $id = input('id');
  259. $data = [
  260. 'allow_action' => $this->getFreezing()
  261. ];
  262. $freezingModel = new ChannelApiRequestAuth;
  263. if ($freezingModel->allowField(true)->save($data, ['id' => $id]) !== false ) {
  264. $content = '编辑渠道冻结管理:'.model('Channel')->where(['id' => $list['channel_id']])->value('name');
  265. $this->insertLog($this->current_node, $content, 65);
  266. $this->success('编辑成功',url('freezing'));
  267. }
  268. $this->error($freezingModel->getError() ?: '编辑失败');
  269. }
  270. $data_limit = $this->getChange($list['allow_action']);
  271. $list['game_list'] = $data_limit['game_list'];
  272. $list['member_recharge'] = $data_limit['member_recharge'];
  273. $list['query_discount'] = $data_limit['query_discount'];
  274. $list['login_list'] = $data_limit['login_list'];
  275. $list['register_list'] = $data_limit['register_list'];
  276. $list['pay_list'] = $data_limit['pay_list'];
  277. $list['sub_package'] = $data_limit['sub_package'];
  278. $list['detect_channel'] = $data_limit['detect_channel'];
  279. $list['detect_user'] = $data_limit['detect_user'];
  280. $list['subchannel_recharge'] = $data_limit['subchannel_recharge'];
  281. $list['create_channel'] = $data_limit['create_channel'];
  282. $list['check_balance'] = $data_limit['check_balance'];
  283. $list['channel_discount'] = $data_limit['channel_discount'];
  284. $list['operate_package'] = $data_limit['operate_package'];
  285. $list['game_point'] = $data_limit['game_point'];
  286. $list['sub_packageurl'] = $data_limit['sub_packageurl'];
  287. $this->assign('list',$list);
  288. return $this->fetch('editFreezing');
  289. }
  290. /*
  291. *允许访问的接口拼接
  292. */
  293. private function getFreezing()
  294. {
  295. $allow = [
  296. 'sync_time' => 'sync_time',
  297. 'hello_world' => 'hello_world',
  298. 'game_list' => input('post.game_list'),
  299. 'member_recharge' => input('post.member_recharge'),
  300. 'query_discount' => input('post.query_discount'),
  301. 'login_list' => input('post.login_list'),
  302. 'register_list' => input('post.register_list'),
  303. 'pay_list' => input('post.pay_list'),
  304. 'sub_package' => input('post.sub_package'),
  305. 'detect_channel' => input('post.detect_channel'),
  306. 'detect_user' => input('post.detect_user'),
  307. 'subchannel_recharge' => input('post.subchannel_recharge'),
  308. 'create_channel' => input('post.create_channel'),
  309. 'check_balance' => input('post.check_balance'),
  310. 'channel_discount' => input('post.channel_discount'),
  311. 'operate_package' => input('post.operate_package'),
  312. 'game_point' => input('post.game_point'),
  313. 'sub_packageurl' => input('post.sub_packageurl'),
  314. ];
  315. $allow = array_filter($allow); //去掉数组中的空值
  316. $allow = implode(',',$allow); //将数组转化成字符串
  317. return $allow;
  318. }
  319. /*
  320. * 外部渠道冻结配置表
  321. */
  322. protected function _freezingLimit()
  323. {
  324. return 'sync_time,hello_world,game_list,member_recharge,query_discount,login_list,register_list,pay_list,sub_package,detect_channel,detect_user,subchannel_recharge,create_channel,check_balance,channel_discount,operate_package,game_point,sub_packageurl';
  325. }
  326. }