Placeorder.php 12.2 KB
Newer Older
T
Terry 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
<?php
/**
 * FecShop file.
 *
 * @link http://www.fecshop.com/
 * @copyright Copyright (c) 2016 FecShop Software LLC
 * @license http://www.fecshop.com/license/
 */

namespace fecshop\app\appserver\modules\Payment\block\paypal\express;

use Yii;

/**
 * @author Terry Zhao <2358269014@qq.com>
 * @since 1.0
 */
class Placeorder
{
    /**
T
Terry 已提交
21
     * 用户的账单地址信息,通过用户传递的信息计算而来。
T
Terry 已提交
22 23 24 25 26
     */
    public $_billing;

    public $_address_id;
    /**
T
Terry 已提交
27
     * 用户的货运方式.
T
Terry 已提交
28 29 30
     */
    public $_shipping_method;
    /**
T
Terry 已提交
31
     * 用户的支付方式.
T
Terry 已提交
32 33
     */
    public $_payment_method;
T
Terry 已提交
34 35 36
    
    public $_order_remark;
    
T
Terry 已提交
37 38 39 40 41
    public function getLastData()
    {
        $post = Yii::$app->request->post();
        $token = Yii::$app->request->post('token');
        if(!$token){
T
Terry 已提交
42 43 44
            $code = Yii::$service->helper->appserver->order_paypal_express_get_token_fail;
            $data = [];
            $reponseData = Yii::$service->helper->appserver->getReponseData($code, $data);
T
Terry 已提交
45
            
T
Terry 已提交
46
            return $reponseData;
T
Terry 已提交
47 48 49
        }
        if (is_array($post) && !empty($post)) {
            $post = \Yii::$service->helper->htmlEncode($post);
T
Terry 已提交
50
            // 设置paypal快捷支付
T
Terry 已提交
51
            $post['payment_method'] = Yii::$service->payment->paypal->express_payment_method;
T
Terry 已提交
52 53
            // 检查前台传递的数据的完整性
            // 检查前台传递的数据的完整
T
Terry 已提交
54 55 56 57 58
            $checkInfo = $this->checkOrderInfoAndInit($post);
            if ($checkInfo !== true) {
                return $checkInfo;
            }
            
T
Terry 已提交
59
            // 如果游客用户勾选了注册账号,则注册,登录,并把地址写入到用户的address中
T
Terry 已提交
60 61
            $save_address_status = $this->updateAddress($post);
           
T
Terry 已提交
62
            // 更新Cart信息
T
Terry 已提交
63
            //$this->updateCart();
T
Terry 已提交
64
            // 设置checkout type
T
Terry 已提交
65 66 67
            $serviceOrder = Yii::$service->order;
            $checkout_type = $serviceOrder::CHECKOUT_TYPE_EXPRESS;
            $serviceOrder->setCheckoutType($checkout_type);
T
Terry 已提交
68
            // 将购物车数据,生成订单,生成订单后,不清空购物车,不扣除库存,在支付成功后在清空购物车。
T
Terry 已提交
69 70
            $innerTransaction = Yii::$app->db->beginTransaction();
            try {
T
Terry 已提交
71
                $genarateStatus = Yii::$service->order->generateOrderByCart($this->_billing, $this->_shipping_method, $this->_payment_method, false, $token, $this->_order_remark);
T
Terry 已提交
72 73 74 75 76 77 78 79 80 81
                if ($genarateStatus) {
                    $innerTransaction->commit();
                } else {
                    $innerTransaction->rollBack();
                }
            } catch (Exception $e) {
                $innerTransaction->rollBack();
            }
            //echo 22;
            if ($genarateStatus) {
T
Terry 已提交
82
                // 得到当前的订单信息
T
Terry 已提交
83 84
                $doCheckoutReturn = $this->doCheckoutPayment($token);
                //echo $doCheckoutReturn;exit;
T
Terry 已提交
85
                //echo 333;
T
Terry 已提交
86
                if ($doCheckoutReturn) {
T
Terry 已提交
87 88 89
                    $increment_id = Yii::$service->order->getSessionIncrementId();
                    $innerTransaction = Yii::$app->db->beginTransaction();
                    try {
T
Terry 已提交
90
                        // 插件这个订单是否被支付过,如果被支付过,则回滚
T
Terry 已提交
91 92
                        if(!Yii::$service->order->checkOrderVersion($increment_id)){    
                            $innerTransaction->rollBack();
T
Terry 已提交
93 94 95 96
                            
                            $code = Yii::$service->helper->appserver->order_has_been_paid;
                            $data = [
                                'error' => 'the order has been paid',
T
Terry 已提交
97
                            ];
T
Terry 已提交
98 99 100
                            $reponseData = Yii::$service->helper->appserver->getReponseData($code, $data);
                            
                            return $reponseData;
T
Terry 已提交
101
                        }
T
Terry 已提交
102
                        $orderPayment = Yii::$service->payment->paypal->updateOrderPayment($doCheckoutReturn,$token);
T
Terry 已提交
103
                        // 如果支付成功,并把信息更新到了订单数据中,则进行下面的操作。
T
Terry 已提交
104
                        //echo 444;
T
Terry 已提交
105
                        if ($orderPayment) {
T
Terry 已提交
106
                            // 查看订单是否被多次支付,如果被多次支付,则回滚
T
Terry 已提交
107
                            
T
Terry 已提交
108
                            // 支付成功后,在清空购物车数据。而不是在生成订单的时候。
T
Terry 已提交
109
                            Yii::$service->cart->clearCartProductAndCoupon();
T
Terry 已提交
110 111
                            // (删除)支付成功后,扣除库存。
                            // (删除)Yii::$service->product->stock->deduct();
T
Terry 已提交
112
                            // echo 555;
T
Terry 已提交
113
                            // 发送新订单邮件
T
Terry 已提交
114

T
Terry 已提交
115 116
                            // 扣除库存和优惠券
                            // 在生成订单的时候已经扣除了。参看order service GenerateOrderByCart() function
T
Terry 已提交
117

T
Terry 已提交
118
                            // 得到支付跳转前的准备页面。
T
Terry 已提交
119 120 121 122 123
                            //$paypal_express = Yii::$service->payment->paypal->express_payment_method;
                            //$successRedirectUrl = Yii::$service->payment->getExpressSuccessRedirectUrl($paypal_express);
                            //Yii::$service->url->redirect($successRedirectUrl);
                            $innerTransaction->commit();
                            
T
Terry 已提交
124 125 126 127 128
                            $code = Yii::$service->helper->appserver->status_success;
                            $data = [];
                            $reponseData = Yii::$service->helper->appserver->getReponseData($code, $data);
                            
                            return $reponseData;
T
Terry 已提交
129 130 131
                        }else{
                            
                            $innerTransaction->rollBack();
T
Terry 已提交
132 133 134 135 136
                            $code = Yii::$service->helper->appserver->order_paypal_express_payment_fail;
                            $data = [];
                            $reponseData = Yii::$service->helper->appserver->getReponseData($code, $data);
                            
                            return $reponseData;
T
Terry 已提交
137 138 139 140 141
                        }
                    } catch (Exception $e) {
                        $innerTransaction->rollBack();
                    }
                }
T
Terry 已提交
142 143
                // 如果订单支付过程中失败,将订单取消掉
                /* 2017-09-12修改,认为没有必要取消订单,如果取消掉,在支付页面就无法继续下单,因此注释掉下面的代码
T
Terry 已提交
144
                if (!$doCheckoutReturn || !$orderPayment) {
T
Terry 已提交
145 146 147 148 149 150 151 152 153 154 155 156 157 158
                    $innerTransaction = Yii::$app->db->beginTransaction();
                    try {
                        if(Yii::$service->order->cancel()){
                            $innerTransaction->commit();
                        }else{
                            $innerTransaction->rollBack();
                        }
                    } catch (Exception $e) {
                        $innerTransaction->rollBack();
                    }
                }
                */
                //return true;
            }else{
T
Terry 已提交
159 160 161 162 163
                $code = Yii::$service->helper->appserver->order_generate_fail;
                $data = [];
                $reponseData = Yii::$service->helper->appserver->getReponseData($code, $data);
                
                return $reponseData;
T
Terry 已提交
164 165 166 167 168 169
            }
            
        }
        //echo 'eeeeeeee';exit;
        Yii::$service->page->message->addByHelperErrors();

T
Terry 已提交
170
        return [];
T
Terry 已提交
171 172 173
    }
    /**
     * @property $token | String 
T
Terry 已提交
174
     * 通过paypal的api接口,进行支付下单
T
Terry 已提交
175
     */
T
Terry 已提交
176
    public function doCheckoutPayment($token)
T
Terry 已提交
177 178
    {
        $methodName_ = 'DoExpressCheckoutPayment';
T
Terry 已提交
179
        $nvpStr_ = Yii::$service->payment->paypal->getCheckoutPaymentNvpStr($token);
T
Terry 已提交
180
        //echo $nvpStr_;exit;
T
Terry 已提交
181 182
        $doCheckoutReturn = Yii::$service->payment->paypal->PPHttpPost5($methodName_, $nvpStr_);
        //var_dump($doCheckoutReturn);
T
Terry 已提交
183
        //exit;
T
Terry 已提交
184 185
        if (strstr(strtolower($doCheckoutReturn['ACK']), 'success')) {
            return $doCheckoutReturn;
T
Terry 已提交
186
        } else {
T
Terry 已提交
187 188
            if ($doCheckoutReturn['ACK'] == 'Failure') {
                $message = $doCheckoutReturn['L_LONGMESSAGE0'];
T
Terry 已提交
189
                // 添加报错信息。
T
Terry 已提交
190 191 192 193 194 195 196 197 198 199 200 201
                //Message::error($message);
                Yii::$service->helper->errors->add($message);
            } else {
                Yii::$service->helper->errors->add('paypal express payment error.');
            }

            return false;
        }
    }

    /**
     * @property $post | Array
T
Terry 已提交
202 203 204 205
     * 登录用户,保存货运地址到customer address ,然后把生成的
     * address_id 写入到cart中。
     * shipping method写入到cart中
     * payment method 写入到cart中 updateCart
T
Terry 已提交
206 207 208 209 210 211 212
     */
    public function updateAddress($post)
    {
        return Yii::$service->cart->updateGuestCart($this->_billing, $this->_shipping_method, $this->_payment_method);
    }

    /**
T
Terry 已提交
213
     * 如果是游客,那么保存货运地址到购物车表。
T
Terry 已提交
214 215 216 217 218 219 220 221 222 223 224 225 226 227
     */
    /*
    public function updateCart(){
        if(Yii::$app->user->isGuest){
            return Yii::$service->cart->updateGuestCart($this->_billing,$this->_shipping_method,$this->_payment_method);
        }else{
            return Yii::$service->cart->updateLoginCart($this->_address_id,$this->_shipping_method,$this->_payment_method);
        }
    }
    */

    /**
     * @property $post | Array
     * @return bool
T
Terry 已提交
228
     *              检查前台传递的信息是否正确。同时初始化一部分类变量
T
Terry 已提交
229 230 231 232 233 234
     */
    public function checkOrderInfoAndInit($post)
    {
        $address_one = '';
        $billing = isset($post['billing']) ? $post['billing'] : '';
        if (!Yii::$service->order->checkRequiredAddressAttr($billing)) {
T
Terry 已提交
235 236 237 238
            
            $code = Yii::$service->helper->appserver->order_generate_request_post_param_invaild;
            $data = [
                'error' => Yii::$service->helper->errors->get(','),
T
Terry 已提交
239
            ];
T
Terry 已提交
240 241 242 243 244
            $reponseData = Yii::$service->helper->appserver->getReponseData($code, $data);
            
            return $reponseData;
            
            
T
Terry 已提交
245 246 247 248 249
        }
        $this->_billing = $billing;

        $shipping_method = isset($post['shipping_method']) ? $post['shipping_method'] : '';
        $payment_method = isset($post['payment_method']) ? $post['payment_method'] : '';
T
Terry 已提交
250
        // 验证货运方式
T
Terry 已提交
251
        if (!$shipping_method) {
T
Terry 已提交
252 253 254
            $code = Yii::$service->helper->appserver->order_generate_request_post_param_invaild;
            $data = [
                'error' => 'shipping method can not empty',
T
Terry 已提交
255
            ];
T
Terry 已提交
256 257 258
            $reponseData = Yii::$service->helper->appserver->getReponseData($code, $data);
            
            return $reponseData;
T
Terry 已提交
259 260
        } else {
            if (!Yii::$service->shipping->ifIsCorrect($shipping_method)) {
T
Terry 已提交
261 262 263
                $code = Yii::$service->helper->appserver->order_generate_request_post_param_invaild;
                $data = [
                    'error' => 'shipping method is not correct',
T
Terry 已提交
264
                ];
T
Terry 已提交
265 266 267
                $reponseData = Yii::$service->helper->appserver->getReponseData($code, $data);
                
                return $reponseData;
T
Terry 已提交
268
            }
T
Terry 已提交
269
            
T
Terry 已提交
270
        }
T
Terry 已提交
271 272 273 274 275 276 277 278 279 280 281 282 283 284
        // 订单备注信息不能超过1500字符
        $orderRemarkStrMaxLen = Yii::$service->order->orderRemarkStrMaxLen;
        $order_remark = isset($post['order_remark']) ? $post['order_remark'] : '';
        if ($order_remark && $orderRemarkStrMaxLen) {
            $order_remark_strlen = strlen($order_remark);
            if ($order_remark_strlen > $orderRemarkStrMaxLen) {
                Yii::$service->helper->errors->add('order remark string length can not gt '.$orderRemarkStrMaxLen);
                
                return false;
            } else {
                // 去掉xss攻击字符,关于防止xss攻击的yii文档参看:http://www.yiichina.com/doc/guide/2.0/security-best-practices#fang-zhi-xss-gong-ji
                $this->_order_remark = $order_remark;
            }
        }
T
Terry 已提交
285 286 287 288 289 290 291
        $this->_shipping_method = $shipping_method;
        $this->_payment_method = $payment_method;
        Yii::$service->payment->setPaymentMethod($this->_payment_method);

        return true;
    }
}