mPaymentLogic = Logic('payment'); $order_pay_info = Model('order')->getOrderPayInfo(['pay_sn' => $paysn],true); if (empty($order_pay_info)) { $this->mOrderType = pay_helper::virtual_order; } else { $this->mOrderType = pay_helper::real_order; } $this->mPaysn = $paysn; } public function pay($payment,&$err) { if($this->mOrderType == self::real_order) { return $this->real_pay($payment,$err); } else { return $this->virtual_pay($payment,$err); } } private function real_pay($payment,&$err) { $pay_sn = $this->mPaysn; $payinfo = $this->mPaymentLogic->getRealOrderInfo($pay_sn, $_SESSION['member_id'],true); if (intval($payinfo['data']['api_pay_state']) != 0) { $err = ['code' => errcode::ErrPayment, 'msg' => $payinfo['msg']]; return false; } Log::record("payinfo=" . json_encode($payinfo),Log::DEBUG); $left_cents = intval(doubleval($payinfo['data']['api_pay_amount']) * 100 + 0.5); if($left_cents == 0) { $output['need_pay'] = false; $output['tips'] = "已经用红包支付完成"; $output['is_virtual'] = false; $payinfo = $this->update_order($pay_sn, 'bonus'); // 更新订单 if (isset($payinfo) && $payinfo['state']) { if(is_pushoms()) { $logic_delivery = Logic('delivery'); $ret = $logic_delivery->putOrder($pay_sn, $pay_sn); if(empty($ret)) { //todo must add to 定时任务 Log::record("Put order to oms error: pay_sn={$pay_sn},bonus pay.",Log::ERR); } } $this->OnSuccess(); } return $output; } else { return $this->third_pay($payment,$payinfo,$left_cents,$err); } } private function virtual_pay($payment,&$err) { $order_sn = $this->mPaysn; $payinfo = $this->mPaymentLogic->getVrOrderInfo($order_sn, null,true); if(!$payinfo['state']) goto onerror; if ($payinfo['data']['order_state'] != ORDER_STATE_NEW || empty($payinfo['data']['api_pay_amount'])) goto onerror; $left_cents = intval(doubleval($payinfo['data']['api_pay_amount']) * 100 + 0.5); if($left_cents == 0) { $output['need_pay'] = false; $output['tips'] = "支付完成"; $output['is_virtual'] = true; $payinfo = $this->update_order($order_sn, 'bonus'); // 更新订单 if ($payinfo['state']) { $this->OnSuccess(); } return $output; } else { return $this->third_pay($payment,$payinfo,$left_cents,$err); } onerror: $err = ['code' => errcode::ErrPayment, 'msg' => $payinfo['msg']]; return false; } private function third_pay($payment, $payinfo, $left_cents, &$err) { $pay = null; if($payment == "wxpay") { $pay = new Pay\wxpay(); } elseif($payment == "jspay") { $openid = session_helper::pub_openid(); Log::record("openid = {$openid}",Log::DEBUG); if(empty($openid)) { $err = ['code' => errcode::ErrPayment, 'msg' => '微信未授权,不可以进行网页支付.']; return false; } else { $pay = new Pay\jspay($openid); } } elseif($payment == "webpay") { $openid = session_helper::pub_openid(); $pay = new Pay\webpay($openid); } elseif($payment == "minipay") { $openid = session_helper::pub_openid(); Log::record("openid = {$openid}",Log::DEBUG); if(empty($openid)) { $err = ['code' => errcode::ErrPayment, 'msg' => '微信未授权,不可以进行小程序支付.']; return false; } else { $pay = new Pay\minipay($openid); } } elseif($payment == "alipay") { if(defined('SERVER_TYPE') && SERVER_TYPE == 'panda') { $pay = new Pay\alipay(); } elseif(defined('SERVER_TYPE') && SERVER_TYPE == 'car') { $pay = new Pay\aopay(); } else { Log::record("没有找到阿里支付密钥",Log::DEBUG); } } elseif($payment == "cmbpay") { $pay = new Pay\cmbpay(); } else { $err = ['code' => errcode::ErrPayment, 'msg' => $payinfo['msg']]; return false; } $subject = $payinfo['data']['subject']; $pay_sn = $payinfo['data']['pay_sn']; $order_sn = $payinfo['data']['order_sn']; $output['need_pay'] = true; $output['tips'] = ""; try{ $third_param = $pay->gen_pay($pay_sn,$left_cents,$order_sn,$subject); } catch (Exception $ex) { Log::record($ex->getTraceAsString(),Log::ERR); } $output['param'] = $third_param; return $output; } public function confirm(&$err,&$amount,&$fcode_state) { $pay_sn = $this->mPaysn; if($this->mOrderType == pay_helper::real_order) { $result = $this->mPaymentLogic->getRealOrderInfo($pay_sn,null,true); if(empty($result)) { $err = ['code'=> errcode::ErrOrder,'msg' => '无此订单.']; return false; } $amount = $result['data']['api_pay_amount']; $fcode_state = intval($result['data']['fcode_state']); if (intval($result['data']['api_pay_state']) == 0) { $err = ['code'=> errcode::ErrOrder,'msg' => '此订单未完成支付.']; return false; } else { return true; } } else { $result = $this->mPaymentLogic->getVrOrderInfo($pay_sn, null,true); if(!$result['state']) { $err = ['code'=> errcode::ErrOrder,'msg' => '无此订单.']; return false; } if ($result['data']['order_state'] != ORDER_STATE_NEW) { $fcode_state = 1; return true; } else { $err = ['code'=> errcode::ErrOrder,'msg' => '订单未完成支付.']; return false; } } } public function check_fee($total_fee,&$need_pay) { $pay_sn = $this->mPaysn; if($this->mOrderType == pay_helper::real_order) { $result = $this->mPaymentLogic->getRealOrderInfo($pay_sn,null,true); if (intval($result['data']['api_pay_state']) != 0) { return false; } $need_pay = intval($result['data']['api_pay_amount'] * 100 + 0.5); $total_fee = intval($total_fee * 100 + 0.5); return ($need_pay === $total_fee); } else { $result = $this->mPaymentLogic->getVrOrderInfo($pay_sn); if(!$result['state']) return false; $need_pay = intval($result['data']['api_pay_amount'] * 100 + 0.5); $total_fee = intval($total_fee * 100 + 0.5); return ($need_pay === $total_fee); } } public function paied() { $pay_sn = $this->mPaysn; if($this->mOrderType == self::real_order) { $result = $this->mPaymentLogic->getRealOrderInfo($pay_sn,null,true); if (intval($result['data']['api_pay_state']) != 0) { return true; } } else { $result = $this->mPaymentLogic->getVrOrderInfo($pay_sn); if(!$result['state']) return false; if ($result['data']['order_state'] != ORDER_STATE_NEW) { return true; } } return false; } public function OnSuccess() { $pay_sn = $this->mPaysn; if ($this->mOrderType == self::real_order) { $result = $this->mPaymentLogic->getRealOrderInfo($pay_sn,null,true); if($result['state'] != true) { return false; } else { QueueClient::push('onAsyncOrderPaied',['pay_sn' => $pay_sn]); return true; } } else { $result = $this->mPaymentLogic->getVrOrderInfo($pay_sn,null,true); if($result['state'] != true) { return false; } else { QueueClient::push('onAsyncOrderPaied',['pay_sn' => $pay_sn]); return true; } } } public function update_order($trade_no, $payment) { $paysn = $this->mPaysn; if ($this->mOrderType == self::real_order) { $result = $this->mPaymentLogic->getRealOrderInfo($paysn,null,true); if (intval($result['data']['api_pay_state'])) { return ['state' => true]; } $order_list = $result['data']['order_list']; $result = $this->mPaymentLogic->updateRealOrder($paysn, $payment, $order_list, $trade_no); } else { $result = $this->mPaymentLogic->getVrOrderInfo($paysn); if(!$result['state']) { return ['state' => false]; } if ($result['data']['order_state'] != ORDER_STATE_NEW) { return ['state' => true]; } $result = $this->mPaymentLogic->updateVrOrder($paysn, $payment, $result['data'], $trade_no); if($result['state']) { QueueClient::push('OnVrOrderPaidSuccess', ['order_sn' => $paysn]); } } return $result; } static public function pay_types() { //支付宝,微信,招商银行,各自的描述语 $types = []; $types[] = ["payment" => "wxpay","desc" => ""]; $types[] = ["payment" => "alipay","desc" => ""]; $types[] = ["payment" => "cmbpay","desc" => ""]; return $types; } public static function OnOmsNotify($order_sn, $express_id, $logistics_no,$logistics_company) { $model_order = Model('order'); $order_info = $model_order->getOrderInfo(['order_sn' => $order_sn], ['order_common','order_goods']); $data['reciver_name'] = $order_info['extend_order_common']['reciver_name']; $data['reciver_info'] = $order_info['extend_order_common']['reciver_info']; $data['deliver_explain'] = $order_info['extend_order_common']['deliver_explain']; $data['daddress_id'] = intval($order_info['extend_order_common']['daddress_id']); $data['shipping_express_id'] =intval($express_id); $data['shipping_code'] = $logistics_no; $data['store_id'] = 6; $logic_order = Logic('order'); $result = $logic_order->changeOrderSend($order_info, 'system', $order_info['buyer_name'], $data); QueueClient::push('onAsyncOrderSended', ['pay_sn' => $order_info['pay_sn'], 'logistics_company' => $logistics_company, 'logistics_no' => $logistics_no]); return $result['state']; } public static function OnNotify($param,$payment) { $pay = self::gen_payment($payment); if($pay == null) { return false; } $result = $pay->on_notify($param); if($result != false) { $pay_sn = $result['pay_sn']; $trade_no = $result['trade_no']; $payer = new pay_helper($pay_sn); $cb_info = $payer->update_order($trade_no,$payment); if ($cb_info['state'] == false) { Log::record("update_order fail: pay_sn={$pay_sn},trade_no={$trade_no}", Log::DEBUG); return false; } else { if(is_pushoms()) { $logic_delivery = Logic('delivery'); $logic_delivery->putOrder($pay_sn, $trade_no); Log::record("update_order success: pay_sn={$pay_sn}", Log::DEBUG); } $payer->OnSuccess(); return true; } } else { return false; } } private static function gen_payment($payment) { if($payment == "wxpay") { return new Pay\wxpay(); } elseif($payment == "jspay") { return new Pay\jspay(""); } elseif($payment == "minipay") { return new Pay\jspay(""); } elseif($payment == "alipay") { return new Pay\alipay(); } elseif($payment == "cmbpay") { return new Pay\cmbpay(); } else { return null; } } }