public function fire($job, $data) { $orderId = $data['id']; $ret = true; switch ($data['notify_type']) { case 'direct': $order = RechargeModel::find($orderId); break; case 'consume': $order = ConsumeModel::find($orderId); break; case 'refund': $order = RefundModel::find($orderId); break; case 'trans': $order = TransModel::find($orderId); break; } if ($order && $order->callback_status != 2 && $order->callback_count < 20) { try { $ret = BusiNotifyBiz::getInstance()->notifyCallback($order, $data['notify_type']); } catch (PayException $e) { $ret = true; } catch (\Exception $e) { $ret = false; } $job->release(pow($order->callback_count, 2) * 60); } if ($ret == true) { $job->delete(); } }
public function serRefund($job, $data) { $errCode = 0; $refundOrder = RefundModel::find($data['id']); $rechargeOrder = RechargeModel::find($refundOrder->recharge_id); do { if ($rechargeOrder->status != RechargeModel::STATUS_SUCCESS || $refundOrder->ser_notify_status != RefundModel::STATUS_DEFAULT) { $errCode = 1; break; } if (!$refundOrder->gateway || !$refundOrder->channel) { $errCode = 2; break; } $channel = ChannelUtil::calculateAccountChannel($refundOrder->channel); if (false === $channel) { $errCode = 3; break; } $gatewayObj = gatewayUtil::getGatewayObj($rechargeOrder->gateway); if (!$gatewayObj) { $errCode = 4; break; } $orderData = $refundOrder->toArray(); $queryParams = array('ser_recharge_no' => $rechargeOrder->ser_recharge_no, 'channel' => $channel, 'seller_partner' => $orderData['seller_partner']); $queryResult = $gatewayObj->refundQuery($queryParams); if ($queryResult->is_success == 'T') { /// 第三方已经退过款 if ($queryResult->is_refund == true) { $errCode = 5; break; } } } while (0); if ($errCode == 0) { $notifyUrl = PayVars::getNotifyUrl() . "notify/refund/{$channel}/{$rechargeOrder->gateway}"; $order = array('channel' => $channel, 'gateway' => $rechargeOrder->gateway, 'create_time' => $orderData['create_time'], 'mer_refund_no' => $orderData['mer_refund_no'], 'notify_url' => $notifyUrl, 'ser_recharge_no' => $rechargeOrder->ser_recharge_no, 'recharge_amount' => $rechargeOrder->recharge_amount, 'refund_amount' => $orderData['amount'], 'subject' => $orderData['subject'], 'mer_recharge_no' => $rechargeOrder->mer_recharge_no, 'seller_partner' => $rechargeOrder->seller_partner); $ret = $gatewayObj->refund($order); if ($ret->is_success == 'F') { $data = array('ser_notify_status' => 3, 'ser_notify_log' => $ret->error, 'ser_notify_time' => time()); RefundBiz::getInstance()->confirmRefundOrderById($refundOrder->id, $data); } $job->release(60 * 5); } else { $job->delete(); } }
public function notifyCallback(BaseModel $order, $notifyType) { $params = new \stdClass(); if (!$order) { throw new PayException(ErrCode::ERR_ORDER_NO_EXISTS); } elseif ($order->callback_url == '') { throw new PayException(ErrCode::ERR_ORDER_NO_EXISTS, '订单callback_url不存在!'); } $params->channel = $order->channel; $params->user_id = $order->user_id; switch ($notifyType) { case 'direct': $params->is_success = $order->status == RechargeModel::STATUS_SUCCESS ? 'T' : 'F'; $params->error = $order->status == RechargeModel::STATUS_SUCCESS ? '' : '充值失败:' . $order->status; $params->pay_recharge_id = $order->id; $params->mer_recharge_no = $order->mer_recharge_no; $params->ser_recharge_no = $order->ser_recharge_no; $params->busi_recharge_no = $order->busi_recharge_no; $params->recharge_amount = $order->recharge_amount; $params->geteway = $order->gateway; $params->gateway_account = $order->gateway_account; break; case 'consume': $params->is_success = $order->status == RechargeModel::STATUS_SUCCESS ? 'T' : 'F'; $params->error = $order->status == RechargeModel::STATUS_SUCCESS ? '' : '消费失败:' . $order->status; $params->pay_consume_id = $order->id; $params->busi_consume_no = $order->busi_consume_no; $params->recharge_amount = $order->recharge_amount; $params->consume_amount = $order->consume_amount; $rechargeOrder = RechargeModel::find($order->recharge_id); if ($rechargeOrder) { $params->pay_recharge_id = $rechargeOrder->id; $params->recharge_amount = $rechargeOrder->recharge_amount; $params->geteway = $rechargeOrder->gateway; } break; case 'refund': $params->is_success = $order->ser_notify_status == RefundModel::STATUS_SUCCESS ? 'T' : 'F'; $params->error = $order->ser_notify_status == RefundModel::STATUS_SUCCESS ? '' : '退款失败:' . $order->ser_notify_log; $params->pay_refund_id = $order->id; $params->busi_refund_no = $order->busi_refund_no; $params->refund_amount = $order->amount; $params->gateway = $order->gateway; $params->refund_time = $order->refund_time; $rechargeOrder = RechargeModel::find($order->recharge_id); if ($rechargeOrder) { $params->mer_recharge_no = $rechargeOrder->mer_recharge_no; $params->recharge_amount = $rechargeOrder->recharge_amount; } break; case 'trans': $params->is_success = $order->ser_notify_status == TransModel::STATUS_SUCCESS ? 'T' : 'F'; $params->error = $order->ser_notify_status == TransModel::STATUS_SUCCESS ? '' : '提现失败:' . $order->ser_notify_log; $params->gateway = $order->gateway; $params->pay_trans_id = $order->id; $params->busi_trans_no = $order->busi_trans_no; $params->trans_amount = $order->trans_amount; $params->trans_time = $order->pay_time; break; default: throw new PayException(ErrCode::ERR_REQUEST_METHOD, "notifyFail. 未知通知类型:{$notifyType}"); break; } $params->timestamp = time(); $params->sign = SignUtil::makeSign(get_object_vars($params)); $ret = $this->_sendCallback($order->callback_url, $params); $order->callback_count++; $order->callback_time = time(); $order->callback_status = $ret == 'succeed' ? 2 : 1; $order->save(); return $ret == 'succeed' ? true : false; }
private function _refundNotify($notice) { $errCode = 0; $errMsg = ''; do { try { $refundOrder = RefundModel::where('mer_refund_no', $notice['mer_refund_no'])->first(); if (!$refundOrder) { $errCode = 2; $errMsg = '退款订单不存在' . $notice['mer_refund_no']; break; } $rechargeOrder = RechargeModel::find($refundOrder->recharge_id); if (!$rechargeOrder) { $errCode = 2; $errMsg = '充值订单不存在' . $refundOrder->recharge_id; break; } if ($rechargeOrder->status != RechargeModel::STATUS_SUCCESS) { $errCode = 3; $errMsg = '订单状态不正确'; break; } $upInfo = ['refund_time' => $notice['refund_time'], 'notify_time' => $notice['notify_time'], 'ser_refund_no' => $notice['ser_refund_no'], 'notify_status' => $notice['notify_status'], 'notify_log' => $notice['notify_log']]; if (true !== RefundBiz::getInstance()->confirmrefundOrderById($refundOrder->id, $upInfo)) { $errCode = 3; $errMsg = '确认退款订单失败'; break; } } catch (\Exception $e) { $errCode = 99; $errMsg = $e->getMessage(); break; } } while (0); $ret = new \stdClass(); $ret->is_success = $errCode === 0 ? 'T' : 'F'; $ret->code = $errCode; $ret->output = $notice['output']; $ret->error = $errMsg; return $ret; }
public function refundRechargeOrderById($orderId, $amount) { $time = time(); $errCode = 0; $errMsg = ''; \DB::beginTransaction(); do { $order = RechargeModel::find($orderId); if (!$order) { $errCode = ErrCode::ERR_ORDER_NO_EXISTS; throw new PayException($errCode); } elseif ($order->status != RechargeModel::STATUS_SUCCESS) { $errCode = ErrCode::ERR_ORDER_STATUS; throw new PayException($errCode); } $order->refund_count++; $order->refund_amount += $amount; $order->refund_time = $time; $order->update_time = $time; $order->save(); AccountBiz::getInstance()->updateUserAccount($order->user_id, RechargeModel::DEAL_OUT_REFUND, $amount, $order->channel); } while (0); if ($errCode == 0) { \DB::commit(); return true; } else { \DB::rollback(); return false; } }