getMemberInfoByID(session('member_id')); if ($buyer_info['member_paypwd'] == '' || $buyer_info['member_paypwd'] != md5($post['password'])) { return $order_info; } if ($buyer_info['available_rc_balance'] == 0) { $post['rcb_pay'] = null; } if ($buyer_info['available_predeposit'] == 0) { $post['pd_pay'] = null; } try { Db::startTrans(); if (!empty($post['rcb_pay'])) { $order_info = $logic_buy->rcbPay($order_info, $post, $buyer_info); } if (!empty($post['pd_pay'])) { $order_info = $logic_buy->pdPay($order_info, $post, $buyer_info); } Db::commit(); } catch (\Exception $e) { Db::rollback(); exit($e->getMessage()); } return $order_info; } private function get_order_info($result) { //计算本次需要在线支付的订单总金额 $pay_amount = 0; $pay_order_id_list = array(); if (!empty($result['data']['order_list'])) { foreach ($result['data']['order_list'] as $order_info) { if ($order_info['order_state'] == ORDER_STATE_NEW) { $pay_amount += $order_info['order_amount'] - $order_info['pd_amount'] - $order_info['rcb_amount']; $pay_order_id_list[] = $order_info['order_id']; } } } if (round($pay_amount,2) == 0) { $result['data']['pay_end'] = 1; } else { $result['data']['pay_end'] = 0; } $result['data']['api_pay_amount'] = ds_price_format($pay_amount); //临时注释 if (!empty($pay_order_id_list)) { $update = model('order')->editOrder(array('payment_time'=>TIMESTAMP), array(array('order_id', 'in', $pay_order_id_list))); // if (!$update) { // exit('更新订单信息发生错误,请重新支付');//因为微信支付时会重定向获取openid所以会更新两次 // } } //如果是开始支付尾款,则把支付单表重置了未支付状态,因为支付接口通知时需要判断这个状态 if (isset($result['data']['if_buyer_repay'])) { $update = model('order')->editOrderpay(array('api_paystate' => 0), array('pay_id' => $result['data']['pay_id'])); if (!$update) { exit(lang('order_pay_fail')); } $result['data']['api_paystate'] = 0; } return $result; } private function get_vr_order_info($result) { //计算本次需要在线支付的订单总金额 $pay_amount = 0; if ($result['data']['order_state'] == ORDER_STATE_NEW) { $pay_amount += $result['data']['order_amount'] - $result['data']['pd_amount'] - $result['data']['rcb_amount']; } if ($pay_amount == 0) { $result['data']['pay_end'] = 1; } else { $result['data']['pay_end'] = 0; } $result['data']['api_pay_amount'] = ds_price_format($pay_amount); //临时注释 //$update = model('order')->editOrder(array('api_pay_time'=>TIMESTAMP),array('order_id'=>$result['data']['order_id'])); //if(!$update) { // return array('error' => '更新订单信息发生错误,请重新支付'); //} //计算本次需要在线支付的订单总金额 $pay_amount = $result['data']['order_amount'] - $result['data']['pd_amount'] - $result['data']['rcb_amount']; $result['data']['api_pay_amount'] = ds_price_format($pay_amount); return $result; } /** * 实物商品订单 */ public function real_order() { $pay_sn = input('post.pay_sn'); $payment_code = input('post.payment_code'); $url = url('Memberorder/index'); if (!preg_match('/^\d{20}$/', $pay_sn)) { $this->error(lang('param_error'), $url); } $logic_payment = model('payment', 'logic'); $result = $logic_payment->getPaymentInfo($payment_code); if (!$result['code']) { $this->error($result['msg'], $url); } $payment_info = $result['data']; //计算所需支付金额等支付单信息 $result = $logic_payment->getRealOrderInfo($pay_sn, session('member_id')); if (!$result['code']) { $this->error($result['msg'], $url); } if ($result['data']['api_paystate'] || empty($result['data']['api_pay_amount'])) { $this->error(lang('no_payment_required_this_order'), $url); } $result['data']['order_list'] = $this->use_predeposit($result['data']['order_list'], input('param.'), 0); $result = $this->get_order_info($result); if ($result['data']['pay_end'] == 1) { //站内支付了全款 $this->redirect($url);return; } //转到第三方API支付 $this->_api_pay($result['data'], $payment_info); } /** * 虚拟商品购买 */ public function vr_order() { $order_sn = input('post.order_sn'); $payment_code = input('post.payment_code'); $url = url('Membervrorder/index'); if (!preg_match('/^\d{20}$/', $order_sn)) { $this->error(lang('param_error')); } $logic_payment = model('payment', 'logic'); $result = $logic_payment->getPaymentInfo($payment_code); if (!$result['code']) { $this->error($result['msg'], $url); } $payment_info = $result['data']; //计算所需支付金额等支付单信息 $result = $logic_payment->getVrOrderInfo($order_sn, session('member_id')); if (!$result['code']) { $this->error($result['msg'], $url); } if ($result['data']['order_state'] != ORDER_STATE_NEW || empty($result['data']['api_pay_amount'])) { $this->error(lang('no_payment_required_this_order'), $url); } $result['data'] = $this->use_predeposit($result['data'], input('param.'), 1); $result = $this->get_vr_order_info($result); if ($result['data']['pay_end'] == 1) { $this->redirect($url);return; } //转到第三方API支付 $this->_api_pay($result['data'], $payment_info); } /** * 预存款充值 */ public function pd_order() { $pdr_sn = input('param.pdr_sn'); $payment_code = input('param.payment_code'); $url = url('Predeposit/index'); if (!preg_match('/^\d{20}$/', $pdr_sn)) { $this->error(lang('param_error'), $url); } $logic_payment = model('payment', 'logic'); $result = $logic_payment->getPaymentInfo($payment_code); if (!$result['code']) { $this->error($result['msg'], $url); } $payment_info = $result['data']; $result = $logic_payment->getPdOrderInfo($pdr_sn, session('member_id')); if (!$result['code']) { $this->error($result['msg'], $url); } if ($result['data']['pdr_payment_state'] || empty($result['data']['api_pay_amount'])) { $this->error(lang('no_payment_required'), $url); } //转到第三方API支付 $this->_api_pay($result['data'], $payment_info); } /** * 第三方在线支付接口 * */ private function _api_pay($order_info, $payment_info) { try{ $payment_api = new $payment_info['payment_code']($payment_info); }catch(\Exception $e){ $this->error($e->getMessage()); } if (in_array($payment_info['payment_code'],array('wxpay_native','allinpay'))) { if (!extension_loaded('curl')) { $this->error(lang('please_check_system_configuration')); } if (array_key_exists('order_list', $order_info)) { View::assign('order_list', $order_info['order_list']); View::assign('args', 'buyer_id=' . session('member_id') . '&pay_id=' . $order_info['pay_id']); } else { View::assign('order_list', array()); if ($order_info['order_type'] == 'pd_order') { View::assign('args', 'buyer_id=' . session('member_id') . '&pdr_sn=' . $order_info['pdr_sn']); } else { View::assign('args', 'buyer_id=' . session('member_id') . '&order_id=' . (isset($order_info['order_id']) ? $order_info['order_id'] : '')); } } View::assign('api_pay_amount', $order_info['api_pay_amount']); try{ $pay_url=base64_encode(ds_encrypt($payment_api->get_payform($order_info), MD5_KEY)); }catch(\Exception $e){ $this->error($e->getMessage()); } View::assign('pay_url', $pay_url); View::assign('nav_list', rkcache('nav', true)); if($payment_info['payment_code']=='wxpay_native'){ $pay_method=lang('pay_method_wechat'); }elseif($payment_info['payment_code']=='allinpay'){ $paytype=input('param.paytype'); switch($paytype){ case 'W01': $pay_method=lang('pay_method_wechat'); break; case 'A01': $pay_method=lang('pay_method_alipay'); break; case 'Q01': $pay_method=lang('pay_method_tenpay'); break; case 'U01': $pay_method=lang('pay_method_unionpay'); break; default: $this->error(lang('please_check_system_configuration')); } } View::assign('pay_method',$pay_method); echo View::fetch($this->template_dir . 'wxpay'); } else { try{ $pay_url=$payment_api->get_payform($order_info); }catch(\Exception $e){ $this->error($e->getMessage()); } @header("Location: " . $pay_url); } exit(); } /** * 二维码显示(微信扫码支付) */ public function qrcode() { $data = base64_decode(input('data')); $data = ds_decrypt($data, MD5_KEY, 30); include_once root_path(). 'extend/qrcode/phpqrcode.php'; \QRcode::png($data); } /** * 扫码支付结果判断 */ public function query_state() { if (intval(input('param.pay_id')) > 0) { $info = model('order')->getOrderpayInfo(array( 'pay_id' => intval(input('param.pay_id')), 'buyer_id' => intval(input('param.buyer_id')) )); exit(json_encode(array( 'state' => ($info['api_paystate'] == '1'), 'pay_sn' => $info['pay_sn'], 'type' => 'real_order' ))); } elseif (intval(input('param.order_id')) > 0) { $info = model('vrorder')->getVrorderInfo(array( 'order_id' => intval(input('param.order_id')), 'buyer_id' => intval(input('param.buyer_id')) )); exit(json_encode(array( 'state' => ($info['order_state'] == '20'), 'pay_sn' => $info['order_sn'], 'type' => 'vr_order' ))); } else { $result = model('payment', 'logic')->getPdOrderInfo(input('param.pdr_sn'), input('param.buyer_id')); exit(json_encode(array('state' => $result['code'] && $result['data']['pdr_payment_state'], 'pdr_sn' => $result['code']?$result['data']['pay_sn']:'', 'type' => 'pd_order'))); } } /** * * @param type $payment_code 共用回调方法 * @param type $show_code 实际支付方式名称 */ public function notify($payment_code,$show_code='') { $logic_payment = model('payment', 'logic'); $result = $logic_payment->getPaymentInfo($payment_code); $payment_info = $result['data']; if($show_code){ $result = $logic_payment->getPaymentInfo($show_code); $payment_info['payment_config'] = array_merge($payment_info['payment_config'],$result['data']['payment_config']); } //创建支付接口对象 $payment_api = new $payment_code($payment_info); //对进入的参数进行远程数据判断 $verify = $payment_api->verify_notify(); if ($verify['trade_status'] != 1) { exit; } $out_trade_no = $verify['out_trade_no']; #内部订单号 $trade_no = $verify['trade_no']; #交易订单号 $order_type = $verify['order_type']; #交易类型 $update_result = $logic_payment->updateOrder($out_trade_no, $trade_no, $order_type, $show_code?$show_code:$payment_code); exit($update_result ? 'success' : 'fail'); } /** * 支付接口同步返回路径 */ public function alipay_return() { $result = explode('-', input('param.out_trade_no')); $out_trade_no = $result['1']; //返回的支付单号 $order_type = $result['0']; $order_amount = input('param.total_amount'); //订单金额 $trade_no = input('param.trade_no'); $payment_code = 'alipay'; $logic_payment = model('payment', 'logic'); //取得支付方式 $result = $logic_payment->getPaymentInfo($payment_code); if (!$result['code']) { $this->error($result['msg'], 'Memberorder/index'); } $payment_info = $result['data']; //创建支付接口对象 $payment_api = new $payment_info['payment_code']($payment_info); //返回参数判断 $verify = $payment_api->return_verify(); if (!$verify) { $this->error(lang('payment_data_validation_failed'), 'Memberorder/index'); } //支付成功后跳转 if ($order_type == 'real_order') { $pay_ok_url = '/buy/pay_ok?pay_sn=' . $out_trade_no . '&pay_amount=' . ds_price_format($order_amount); } elseif ($order_type == 'vr_order') { $pay_ok_url = '/buyvirtual/pay_ok?order_sn=' . $out_trade_no . '&order_amount=' . ds_price_format($order_amount); } elseif ($order_type == 'pd_order') { $pay_ok_url = '/predeposit/index'; } header("Location:$pay_ok_url"); exit; } //测试stripe支付 public function pay() { return View::fetch($this->template_dir.'pay'); } //stripe支付异步通知 public function stripe_notify() { $payload = @file_get_contents('php://input'); file_put_contents('1.txt', $payload, FILE_APPEND); require_once root_path() . 'vendor/autoload.php'; require_once root_path() . 'vendor/stripe/stripe-php/init.php'; \Stripe\Stripe::setApiKey(self::$key); // $payload = file_get_contents('https://light.haix.cn/1.txt'); $event = null; try { $event = \Stripe\Event::constructFrom( json_decode($payload, true) ); } catch(\UnexpectedValueException $e) { // Invalid payload // http_response_code(400); exit(); } $payment_intent = ''; // Handle the event switch ($event->type) { case 'charge.succeeded': $succeeded = $event->data->object; $content = json_encode($succeeded); if ($succeeded->status == 'succeeded'){ $payment_intent = $succeeded->payment_intent; } break; default: echo 'Received unknown event type ' . $event->type; break; } if (empty($payment_intent)) { return false; } $order_model = model('order'); $logic_payment = model('payment', 'logic'); $o = $order_model->getOrderBy($payment_intent); $order = $logic_payment->getRealOrderInfo($o['pay_sn']); $order_list = $order['data']['order_list']; $result = $logic_payment->updateRealOrder($o['pay_sn'], 'stripe', $order_list, $payment_intent); } //stripe支付 public function stripe() { $pay_sn = input('post.pay_sn'); $payment_code = input('post.payment_code'); $url = '/Memberorder/index.html'; if (!preg_match('/^\d{20}$/', $pay_sn)) { $this->error(lang('param_error'), $url); } $logic_payment = model('payment', 'logic'); $result = $logic_payment->getPaymentInfo($payment_code); $payment_info = $result['data']; //计算所需支付金额等支付单信息 $result = $logic_payment->getRealOrderInfo($pay_sn, session('member_id')); if (!$result['code']) { $this->error($result['msg'], $url); } if ($result['data']['api_paystate'] || empty($result['data']['api_pay_amount'])) { $this->error(lang('no_payment_required_this_order'), $url); } $result['data']['order_list'] = $this->use_predeposit($result['data']['order_list'], input('param.'), 0); $result = $this->get_order_info($result); if ($result['data']['pay_end'] == 1) { //站内支付了全款 $this->redirect($url);return; } $order_model = model('order'); $detail = $order_model->getOrdergoodsInfo(['order_id' => $result['data']['order_list'][0]['order_id']]); //新的 $product = [ 'name' => 'Order Number:' . $pay_sn , 'images' => [ 'http://test.lightcourse.com/static/home/new/images/logo.png', ] ]; $amount = intval($result['data']['api_pay_amount']) * 100; $result = self::stripePay($product, $amount, $result['data']['order_list'][0]['order_id']); } /** * Stripe支付 * @access private * @author super * @date 2020-11-04 * @param array $product 商品信息 * @param int|float $amount 支付金额 * @param array $pay_type 支付类型 * @param string $currency 货币类型 小写 * @return array */ private static function stripePay($product, $amount, $order_id, $pay_type = ['card'], $currency = 'usd') { require_once root_path() . 'vendor/autoload.php'; require_once root_path() . 'vendor/stripe/stripe-php/init.php'; \Stripe\Stripe::setApiKey(self::$key); header('Content-Type: application/json'); $YOUR_DOMAIN = 'http://test.lightcourse.com/'; $checkout_session = \Stripe\Checkout\Session::create([ 'payment_method_types' => $pay_type, 'line_items' => [[ 'price_data' => [ 'currency' => $currency, 'unit_amount' => $amount, 'product_data' => $product ], 'quantity' => 1, ]], 'mode' => 'payment', 'success_url' => $YOUR_DOMAIN . '/buy/succ?order_id='.$order_id, // 支付成功后跳转url 'cancel_url' => $YOUR_DOMAIN . '/Memberorder/index.html', // 支付失败后跳转url ]); // var_dump($checkout_session->url);die; $jump = $checkout_session->url; //return ['id' => $checkout_session->id, 'payment_intent' => $checkout_session->payment_intent]; // payment_intent是识别支付与通知关系的唯一凭证 $order_model = model('order'); $intent = $checkout_session->payment_intent; $order_model->editOrder(array('trade_no'=>$intent), array( 'order_id' => $order_id)); header("location:$jump");exit(); } /** * 通联异步通知 */ public function allinpay_notify(){ $this->notify('allinpay'); } /** * 微信扫码支付异步通知 */ public function wxpay_native_notify() { $this->notify('wxpay_native'); } /** * 小程序支付异步通知 */ public function wxpay_minipro_notify() { $this->notify('wxpay_native','wxpay_minipro'); } /** * 微信支付支付异步通知 */ public function wxpay_jsapi_notify() { $this->notify('wxpay_native','wxpay_jsapi'); } /** * 微信H5支付异步通知 */ public function wxpay_h5_notify() { $this->notify('wxpay_native','wxpay_h5'); } /** * 微信APP支付异步通知 */ public function wxpay_app_notify() { $this->notify('wxpay_native','wxpay_app'); } /** * 通知处理(支付宝异步对账) */ public function alipay_notify() { $this->notify('alipay'); } /** * 支付宝APP支付异步通知 */ public function alipay_app_notify() { $this->notify('alipay_app'); } /** * 支付宝wap支付异步通知 */ public function alipay_h5_notify() { $this->notify('alipay','alipay_h5'); } } ?>