فهرست منبع

提供给第三方查询用户在app的余额和转出用户在app的余额的接口

jekon 6 سال پیش
والد
کامیت
fa3961067c
4فایلهای تغییر یافته به همراه338 افزوده شده و 13 حذف شده
  1. 61 0
      app/Http/Appadapter/Adapter.php
  2. 272 12
      app/Http/Controllers/Api/PartyController.php
  3. 4 0
      app/Http/Middleware/authJWT.php
  4. 1 1
      routes/api.php

+ 61 - 0
app/Http/Appadapter/Adapter.php

@@ -2,11 +2,19 @@
 
 namespace App\Http\Appadapter;
 
+use Monolog\Logger;
+use Monolog\Handler\StreamHandler;
 /**
 * 适配器(基类)
 */
 class Adapter
 {
+    public $logger;
+
+    public function __construct() {
+        $this->logger = new Logger('adapter');
+        $this->logger->pushHandler(new StreamHandler(storage_path('logs/adapter.log'), Logger::WARNING));
+    }
 
     /**
      * 检测内容方是否存在该用户,不存在则创建
@@ -75,4 +83,57 @@ class Adapter
 
         return $result;
     }
+
+
+    public function balance($appid, $appUsername, $password){
+        //return array('code' => 1, 'msg'=>'成功');
+
+        $result = array('code'=>-2, 'msg'=>'', 'data'=>array());
+        if($appid == 1){//体育
+            $proxy = new Sport();
+            $proxy->Init();
+            $this->logger->addWarning('balance gb send:$appUsername:'.$password.'$appUsername:'.$password);
+            $ret = $proxy->gb($appUsername, $password);
+            $this->logger->addWarning('balance gb out:'.$ret);
+
+            //'{"status":1,"msg":"登录成功","data":{"ret":0,"tokenold":"UUaCai15678500915d737e6b2bd90","token":"%7B%22img_url%22%3Anull%2C%22name%22%3A%22dttes_t1_jekonefs_a1%22%2C%22token%22%3A%22UUaCai15678500915d737e6b2bd90%22%2C%22cash%22%3A%220.00%22%7D","url":"http:\/\/sports.bocai108.com\/m\/jump.html?token=%7B%22img_url%22%3Anull%2C%22name%22%3A%22dttes_t1_jekonefs_a1%22%2C%22token%22%3A%22UUaCai15678500915d737e6b2bd90%22%2C%22cash%22%3A%220.00%22%7D"}}'
+            $ret = json_decode($ret, true);
+            if($ret['status'] == 1){
+                $data = array(
+                    'appid' => $appid,
+                    'balance' => $ret['data']
+                );
+                $result = array('code'=>1, 'msg'=>'成功', 'data'=>$data);
+            }else{
+                $result = array('code'=>-1, 'msg'=>'服务器繁忙');
+            }
+        }else{
+            $result = array('code'=>-100, 'msg'=>'应用不存在');
+        }
+        return $result;
+    }
+
+    public function backBalance($appid, $appUsername , $password, $money, $billno=''){
+        //return array('code' => 1, 'msg'=>'成功');
+
+        $result = array('code'=>-2, 'msg'=>'', 'data'=>array());
+        if($appid == 1){//体育
+            $proxy = new Sport();
+            $proxy->Init();
+            $this->logger->addWarning('backBalance ptc send:$appUsername:'.$password.';$appUsername:'
+                .$password.';$money:'.$money.';$billno:'.$billno);
+            $ret = $proxy->ptc($appUsername, $password, $billno, $money, 'OUT');
+            $this->logger->addWarning('backBalance ptc out:'.$ret);
+
+            $ret = json_decode($ret, true);
+            if($ret['status'] == 1){
+                $result = array('code'=>1, 'msg'=>'成功', 'data'=>[]);
+            }else{
+                $result = array('code'=>-1, 'msg'=>'服务器繁忙');
+            }
+        }else{
+            $result = array('code'=>-100, 'msg'=>'应用不存在');
+        }
+        return $result;
+    }
 }

+ 272 - 12
app/Http/Controllers/Api/PartyController.php

@@ -19,6 +19,13 @@ class PartyController extends Controller
 {
 
     public $logger;
+    public $errCode = array(
+        'USER_NOT_EXIT' => array(
+            'code' => '-110',
+            'msg' => '找不到此用户'
+        ),
+
+    );
     /**
      * 构造函数
      *
@@ -31,6 +38,9 @@ class PartyController extends Controller
         $this->logger->pushHandler(new StreamHandler(storage_path('logs/api.log'), Logger::WARNING));
     }
 
+    public function toError($err){
+        return toJson($err['code'], $err['msg']);
+    }
 
     /**
      * 第三方账号登陆、注册
@@ -56,7 +66,7 @@ class PartyController extends Controller
             $partyModel = new Models\Party;
             $key = $req->input('key');
             $appid = $req->input('appid');
-            $partyUserName = $req->input('username');
+            $partyUsername = $req->input('username');
             $partyNickName = $req->input('nickname');
             //$partyInfo = \App\Models\Party::where('key', $key)->first();
             $partyInfo = $partyModel->where('key', $key)->first();
@@ -78,12 +88,12 @@ class PartyController extends Controller
             $partyUserModel = new Models\PartyUser();
             $partyUserInfo = $partyUserModel->where([
                 ['party_id', '=', $partyInfo['id']],
-                ['party_username', '=', $partyUserName],
+                ['party_username', '=', $partyUsername],
             ])->first();
             if(empty($partyUserInfo)){
                 $partyUserModel->insert([
                     'party_id' => $partyInfo['id'],
-                    'party_username' => $partyUserName,
+                    'party_username' => $partyUsername,
                     'nickname' => $partyNickName,
                     'password' => $req->input('password'),
                     'login_time' => now(),
@@ -100,9 +110,9 @@ class PartyController extends Controller
             //查询是否已创建对于应用的用户
             $appUserModel = new Models\AppUser();
 
-            $info = $this->findAppUsername($partyInfo['id'], $partyUserName, $appid);
+            $info = $this->findAppUsername($partyInfo['id'], $partyUsername, $appid);
             if($info == false){
-                $appUsername = $this->buildAppUsername($partyInfo['id'], $partyUserName, $appid);
+                $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));
@@ -111,7 +121,7 @@ class PartyController extends Controller
 
                 $appUserId = $appUserModel->insert([
                     'app_id' => $appInfo['id'],
-                    'party_username' => $partyUserName,
+                    'party_username' => $partyUsername,
                     'app_username' => $appUsername,
                     'password' => $req->input('password'),
                     'login_time' => now(),
@@ -121,7 +131,7 @@ class PartyController extends Controller
                 $UserMapModel = new Models\PartyAppUserMap();
                 $UserMapModel->insert([
                     'party_id' => $partyInfo['id'],
-                    'party_username' => $partyUserName,
+                    'party_username' => $partyUsername,
                     'app_id' => $appInfo['id'],
                     'app_username' => $appUsername,
                     'app_user_id' => $appUserId,
@@ -164,9 +174,10 @@ class PartyController extends Controller
                 'app_id' => $appInfo['id'],
                 'app_username' => $appUsername,
                 'party_id' =>$partyInfo['id'],
-                'party_username' => $partyUserName,
+                'party_username' => $partyUsername,
                 'billno' => $billno,
-                'balance' => $partyBalance
+                'balance' => $partyBalance,
+                'created_at' => date('Y-m-d H:i:s')
             ]);
             //记录平台日志
             $appBalanceLogModel = new Models\AppBalanceLog();
@@ -176,9 +187,10 @@ class PartyController extends Controller
                 'app_id' => $appInfo['id'],
                 'app_username' => $appUsername,
                 'party_id' =>$partyInfo['id'],
-                'party_username' => $partyUserName,
+                'party_username' => $partyUsername,
                 'billno' => $billno,
-                'balance' => $appBalance
+                'balance' => $appBalance,
+                'created_at' => date('Y-m-d H:i:s')
             ]);
             if($result1 === false || $result2 === false || $result3 === false || $result4 === false){
                 DB::rollBack();
@@ -192,7 +204,7 @@ class PartyController extends Controller
             $code = 1;
 
             $this->logger->addWarning('login out: 成功,$appResult:'.json_encode($appResult));
-            return toJson($code, $msg, $appResult);
+            return toJson($code, $msg, $appResult['data']);
         } catch (Exception $e) {
             $this->logger->addWarning('login out: -200 操作失败,err:'.json_encode($e));
             return toJson($code, $msg, []);
@@ -250,5 +262,253 @@ class PartyController extends Controller
         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;
+    }
 
 }

+ 4 - 0
app/Http/Middleware/authJWT.php

@@ -20,6 +20,10 @@ class authJWT
         try {
             $data = $request->input();
 
+            if(empty($data['key'])){
+                return toJson(-30001);
+            }
+
             $secret = $this->getToken($data['key']);
             $partySign = new PartySign($secret);
             if(!$partySign->checkSignature($data)) {

+ 1 - 1
routes/api.php

@@ -26,7 +26,7 @@ Route::any('/app/{action}', function ($action) {
 Route::any('/{class}/{action}', function ( $class, $action) {
     $module='api';
     return appExec($module, $class, $action);
-})->middleware();
+})->middleware('auth.jwt');
 
 // Route::middleware('auth:api')->get('/user', function (Request $request) {