/** * @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('支付失败'); } }