| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514 |
- <?php
- namespace App\Http\Controllers\Api;
- use App\Http\Appadapter\Adapter;
- use Illuminate\Http\Request;
- use App\Http\Controllers\Controller;
- use \App\Http\Models;
- use Illuminate\Support\Facades\DB;
- use \Exception;
- use Monolog\Logger;
- use Monolog\Handler\StreamHandler;
- /**
- * 第三方管理类
- */
- class PartyController extends Controller
- {
- public $logger;
- public $errCode = array(
- 'USER_NOT_EXIT' => array(
- 'code' => '-110',
- 'msg' => '找不到此用户'
- ),
- );
- /**
- * 构造函数
- *
- * @access public
- * @param mixed $req 数据传输
- * @return array JsonString
- */
- public function __construct() {
- $this->logger = new Logger('party');
- $this->logger->pushHandler(new StreamHandler(storage_path('logs/api.log'), Logger::WARNING));
- }
- public function toError($err){
- return toJson($err['code'], $err['msg']);
- }
- /**
- * 第三方账号登陆、注册
- *
- * @access public
- * @param mixed $req 数据传输
- * @return array JsonString
- */
- public function login(Request $req)
- {
- $reqArr = $req->input();
- $this->logger->addWarning('login get:'.json_encode($reqArr));
- $code = -200;
- $msg = '操作失败';
- try {
- $check = $this->checkLoginArg($req);
- if($check['code'] != 1){
- return toJson($check['code'], $check['msg'], []);
- }
- $partyModel = new Models\Party;
- $key = $req->input('key');
- $appid = $req->input('appid');
- $partyUsername = $req->input('username');
- $partyNickName = $req->input('nickname');
- //$partyInfo = \App\Models\Party::where('key', $key)->first();
- $partyInfo = $partyModel->where('key', $key)->first();
- $money = $req->input('money');
- if($partyInfo['balance'] < $money){
- $this->logger->addError('login out: status:-100;您的余额不足');
- return toJson(-100, '您的余额不足', []);
- }
- $appModel = new Models\App;
- $appInfo = $appModel->where('id', $appid)->first();
- if($appInfo['balance'] < $money){
- $this->logger->addError('login out: status:-101;我在应用的余额不足');
- return toJson(-101, '系统繁忙,请稍后重试', []); //我的余额不足
- }
- //查询该用户是否已在系统
- $partyUserModel = new Models\PartyUser();
- $partyUserInfo = $partyUserModel->where([
- ['party_id', '=', $partyInfo['id']],
- ['party_username', '=', $partyUsername],
- ])->first();
- if(empty($partyUserInfo)){
- $partyUserModel->insert([
- 'party_id' => $partyInfo['id'],
- 'party_username' => $partyUsername,
- 'nickname' => $partyNickName,
- 'password' => $req->input('password'),
- 'login_time' => now(),
- 'login_ip' => $this->get_real_ip(),
- ]);
- }else{
- $partyUserModel->where('id', $partyUserInfo['id'])->update([
- 'login_time' => now(),
- 'login_ip' => $this->get_real_ip(),
- ]);
- }
- $adapter = new Adapter();
- //查询是否已创建对于应用的用户
- $appUserModel = new Models\AppUser();
- $info = $this->findAppUsername($partyInfo['id'], $partyUsername, $appid);
- if($info == false){
- $appUsername = $this->buildAppUsername($partyInfo['id'], $partyUsername, $appid);
- $result = $adapter->syncUser($appid, $appUsername, $req->input('password')); //检测用户并创建用户
- if($result['code'] != 1){
- $this->logger->addError('login out: status:-102;创建应用用户失败; '.json_encode($result));
- return toJson(-102, $result['msg'], []);
- }
- $appUserId = $appUserModel->insert([
- 'app_id' => $appInfo['id'],
- 'party_username' => $partyUsername,
- 'app_username' => $appUsername,
- 'password' => $req->input('password'),
- 'login_time' => now(),
- 'login_ip' => $this->get_real_ip(),
- ]);
- $UserMapModel = new Models\PartyAppUserMap();
- $UserMapModel->insert([
- 'party_id' => $partyInfo['id'],
- 'party_username' => $partyUsername,
- 'app_id' => $appInfo['id'],
- 'app_username' => $appUsername,
- 'app_user_id' => $appUserId,
- ]);
- }else{
- $appUsername = $info['appUsername'];
- $appUserId = $info['appUserId'];
- $appUserModel->where('id', $appUserId)->update([
- 'login_time' => now(),
- 'login_ip' => $this->get_real_ip(),
- ]);
- }
- //调用内容方的登陆接口
- $billno = date('YmdHis', time()).rand(10000, 99999);
- $appResult = $adapter->login($appid, $appUsername, $req->input('password'), $money, $billno);
- if($appResult['code'] != 1){
- $this->logger->addError('login out: status:-103;调用应用登陆接口失败'.json_encode($appResult));
- return toJson(-103, $appResult['msg'], []);
- }
- DB::beginTransaction();
- //更新额度
- $partyBalance = $partyInfo['balance'] - $money;
- $result1 = $partyModel->where('id', $partyInfo['id'])->update(array(
- 'balance' => $partyBalance
- ));
- //更新额度
- $appBalance = $appInfo['balance'] - $money;
- $result2 = $appModel->where('id', $appInfo['id'])->update(array(
- 'balance' => $appBalance
- ));
- //记录第三方日志
- $balanceLogModel = new Models\BalanceLog();
- $result3 = $balanceLogModel->insert([
- 'type' => 2,
- 'money' => $money,
- 'app_id' => $appInfo['id'],
- 'app_username' => $appUsername,
- 'party_id' =>$partyInfo['id'],
- 'party_username' => $partyUsername,
- 'billno' => $billno,
- 'balance' => $partyBalance,
- 'created_at' => date('Y-m-d H:i:s')
- ]);
- //记录平台日志
- $appBalanceLogModel = new Models\AppBalanceLog();
- $result4 = $appBalanceLogModel->insert([
- 'type' => 2,
- 'money' => $money,
- 'app_id' => $appInfo['id'],
- 'app_username' => $appUsername,
- 'party_id' =>$partyInfo['id'],
- 'party_username' => $partyUsername,
- 'billno' => $billno,
- 'balance' => $appBalance,
- 'created_at' => date('Y-m-d H:i:s')
- ]);
- if($result1 === false || $result2 === false || $result3 === false || $result4 === false){
- DB::rollBack();
- $this->logger->addError('login out: status:-104;更新数据库失败');
- return toJson(-104, '系统繁忙', []);
- }
- DB::commit();
- $msg = '成功';
- $code = 1;
- $this->logger->addWarning('login out: 成功,$appResult:'.json_encode($appResult));
- return toJson($code, $msg, $appResult['data']);
- } catch (Exception $e) {
- $this->logger->addWarning('login out: -200 操作失败,err:'.json_encode($e));
- return toJson($code, $msg, []);
- }
- }//end login()
- private function findAppUsername($partyId, $partyUsername, $appid){
- $UserMapModel = new Models\PartyAppUserMap();
- $info = $UserMapModel->where([
- ['party_id',$partyId],
- ['party_username',$partyUsername],
- ['app_id', $appid]
- ])->first();
- if(empty($info)){
- return false;
- }
- return array('appUsername' => $info['app_username'], 'appUserId' => $info['app_user_id']);
- }
- /**
- * 组装内容用户名称
- * @param $partyId
- * @param $partyUsername
- * @param $appid
- * @return string
- */
- public function buildAppUsername($partyId, $partyUsername, $appid){
- return 't'.$partyId.'_'.$partyUsername.'_a'.$appid;
- }
- private function checkLoginArg($req){
- $arr = array('code'=>-100, 'msg'=>'');
- if(empty($req->input('username'))){
- $arr['msg'] = '请输入用户名';
- return $arr;
- }
- if(empty($req->input('password'))){
- $arr['msg'] = '请输入密码';
- return $arr;
- }
- if(empty($req->input('appid'))){
- $arr['msg'] = '请输入appid';
- return $arr;
- }
- if(!preg_match('/^[0-9]{1,8}(.[0-9]{1,2})?$/', $req->input('money'))){
- $arr['msg'] = '请输入正确的金额';
- return $arr;
- }
- $arr['code'] = 1;
- return $arr;
- }
- private function checkBackBalanceArg($req){
- $arr = array('code'=>-100, 'msg'=>'');
- if(empty($req->input('username'))){
- $arr['msg'] = '请输入用户名';
- return $arr;
- }
- if(empty((int)$req->input('appid'))){
- $arr['msg'] = '请输入appid';
- return $arr;
- }
- if(!preg_match('/^[0-9]{1,8}(.[0-9]{1,2})?$/', $req->input('money'))){
- $arr['msg'] = '请输入正确的金额';
- return $arr;
- }
- $arr['code'] = 1;
- return $arr;
- }
- /**
- * 查询用户在平台的余额
- * @param Request $req
- * @return \Illuminate\Http\JsonResponse
- */
- public function balance(Request $req)
- {
- $reqArr = $req->input();
- $this->logger->addWarning('balance get:'.json_encode($reqArr));
- $code = -200;
- $msg = '操作失败';
- try {
- $check = $this->checkBalanceArg($req);
- if($check['code'] != 1){
- return toJson($check['code'], $check['msg'], []);
- }
- $partyModel = new Models\Party;
- $key = $req->input('key');
- $appid = $req->input('appid');
- $partyUsername = $req->input('username');
- $partyInfo = $partyModel->where('key', $key)->first();
- //查询该用户是否已在系统
- $partyUserModel = new Models\PartyUser();
- $partyUserInfo = $partyUserModel->where([
- ['party_id', '=', $partyInfo['id']],
- ['party_username', '=', $partyUsername],
- ])->first();
- if(empty($partyUserInfo)){
- return $this->toError($this->errCode['USER_NOT_EXIT']);
- }
- if(empty($appid)){
- $lastAppInfo = $this->getLastAppInfo($partyInfo['id'], $partyUsername);
- $appid = $lastAppInfo['app_id'];
- $appUsername = $lastAppInfo['app_username'];
- }else{
- $findInfo = $this->findAppUsername($partyInfo['id'], $partyUsername, $appid);
- $appUsername = $findInfo['appUsername'];
- }
- $password = $this->getAppUserPasswordByUsername($appUsername, $appid);
- $adapter = new Adapter();
- //调用内容方的登陆接口
- $billno = date('YmdHis', time()).rand(10000, 99999);
- $appResult = $adapter->balance($appid, $appUsername, $password);
- if($appResult['code'] != 1){
- $this->logger->addError('balance out: status:-103;调用应用登陆接口失败'.json_encode($appResult));
- return toJson(-103, $appResult['msg'], []);
- }
- $msg = '成功';
- $code = 1;
- $this->logger->addWarning('balance out: 成功,$appResult:'.json_encode($appResult));
- return toJson($code, $msg, $appResult['data']);
- } catch (Exception $e) {
- $this->logger->addWarning('balance out: -200 操作失败,err:'.json_encode($e));
- return toJson($code, $msg, []);
- }
- }//end login()
- /**
- * 转回用户在平台的余额
- * @param Request $req
- * @return \Illuminate\Http\JsonResponse
- */
- public function backBalance(Request $req)
- {
- $reqArr = $req->input();
- $this->logger->addWarning('backBalance get:'.json_encode($reqArr));
- $code = -200;
- $msg = '操作失败';
- try {
- $check = $this->checkBackBalanceArg($req);
- if($check['code'] != 1){
- return toJson($check['code'], $check['msg'], []);
- }
- $partyModel = new Models\Party;
- $key = $req->input('key');
- $appid = (int)$req->input('appid');
- $money = $req->input('money');
- $partyUsername = $req->input('username');
- $partyInfo = $partyModel->where('key', $key)->first();
- //查询该用户是否已在系统
- $partyUserModel = new Models\PartyUser();
- $partyUserInfo = $partyUserModel->where([
- ['party_id', '=', $partyInfo['id']],
- ['party_username', '=', $partyUsername],
- ])->first();
- if(empty($partyUserInfo)){
- return $this->toError($this->errCode['USER_NOT_EXIT']);
- }
- $findInfo = $this->findAppUsername($partyInfo['id'], $partyUsername, $appid);
- $appUsername = $findInfo['appUsername'];
- $password = $this->getAppUserPasswordByUsername($appUsername, $appid);
- $adapter = new Adapter();
- //调用内容方的登陆接口
- $billno = date('YmdHis', time()).rand(10000, 99999);
- $appResult = $adapter->backBalance($appid, $appUsername, $password, $money, $billno);
- if($appResult['code'] != 1){
- $this->logger->addError('login out: status:-103;调用应用登陆接口失败'.json_encode($appResult));
- return toJson(-103, $appResult['msg'], []);
- }
- $appModel = new Models\App;
- $appInfo = $appModel->where('id', $appid)->first();
- DB::beginTransaction();
- //更新额度
- $partyBalance = $partyInfo['balance'] + $money;
- $result1 = $partyModel->where('id', $partyInfo['id'])->update(array(
- 'balance' => $partyBalance
- ));
- //更新额度
- $appBalance = $appInfo['balance'] + $money;
- $result2 = $appModel->where('id', $appInfo['id'])->update(array(
- 'balance' => $appBalance
- ));
- //记录第三方日志
- $balanceLogModel = new Models\BalanceLog();
- $result3 = $balanceLogModel->insert([
- 'type' => 1,
- 'money' => $money,
- 'app_id' => $appInfo['id'],
- 'app_username' => $appUsername,
- 'party_id' =>$partyInfo['id'],
- 'party_username' => $partyUsername,
- 'billno' => $billno,
- 'balance' => $partyBalance,
- 'created_at' => date('Y-m-d H:i:s')
- ]);
- //记录平台日志
- $appBalanceLogModel = new Models\AppBalanceLog();
- $result4 = $appBalanceLogModel->insert([
- 'type' => 1,
- 'money' => $money,
- 'app_id' => $appInfo['id'],
- 'app_username' => $appUsername,
- 'party_id' =>$partyInfo['id'],
- 'party_username' => $partyUsername,
- 'billno' => $billno,
- 'balance' => $appBalance,
- 'created_at' => date('Y-m-d H:i:s')
- ]);
- if($result1 === false || $result2 === false || $result3 === false || $result4 === false){
- DB::rollBack();
- $this->logger->addError('login out: status:-104;更新数据库失败');
- return toJson(-104, '系统繁忙', []);
- }
- DB::commit();
- $msg = '成功';
- $code = 1;
- $this->logger->addWarning('login out: 成功,$appResult:'.json_encode($appResult));
- return toJson($code, $msg, $appResult['data']);
- } catch (Exception $e) {
- $this->logger->addWarning('login out: -200 操作失败,err:'.json_encode($e));
- return toJson($code, $msg, []);
- }
- }//end login()
- /**
- * 获取用户登陆的最后一个平台的信息
- * @param $partyId
- * @param $partyUsername
- * @return array
- */
- private function getLastAppInfo($partyId, $partyUsername){
- $model = new Models\BalanceLog();
- $info = $model->where([
- ['party_id', '=', $partyId],
- ['party_username', '=', $partyUsername],
- ])->orderBy('id', 'desc')->first();
- return array('app_username'=>$info['app_username'], 'app_id'=>$info['app_id']);
- }
- /**
- * 通过平台用户名返回平台用户密码
- * @param $appUsername
- * @param $appid
- * @return mixed
- */
- private function getAppUserPasswordByUsername($appUsername, $appid){
- $model = new Models\AppUser();
- $info = $model->where([
- ['app_id', '=', $appid],
- ['app_username', '=', $appUsername],
- ])->first();
- return $info['password'];
- }
- private function checkBalanceArg($req){
- $arr = array('code'=>-100, 'msg'=>'');
- if(empty($req->input('username'))){
- $arr['msg'] = '请输入用户名';
- return $arr;
- }
- /*if(empty($req->input('appid'))){
- $arr['msg'] = '请输入appid';
- return $arr;
- }*/
- $arr['code'] = 1;
- return $arr;
- }
- }
|