public function pay($request, $response) { /*{{{*/ $this->validLogin($response); $source = $this->getSource($request); if ($source->isNull()) { $response->setRedirect($this->space->getPhoneServiceUrl4Order()); return parent::DIRECT_OUTPUT; } $this->checkIsMySource($source); if ($source->isPaid()) { $response->setRedirect($source->successUrl()); return parent::DIRECT_OUTPUT; } $account = $source->user->getCashAccount(); if ($account->amount >= $source->getSalePrice()) { $response->setRedirect($response->router->urlfor('payment/showpaytype', array('sourceId' => $source->id, 'sourceType' => $request->sourceType))); return parent::DIRECT_OUTPUT; } $amount = XString::calculateBalancePrice($source->getSalePrice(), $account->amount); $doctor = $this->space->host; $hospitalfaculty = $doctor->hospitalfaculty; $hospital = $hospitalfaculty->hospital; $description = $hospital->name . $hospitalfaculty->name . $doctor->name; $onlinePayType = $request->onlinePayType; $depositeOrder = OrderClient::getInstance()->createDepositeOrder($this->user, $amount, $onlinePayType == 'alipay' ? DepositeOrder::RECHARGE_TYPE_ALIPAY : DepositeOrder::RECHARGE_TYPE_QPAY, array($source)); if ($onlinePayType == 'alipay') { //创建支付url $callBackUrl = BeanFinder::get('configs')->alipay_callback_url; $frontUrl = BeanFinder::get('configs')->alipay_callback_returnurl; $payUrl = Alipay::getInstance()->getPayUrl($depositeOrder->id, Pay::TYPE_PAY, $depositeOrder->amount, $callBackUrl, ServiceDef::getServiceSpec(ServiceDef::TYPE_TELORDER)->text, $description, $frontUrl); $response->exitJump($payUrl); } else { if ($onlinePayType == '00') { $orders = array(); $orders['orderId'] = $depositeOrder->id; $orders['productName'] = ServiceDef::getServiceSpec(ServiceDef::TYPE_TELORDER)->text; $orders['bankId'] = ''; $orders['bankType'] = '00'; $orders['orderTimestamp'] = Qpay::getInstance()->getQpayOrderTimestamp(); $orders['payerIP'] = XIpLocation::getIp(); $orders['bgUrl'] = BeanFinder::get('configs')->qpay_callback_url; $orders['orderAmount'] = $amount; $qpay = new Qpay(); $qpay->setOrderInfo($orders, Pay::TYPE_PAY); $form = $qpay->getSubmitForm(); $response->form = $form; } else { //创建支付url $callBackUrl = BeanFinder::get('configs')->alipay_gateway_callback_url; $frontUrl = BeanFinder::get('configs')->alipay_gateway_callback_returnurl; $payUrl = GatewayAlipay::getInstance()->getPayUrl($depositeOrder->id, Pay::TYPE_PAY, $amount, $callBackUrl, ServiceDef::getServiceSpec(ServiceDef::TYPE_TELORDER)->text, $description, $frontUrl, $onlinePayType); $response->form = $payUrl; } } }
private function getAlipayForm4FollowupOrder(FollowupOrder $order) { $callbackUrl = BeanFinder::get('configs')->alipay_callback_url; $frontUrl = BeanFinder::get('configs')->alipay_callback_returnurl; $price = $order->price;//原价 //dodo::zhb 创建充值单 $depositeOrder = OrderClient::getInstance()->createDepositeOrder($this->user, $price, DepositeOrder::RECHARGE_TYPE_ALIPAY, array($order)); $description = ''; $form = Alipay::getInstance()->getPayForm($depositeOrder->id, Pay::TYPE_FOLLOWUPORDER, $price, $callbackUrl, $order->product->title, $order->product->title, $frontUrl); return $form; }
private function _alipayForOrder($amount, $order, DepositeOrder $depositeOrder) {/*{{{*/ $callBackUrl = BeanFinder::get('configs')->alipay_callback_url; $frontUrl = BeanFinder::get('configs')->alipay_callback_returnurl; if($order instanceof ScoreOrder) { $description = $this->user->name."充值兑换积分"; $type = Pay::TYPE_SCOREORDER; } else if($order instanceof ServiceOrder) { $description = $this->user->name."充值购买咨询"; $type = Pay::TYPE_FLOWORDER; } else if($order instanceof DepositeOrder) { $type = Pay::TYPE_RECHARGE; $description = $this->user->name."充值"; } else { return false; } return Alipay::getInstance()->getPayUrl($depositeOrder->id, $type, $amount, $callBackUrl, ServiceDef::getServiceSpec(ServiceDef::TYPE_TELORDER)->text, $description, $frontUrl); }/*}}}*/
public function getAliPayItemList($request, $response) {/*{{{*/ //第一次查询列表 $isFirstQuery = $request->query; $depositeId = $request->depositeId; $failDepositeOrderIds = array(); $page = $request->page ? $request->page : 1; $pageSize = 100; $startMinute = $request->startMinute; $endMinute = $request->endMinute; $startNormalTime = $request->getRequest('startTime', XDateTime::now()->toShortString()); $startTime = $startNormalTime.' '.$request->getRequest('startHour', '00').':'.$request->getRequest('startMinute', '00').':00'; $endTime = $startNormalTime.' '.$request->getRequest('endHour', '23').':'.$request->getRequest('endMinute', '00').':59'; DBC::requireTrue(XDateTime::secondDiff(XDateTime::valueOf($endTime), XDateTime::valueOf($startTime)) <= 0 , "结束时间不能大于开始时间"); $isSuccess = false; $returnItems = array(); //第一次查询isFirstQuery有值 if(empty($isFirstQuery)) {/*{{{*/ $itemUrl = Alipay::getInstance()->getPayItemList($page, $pageSize, $startTime, $endTime); $xml = file_get_contents($itemUrl); $itemValues = simplexml_load_string($xml); if($itemValues->is_success == 'T') { $i = 0; $isSuccess = true; $xmlResponse = $itemValues->response; $account_page_query_result = $xmlResponse->account_page_query_result; $response->hasNextPage = $account_page_query_result->has_next_page && $account_page_query_result->has_next_page == 'T'; $account_log_list = $account_page_query_result->account_log_list; $AccountQueryAccountLogVO = $account_log_list->AccountQueryAccountLogVO; foreach($AccountQueryAccountLogVO as $item) { $i++; $items = array(); $depositeOrderId = strstr($item->merchant_out_order_no,'_', true); if($item->income > 0 && $item->outcome == 0 ) { $items = $this->getAllAliPayList($item, $depositeOrderId, $items); //查询全部 if(empty($depositeId)) { $returnItems[$i] = $items; } else if ($depositeId == $depositeOrderId) { $returnItems[$i] = $items; } //区间内最多50条status为fail的记录 $failDepositeId = $this->getFailDepositeOrderIds($items, $depositeOrderId); $failDepositeOrderIds[] = $failDepositeId; } } } else { $response->errorMsg = $itemValues->error; } }/*}}}*/ //充值失败充值单 $failDepositeOrders = DAL::get()->find('depositeorder', $failDepositeOrderIds); $response->failDepositeOrders = $failDepositeOrders; $response->items = $returnItems; $response->isSuccess = $isSuccess; $response->startHour = $request->startHour; $response->endHour = $request->endHour; $response->startTime = $request->startTime; $response->startMinute = $request->startMinute; $response->endMinute = $request->endMinute; $response->page = $page; $response->depositeId = $depositeId; }/*}}}*/
public function alipayCallBack4notify() {/*{{{*/ $content = $_POST; $payable = Alipay::getInstance()->initCallBackData($content,Pay::NAME_TYPE_ALIPAY_NOTIFY); //参数检查,如果无效,直接退出 $this->_checkPayable($payable,Pay::NAME_TYPE_ALIPAY_NOTIFY); //notify $ret = $this->_callbackImp4notify(); if($ret){ //返回回调成功 echo "success"; }else { echo "fail"; } exit; }/*}}}*/
public function pay($request, $response) {/*{{{*/ $this->validLogin(); $user = $this->_newUser; $onlinePayType = $request->onlinePayType; $order = DAL::get()->find('TelOrder', $request->sId); if (false == $order->isNull() && $order->isPayed()) { $response->setRedirect($response->router->urlfor('payment/paymessage', array('orderId'=>$order->id))); return ; } DBC::requireTrue($user->id == $order->getUser()->id, '请患者重新登陆,或者重新下单!'); $ownerDoctor = $order->getExecuterBySpace()->host; $hospitalfaculty = $ownerDoctor->hospitalfaculty; $hospital = $hospitalfaculty->hospital; $description = $hospital->name.$hospitalfaculty->name.$ownerDoctor->name; $buyerCashAccount = $order->owner->relatedObject->getCashAccount(); $balance = 0; if($buyerCashAccount != null && $buyerCashAccount->isNull() == false) { $balance = $order->owner->relatedObject->getCashAccount()->amount; } $amount = number_format($order->getAmount()-$balance, 2, '.', ''); TelOrderClient::getInstance()->updatePayType($order->id, $onlinePayType); //dodo::zhb 创建充值单 $depositeOrder = OrderClient::getInstance()->createDepositeOrder($user, $user->getCashAccount(), $amount, $onlinePayType == 'alipay'?DepositeOrder::RECHARGE_TYPE_ALIPAY:DepositeOrder::RECHARGE_TYPE_QPAY, $order->id, get_class($order)); if($onlinePayType == 'alipay') { //创建支付url $callBackUrl = BeanFinder::get('configs')->alipay_callback_url; $frontUrl = BeanFinder::get('configs')->alipay_callback_returnurl; $payUrl = Alipay::getInstance()->getPayUrl($depositeOrder->id, Pay::TYPE_PAY, $amount, $callBackUrl, TelService::$serviceType[TelService::APPOINTMENT_SERVICE], $description, $frontUrl); header("Location: $payUrl"); exit(); } else { $orders = array(); $orders['orderId'] = $depositeOrder->id; $orders['productName'] = TelService::$serviceType[TelService::APPOINTMENT_SERVICE]; if($onlinePayType == '00') { $orders['bankId'] = ''; $orders['bankType'] = '00'; }else{ $orders['bankId'] = $onlinePayType; $orders['payType'] = 10; } $orders['orderTimestamp'] = Qpay::getInstance()->getQpayOrderTimestamp(); $orders['payerIP'] = XIpLocation::getIp(); $orders['bgUrl'] = BeanFinder::get('configs')->qpay_callback_url; $orders['orderAmount'] = $amount; $qpay = new Qpay(); $qpay->setOrderInfo($orders, Pay::TYPE_PAY); $form = $qpay->getSubmitForm(); $response->form = $form; } }/*}}}*/