PartyController.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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. //'ctime' =>now()
  77. ]);
  78. }else{
  79. $partyUserModel->where('id', $partyUserInfo['id'])->update([
  80. 'login_time' => now(),
  81. 'login_ip' => $this->get_real_ip(),
  82. ]);
  83. }
  84. $adapter = new Adapter();
  85. //查询是否已创建对于应用的用户
  86. $appUserModel = new Models\AppUser();
  87. $appUsername = $this->buildAppUsername($partyInfo['id'], $partyUserName, $appid);
  88. $appUserInfo = $appUserModel->where('app_username',$appUsername)->first();
  89. if(empty($appUserInfo)){
  90. $result = $adapter->syncUser($appid, $appUsername, $req->input('password')); //检测用户并创建用户
  91. if($result['code'] != 1){
  92. $this->logger->addError('login out: status:-102;创建应用用户失败; '.json_encode($result));
  93. return toJson(-102, $result['msg'], []);
  94. }
  95. $appUserModel->insert([
  96. 'app_id' => $appInfo['id'],
  97. 'party_username' => $partyUserName,
  98. 'app_username' => $appUsername,
  99. 'password' => $req->input('password'),
  100. 'login_time' => now(),
  101. 'login_ip' => $this->get_real_ip(),
  102. //'ctime' =>now()
  103. ]);
  104. }else{
  105. $appUserModel->where('id', $appUserInfo['id'])->update([
  106. 'login_time' => now(),
  107. 'login_ip' => $this->get_real_ip(),
  108. ]);
  109. }
  110. //调用内容方的登陆接口
  111. $billno = date('YmdHis', time()).rand(10000, 99999);
  112. $appResult = $adapter->login($appid, $appUsername, $req->input('password'), $money, $billno);
  113. if($appResult['code'] != 1){
  114. $this->logger->addError('login out: status:-103;调用应用登陆接口失败'.json_encode($appResult));
  115. return toJson(-103, $appResult['msg'], []);
  116. }
  117. DB::beginTransaction();
  118. //更新额度
  119. $result1 = $partyModel->where('id', $partyInfo['id'])->update(array(
  120. 'balance' => $partyInfo['balance'] - $money
  121. ));
  122. //更新额度
  123. $result2 = $appModel->where('id', $appInfo['id'])->update(array(
  124. 'balance' => $appInfo['balance'] - $money
  125. ));
  126. //记录日志
  127. $result3 = $balanceLogModel = new Models\BalanceLog();
  128. $balanceLogModel->insert([
  129. 'type' => 2,
  130. 'money' => $money,
  131. 'app_id' => $appInfo['id'],
  132. 'app_username' => $appUsername,
  133. 'party_id' =>$partyInfo['id'],
  134. 'party_username' => $partyUserName,
  135. 'billno' => $billno,
  136. //'ctime' =>now()
  137. ]);
  138. if($result1 === false || $result2 === false || $result3 === false){
  139. DB::rollBack();
  140. $this->logger->addError('login out: status:-104;更新数据库失败');
  141. return toJson(-104, '系统繁忙', []);
  142. }
  143. DB::commit();
  144. $msg = '成功';
  145. $code = 1;
  146. $this->logger->addWarning('login out: 成功,$appResult:'.json_encode($appResult));
  147. return toJson($code, $msg, $appResult);
  148. } catch (Exception $e) {
  149. return toJson($code, $msg, []);
  150. }
  151. }//end login()
  152. /**
  153. * 组装内容用户名称
  154. * @param $partyId
  155. * @param $partyUsername
  156. * @param $appid
  157. * @return string
  158. */
  159. public function buildAppUsername($partyId, $partyUsername, $appid){
  160. return 't'.$partyId.'_'.$partyUsername.'_a'.$appid;
  161. }
  162. private function checkLoginArg($req){
  163. $arr = array('code'=>-100, 'msg'=>'');
  164. if(empty($req->input('username'))){
  165. $arr['msg'] = '请输入用户名';
  166. return $arr;
  167. }
  168. if(empty($req->input('password'))){
  169. $arr['msg'] = '请输入密码';
  170. return $arr;
  171. }
  172. if(empty($req->input('appid'))){
  173. $arr['msg'] = '请输入appid';
  174. return $arr;
  175. }
  176. if(!preg_match('/^[0-9]{1,8}(.[0-9]{1,2})?$/', $req->input('money'))){
  177. $arr['msg'] = '请输入正确的金额';
  178. return $arr;
  179. }
  180. $arr['code'] = 1;
  181. return $arr;
  182. }
  183. }