params['out_trade_no']; $store_id = $this->params['store_id'] ?? 0; $json = [ [ 'order_goods gs', 'a.order_id = gs.order_id', 'left' ], [ 'goods_card c', 'gs.goods_id = c.goods_id', 'left' ] ]; $order_info = model('order') ->getInfo([['a.out_trade_no', '=', $out_trade_no]], 'a.order_id,a.order_no,a.order_type,a.order_name,a.store_id,a.order_from,a.promotion_type,a.promotion_status_name, c.goods_id,c.discount_type,c.downPaymentPeriods,c.downPaymentDate,c.validity_type,c.validity_day,c.validity_time,c.average_original_price,c.downPayment,c.perPeriodPriceArray,c.average_discount_price,c.cloud_card_type,c.common_num,c.periods,c.card_template_id', 'a', $json); if (!empty($order_info)) { $original_price = $order_info['average_original_price']; $deductionAmount = $order_info['average_discount_price']; $down_payment = $order_info['downPayment']; $card_type = $order_info['cloud_card_type']; $periods = $order_info['periods'] ?: $order_info['common_num']; $down_payment_periods = $order_info['downPaymentPeriods']; if ($order_info['order_from'] == 'cashier' && $order_info['promotion_type'] == 'cardservice') { $promotion_info = json_decode($order_info['promotion_status_name'], true); $original_price = $promotion_info['average_original_price']; $deductionAmount = $promotion_info['average_discount_price']; $down_payment = $promotion_info['downPayment']; $card_type = $promotion_info['cloud_card_type']; $periods = $promotion_info['periods']; $down_payment_periods = $promotion_info['downPaymentPeriods']; } } else { return $this->error(-1, '订单不存在'); } $merchantPid = ''; $shop_id = ''; if ($store_id && $order_info['store_id'] == $store_id) { $storeInfo = Db::name('store')->cache('store_info' . $store_id)->where('store_id', $store_id)->find(); if (!empty($storeInfo) && $storeInfo['is_settlement'] == 1 && $storeInfo['settlement_type'] == 1 && $storeInfo['merchant_smid'] != '') { $merchantPid = $storeInfo['merchant_smid']; if ($storeInfo['is_mystore']) { $shop_id = json_decode($storeInfo['storeinfo'], true)['shop_id']; } } } if ($merchantPid == '') { $pay = new \addon\alipay\model\Config(); $payConfig = $pay->getPayConfig(request()->siteid())['data']['value']; if ($payConfig && isset($payConfig['merchant_smid']) && $payConfig['merchant_smid']) { $merchantPid = $payConfig['merchant_smid']; } else { $where = [ 'site_id' => request()->siteid(), 'is_platform' => 1, 'pay_type' => 'alipay', ]; $merchantPid = Db::name('pay_shop')->where($where)->cache(json_encode($where))->value('merchant_smid'); if (empty($merchantPid)) { cache(json_encode($where), null); } } } $proxy_url = config('alipay.cloudAlipay.proxy_url'); if ($proxy_url) { //代理模式 $post = [ 'userId' => $out_trade_no, 'domain' => addon_url('pay/pay/cloudnotify'), 'site_id' => request()->siteid() ]; $this->http_post_data($proxy_url, $post); } $pub = [ 'merchantPid' => $merchantPid, //商户pid 'productName' => trim($order_info['order_name']), //产品秒杀 'productNo' => $order_info['goods_id'], 'nickName' => '支付宝用户', 'outSubscriptionNo' => $out_trade_no, 'deductionAmount' => sprintf("%.2f", $deductionAmount), //每期费用 'periods' => (int)$periods, //总期数 'downPayment' => $down_payment, //优惠价格 'downPaymentPeriods' => $down_payment_periods, //优惠期数 // 'shopId' => '2024052500502007090093617395', // 'productUrl' => '/pages_market/goods/detail?goods_id='.$order_info['goods_id'], ]; if ($pub['downPaymentPeriods'] == 0) { unset($pub['downPayment'], $pub['downPaymentPeriods']); } $downPaymentDate = 0; if ($order_info['downPaymentDate'] > 0) { //首期扣款时间 $downPaymentDate = $order_info['downPaymentDate']; } if ($shop_id) { // $pub['shopId'] = $shop_id; } switch ($card_type) { case 'week': $data = []; $info['initData']['openWeek'] = array_merge($pub, $data); break; case 'month': $data = []; $info['initData']['openMonth'] = array_merge($pub, $data); break; case 'discount_month': if (!$downPaymentDate) $downPaymentDate = 30; $data = [ 'enableUserActivePay' => 'Y', //主动付款 'originalPrice' => sprintf("%.2f", $original_price), //订购原价 'downPaymentDate' => date("Y-m-d", strtotime("+ {$downPaymentDate} day")), //首期扣款时间 当前时间增加7天 ]; $info['initData']['openDiscountMonth'] = array_merge($pub, $data); break; case 'discount_week': if (!$downPaymentDate) $downPaymentDate = 7; $data = [ 'enableUserActivePay' => 'Y', //主动付款 'originalPrice' => sprintf("%.2f", $original_price), //订购原价 'downPaymentDate' => date("Y-m-d", strtotime("+ {$downPaymentDate} day")), //首期扣款时间 当前时间增加7天 ]; $info['initData']['openDiscountWeek'] = array_merge($pub, $data); break; case 'num': $data = []; $info['initData']['openTime'] = array_merge($pub, $data); break; case 'discount_num': $data = [ 'enableUserActivePay' => 'Y', //主动付款 'existVerificationCode' => 'Y',//主动付款 'originalPrice' => sprintf("%.2f", $original_price), //订购原价 'overdueDate' => '', //过期时间 ]; switch ($order_info['validity_type']) { case '0': $time = mktime(0, 0, 0, date('m'), date('d'), date('Y') + 10); $data['overdueDate'] = date('Y-m-d', $time); break; case '1': $time = mktime(0, 0, 0, date('m'), date('d') + $order_info['validity_day'], date('Y')); $data['overdueDate'] = date('Y-m-d', $time); break; case '2' : $data['overdueDate'] = date('Y-m-d', $order_info['validity_time']); break; } $info['initData']['openDiscountTime'] = array_merge($pub, $data); $card_type = 'discount_time'; } if ($order_info['card_template_id'] != '') { $info['card_template_id'] = $order_info['card_template_id']; $info['outOrderNo'] = $order_info['order_no']; $info['is_public_domain'] = 1; $info['backUrl'] = '/pages_promotion/cardservice/card/zm_payment'; } $pub['subscriptionType'] = strtoupper($card_type); cache($out_trade_no, array_merge($pub, $data), 7200); return $this->response($this->success($info)); } private function http_post_data($url, $params = array()) { if (is_array($params)) { $params = http_build_query($params, null, '&'); } $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 设置请求超时时间为10秒 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // 设置连接超时时间为5秒 $response = curl_exec($ch); curl_close($ch); return $response; } }