コード例 #1
0
 /**
  * @brief 担保交易支付,支付的时候,需要判断是否需要用户充值完成支付
  *
  * @return  public function
  * @retval
  * @see
  * @note
  * @author 吕宝贵
  * @date 2015/12/08 22:35:00
  **/
 public function actionPay()
 {
     Yii::warning('进入支付Action', __METHOD__);
     $channels = PayChannel::find()->select(['id', 'name', 'alias'])->indexBy('id')->all();
     $payForm = new PayForm();
     $requestParams = array_merge(Yii::$app->request->get(), Yii::$app->request->post());
     if (!$payForm->load($requestParams, '')) {
         //如果用户没有提交支付,则认为是需要渲染页面
         return $this->render('pay', ['model' => $payForm, 'channels' => $channels]);
     }
     Yii::warning('获取payForm信息成功', __METHOD__);
     //根据form产生trans,trans处于未支付状态
     $transaction = Yii::$app->db->beginTransaction();
     $userAccount = Yii::$app->account->getUserAccount(Yii::$app->user->identity->uid);
     Yii::warning('获取登录用户帐号的金额帐号', __METHOD__);
     $trans = null;
     if (!($trans = $payForm->getTrans())) {
         $transaction->rollback();
         throw new Exception(json_encode($payForm->getErrors()));
     }
     Yii::warning('通过payForm成功获取相关交易信息', __METHOD__);
     //如果账户余额大于交易的总金额,则直接支付
     $callbackData = ['bid' => $payForm->booking_id, 'trans_id' => $trans->id];
     if ($userAccount->balance >= $trans->total_money) {
         Yii::warning('用户余额充足,使用余额支付', __METHOD__);
         if (Yii::$app->account->pay($trans)) {
             Yii::warning('使用余额支付成功', __METHOD__);
             //回调预订中的成功支付函数
             if (call_user_func([Booking::className(), 'processPaySuccess'], $callbackData)) {
                 $transaction->commit();
                 Yii::warning('业务逻辑回掉处理成功', __METHOD__);
                 //支付成功
                 $this->data = ['pay_url' => '', 'need_pay' => 0, 'channel_id' => 0];
                 return;
             } else {
                 Yii::warning('业务逻辑回掉处理失败', __METHOD__);
                 $transaction->rollback();
                 //此处需要设置错误信息
                 return;
             }
         } else {
             Yii::warning('使用余额支付失败,事务回滚', __METHOD__);
             Yii::warning(Yii::$app->account->getErrors());
             $transaction->rollback();
             return;
         }
     }
     Yii::warning('余额不足,尝试生成充值订单', __METHOD__);
     if (!($receivable = Yii::$app->account->generateReceivableAndChargeTrans($trans, $userAccount))) {
         $transaction->rollback();
         Yii::warning('生成充值订单出错', __METHOD__);
         throw new Exception('生成充值订单出错');
     } else {
         Yii::warning('生成充值订单成功', __METHOD__);
         if (call_user_func([Booking::className(), 'processGenTransSuccess'], $callbackData)) {
             Yii::warning('挂在充值订单到业务订单交易信息上', __METHOD__);
             $transaction->commit();
         } else {
             $transaction->rollback();
             throw new Exception('生成支付信息出错');
         }
     }
     Yii::warning('根据充值订单信息产生第三方充值信息', __METHOD__);
     //下面的操作将会引起用户端页面的跳转或者是微信支付页面弹出
     $payChannel = PayChannel::findOne($payForm->channel_id);
     //根据是否是移动端支付,决定传给payment的options参数
     $payOptions['trade_type'] = 'NATIVE';
     if ($payForm->is_mobile) {
         $payOptions['trade_type'] = 'APP';
     }
     //跳转到支付页面,如果是微信扫码支付,返回的是图片生成的url地址,如果是支付宝,返回的是html
     $payment = new Payment($payChannel->alias, $payOptions);
     //跳转到支付或者返回支付二维码地址
     $returnData = $payment->generatePayRequestParams($receivable);
     Yii::warning('产生的充值订单信息为:', __METHOD__);
     Yii::warning($returnData, __METHOD__);
     if ($returnData) {
         $this->data = ['pay_url' => $returnData, 'need_pay' => 1, 'channel_id' => $payForm->channel_id];
         Yii::warning($this->data, __METHOD__);
         return;
     } else {
         Yii::error($returnData);
         Yii::error($payment->getErrors());
         throw new Exception('支付失败');
     }
 }