PartyController.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Appadapter\Adapter;
  4. use Illuminate\Http\Request;
  5. use App\Http\Controllers\Controller;
  6. use \App\Http\Models;
  7. use Illuminate\Support\Facades\DB;
  8. use \Exception;
  9. use Monolog\Logger;
  10. use Monolog\Handler\StreamHandler;
  11. /**
  12. * 第三方管理类
  13. */
  14. class PartyController extends Controller
  15. {
  16. public $logger;
  17. public $errCode = array(
  18. 'USER_NOT_EXIT' => array(
  19. 'code' => '-110',
  20. 'msg' => '找不到此用户'
  21. ),
  22. );
  23. /**
  24. * 构造函数
  25. *
  26. * @access public
  27. * @param mixed $req 数据传输
  28. * @return array JsonString
  29. */
  30. public function __construct() {
  31. $this->logger = new Logger('party');
  32. $this->logger->pushHandler(new StreamHandler(storage_path('logs/api.log'), Logger::WARNING));
  33. }
  34. public function toError($err){
  35. return toJson($err['code'], $err['msg']);
  36. }
  37. /**
  38. * 第三方账号登陆、注册
  39. *
  40. * @access public
  41. * @param mixed $req 数据传输
  42. * @return array JsonString
  43. */
  44. public function login(Request $req)
  45. {
  46. $reqArr = $req->input();
  47. $this->logger->addWarning('login get:'.json_encode($reqArr));
  48. $code = -200;
  49. $msg = '操作失败';
  50. try {
  51. $check = $this->checkLoginArg($req);
  52. if($check['code'] != 1){
  53. return toJson($check['code'], $check['msg'], []);
  54. }
  55. $partyModel = new Models\Party;
  56. $key = $req->input('key');
  57. $appid = $req->input('appid');
  58. $partyUsername = $req->input('username');
  59. $partyNickName = $req->input('nickname');
  60. //$partyInfo = \App\Models\Party::where('key', $key)->first();
  61. $partyInfo = $partyModel->where('key', $key)->first();
  62. $money = $req->input('money');
  63. if($partyInfo['balance'] < $money){
  64. $this->logger->addError('login out: status:-100;您的余额不足');
  65. return toJson(-100, '您的余额不足', []);
  66. }
  67. $appModel = new Models\App;
  68. $appInfo = $appModel->where('id', $appid)->first();
  69. if($appInfo['balance'] < $money){
  70. $this->logger->addError('login out: status:-101;我在应用的余额不足');
  71. return toJson(-101, '系统繁忙,请稍后重试', []); //我的余额不足
  72. }
  73. //查询该用户是否已在系统
  74. $partyUserModel = new Models\PartyUser();
  75. $partyUserInfo = $partyUserModel->where([
  76. ['party_id', '=', $partyInfo['id']],
  77. ['party_username', '=', $partyUsername],
  78. ])->first();
  79. if(empty($partyUserInfo)){
  80. $partyUserModel->insert([
  81. 'party_id' => $partyInfo['id'],
  82. 'party_username' => $partyUsername,
  83. 'nickname' => $partyNickName,
  84. 'password' => $req->input('password'),
  85. 'login_time' => now(),
  86. 'login_ip' => $this->get_real_ip(),
  87. ]);
  88. }else{
  89. $partyUserModel->where('id', $partyUserInfo['id'])->update([
  90. 'login_time' => now(),
  91. 'login_ip' => $this->get_real_ip(),
  92. ]);
  93. }
  94. $adapter = new Adapter();
  95. //查询是否已创建对于应用的用户
  96. $appUserModel = new Models\AppUser();
  97. $info = $this->findAppUsername($partyInfo['id'], $partyUsername, $appid);
  98. if($info == false){
  99. $appUsername = $this->buildAppUsername($partyInfo['id'], $partyUsername, $appid);
  100. $result = $adapter->syncUser($appid, $appUsername, $req->input('password')); //检测用户并创建用户
  101. if($result['code'] != 1){
  102. $this->logger->addError('login out: status:-102;创建应用用户失败; '.json_encode($result));
  103. return toJson(-102, $result['msg'], []);
  104. }
  105. $appUserId = $appUserModel->insert([
  106. 'app_id' => $appInfo['id'],
  107. 'party_username' => $partyUsername,
  108. 'app_username' => $appUsername,
  109. 'password' => $req->input('password'),
  110. 'login_time' => now(),
  111. 'login_ip' => $this->get_real_ip(),
  112. ]);
  113. $UserMapModel = new Models\PartyAppUserMap();
  114. $UserMapModel->insert([
  115. 'party_id' => $partyInfo['id'],
  116. 'party_username' => $partyUsername,
  117. 'app_id' => $appInfo['id'],
  118. 'app_username' => $appUsername,
  119. 'app_user_id' => $appUserId,
  120. ]);
  121. }else{
  122. $appUsername = $info['appUsername'];
  123. $appUserId = $info['appUserId'];
  124. $appUserModel->where('id', $appUserId)->update([
  125. 'login_time' => now(),
  126. 'login_ip' => $this->get_real_ip(),
  127. ]);
  128. }
  129. //调用内容方的登陆接口
  130. $billno = date('YmdHis', time()).rand(10000, 99999);
  131. $appResult = $adapter->login($appid, $appUsername, $req->input('password'), $money, $billno);
  132. if($appResult['code'] != 1){
  133. $this->logger->addError('login out: status:-103;调用应用登陆接口失败'.json_encode($appResult));
  134. return toJson(-103, $appResult['msg'], []);
  135. }
  136. DB::beginTransaction();
  137. //更新额度
  138. $partyBalance = $partyInfo['balance'] - $money;
  139. $result1 = $partyModel->where('id', $partyInfo['id'])->update(array(
  140. 'balance' => $partyBalance
  141. ));
  142. //更新额度
  143. $appBalance = $appInfo['balance'] - $money;
  144. $result2 = $appModel->where('id', $appInfo['id'])->update(array(
  145. 'balance' => $appBalance
  146. ));
  147. //记录第三方日志
  148. $balanceLogModel = new Models\BalanceLog();
  149. $result3 = $balanceLogModel->insert([
  150. 'type' => 2,
  151. 'money' => $money,
  152. 'app_id' => $appInfo['id'],
  153. 'app_username' => $appUsername,
  154. 'party_id' =>$partyInfo['id'],
  155. 'party_username' => $partyUsername,
  156. 'billno' => $billno,
  157. 'balance' => $partyBalance,
  158. 'created_at' => date('Y-m-d H:i:s')
  159. ]);
  160. //记录平台日志
  161. $appBalanceLogModel = new Models\AppBalanceLog();
  162. $result4 = $appBalanceLogModel->insert([
  163. 'type' => 2,
  164. 'money' => $money,
  165. 'app_id' => $appInfo['id'],
  166. 'app_username' => $appUsername,
  167. 'party_id' =>$partyInfo['id'],
  168. 'party_username' => $partyUsername,
  169. 'billno' => $billno,
  170. 'balance' => $appBalance,
  171. 'created_at' => date('Y-m-d H:i:s')
  172. ]);
  173. if($result1 === false || $result2 === false || $result3 === false || $result4 === false){
  174. DB::rollBack();
  175. $this->logger->addError('login out: status:-104;更新数据库失败');
  176. return toJson(-104, '系统繁忙', []);
  177. }
  178. DB::commit();
  179. $msg = '成功';
  180. $code = 1;
  181. $this->logger->addWarning('login out: 成功,$appResult:'.json_encode($appResult));
  182. return toJson($code, $msg, $appResult['data']);
  183. } catch (Exception $e) {
  184. $this->logger->addWarning('login out: -200 操作失败,err:'.json_encode($e));
  185. return toJson($code, $msg, []);
  186. }
  187. }//end login()
  188. private function findAppUsername($partyId, $partyUsername, $appid){
  189. $UserMapModel = new Models\PartyAppUserMap();
  190. $info = $UserMapModel->where([
  191. ['party_id',$partyId],
  192. ['party_username',$partyUsername],
  193. ['app_id', $appid]
  194. ])->first();
  195. if(empty($info)){
  196. return false;
  197. }
  198. return array('appUsername' => $info['app_username'], 'appUserId' => $info['app_user_id']);
  199. }
  200. /**
  201. * 组装内容用户名称
  202. * @param $partyId
  203. * @param $partyUsername
  204. * @param $appid
  205. * @return string
  206. */
  207. public function buildAppUsername($partyId, $partyUsername, $appid){
  208. return 't'.$partyId.'_'.$partyUsername.'_a'.$appid;
  209. }
  210. private function checkLoginArg($req){
  211. $arr = array('code'=>-100, 'msg'=>'');
  212. if(empty($req->input('username'))){
  213. $arr['msg'] = '请输入用户名';
  214. return $arr;
  215. }
  216. if(empty($req->input('password'))){
  217. $arr['msg'] = '请输入密码';
  218. return $arr;
  219. }
  220. if(empty($req->input('appid'))){
  221. $arr['msg'] = '请输入appid';
  222. return $arr;
  223. }
  224. if(!preg_match('/^[0-9]{1,8}(.[0-9]{1,2})?$/', $req->input('money'))){
  225. $arr['msg'] = '请输入正确的金额';
  226. return $arr;
  227. }
  228. $arr['code'] = 1;
  229. return $arr;
  230. }
  231. private function checkBackBalanceArg($req){
  232. $arr = array('code'=>-100, 'msg'=>'');
  233. if(empty($req->input('username'))){
  234. $arr['msg'] = '请输入用户名';
  235. return $arr;
  236. }
  237. if(empty((int)$req->input('appid'))){
  238. $arr['msg'] = '请输入appid';
  239. return $arr;
  240. }
  241. if(!preg_match('/^[0-9]{1,8}(.[0-9]{1,2})?$/', $req->input('money'))){
  242. $arr['msg'] = '请输入正确的金额';
  243. return $arr;
  244. }
  245. $arr['code'] = 1;
  246. return $arr;
  247. }
  248. /**
  249. * 查询用户在平台的余额
  250. * @param Request $req
  251. * @return \Illuminate\Http\JsonResponse
  252. */
  253. public function balance(Request $req)
  254. {
  255. $reqArr = $req->input();
  256. $this->logger->addWarning('balance get:'.json_encode($reqArr));
  257. $code = -200;
  258. $msg = '操作失败';
  259. try {
  260. $check = $this->checkBalanceArg($req);
  261. if($check['code'] != 1){
  262. return toJson($check['code'], $check['msg'], []);
  263. }
  264. $partyModel = new Models\Party;
  265. $key = $req->input('key');
  266. $appid = $req->input('appid');
  267. $partyUsername = $req->input('username');
  268. $partyInfo = $partyModel->where('key', $key)->first();
  269. //查询该用户是否已在系统
  270. $partyUserModel = new Models\PartyUser();
  271. $partyUserInfo = $partyUserModel->where([
  272. ['party_id', '=', $partyInfo['id']],
  273. ['party_username', '=', $partyUsername],
  274. ])->first();
  275. if(empty($partyUserInfo)){
  276. return $this->toError($this->errCode['USER_NOT_EXIT']);
  277. }
  278. if(empty($appid)){
  279. $lastAppInfo = $this->getLastAppInfo($partyInfo['id'], $partyUsername);
  280. $appid = $lastAppInfo['app_id'];
  281. $appUsername = $lastAppInfo['app_username'];
  282. }else{
  283. $findInfo = $this->findAppUsername($partyInfo['id'], $partyUsername, $appid);
  284. $appUsername = $findInfo['appUsername'];
  285. }
  286. $password = $this->getAppUserPasswordByUsername($appUsername, $appid);
  287. $adapter = new Adapter();
  288. //调用内容方的登陆接口
  289. $billno = date('YmdHis', time()).rand(10000, 99999);
  290. $appResult = $adapter->balance($appid, $appUsername, $password);
  291. if($appResult['code'] != 1){
  292. $this->logger->addError('balance out: status:-103;调用应用登陆接口失败'.json_encode($appResult));
  293. return toJson(-103, $appResult['msg'], []);
  294. }
  295. $msg = '成功';
  296. $code = 1;
  297. $this->logger->addWarning('balance out: 成功,$appResult:'.json_encode($appResult));
  298. return toJson($code, $msg, $appResult['data']);
  299. } catch (Exception $e) {
  300. $this->logger->addWarning('balance out: -200 操作失败,err:'.json_encode($e));
  301. return toJson($code, $msg, []);
  302. }
  303. }//end login()
  304. /**
  305. * 转回用户在平台的余额
  306. * @param Request $req
  307. * @return \Illuminate\Http\JsonResponse
  308. */
  309. public function backBalance(Request $req)
  310. {
  311. $reqArr = $req->input();
  312. $this->logger->addWarning('backBalance get:'.json_encode($reqArr));
  313. $code = -200;
  314. $msg = '操作失败';
  315. try {
  316. $check = $this->checkBackBalanceArg($req);
  317. if($check['code'] != 1){
  318. return toJson($check['code'], $check['msg'], []);
  319. }
  320. $partyModel = new Models\Party;
  321. $key = $req->input('key');
  322. $appid = (int)$req->input('appid');
  323. $money = $req->input('money');
  324. $partyUsername = $req->input('username');
  325. $partyInfo = $partyModel->where('key', $key)->first();
  326. //查询该用户是否已在系统
  327. $partyUserModel = new Models\PartyUser();
  328. $partyUserInfo = $partyUserModel->where([
  329. ['party_id', '=', $partyInfo['id']],
  330. ['party_username', '=', $partyUsername],
  331. ])->first();
  332. if(empty($partyUserInfo)){
  333. return $this->toError($this->errCode['USER_NOT_EXIT']);
  334. }
  335. $findInfo = $this->findAppUsername($partyInfo['id'], $partyUsername, $appid);
  336. $appUsername = $findInfo['appUsername'];
  337. $password = $this->getAppUserPasswordByUsername($appUsername, $appid);
  338. $adapter = new Adapter();
  339. //调用内容方的登陆接口
  340. $billno = date('YmdHis', time()).rand(10000, 99999);
  341. $appResult = $adapter->backBalance($appid, $appUsername, $password, $money, $billno);
  342. if($appResult['code'] != 1){
  343. $this->logger->addError('login out: status:-103;调用应用登陆接口失败'.json_encode($appResult));
  344. return toJson(-103, $appResult['msg'], []);
  345. }
  346. $appModel = new Models\App;
  347. $appInfo = $appModel->where('id', $appid)->first();
  348. DB::beginTransaction();
  349. //更新额度
  350. $partyBalance = $partyInfo['balance'] + $money;
  351. $result1 = $partyModel->where('id', $partyInfo['id'])->update(array(
  352. 'balance' => $partyBalance
  353. ));
  354. //更新额度
  355. $appBalance = $appInfo['balance'] + $money;
  356. $result2 = $appModel->where('id', $appInfo['id'])->update(array(
  357. 'balance' => $appBalance
  358. ));
  359. //记录第三方日志
  360. $balanceLogModel = new Models\BalanceLog();
  361. $result3 = $balanceLogModel->insert([
  362. 'type' => 1,
  363. 'money' => $money,
  364. 'app_id' => $appInfo['id'],
  365. 'app_username' => $appUsername,
  366. 'party_id' =>$partyInfo['id'],
  367. 'party_username' => $partyUsername,
  368. 'billno' => $billno,
  369. 'balance' => $partyBalance,
  370. 'created_at' => date('Y-m-d H:i:s')
  371. ]);
  372. //记录平台日志
  373. $appBalanceLogModel = new Models\AppBalanceLog();
  374. $result4 = $appBalanceLogModel->insert([
  375. 'type' => 1,
  376. 'money' => $money,
  377. 'app_id' => $appInfo['id'],
  378. 'app_username' => $appUsername,
  379. 'party_id' =>$partyInfo['id'],
  380. 'party_username' => $partyUsername,
  381. 'billno' => $billno,
  382. 'balance' => $appBalance,
  383. 'created_at' => date('Y-m-d H:i:s')
  384. ]);
  385. if($result1 === false || $result2 === false || $result3 === false || $result4 === false){
  386. DB::rollBack();
  387. $this->logger->addError('login out: status:-104;更新数据库失败');
  388. return toJson(-104, '系统繁忙', []);
  389. }
  390. DB::commit();
  391. $msg = '成功';
  392. $code = 1;
  393. $this->logger->addWarning('login out: 成功,$appResult:'.json_encode($appResult));
  394. return toJson($code, $msg, $appResult['data']);
  395. } catch (Exception $e) {
  396. $this->logger->addWarning('login out: -200 操作失败,err:'.json_encode($e));
  397. return toJson($code, $msg, []);
  398. }
  399. }//end login()
  400. /**
  401. * 获取用户登陆的最后一个平台的信息
  402. * @param $partyId
  403. * @param $partyUsername
  404. * @return array
  405. */
  406. private function getLastAppInfo($partyId, $partyUsername){
  407. $model = new Models\BalanceLog();
  408. $info = $model->where([
  409. ['party_id', '=', $partyId],
  410. ['party_username', '=', $partyUsername],
  411. ])->orderBy('id', 'desc')->first();
  412. return array('app_username'=>$info['app_username'], 'app_id'=>$info['app_id']);
  413. }
  414. /**
  415. * 通过平台用户名返回平台用户密码
  416. * @param $appUsername
  417. * @param $appid
  418. * @return mixed
  419. */
  420. private function getAppUserPasswordByUsername($appUsername, $appid){
  421. $model = new Models\AppUser();
  422. $info = $model->where([
  423. ['app_id', '=', $appid],
  424. ['app_username', '=', $appUsername],
  425. ])->first();
  426. return $info['password'];
  427. }
  428. private function checkBalanceArg($req){
  429. $arr = array('code'=>-100, 'msg'=>'');
  430. if(empty($req->input('username'))){
  431. $arr['msg'] = '请输入用户名';
  432. return $arr;
  433. }
  434. /*if(empty($req->input('appid'))){
  435. $arr['msg'] = '请输入appid';
  436. return $arr;
  437. }*/
  438. $arr['code'] = 1;
  439. return $arr;
  440. }
  441. }