123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445 |
- <?php
- /**
- * Created by PhpStorm.
- * User: stanley-king
- * Date: 16/6/4
- * Time: 上午11:12
- */
- require_once(BASE_ROOT_PATH . "/helper/session_helper.php");
- require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
- require_once(BASE_ROOT_PATH . '/helper/account_helper.php');
- require_once(BASE_ROOT_PATH . '/helper/pay/IPay.php');
- if(defined('SERVER_TYPE') && SERVER_TYPE == 'panda') {
- require_once(BASE_ROOT_PATH . '/helper/pay/alipay.php');
- }
- elseif(defined('SERVER_TYPE') && SERVER_TYPE == 'car') {
- require_once(BASE_ROOT_PATH . '/helper/pay/aopay.php');
- }
- else {
- Log::record("没有找到阿里支付密钥",Log::DEBUG);
- }
- require_once(BASE_ROOT_PATH . '/helper/pay/wxpay.php');
- require_once(BASE_ROOT_PATH . '/helper/pay/cmbpay.php');
- require_once(BASE_ROOT_PATH . '/helper/pay/jspay.php');
- require_once(BASE_ROOT_PATH . '/helper/pay/minipay.php');
- require_once(BASE_ROOT_PATH . '/helper/pay/webpay.php');
- class pay_helper
- {
- const WX_PAYMENT = "wxpay";
- const ALI_PAYMENT = "alipay";
- const CMB_PAYMENT = "cmbpay";
- const PUBWX_PAYMENT = "jspay";
- const virtual_order = 1;
- const real_order = 2;
- private $mOrderType;
- private $mPaymentLogic;
- private $mPaysn;
- public function __construct($paysn)
- {
- $this->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;
- }
- }
- }
|