Bläddra i källkod

跨境商品支付接入

kevin 1 år sedan
förälder
incheckning
16a1686e98

+ 17 - 4
backendApi/modules/v1/models/lists/shop/GoodsList.php

@@ -57,8 +57,7 @@ class GoodsList extends \common\libs\dataList\DataList implements DataListInterf
                 'SELL_DISCOUNT' => [
                     'header' => '商品折扣',
                     'value' => function($row) {
-                        $discount = $row['SELL_DISCOUNT'];
-                        return $discount;
+                        return $row['SELL_DISCOUNT'];
                     },
                     'headerOther' => ['width' => '150'],
                 ],
@@ -79,7 +78,7 @@ class GoodsList extends \common\libs\dataList\DataList implements DataListInterf
                 'SELL_TYPE' => [
                     'header' => '复消购买方式',
                     'value' => function($row){
-                        $sellType = ShopGoods::SALE_TYPE;
+                        $sellType = array_merge(ShopGoods::LOCAL_PAY, ShopGoods::ONLINE_PAY);
                         $sel = explode(',',$row['SELL_TYPE']);
                         $value = '';
                         foreach ($sel as $v){
@@ -200,11 +199,25 @@ class GoodsList extends \common\libs\dataList\DataList implements DataListInterf
                 'STATUS'=> ['name'=> '状态', 'other'=> 'select', 'selectData'=> [['id'=> 1, 'name'=> '已上架'],['id'=> 0, 'name'=> '已下架'],]],
                 'GOODS_NAME'=> ['name'=> '商品名称'],
                 'GOODS_NO'=> ['name'=> '商品编号'],
-                'SELL_TYPE'=> ['name'=> '复消购买方式', 'other'=> 'select', 'selectData'=> [['id'=> 1, 'name'=> '余额购买'],['id'=> 2, 'name'=> '积分购买']]],
+                'SELL_TYPE'=> ['name'=> '复消购买方式', 'other'=> 'select', 'selectData'=> [$this->getSaleType()]],
                 'SELL_PRICE'=> ['name'=> '销售价格'],
                 'PRICE_PV'=> ['name'=> '销售PV'],
             ];
         }
         return $this->filterTypes;
     }
+
+    public function getSaleType()
+    {
+        $saleTypeList = [];
+        $saleType = array_merge(ShopGoods::LOCAL_PAY, ShopGoods::ONLINE_PAY);
+        foreach ($saleType as $index => $item) {
+            $saleTypeList[] = [
+                'id' => $index,
+                $item
+            ];
+        }
+
+        return $saleTypeList;
+    }
 }

+ 61 - 13
common/models/ShopGoods.php

@@ -40,21 +40,24 @@ class ShopGoods extends \common\components\ActiveRecord
         3 => [
             'name' => '积分兑换'
         ],
-        4 => [
-            'name' => 'IPay88'
+    ];
+
+    const LOCAL_PAY = [
+        1 => [
+            'name' => '余额购买',
         ],
-        5 => [
-            'name' => '微信'
+        2 => [
+            'name' => '复消兑换',
         ],
-        6 => [
-            'name' => '支付宝'
+        3 => [
+            'name' => '积分兑换'
         ],
     ];
 
     const ONLINE_PAY = [
-        4 => [
-            'name' => 'IPay88'
-        ],
+//        4 => [
+//            'name' => 'IPay88'
+//        ],
         5 => [
             'name' => '微信'
         ],
@@ -194,13 +197,58 @@ class ShopGoods extends \common\components\ActiveRecord
             'online' => [
                 'name' => 'IPay88'
             ],
-            'wechat'  => [
-                'name' => '微信',
+            'WECHAT'  => [
+                'name' => '微信正扫',
+            ],
+            'WAPWECHAT'  => [
+                'name' => '微信WAP',
             ],
-            'alipay'  => [
-                'name' => '支付宝',
+            'ALIPAY'  => [
+                'name' => '支付宝正扫',
+            ],
+            'WEBSITEALIPAY'  => [
+                'name' => '支付宝WAP',
             ],
         ];
     }
 
+    public static function getPayMethod($device = 'local')
+    {
+        $result = [];
+        if ($device == 'website') {
+            $result = [
+                'WECHAT'  => [
+                    'name' => '微信正扫',
+                ],
+                'ALIPAY'  => [
+                    'name' => '支付宝正扫',
+                ],
+            ];
+        }
+        if ($device == 'mobile') {
+            $result = [
+                'WAPWECHAT'  => [
+                    'name' => '微信WAP',
+                ],
+                'WEBSITEALIPAY'  => [
+                    'name' => '支付宝WAP',
+                ],
+            ];
+        }
+        if ($device == 'local') {
+            $result = [
+                'cash'=>[
+                    'name'=>'消费点数支付'
+                ],
+                'point'=>[
+                    'name'=>'复销点数支付'
+                ],
+                'exchange' => [
+                    'name' => '无业绩兑换点数'
+                ],
+            ];
+        }
+
+        return $result;
+    }
 }

+ 1 - 34
common/models/forms/ApproachOrderForm.php

@@ -5,30 +5,17 @@ use common\helpers\Cache;
 use common\helpers\Date;
 use common\components\Model;
 use common\helpers\Form;
-use common\helpers\IPay88;
 use common\helpers\LoggerTool;
-use common\helpers\PayStack;
-use common\helpers\user\Balance;
-use common\helpers\user\Cash;
 use common\helpers\user\Info;
 use common\libs\logging\operate\AdminOperate;
-use common\models\ApproachDecOrder;
 use common\models\ApproachOrder;
 use common\models\ApproachOrderGoods;
-use common\models\BaUser;
-use common\models\DealType;
-use common\models\DecLevelLog;
-use common\models\DecOrder;
 use common\models\Order;
 use common\models\OrderGoods;
 use common\models\Period;
 use common\models\ReceiveAddress;
 use common\models\Region;
 use common\models\ShopGoods;
-use common\models\User;
-use common\models\UserNetwork;
-use common\models\Instalment;
-use Yii;
 use yii\base\Exception;
 
 /**
@@ -37,8 +24,6 @@ use yii\base\Exception;
 class ApproachOrderForm extends Model
 {
     public $sn;
-    public $expressCompany;
-    public $orderTrackNo;
     public $status;
     public $remark;
     public $note;
@@ -48,16 +33,12 @@ class ApproachOrderForm extends Model
     public $payType;
     public $goodsId;
     public $goodsNum;
-    public $payPassword;
 
     public $userName;
     public $consignee;
-    public $acceptMobile;
     public $province;
     public $city;
     public $county;
-    public $lgaName;
-    public $detailaddress;
 
     public $consigneeIdNo;
     public $consigneeRealName;
@@ -146,26 +127,12 @@ class ApproachOrderForm extends Model
     {
         $parentValidate = parent::beforeValidate();
         if ($this->sn) {
-            $this->_model = ApproachOrder::findOne(['SN'=>$this->sn]);
+            $this->_model = ApproachOrder::findOne(['SN' => $this->sn]);
             if (!ApproachOrder::findOneAsArray('SN = :SN', [':SN' => $this->sn])){
                 $this->addError('sn', '订单不存在');
                 return false;
             }
         }
-//        if ($this->sn) {
-//            $this->_model = ApproachOrder::find()->where('SN=:SN', [':SN' => $this->sn])->one();
-//            if (!$this->_model){
-//                $this->addError('sn', '订单不存在. ' . json_encode($this->_model));
-//                return false;
-//            }
-//        }
-
-//        if ($this->scenario == 'verifyIPay88'){
-//            if ($this->_model->STATUS != \Yii::$app->params['orderStatus']['notPaid']['value']) {
-//                $this->addError('sn', '支付方式错误');
-//                return false;
-//            }
-//        }
 
         return $parentValidate;
     }

+ 1 - 1
common/models/forms/OrderForm.php

@@ -187,7 +187,7 @@ class OrderForm extends Model
      * @param $attribute
      */
     public function isPayType($attribute){
-        if(!array_key_exists($this->payType, ShopGoods::payTypes())){
+        if(!array_key_exists($this->payType, ShopGoods::getPayMethod())){
             $this->addError($attribute, '支付方式错误');
             return;
         }

+ 3 - 3
common/models/forms/ShopGoodsForm.php

@@ -146,7 +146,7 @@ class ShopGoodsForm extends Model
      * @param $attributes
      */
     public function isType() {
-        $this->sellType = $this->type == '1' ? '1,2,3' : '4';
+        $this->sellType = $this->type == '1' ? implode(',', array_keys(ShopGoods::LOCAL_PAY)) : implode(',', array_keys(ShopGoods::ONLINE_PAY));
     }
 
     /**
@@ -169,8 +169,8 @@ class ShopGoodsForm extends Model
             // $shopGoods->SELL_TYPE = implode(',',$this->sellType);
             $shopGoods->SELL_TYPE = $this->sellType;
             $shopGoods->GOODS_NO = $this->goodsNo;
-            $shopGoods->UNIT = $this->unit ? $this->unit : '个';
-            $shopGoods->COVER = $this->cover ? $this->cover : '';
+            $shopGoods->UNIT = $this->unit ?: '个';
+            $shopGoods->COVER = $this->cover ?: '';
             $shopGoods->SELL_PRICE = $this->sellPrice;
             $shopGoods->MARKET_PRICE = $this->marketPrice;
             $shopGoods->PRICE_PV = $this->pricePv;

+ 1 - 1
frontendApi/config/urlManagerRules.php

@@ -73,6 +73,7 @@ return [
             'POST reconsume-sure-order' => 'reconsume-sure-order',
             'GET pay-success' => 'pay-success',
             'GET order-list' => 'order-list',
+            'GET order-incomplete-list' => 'order-incomplete-list',
             'GET dec-order-list' => 'dec-order-list',
             'POST sure-approach-order' => 'sure-approach-order',
             'POST verify-approach-order' => 'verify-approach-order-ipay88',
@@ -81,7 +82,6 @@ return [
             'GET,POST re-query-payment' => 're-query-payment',
             'GET logistics' => 'logistics',
             'GET,POST logistics-auto' => 'logistics-auto',
-            'GET online-pay-list' => 'online-pay-list',
             'POST upop-pre-pay' => 'upop-pre-pay',
             'GET,POST upop-webhook' => 'upop-webhook',
         ],

+ 66 - 110
frontendApi/modules/v1/controllers/ShopController.php

@@ -87,8 +87,10 @@ class ShopController extends BaseController {
      * @throws \yii\web\HttpException
      */
     public function actionShowCart(){
+        // 媒体设备
+        $device = \Yii::$app->request->get('device', 'local');
+
         $userId = \Yii::$app->user->id;
-        $payList = ShopGoods::payTypes();
         $allAddress = ReceiveAddress::findAllAsArray('USER_ID=:USER_ID', [':USER_ID'=>$userId]);
         if($allAddress) {
             foreach ($allAddress as $key => $row) {
@@ -109,7 +111,13 @@ class ShopController extends BaseController {
         if ($userCashResult = UserWallet::findOneAsArray(['USER_ID' => $userId])) {
             $userBalance['cash'] = $userCashResult['CASH'];
         }
-        return static::notice(['payList'=>$payList,'allAddress'=>$allAddress,'userBalance'=>$userBalance]);
+
+        return static::notice([
+            'payList' => ShopGoods::getPayMethod(),
+            'allAddress' => $allAddress,
+            'userBalance' => $userBalance,
+            'onlinePayList' => ShopGoods::getPayMethod($device)
+        ]);
     }
 
     /**
@@ -192,59 +200,32 @@ class ShopController extends BaseController {
         return static::notice($data);
     }
 
-//    /**
-//     * 我的订单(未支付)
-//     * @return mixed
-//     * @throws \yii\web\HttpException
-//     */
-//    public function actionOrderList() {
-//        $uname = Info::getUserNameByUserId(\Yii::$app->user->id);
-//        $condition = " O.IS_DELETE = 0 AND O.ORDER_TYPE='FX' AND (O.USER_ID=:USER_ID OR O.CREATE_USER='$uname')";
-//        $params[':USER_ID'] = \Yii::$app->user->id;
-//        $orderQuery = Order::find()
-//            ->alias('O')
-//            ->where($condition, $params)
-//            ->select('O.*,U.REAL_NAME,OG.REAL_PRICE,OG.BUY_NUMS,OG.SKU_CODE,OG.GOODS_TITLE,OG.REAL_PV,OG.ORDER_SN,OG.GOODS_ID')
-//            ->join('LEFT JOIN', User::tableName() . ' AS U', 'U.ID=O.USER_ID')
-//            ->join('LEFT JOIN', OrderGoods::tableName() . ' AS OG', 'OG.ORDER_SN=O.SN')
-//            ->orderBy('O.CREATED_AT DESC');
-//
-//        // 订单中间表只查询待支付和支付失败的订单
-//        $params[':NOT_PAID'] = \Yii::$app->params['orderStatus']['notPaid']['value'];   // 待支付
-//        $params[':FAIL_PAID'] = \Yii::$app->params['orderStatus']['failPaid']['value'];   // 支付失败
-//        $orderStandardQuery = ApproachOrder::find()
-//            ->alias('O')
-//            ->where($condition . ' AND (O.STATUS = :NOT_PAID OR O.STATUS = :FAIL_PAID)', $params)
-//            ->select('O.*,U.REAL_NAME,OG.REAL_PRICE,OG.BUY_NUMS,OG.SKU_CODE,OG.GOODS_TITLE,OG.REAL_PV,OG.ORDER_SN,OG.GOODS_ID')
-//            ->join('LEFT JOIN', User::tableName() . ' AS U', 'U.ID=O.USER_ID')
-//            ->join('LEFT JOIN', ApproachOrderGoods::tableName() . ' AS OG', 'OG.ORDER_SN=O.SN')
-//            ->orderBy('O.CREATED_AT DESC');
-//
-//        $queryAll = $orderQuery->union($orderStandardQuery, true);
-//        $query = (new Query())->from(['Q' => $queryAll])->select('Q.*')->distinct()->orderBy(['CREATED_AT' => SORT_DESC]);
-//
-//        $totalCount = $query->count();
-//        $pagination = new Pagination(['totalCount' => $totalCount, 'pageSize' => \Yii::$app->request->get('pageSize')]);
-//        $lists = $query->offset($pagination->offset)->limit($pagination->limit)->all();
-//
-//        $data = [
-//            'list' => $lists,
-//            'currentPage'=>$pagination->page,
-//            'totalPages'=>$pagination->pageCount,
-//            'startNum' => $pagination->page * $pagination->pageSize + 1,
-//            'totalCount' => $pagination->totalCount,
-//            'pageSize' => $pagination->pageSize,
-//        ];
-//
-//        foreach ($data['list'] as $key => $value) {
-//            $data['list'][$key]['ORDER_TYPE'] = $value['ORDER_TYPE'] == 'ZC' ? '首单' : '复消';
-//            $data['list'][$key]['PAY_AT'] = $value['PAY_AT'] ? Date::convert($value['PAY_AT'],'Y-m-d H:i:s') : '';
-//            $data['list'][$key]['PAY_TYPE'] = ShopGoods::payTypes()[$value['PAY_TYPE']]['name'] ?? '';
-//            $data['list'][$key]['STATUS'] = \Yii::$app->params['orderStatus'][$value['STATUS']]['label'] ?? '';
-//        }
-//
-//        return $data;
-//    }
+    /**
+     * 我的订单(待支付)
+     * @return mixed
+     * @throws HttpException
+     */
+    public function actionOrderIncompleteList() {
+        $uname = Info::getUserNameByUserId(\Yii::$app->user->id);
+        $condition = " AND IS_DELETE=0 AND ORDER_TYPE='FX' AND (USER_ID=:USER_ID OR CREATE_USER='{$uname}')";
+        $params[':USER_ID'] = \Yii::$app->user->id;
+        $data = ApproachOrder::lists($condition, $params, [
+            'select' => 'O.*,U.REAL_NAME,OG.*',
+            'orderBy' => 'O.CREATED_AT DESC',
+            'from' => Order::tableName() . ' AS O',
+            'join' => [
+                ['LEFT JOIN', User::tableName() . ' AS U', 'U.ID=O.USER_ID'],
+                ['LEFT JOIN', ApproachOrderGoods::tableName() . ' AS OG', 'OG.ORDER_SN=O.SN'],
+            ],
+        ]);
+        foreach ($data['list'] as $key => $value) {
+            $data['list'][$key]['ORDER_TYPE'] = $value['ORDER_TYPE']=='ZC' ? '首单' : '复消';
+            $data['list'][$key]['PAY_AT'] = Date::convert($value['PAY_AT'],'Y-m-d H:i:s');
+            $data['list'][$key]['PAY_TYPE'] = ShopGoods::payTypes()[$value['PAY_TYPE']]['name'] ?? '';
+            $data['list'][$key]['STATUS'] = \Yii::$app->params['orderStatus'][$value['STATUS']]['label'] ?? '';
+        }
+        return static::notice($data);
+    }
 
     /**
      * 会员复消
@@ -312,13 +293,40 @@ class ShopController extends BaseController {
      */
     public function actionSureApproachOrder(){
         if (\Yii::$app->request->isPost) {
+            $post = \Yii::$app->request->post();
             $formModel = new ApproachOrderForm();
             $formModel->scenario = 'userOrder';
             $formModel->remark = '复销备注';
-            $post = \Yii::$app->request->post();
+
             $post['type'] = DeclarationForm::TYPE_FX;
             if ($formModel->load($post, '') && $order = $formModel->add()) {
-                return static::notice($order);
+                // 银行代码
+                $bankCode = \Yii::$app->request->post('bankCode');
+                // 订单商品
+                $orderProducts = ApproachOrderGoods::findOneAsArray(['ORDER_SN' => $order->SN]);
+                // 支付报文
+                $payload = [
+                    "version" => "2.0.0",   // 版本号.定值2.0.0
+                    "trade_code" => "PAY",  // 交易代码
+                    "bank_code" => $bankCode, // 银行代码
+                    "agencyId" => \Yii::$app->params['UPOP']['agencyId'], // 商户号
+                    "child_merchant_no" => \Yii::$app->params['UPOP']['childMerchantId'], // 子商户号
+                    "terminal_no" => \Yii::$app->params['UPOP']['terminalId'], // 商户终端号
+                    "order_no" => $order->SN . mt_rand(0, 10000000),   // 第三方订单号
+                    "amount" => number_format($order['PAY_AMOUNT'], 2),   // 交易金额(元) 2位小数
+                    "currency_type" => "HKD",   // 交易币种 HKD(港币)
+                    "sett_currency_type" => "HKD",  // 清算币种 HKD(港币)
+                    "product_name" => $orderProducts['GOODS_TITLE'], // 产品名称
+                    "return_url" => \Yii::$app->params['UPOP']['returnUrl'], // 同步通知地址
+                    "notify_url" => \Yii::$app->params['UPOP']['notifyUrl'], // 异步通知地址
+                    "client_ip" => $_SERVER['REMOTE_ADDR'], // 客户端IP(订单⽣成的机器IP,指⽤户浏览器端IP,不是商户服务器IP)
+                ];
+                // 预支付
+                $response = (new PaySign())->sendEncodeData($payload, \Yii::$app->params['UPOP']['backPayUrl']);
+                // 预支付结果写入表
+                ApproachOrder::updateAll(['REMARK' => json_encode($response)], 'SN=:SN', [':SN' => $order->SN]);
+
+                return static::notice($response);
             } else {
                 return static::notice(Form::formatErrorsForApi($formModel->getErrors()),400);
             }
@@ -721,7 +729,7 @@ class ShopController extends BaseController {
         // 订单ID
         $refNo = 'OS202310198286872118';
         // 银行代码
-        $bankCode = "WAPWECHAT";
+        $bankCode = "ALIPAY";
 
         // 订单
         $order = ApproachOrder::findOneAsArray(['SN' => $refNo]);
@@ -754,58 +762,6 @@ class ShopController extends BaseController {
         return static::notice($result);
     }
 
-    /*
-     * 预下单(4.11-4.15). 银联在线支付 - UPOP
-     */
-    public function actionUpopOnlinePay()
-    {
-        // 订单ID
-        $refNo = \Yii::$app->request->post('refNo');
-        // 媒体设备
-        $device = \Yii::$app->request->post('device', "0");
-        // 订单
-        $order = ApproachOrder::findOneAsArray(['SN' => $refNo]);
-        if (!$order) {
-            return static::notice('订单编号无效');
-        }
-        // 订单商品
-        $orderProducts = ApproachOrderGoods::findOneAsArray(['ORDER_SN' => $refNo]);
-
-        // 预支付报文
-        $payload = [
-            "version" => "2.0.0",   // 版本号.定值2.0.0
-            "trade_code" => "PAY",  // 交易代码
-            "agencyId" => \Yii::$app->params['UPOP']['agencyId'], // 商户号
-            "child_merchant_no" => \Yii::$app->params['UPOP']['childMerchantId'], // 子商户号
-            "terminal_no" => \Yii::$app->params['UPOP']['terminalId'], // 商户终端号
-            "order_no" => $refNo . mt_rand(0, 1000),   // 第三方订单号
-            "amount" => number_format($order['PAY_AMOUNT'], 2),   // 交易金额(元)
-            "currency_type" => "HKD",   // 交易币种 HKD
-            "sett_currency_type" => "HKD",  // 清算币种
-            "product_name" => $orderProducts['GOODS_TITLE'], // 产品名称
-            "user_name" => $order['USER_NAME'],  // ⽤户名称
-            "return_url" => \Yii::$app->params['UPOP']['returnUrl'], // 同步通知地址
-            "notify_url" => \Yii::$app->params['UPOP']['notifyUrl'], // 异步通知地址
-            "client_ip" => $_SERVER['REMOTE_ADDR'], // 客户端IP(订单⽣成的机器IP,指⽤户浏览器端IP,不是商户服务器IP)
-        ];
-        // 预支付
-        $response = (new PaySign())->sendEncodeData($payload, \Yii::$app->params['UPOP']['backPayUrl']);
-
-        if ($response) {
-            // 前台支付报文
-            $request = [
-                "token_id" => $response['token_id'],  // 预下单接⼝返回的token_id
-                "access_type" => in_array($device, [0, 1]) ?: "0", // 访问端类型: 0:⽹⻚ 1:⼿机
-                "bank_code" => 'UPOP', // 调起⽀付后的默认⽀付⽅式
-            ];
-            $request = \Yii::$app->params['UPOP']['frontPayUrl'] . '?' . http_build_query($request);
-
-            return static::notice($request);
-        }
-
-        return static::notice($response);
-    }
-
     /**
      * UPOP支付成功的webhook.
      * @throws \Exception