PartyController.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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. /**
  18. * 构造函数
  19. *
  20. * @access public
  21. * @param mixed $req 数据传输
  22. * @return array JsonString
  23. */
  24. public function __construct() {
  25. $this->logger = new Logger('party');
  26. $this->logger->pushHandler(new StreamHandler(storage_path('logs/api.log'), Logger::WARNING));
  27. }
  28. /**
  29. * 第三方账号登陆、注册
  30. *
  31. * @access public
  32. * @param mixed $req 数据传输
  33. * @return array JsonString
  34. */
  35. public function login(Request $req)
  36. {
  37. $reqArr = $req->input();
  38. $this->logger->addWarning('login get:'.json_encode($reqArr));
  39. $code = -200;
  40. $msg = '操作失败';
  41. try {
  42. $check = $this->checkLoginArg($req);
  43. if($check['code'] != 1){
  44. return toJson($check['code'], $check['msg'], []);
  45. }
  46. $partyModel = new Models\Party;
  47. $key = $req->input('key');
  48. $appid = $req->input('appid');
  49. $partyUserName = $req->input('username');
  50. //$partyInfo = \App\Models\Party::where('key', $key)->first();
  51. $partyInfo = $partyModel->where('key', $key)->first();
  52. $money = $req->input('money');
  53. if($partyInfo['balance'] < $money){
  54. $this->logger->addError('login out: status:-100;您的余额不足');
  55. return toJson(-100, '您的余额不足', []);
  56. }
  57. $appModel = new Models\App;
  58. $appInfo = $appModel->where('id', $appid)->first();
  59. if($appInfo['balance'] < $money){
  60. $this->logger->addError('login out: status:-101;我在应用的余额不足');
  61. return toJson(-101, '系统繁忙,请稍后重试', []); //我的余额不足
  62. }
  63. //查询该用户是否已在系统
  64. $partyUserModel = new Models\PartyUser();
  65. $partyUserInfo = $partyUserModel->where([
  66. ['party_id', '=', $partyInfo['id']],
  67. ['party_username', '=', $partyUserName],
  68. ])->first();
  69. if(empty($partyUserInfo)){
  70. $partyUserModel->insert([
  71. 'party_id' => $partyInfo['id'],
  72. 'party_username' => $partyUserName,
  73. 'password' => $req->input('password'),
  74. 'login_time' => now(),
  75. 'login_ip' => $this->get_real_ip(),
  76. ]);
  77. }else{
  78. $partyUserModel->where('id', $partyUserInfo['id'])->update([
  79. 'login_time' => now(),
  80. 'login_ip' => $this->get_real_ip(),
  81. ]);
  82. }
  83. $adapter = new Adapter();
  84. //查询是否已创建对于应用的用户
  85. $appUserModel = new Models\AppUser();
  86. $appUsername = $this->buildAppUsername($partyInfo['id'], $partyUserName, $appid);
  87. $appUserInfo = $appUserModel->where('app_username',$appUsername)->first();
  88. if(empty($appUserInfo)){
  89. $result = $adapter->syncUser($appid, $appUsername, $req->input('password')); //检测用户并创建用户
  90. if($result['code'] != 1){
  91. $this->logger->addError('login out: status:-102;创建应用用户失败; '.json_encode($result));
  92. return toJson(-102, $result['msg'], []);
  93. }
  94. $appUserModel->insert([
  95. 'app_id' => $appInfo['id'],
  96. 'party_username' => $partyUserName,
  97. 'app_username' => $appUsername,
  98. 'password' => $req->input('password'),
  99. 'login_time' => now(),
  100. 'login_ip' => $this->get_real_ip(),
  101. ]);
  102. }else{
  103. $appUserModel->where('id', $appUserInfo['id'])->update([
  104. 'login_time' => now(),
  105. 'login_ip' => $this->get_real_ip(),
  106. ]);
  107. }
  108. //调用内容方的登陆接口
  109. $billno = date('YmdHis', time()).rand(10000, 99999);
  110. $appResult = $adapter->login($appid, $appUsername, $req->input('password'), $money, $billno);
  111. if($appResult['code'] != 1){
  112. $this->logger->addError('login out: status:-103;调用应用登陆接口失败'.json_encode($appResult));
  113. return toJson(-103, $appResult['msg'], []);
  114. }
  115. DB::beginTransaction();
  116. //更新额度
  117. $result1 = $partyModel->where('id', $partyInfo['id'])->update(array(
  118. 'balance' => $partyInfo['balance'] - $money
  119. ));
  120. //更新额度
  121. $result2 = $appModel->where('id', $appInfo['id'])->update(array(
  122. 'balance' => $appInfo['balance'] - $money
  123. ));
  124. //记录日志
  125. $result3 = $balanceLogModel = new Models\BalanceLog();
  126. $balanceLogModel->insert([
  127. 'type' => 2,
  128. 'money' => $money,
  129. 'app_id' => $appInfo['id'],
  130. 'app_username' => $appUsername,
  131. 'party_id' =>$partyInfo['id'],
  132. 'party_username' => $partyUserName,
  133. 'billno' => $billno,
  134. ]);
  135. if($result1 === false || $result2 === false || $result3 === false){
  136. DB::rollBack();
  137. $this->logger->addError('login out: status:-104;更新数据库失败');
  138. return toJson(-104, '系统繁忙', []);
  139. }
  140. DB::commit();
  141. $msg = '成功';
  142. $code = 1;
  143. $this->logger->addWarning('login out: 成功,$appResult:'.json_encode($appResult));
  144. return toJson($code, $msg, $appResult);
  145. } catch (Exception $e) {
  146. $this->logger->addWarning('login out: -200 操作失败,err:'.json_encode($e));
  147. return toJson($code, $msg, []);
  148. }
  149. }//end login()
  150. /**
  151. * 组装内容用户名称
  152. * @param $partyId
  153. * @param $partyUsername
  154. * @param $appid
  155. * @return string
  156. */
  157. public function buildAppUsername($partyId, $partyUsername, $appid){
  158. return 't'.$partyId.'_'.$partyUsername.'_a'.$appid;
  159. }
  160. private function checkLoginArg($req){
  161. $arr = array('code'=>-100, 'msg'=>'');
  162. if(empty($req->input('username'))){
  163. $arr['msg'] = '请输入用户名';
  164. return $arr;
  165. }
  166. if(empty($req->input('password'))){
  167. $arr['msg'] = '请输入密码';
  168. return $arr;
  169. }
  170. if(empty($req->input('appid'))){
  171. $arr['msg'] = '请输入appid';
  172. return $arr;
  173. }
  174. if(!preg_match('/^[0-9]{1,8}(.[0-9]{1,2})?$/', $req->input('money'))){
  175. $arr['msg'] = '请输入正确的金额';
  176. return $arr;
  177. }
  178. $arr['code'] = 1;
  179. return $arr;
  180. }
  181. }