"wxpay","desc" => ""); $types[] = array("payment" => "alipay","desc" => ""); $types[] = array("payment" => "cmbpay","desc" => "首付最高减99"); return $types; } static public function pay_bonus($pay_sn) { $member_info = array('member_id' => $_SESSION['member_id'], 'member_name' => $_SESSION['member_name']); $logic_payment = Logic('payment'); $logic_payment->payPredepositEx($pay_sn,$member_info); } static public function pay($pay_sn, $payment,$usebonus,&$err) { if($usebonus) { self::pay_bonus($pay_sn); } $logic_payment = Logic('payment'); $payinfo = $logic_payment->getRealOrderInfo($pay_sn, $_SESSION['member_id']); if (intval($payinfo['data']['api_pay_state']) != 0) { $err = array('code' => errcode::ErrPayment, 'msg' => $payinfo['msg']); return false; } $left_cents = intval(floatval($payinfo['data']['api_pay_amount']) * 100 + 0.5); if($left_cents == 0) { $output['need_pay'] = false; $output['tips'] = "已经用红包支付完成"; $payinfo = self::update_order($pay_sn, $pay_sn, 'bonus'); // 更新订单 // 推送到oms 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); } } } return $output; } else { $pay = null; if($payment == "wxpay") { $pay = new Pay\wxpay(); } else if($payment == "alipay") { $pay = new Pay\alipay(); } else if($payment == "cmbpay") { $pay = new Pay\cmbpay(); } else { $err = array('code' => errcode::ErrPayment, 'msg' => $payinfo['msg']); return false; } $subject = $payinfo['data']['subject']; $pay_sn = $payinfo['data']['pay_sn']; $order_sn = $payinfo['data']['order_list'][0]['order_sn']; $output['need_pay'] = true; $output['tips'] = ""; $third_param = $pay->gen_pay($pay_sn,$left_cents,$order_sn,$subject); $output['param'] = $third_param; return $output; } } public static function check_fee($pay_sn,$total_fee,&$need_pay) { $logic_payment = Logic('payment'); $result = $logic_payment->getRealOrderInfo($pay_sn); 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); } public function OnNotify($param,$payment) { $pay = $this->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']; $cb_info = $this->update_order($pay_sn,$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); } $this->OnSuccess($pay_sn); return true; } } else { return false; } } private function gen_payment($payment) { if($payment == "wxpay") { return new Pay\wxpay(); } else if($payment == "alipay") { return new Pay\alipay(); } else if($payment == "cmbpay") { return new Pay\cmbpay(); } else { return null; } } public function OnSuccess($pay_sn) { $logic_payment = Logic('payment'); $result = $logic_payment->getRealOrderInfo($pay_sn); if($result['state'] != true) { return false; } $data = &$result['data']; $buyer_id = intval($data['buyer_id']); $order_amount = 0.0; $goods_amount = 0.0; if(is_array($data['order_list'])) { foreach($data['order_list'] as $key => $order) { $order_amount += floatval($order['order_amount']); $goods_amount += floatval($order['goods_amount']); } $ret = self::send_share_bonus(36429,$buyer_id,$order_amount); if($ret == false) { Log::record("向用户发送购物后分享红包失败",log::ERR); return false; } else { return true; } } else { return false; } } private function calc_amount($total_amount,$total_num) { $money = $total_num * predeposit_helper::scale() * $total_amount; $money = (intval((intval($money) / 10 )) + 1) * 10; return $money; } static private function is_enough($memer_id,$total_amount) { $member = Model('member'); $relay_array = $member->getMemberPdInfo($memer_id); $total = floatval($relay_array['available_predeposit']); $total = intval($total*100 + 0.5); $total_amount = intval($total_amount * 100 + 0.5); return ($total_amount <= $total); } private function send_share_bonus($sender_id,$relayer_id,$total_amount) { $minfo = new member_info($relayer_id); $param['sender_id'] = $sender_id; $param['relayer_id'] = $relayer_id; $param['sender_mobile'] = $minfo->mobile(); $param['sender_name'] = $minfo->nickname(); $param['send_start_date'] = time(); if(is_publish()) { $param['send_end_date'] = $param['send_start_date'] + self::period_hour * 3600; } else { $param['send_end_date'] = $param['send_start_date'] + 600; //测试服务器用10分钟就退款 } $param['total_num'] = self::total_number; $param['total_amount'] = $this->calc_amount($total_amount,self::total_number); $param['use_type'] = 1; $param['user_type'] = 2; $param['send_type'] = self::send_type; $param['type_bless'] = self::def_bless; $param['make_type'] = bonus\type::MakePayType; if(self::is_enough($sender_id,$param['total_amount']) == false) { Log::record("系统账户余额不够给用户发送分享红包",Log::ERR); return false; } $ret = bonus_helper::make_bonus($param); if($ret === false) { return false; } else { $type_sn = $ret['type_sn']; $money = $ret['money']; $pre_helper = new predeposit_helper($sender_id); $pre_helper->handout_relaybonus($money,$minfo->nickname(),$type_sn,$relayer_id,"发送了{$money}元的转发红包."); $push_param = array(); $push_param['member_id'] = $relayer_id; $push_param['text'] = "熊猫美妆向您派发了{$money}元的购物分享红包,您自己可以抢一份哦~."; $push_param['go_type'] = 'bonus'; QueueClient::push('upushSendMsg',$push_param); return array('money' => $money,'total_num' => self::total_number,'sender_name' => '熊猫美妆'); } } public function update_order($paysn, $trade_no, $payment) { $logic_payment = Logic('payment'); $tmp = explode('|', $paysn); $paysn = $tmp[0]; if (!empty($tmp[1])) { $order_type = $tmp[1]; } else { $order_pay_info = Model('order')->getOrderPayInfo(array('pay_sn' => $paysn)); if (empty($order_pay_info)) { $order_type = 'v'; } else { $order_type = 'r'; } } if ($order_type == 'r') { $result = $logic_payment->getRealOrderInfo($paysn); if (intval($result['data']['api_pay_state'])) { return array('state' => true); } $order_list = $result['data']['order_list']; $result = $logic_payment->updateRealOrder($paysn, $payment, $order_list, $trade_no); } elseif ($order_type == 'v') { $result = $logic_payment->getVrOrderInfo($paysn, null, true); if ($result['data']['order_state'] != ORDER_STATE_NEW) { return array('state' => true); } $result = $logic_payment->updateVrOrder($paysn, $payment, $result['data'], $trade_no); } return $result; } }