PartyController.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  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. $partyNickName = $req->input('nickname');
  51. //$partyInfo = \App\Models\Party::where('key', $key)->first();
  52. $partyInfo = $partyModel->where('key', $key)->first();
  53. $money = $req->input('money');
  54. if($partyInfo['balance'] < $money){
  55. $this->logger->addError('login out: status:-100;您的余额不足');
  56. return toJson(-100, '您的余额不足', []);
  57. }
  58. $appModel = new Models\App;
  59. $appInfo = $appModel->where('id', $appid)->first();
  60. if($appInfo['balance'] < $money){
  61. $this->logger->addError('login out: status:-101;我在应用的余额不足');
  62. return toJson(-101, '系统繁忙,请稍后重试', []); //我的余额不足
  63. }
  64. //查询该用户是否已在系统
  65. $partyUserModel = new Models\PartyUser();
  66. $partyUserInfo = $partyUserModel->where([
  67. ['party_id', '=', $partyInfo['id']],
  68. ['party_username', '=', $partyUserName],
  69. ])->first();
  70. if(empty($partyUserInfo)){
  71. $partyUserModel->insert([
  72. 'party_id' => $partyInfo['id'],
  73. 'party_username' => $partyUserName,
  74. 'nickname' => $partyNickName,
  75. 'password' => $req->input('password'),
  76. 'login_time' => now(),
  77. 'login_ip' => $this->get_real_ip(),
  78. ]);
  79. }else{
  80. $partyUserModel->where('id', $partyUserInfo['id'])->update([
  81. 'login_time' => now(),
  82. 'login_ip' => $this->get_real_ip(),
  83. ]);
  84. }
  85. $adapter = new Adapter();
  86. //查询是否已创建对于应用的用户
  87. $appUserModel = new Models\AppUser();
  88. $info = $this->findAppUsername($partyInfo['id'], $partyUserName, $appid);
  89. if($info == false){
  90. $appUsername = $this->buildAppUsername($partyInfo['id'], $partyUserName, $appid);
  91. $result = $adapter->syncUser($appid, $appUsername, $req->input('password')); //检测用户并创建用户
  92. if($result['code'] != 1){
  93. $this->logger->addError('login out: status:-102;创建应用用户失败; '.json_encode($result));
  94. return toJson(-102, $result['msg'], []);
  95. }
  96. $appUserId = $appUserModel->insert([
  97. 'app_id' => $appInfo['id'],
  98. 'party_username' => $partyUserName,
  99. 'app_username' => $appUsername,
  100. 'password' => $req->input('password'),
  101. 'login_time' => now(),
  102. 'login_ip' => $this->get_real_ip(),
  103. ]);
  104. $UserMapModel = new Models\PartyAppUserMap();
  105. $UserMapModel->insert([
  106. 'party_id' => $partyInfo['id'],
  107. 'party_username' => $partyUserName,
  108. 'app_id' => $appInfo['id'],
  109. 'app_username' => $appUsername,
  110. 'app_user_id' => $appUserId,
  111. ]);
  112. }else{
  113. $appUsername = $info['appUsername'];
  114. $appUserId = $info['appUserId'];
  115. $appUserModel->where('id', $appUserId)->update([
  116. 'login_time' => now(),
  117. 'login_ip' => $this->get_real_ip(),
  118. ]);
  119. }
  120. //调用内容方的登陆接口
  121. $billno = date('YmdHis', time()).rand(10000, 99999);
  122. $appResult = $adapter->login($appid, $appUsername, $req->input('password'), $money, $billno);
  123. if($appResult['code'] != 1){
  124. $this->logger->addError('login out: status:-103;调用应用登陆接口失败'.json_encode($appResult));
  125. return toJson(-103, $appResult['msg'], []);
  126. }
  127. DB::beginTransaction();
  128. //更新额度
  129. $partyBalance = $partyInfo['balance'] - $money;
  130. $result1 = $partyModel->where('id', $partyInfo['id'])->update(array(
  131. 'balance' => $partyBalance
  132. ));
  133. //更新额度
  134. $appBalance = $appInfo['balance'] - $money;
  135. $result2 = $appModel->where('id', $appInfo['id'])->update(array(
  136. 'balance' => $appBalance
  137. ));
  138. //记录第三方日志
  139. $balanceLogModel = new Models\BalanceLog();
  140. $result3 = $balanceLogModel->insert([
  141. 'type' => 2,
  142. 'money' => $money,
  143. 'app_id' => $appInfo['id'],
  144. 'app_username' => $appUsername,
  145. 'party_id' =>$partyInfo['id'],
  146. 'party_username' => $partyUserName,
  147. 'billno' => $billno,
  148. 'balance' => $partyBalance
  149. ]);
  150. //记录平台日志
  151. $appBalanceLogModel = new Models\AppBalanceLog();
  152. $result4 = $appBalanceLogModel->insert([
  153. 'type' => 2,
  154. 'money' => $money,
  155. 'app_id' => $appInfo['id'],
  156. 'app_username' => $appUsername,
  157. 'party_id' =>$partyInfo['id'],
  158. 'party_username' => $partyUserName,
  159. 'billno' => $billno,
  160. 'balance' => $appBalance
  161. ]);
  162. if($result1 === false || $result2 === false || $result3 === false || $result4 === false){
  163. DB::rollBack();
  164. $this->logger->addError('login out: status:-104;更新数据库失败');
  165. return toJson(-104, '系统繁忙', []);
  166. }
  167. DB::commit();
  168. $msg = '成功';
  169. $code = 1;
  170. $this->logger->addWarning('login out: 成功,$appResult:'.json_encode($appResult));
  171. return toJson($code, $msg, $appResult);
  172. } catch (Exception $e) {
  173. $this->logger->addWarning('login out: -200 操作失败,err:'.json_encode($e));
  174. return toJson($code, $msg, []);
  175. }
  176. }//end login()
  177. private function findAppUsername($partyId, $partyUsername, $appid){
  178. $UserMapModel = new Models\PartyAppUserMap();
  179. $info = $UserMapModel->where([
  180. ['party_id',$partyId],
  181. ['party_username',$partyUsername],
  182. ['app_id', $appid]
  183. ])->first();
  184. if(empty($info)){
  185. return false;
  186. }
  187. return array('appUsername' => $info['app_username'], 'appUserId' => $info['app_user_id']);
  188. }
  189. /**
  190. * 组装内容用户名称
  191. * @param $partyId
  192. * @param $partyUsername
  193. * @param $appid
  194. * @return string
  195. */
  196. public function buildAppUsername($partyId, $partyUsername, $appid){
  197. return 't'.$partyId.'_'.$partyUsername.'_a'.$appid;
  198. }
  199. private function checkLoginArg($req){
  200. $arr = array('code'=>-100, 'msg'=>'');
  201. if(empty($req->input('username'))){
  202. $arr['msg'] = '请输入用户名';
  203. return $arr;
  204. }
  205. if(empty($req->input('password'))){
  206. $arr['msg'] = '请输入密码';
  207. return $arr;
  208. }
  209. if(empty($req->input('appid'))){
  210. $arr['msg'] = '请输入appid';
  211. return $arr;
  212. }
  213. if(!preg_match('/^[0-9]{1,8}(.[0-9]{1,2})?$/', $req->input('money'))){
  214. $arr['msg'] = '请输入正确的金额';
  215. return $arr;
  216. }
  217. $arr['code'] = 1;
  218. return $arr;
  219. }
  220. }