Browse Source

for goods convert

stanley-king 6 years ago
parent
commit
0a5519ffec

+ 19 - 0
data/logic/queue.logic.php

@@ -865,4 +865,23 @@ class queueLogic
             return callback($ret);
         }
     }
+
+    public function OnGoodsConvert($params)
+    {
+        $appid = $params['appid'];
+        $convert_sn = $params['convert_sn'];
+        $return_url = $params['return_url'];
+
+        $data['success'] = $params['success'] == true ? 1 : 0;
+        $data['convert_sn'] = $params['convert_sn'];
+        $data['appid'] = $params['appid'];
+
+        if(empty($return_url) || empty($appid) || empty($convert_sn)) {
+            return callback(false);
+        }
+        else {
+            https_request($return_url,$data);
+            return callback(true);
+        }
+    }
 }

+ 42 - 0
helper/fcode/operator.php

@@ -14,6 +14,8 @@ require_once(BASE_ROOT_PATH . '/helper/util_helper.php');
 use session_helper;
 use Log;
 use util;
+use trans_wapper;
+use Exception;
 
 class operator
 {
@@ -65,6 +67,45 @@ class operator
         }
     }
 
+    public function send()
+    {
+        $cond =['goods_commonid' => $this->mCommonID,
+                'batch_code' => $this->mBatchCode,
+                'fc_state' => 0,
+                'grab_state' => 0,
+                'session_id' => '',
+                'mobile' => '',
+                'grab_time' => 0];
+        $items = $this->mod_fcode->where($cond)->field('*')->order('fc_id asc')->select();
+
+        $user_mobile = $this->mMobile;
+        foreach ($items as $item)
+        {
+            try
+            {
+                $fcid = intval($item['fc_id']);
+                $datas = ['grab_state' => 2,
+                    'grab_time' => time(),
+                    'user_key' => mt_rand(1000, 9999),
+                    'mobile' => $user_mobile,
+                    'usable_time' => util::last_day_secs(time() + $item['usable_days'] * 86400)];
+
+                $trans = new trans_wapper($this->mod_fcode,"fcode send");
+                $ret = $this->mod_fcode->where(['fc_id' => $fcid,'session_id' => '','mobile' => '','grab_state' => 0])->update($datas);
+                $rows = $this->mod_fcode->affected_rows();
+                $trans->commit();
+
+                if($ret && $rows > 0) {
+                    return $item['fc_code'];
+                }
+            }
+            catch (Exception $ex) {
+                $trans->rollback();
+            }
+        }
+        return false;
+    }
+
     public function grab()
     {
         $fcode = $this->grabed();
@@ -87,6 +128,7 @@ class operator
             }
         }
     }
+
     public function bind($fcode)
     {
         $cond = [];

+ 16 - 0
helper/openapi/Convertor.php

@@ -24,6 +24,22 @@ class Convertor
         $items = $model->table('goods_convert')->where(['convert_sn' => $convert_sn, 'appid' => $appid])->master(true)->select();
         return !empty($items);
     }
+    public function add_fcode($appid,$convert_sn,$batch_code,$commonid,$fcode,$mobile)
+    {
+        $data = [];
+        $data['appid'] = $appid;
+        $data['convert_sn'] = $convert_sn;
+        $data['convert_type'] = 'fcode';
+        $data['batch_code'] = $batch_code;
+        $data['goods_commonid'] = $commonid;
+        $data['add_time'] = time();
+        $data['goods_fcode'] = $fcode;
+        $data['user_mobile'] = $mobile;
+
+        $model = Model();
+        $insertid = $model->table('goods_convert')->insert($data);
+        return ($insertid > 0);
+    }
 
     private function presign_body($input)
     {

+ 64 - 0
helper/openapi/GoodsConvertor.php

@@ -0,0 +1,64 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 2018/12/12
+ * Time: 11:13 AM
+ */
+
+namespace openapi;
+
+class config
+{
+    const CONVERT_FCODE_API = "https://passport.lrlz.com/mobile/index.php";
+    const APP_ID = 'JYC_CHANNEL';
+    const APP_KEY = 'aa161e84685b42a6862dfa5552195240';
+    const RSA_PATH = BASE_ROOT_PATH . '/helper/openapi/keys/jyc_pri.pem';
+    const FCODE_FIELDS = ['appid','appkey','convert_sn','convert_type','batch_code','commonid','time','mobile','return_url'];
+}
+
+class GoodsConvertor
+{
+    static $pri_key = null;
+
+    public function __construct()
+    {
+        if(self::$pri_key == null) {
+            $pri_key = file_get_contents(config::RSA_PATH);
+            self::$pri_key = openssl_get_privatekey($pri_key);
+        }
+    }
+
+    public function fcode($params)
+    {
+        $body = $this->presign_body($params,config::FCODE_FIELDS);
+        $signed = $this->sign($body);
+        $params['signed'] = $signed;
+        $params['act'] = 'fcode';
+        $params['op']  = 'convert';
+        return config::CONVERT_FCODE_API . "?" . http_build_query($params);
+    }
+
+    private function sign($body)
+    {
+        openssl_sign($body, $signed, self::$pri_key);
+        $signed = base64_encode($signed);
+        return $signed;
+    }
+
+    private function presign_body($input,$fields)
+    {
+        ksort($input);
+        reset($input);
+
+        $params = [];
+        foreach ($input as $key => $val)
+        {
+            if(in_array($key,$fields)) {
+                $params[] = "{$key}={$val}";
+            }
+        }
+
+        return implode('&',$params);
+    }
+}

+ 49 - 31
mobile/control/convert.php

@@ -24,15 +24,23 @@ class convertControl extends mobileControl
 
     public function fcodeOp()
     {
-        $fcode_fileds = ['appid','appkey','convert_sn','convert_type','batch_code','commonid','time','mobile','return_url'];
+        $fileds = ['appid','appkey','convert_sn','convert_type','batch_code','commonid','time','mobile','return_url'];
 
-        if($this->check_parmas($_GET) === false) {
-            return self::outsuccess(["title" => "请求参数异常","msg"=> "请不要随意修改参数哦"],"convert/error");
+        $fCallBack = true;
+        $appid = $_GET['appid'];
+        $convert_sn = $_GET['convert_sn'];
+        $return_url = $_GET['return_url'];
+
+        if($this->check_parmas($_GET,$fileds) === false) {
+            $errmsg = ["title" => "请求参数异常","msg"=> "请不要随意修改参数哦"];
+            goto ErrorHandle;
         }
-        $convert = new openapi\Convertor($fcode_fileds);
+
+        $convert = new openapi\Convertor($fileds);
         $fSucc = $convert->verify($_GET);
         if($fSucc === false) {
-            return self::outsuccess(["title" => "请求参数异常","msg"=> "请不要随意修改参数哦"],"convert/error");
+            $errmsg = ["title" => "请求参数异常","msg"=> "请不要随意修改参数哦"];
+            goto ErrorHandle;
         }
 
         $convert_type = $_GET['convert_type'];
@@ -41,50 +49,60 @@ class convertControl extends mobileControl
             $batch_code = $_GET['batch_code'];
             $common_id  = intval($_GET['commonid']);
             if(empty($batch_code) || $common_id <= 0) {
-                return self::outsuccess(["title" => "商品下架","msg"=> "没有找到要兑换的商品哦"],"convert/error");
+                $errmsg = ["title" => "商品下架","msg"=> "没有找到要兑换的商品哦"];
+                goto ErrorHandle;
             }
+
             $find = $convert->exist($_GET['convert_sn'],$_GET['appid']);
             if($find) {
-                return self::outsuccess(["title" => "商品已兑","msg"=> "这个商品已被兑换过拉"],"convert/error");
+                $fCallBack = false;
+                $errmsg = ["title" => "商品下架","msg"=> "没有找到要兑换的商品哦"];
+                goto ErrorHandle;
             }
 
             $mobile = $_GET['mobile'];
-            $mobile_loginner = new login\mobile_log($mobile);
-
-            if($mobile_loginner->ismember()) {
-                $mobile_loginner->login();
-            } else {
-                $mobile_loginner->register('',0,$mobile);
-                $mobile_loginner->login();
-            }
-
-            $oper = new fcode\operator($common_id,$batch_code,$mobile,'');
-            $fcode = $oper->grabed();
-
-            if($fcode == false)
+            if(!session_helper::logined())
             {
-                $fcode = $oper->grab();
-                if($fcode == false) {
-                    return self::outsuccess(["title" => "商品下架","msg"=> "这个商品已经被换光拉"],"convert/error");
+                $mobile_loginner = new login\mobile_log($mobile);
+                if($mobile_loginner->ismember()) {
+                    $mobile_loginner->login();
                 } else {
-                    $convert->add();
-                    //notice jyc
-                    return self::outsuccess("","convert/success");
+                    $mobile_loginner->register('',0,$mobile);
+                    $mobile_loginner->login();
                 }
             }
+
+            $oper = new fcode\operator($common_id,$batch_code,$mobile,'');
+            $fcode = $oper->send();
+            if($fcode == false) {
+                $errmsg = ["title" => "兑换失败","msg"=> "这个商品已经被兑换完了"];
+                goto ErrorHandle;
+            }
             else {
-                return self::outsuccess(["title" => "商品已兑","msg"=> "这个商品已被兑换过拉"],"convert/error");
+                $return_url = $_GET['return_url'];
+                QueueClient::push('OnGoodsConvert',['appid' => $appid,'convert_sn' => $convert_sn,'return_url' => $return_url,'success' => true]);
+                $convert->add_fcode($_GET['appid'],$_GET['convert_sn'],$_GET['batch_code'],$_GET['commonid'],$fcode,$_GET['mobile']);
+
+                return self::outsuccess(["title" => "兑换成功","msg"=> "您已经成功兑换商品"],"convert/success");
             }
         }
         else {
-            return self::outsuccess(["title" => "红包兑换","msg"=> "这个业务还没有开启哦"],"convert/error");
+            $errmsg = ["title" => "红包兑换","msg"=> "这个业务还没有开启哦"];
+            goto ErrorHandle;
         }
+
+        ErrorHandle:
+        if($fCallBack) {
+            QueueClient::push('OnGoodsConvert',['appid' => $appid,'convert_sn' => $convert_sn,'return_url' => $return_url,'success' => false]);
+        }
+
+        return self::outsuccess($errmsg,"convert/error");
     }
 
-    private function check_parmas($input)
+    private function check_parmas($input,$fields)
     {
-        $fields = ['appid','convert_sn','appkey','mobile','convert_type','signed'];
-        foreach ($fields as $key) {
+        foreach ($fields as $key)
+        {
             if(!array_key_exists($key,$input)) return false;
             else {
                 if(empty($input[$key])) return false;