mall_id = $mall_id; $this->config = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_HUIFU_PAY, 'basic'); } } /** * 快捷支付-发送签约短信 * @desc 签约第一步 * @param int $card_id UserBankCard->id * @throws Exception * @return bool */ public function sendSignSms($card_id) { $card = HuifuPayUserBankcard::findOne(['card_id' => $card_id]); if (!$card) { throw new Exception('银行卡信息不存在'); } $order_id = HuifuPayFastpayOrder::createOrder($card->mall_id, $card->user_id, $card_id, 0.01); $orderInfo = HuifuPayFastpayOrder::findOne(['id' => $order_id]); $data=[ 'user_id'=>$card->user_id, 'huifu_id'=>$this->config['huifupay_huifu_id'], 'order_no'=>$orderInfo->order_no, 'bank_card_no'=>$card->bank_card_no, 'payer_name'=>$card->payer_name, 'id_no'=>$card->id_no, 'is_longer'=>$card->is_longer, 'sdate'=>$card->sdate, 'edate'=>$card->edate, 'mobile_no'=>$card->mobile_no, ]; $huifuService=new HuifuService($card->mall_id); $result= $huifuService->signCard($data); if(isset($result['trans_id'])) { $orderInfo->hf_order_no=$result['trans_id']; $orderInfo->save(); } return $result; } /** * 快捷支付-签约 * @desc 签约第二步 END * @param $card_info * @param $sms_code * @throws Exception * @return bool */ public function sign($card_id, $sms_code) { $card_info = UserBankCard::findOne([ 'id' => $card_id, 'status' => StatusEnum::ENABLED, ]); /** @var HuifuPayUserBankcard $card_info */ $huifupay_card_info = HuifuPayUserBankcard::findOne([ 'card_id' => $card_id, 'status' => StatusEnum::ENABLED, 'is_sign' => 0, ]); if (empty($card_info) || empty($huifupay_card_info)) throw new \Exception('银行卡不存在'); /** @var HuifuPayFastpayOrder $orderInfo */ $orderInfo = HuifuPayFastpayOrder::find() ->where(['bank_card_id' => $card_info->id,'user_id'=>$card_info->user_id]) ->orderBy('id desc') ->one(); if (empty($orderInfo)) throw new \Exception('签约订单未找到'); $data=[ 'user_id'=>$huifupay_card_info->user_id, 'huifu_id'=>$this->config['huifupay_huifu_id'], 'order_no'=>$orderInfo->order_no, 'bank_card_no'=>$huifupay_card_info->bank_card_no, 'payer_name'=>$huifupay_card_info->payer_name, 'id_no'=>$huifupay_card_info->id_no, 'is_longer'=>$huifupay_card_info->is_longer, 'sdate'=>$huifupay_card_info->sdate, 'edate'=>$huifupay_card_info->edate, 'mobile_no'=>$huifupay_card_info->mobile_no, 'trans_id'=>$orderInfo->hf_order_no, 'code'=>$sms_code ]; $huifuService=new HuifuService($card_info->mall_id); $result= $huifuService->confirmBindSms($data); if(isset($result['token_no'])&&$result['trans_status']=='S') { $huifupay_card_info->sign_no = $result['token_no'] ?? ''; $huifupay_card_info->is_sign = !empty($result['token_no']) ? 1 : 0; $huifupay_card_info->cust_id=$result['cust_id']; $huifupay_card_info->updated_at = time(); if(!$huifupay_card_info->save()){ throw new Exception($huifupay_card_info->getErrorMessage()); } $orderInfo->updated_at = time(); if(!$orderInfo->save()){ throw new Exception($orderInfo->getErrorMessage()); } return true; } return false; } /** * 解约 * @param $card_info * @return bool * @throws Exception */ public function unsign($card_info) { try { if (!$card_info->sign_no) { // 未签约(直接解绑) $card_info->is_sign = 0; if (!$card_info->save()) { throw new Exception($card_info->getErrorMessage()); } return true; } $bankInfo = [ 'huifu_id' => $this->config['huifupay_huifu_id'], 'user_id' => $card_info->user_id, 'sign_no' => $card_info->sign_no, ]; $huifuService = new HuifuService($card_info['mall_id']); $result = $huifuService->unbindBankCard($bankInfo); if (!$result) { throw new Exception('解约失败'); } $card_info->is_sign = 0; if (!$card_info->save()) { throw new Exception($card_info->getErrorMessage()); } } catch (\Exception $e) { throw new Exception($e->getMessage()); } return true; } /** * 支付短信接口 * @param $trade_id 支付流水id * @param $card_id 银行卡记录id * @throws Exception * @return bool */ public function sendPaySms(int $trade_id, $card_info, $mall_id) { $trade = PaymentTrade::find() ->select('*,out_trade_no as order_no') ->where(['id' => $trade_id]) ->one(); $order_setting = \Yii::$app->services->setting->mall->get($mall_id, 'order'); $order_auto_handle_time = 30; if (!empty($order_setting)) { $order_auto_handle_time = $order_setting['payment_expire_time']; } $expireDate = time() + ($order_auto_handle_time * 60); $huifuService = new HuifuService($trade->mall_id); $notify_url = \Yii::$app->services->setting->platform->get('system.api_url') . "/huifu-pay/notify/notify2"; $result = []; //分账对象 $splitAccount = []; if ($this->config['huifupay_ledger_status'] && !empty(json_decode($this->config['huifupay_ledger_list'], true))) { $sList = json_decode($this->config['huifupay_ledger_list'], true); foreach ($sList as $key => $value) { $scale = bcdiv($value['num'], 100); $price = bcmul($trade->pay_fee, $scale, 2); $item = [ 'num' => $price, 'id' => $value['id'] ]; $splitAccount[] = $item; } } // 发送快捷支付短信 $data = [ 'cust_id' => $card_info->cust_id, 'amount' => $trade->pay_fee, 'huifu_id' => $this->config['huifupay_huifu_id'], 'sign_no'=>$card_info->sign_no, 'delay_acct_flag' => PayService::getSplitAccount($trade) ]; $huifuService=new HuifuService($mall_id); $expireDate = time() + (91 * 60); $result = $huifuService->sendPaySms($data, $notify_url, $expireDate, $splitAccount); if($result) { //添加记录 $order = new HuifuPayOrderModel(); $order->mall_id = $trade->mall_id; $order->hf_order_no = $result['req_seq_id']; //汇付流水号 $order->trade_no = $trade->out_trade_no; $order->created_at = time(); $order->updated_at = time(); $order->payment_id = $trade->id; $order->trade_type = 'fast_pay'; $order->save(); $trade->trade_type='fast_pay'; $trade->save(); } return $result; } }