FinanceController.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. <?php
  2. namespace addons\Mch\client\controllers;
  3. use addons\JoinPay\common\global_func\payment_logic\JoinPayFastPay;
  4. use addons\JoinPay\common\models\JoinPayUserBankcard;
  5. use addons\Mch\common\enums\MchEnum;
  6. use addons\Mch\common\models\Mch;
  7. use addons\Mch\common\models\MchBank;
  8. use addons\Mch\common\models\MchCommission;
  9. use addons\Mch\common\models\MchSettings;
  10. use addons\Mch\common\models\MchStatistics;
  11. use addons\Mch\common\models\MchWithdrawLog;
  12. use common\enums\AddonsEnum;
  13. use common\enums\ApiStatusEnum;
  14. use common\enums\StatusEnum;
  15. use common\enums\WithdrawWayEnum;
  16. use common\globals\GlobalInvoke;
  17. use common\helpers\ArrayHelper;
  18. use common\helpers\BankCardHelper;
  19. use common\models\common\PlatformSetting;
  20. use common\models\common\UserBankCard;
  21. use common\models\mall\MallAddons;
  22. use common\models\user\User;
  23. use yii\helpers\Json;
  24. class FinanceController extends BaseController
  25. {
  26. /**
  27. * 财务首页
  28. * @Author bing
  29. * @DateTime 2022-04-26 18:03:57
  30. * @return void
  31. * @copyright: Copyright (c) 2022 广东七件事集团
  32. */
  33. public function actionIndex()
  34. {
  35. if (\Yii::$app->request->isAjax) {
  36. if (\Yii::$app->request->isGet) {
  37. $get = \Yii::$app->request->get();
  38. $where[] = ['mall_id' => $this->mall_id];
  39. $where[] = ['mch_id' => $this->mch_id];
  40. if (!empty($get['keyword'])) {
  41. $user_list = User::lists(['where' => [['mall_id' => $this->mall_id], [
  42. 'or',
  43. ['like', 'username', trim($get['keyword'])],
  44. ['like', 'nickname', trim($get['keyword'])],
  45. ['like', 'mobile', trim($get['keyword'])]
  46. ]], 'select' => 'id']);
  47. $where[] = ['user_id' => array_column($user_list, 'id')];
  48. }
  49. if (!empty($get['user_id'])) $where[] = ['user_id' => $get['user_id']];
  50. if (!empty($get['order_no'])) $where[] = ['order_no' => $get['order_no']];
  51. if (isset($get['is_settlement']) && $get['is_settlement'] != -1) $where[] = ['is_settlement' => $get['is_settlement']];
  52. $store = Mch::findOne(['id' => $this->mch_id]);
  53. $total_expenses = $store_balance = $unsettled_amount = 0;
  54. if (!empty($store)) {
  55. $total_expenses = $store['total_expenses'];
  56. $store_balance = $store['balance'] + $store['unsettled_amount'];
  57. $unsettled_amount = $store['unsettled_amount'];
  58. }
  59. $time = time();
  60. $where[] = ['>=', 'created_at', $time - 365 * 24 * 3600];
  61. $list = MchStatistics::lists(['where' => $where, 'index' => 'date_time']);
  62. $month = date('m', $time);
  63. $monty_int = intval($month);
  64. $year = date('Y', $time);
  65. $chart_time_arr = [];
  66. $settle_income_arr = [];
  67. if ($monty_int < 12) {
  68. $front_year = $year - 1;
  69. for ($i = $monty_int; $i <= 12; $i++) {
  70. if ($i < 10) {
  71. $month_time = $front_year . '-0' . $i;
  72. } else {
  73. $month_time = $front_year . '-' . $i;
  74. }
  75. $settle_income_arr[] = $list[$month_time]['income_money'] ?? 0;
  76. $chart_time_arr[] = $month_time;
  77. }
  78. for ($i = 1; $i <= $monty_int; $i++) {
  79. if ($i < 10) {
  80. $month_time = $year . '-0' . $i;
  81. } else {
  82. $month_time = $year . '-' . $i;
  83. }
  84. $chart_time_arr[] = $month_time;
  85. $settle_income_arr[] = $list[$month_time]['income_money'] ?? 0;
  86. }
  87. }
  88. $order_total_arr = [];
  89. $order_total_arr['store_balance'] = ['type' => 'store_balance', 'name' => '店铺余额(元)', 'value' => $store_balance, 'prompt' => ''];
  90. $order_total_arr['unsettled_amount'] = ['type' => 'unsettled_amount', 'name' => '包含待结算店铺余额(元)', 'value' => $unsettled_amount, 'prompt' => ''];
  91. $order_total_arr['total_expenses'] = ['type' => 'total_expenses', 'name' => '已提现(元)', 'value' => $total_expenses, 'prompt' => ''];
  92. $data['order_total_arr'] = $order_total_arr;
  93. $data['chart_time_arr'] = $chart_time_arr;
  94. $data['settle_income_arr'] = $settle_income_arr;
  95. return $this->success('ok', $data);
  96. }
  97. }
  98. return $this->render($this->action->id);
  99. }
  100. /**
  101. * 收入明细
  102. * @Author bing
  103. * @DateTime 2022-04-26 18:04:25
  104. * @return void
  105. * @copyright: Copyright (c) 2022 广东七件事集团
  106. */
  107. public function actionIncomeLog()
  108. {
  109. if (\Yii::$app->request->isAjax) {
  110. if (\Yii::$app->request->isGet) {
  111. $get = \Yii::$app->request->get();
  112. $where[] = ['mall_id' => $this->mall_id];
  113. $where[] = ['mch_id' => $this->mch_id];
  114. $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  115. if (!empty($get['keyword'])) {
  116. $user_list = User::lists(['where' => [['mall_id' => $this->mall_id], [
  117. 'or',
  118. ['like', 'username', trim($get['keyword'])],
  119. ['like', 'nickname', trim($get['keyword'])],
  120. ['like', 'mobile', trim($get['keyword'])]
  121. ]], 'select' => 'id']);
  122. $where[] = ['user_id' => array_column($user_list, 'id')];
  123. }
  124. if (!empty($get['user_id'])) $where[] = ['user_id' => $get['user_id']];
  125. if (!empty($get['order_no'])) $where[] = ['order_no' => $get['order_no']];
  126. if (isset($get['is_settlement']) && $get['is_settlement'] !== '') $where[] = ['is_settlement' => $get['is_settlement']];
  127. $params = [
  128. 'where' => $where,
  129. 'order' => 'id desc',
  130. 'with' => ['user']
  131. ];
  132. $store = Mch::findOne(['id' => $this->mch_id]);
  133. $page_data = MchCommission::listPage($params);
  134. if ($page_data === false) return $this->error(MchCommission::getStaticError());
  135. $total_num = $total_order_money = $total_settled_amount = $unsettled_amount = 0;
  136. if (!empty($store)) {
  137. $total_num = $store['total_num'];
  138. $total_order_money = $store['total_order_money'];
  139. $total_settled_amount = $store['total_settled_amount'];
  140. $unsettled_amount = $store['unsettled_amount'];
  141. }
  142. if (!empty($page_data['list'])) {
  143. $user_id_arr = array_column($page_data['list'], 'user_id');
  144. $user_list = User::lists(['where' => [['id' => $user_id_arr]], 'index' => 'id']);
  145. foreach ($page_data['list'] as &$item) {
  146. $item['nickname'] = $item['mobile'] = $item['avatar_url'] = '';
  147. if (isset($user_list[$item['user_id']])) {
  148. $item['nickname'] = $user_list[$item['user_id']]['nickname'];
  149. $item['mobile'] = $user_list[$item['user_id']]['mobile'];
  150. $item['avatar_url'] = $user_list[$item['user_id']]['avatar_url'];
  151. }
  152. if ($item['type'] == 2) {
  153. if (isset($store_cashier_order_list[$item['order_no']])) {
  154. $addons_bonus = 0;
  155. $extra = json_decode($store_cashier_order_list[$item['order_no']]['extra'], true);
  156. foreach ($extra as $k => $v) {
  157. if (in_array($k, ['agent_commission', 'distribution_commission'])) $addons_bonus += $v;
  158. }
  159. $item['addons_bonus'] = $addons_bonus;
  160. }
  161. }
  162. }
  163. }
  164. $order_total_arr = [];
  165. $order_total_arr[] = ['type' => 'total_num', 'name' => '总数', 'value' => $total_num, 'prompt' => ''];
  166. $order_total_arr[] = ['type' => 'total_order_money', 'name' => '订单总金额', 'value' => $total_order_money, 'prompt' => ''];
  167. $order_total_arr[] = ['type' => 'total_settled_amount', 'name' => '提成已结算总金额', 'value' => $total_settled_amount, 'prompt' => ''];
  168. $order_total_arr[] = ['type' => 'unsettled_amount', 'name' => '提成未结算总金额', 'value' => $unsettled_amount, 'prompt' => ''];
  169. $page_data['order_total_arr'] = $order_total_arr;
  170. return $this->success('ok', $page_data);
  171. }
  172. }
  173. return $this->render($this->action->id);
  174. }
  175. /**
  176. * 提现申请
  177. * @Author bing
  178. * @DateTime 2022-04-26 18:04:50
  179. * @return void
  180. * @copyright: Copyright (c) 2022 广东七件事集团
  181. */
  182. public function actionWithdrawal()
  183. {
  184. if (\Yii::$app->request->isAjax) {
  185. if (\Yii::$app->request->isGet) {
  186. $mch = Mch::getOne([['id' => $this->mch_id]], true, [], false, 'id,user_id,balance');
  187. $user = User::getOne([['id' => $mch['user_id']]], true, [], false, 'id,nickname,avatar_url,mobile');
  188. $mch_banks = MchBank::lists(['where' => [['mch_id' => $mch['id']], ['status' => StatusEnum::ENABLED]], 'id,mall_id,mch_id,username,bank,card_no']);
  189. $mch_setting = MchSettings::getOne([['mch_id' => $this->mch_id]], true, [], false, 'id,balance_cash_service_fee,is_balance_cash_service_fee');
  190. $mch['balance_cash_service_fee'] = $this->getBalanceCashServiceFee($this->mall_id,$mch_setting);;
  191. $is_show_join_pay = 0;
  192. $payment = \Yii::$app->services->setting->mall->get($this->mall_id, 'withdraw_balance');
  193. $balance_cash_type = [];
  194. if(!empty($payment['balance_cash_type'])) {
  195. $balance_cash_type = json_decode($payment['balance_cash_type'],true);
  196. }
  197. $join_pay_banks = [];
  198. if(MallAddons::isInstall($this->mall_id,'JoinPay')&&in_array('joinpay',$balance_cash_type)){
  199. $is_show_join_pay = 1;
  200. $bank_card_list = JoinPayUserBankcard::lists([
  201. 'where'=>[
  202. ['mall_id'=>$this->mall_id],
  203. ['user_id'=>$user['id']],
  204. ['status'=>StatusEnum::ENABLED],
  205. ],
  206. 'select'=>'id,payer_name,bank_card_no,bank_name,card_id,is_sign'
  207. ]);
  208. if(!empty($bank_card_list)){
  209. $cardIds = array_column($bank_card_list,'card_id');
  210. $user_bank_card_list = UserBankCard::lists(['where'=>[['id'=>$cardIds]],'index'=>'id']);
  211. foreach ($bank_card_list as &$item){
  212. $item['bank_account_type'] = 1;
  213. if(isset($user_bank_card_list[$item['card_id']])) $item['bank_account_type'] = $user_bank_card_list[$item['card_id']]['bank_account_type'];
  214. }
  215. $join_pay_banks = $bank_card_list;
  216. }
  217. }
  218. $cash_type_name = $this->getCashTypeName($mch['user_id']);
  219. sort($cash_type_name);
  220. array_unshift($cash_type_name,['name'=>'余额提现','type'=>'balance']);
  221. return $this->success('ok', ['user' => $user, 'mch' => $mch, 'store_banks' => $mch_banks,
  222. 'join_pay_banks' => $join_pay_banks,
  223. 'is_show_join_pay'=>$is_show_join_pay,
  224. 'cash_type_name'=>$cash_type_name,
  225. ]);
  226. } else {
  227. $params = \Yii::$app->request->post('form');
  228. if (empty($params['withdrawal_type'])) return $this->error('请选择提现方式');
  229. if (empty($params['withdrawal_money'])) return $this->error('请输入金额');
  230. if ($params['withdrawal_money'] < 0) return $this->error('输入金额必须大于0');
  231. $mch = Mch::getOne([['id' => $this->mch_id]], false, [], false, 'id,mall_id,user_id,balance');
  232. $mch_setting = MchSettings::getOne([['mch_id' => $this->mch_id]], true, [], false, 'id,balance_cash_service_fee,is_balance_cash_service_fee');
  233. if ($params['withdrawal_money'] > $mch['balance']) return $this->error('输入金额大于可提现金额');
  234. $params['mall_id'] = $this->mall_id;
  235. $params['mch_id'] = $this->mch_id;
  236. $params['balance_cash_service_fee'] = $this->getBalanceCashServiceFee($this->mall_id,$mch_setting);
  237. if(empty($params['remark']))$params['remark'] = '';
  238. $res = MchWithdrawLog::withdrawApply($params);
  239. if (empty($res)) return $this->error(MchWithdrawLog::getStaticError());
  240. $res['withdrawal_type'] = $params['withdrawal_type'];
  241. return $this->success('操作成功',$res);
  242. }
  243. }
  244. return $this->render($this->action->id);
  245. }
  246. protected function getBalanceCashServiceFee($mall_id,$mch_setting){
  247. if(!empty($mch_setting['is_balance_cash_service_fee'])){
  248. $balance_cash_service_fee = $mch_setting['balance_cash_service_fee']??0;
  249. }else{
  250. $basic = \Yii::$app->services->setting->addons->get($mall_id, MchEnum::ADDONS_NAME, 'basic');
  251. if(isset($basic['balance_cash_service_fee'])){
  252. $balance_cash_service_fee = $basic['balance_cash_service_fee'];
  253. }else{
  254. $balance_cash_service_fee = \Yii::$app->services->setting->mall->get($mall_id, 'withdraw_balance.balance_cash_service_fee');
  255. }
  256. }
  257. return $balance_cash_service_fee;
  258. }
  259. public function getCashTypeName($user_id){
  260. $cash_type_name = [];
  261. $payment = \Yii::$app->services->setting->mall->get($this->mall_id, 'withdraw_balance');
  262. if (!$payment) return $cash_type_name;
  263. $cashType = $payment['balance_cash_type'];
  264. if(!empty($cashType)) {
  265. $cash_type = Json::decode($cashType);
  266. $default_withdraw_way = WithdrawWayEnum::getDefaultWithDrawWayMap(WithdrawWayEnum::WITHDRAW_TYPE_2);
  267. $extension_withdraw_way = GlobalInvoke::exec(GlobalInvoke::INVOKE_GET_WITHDRAW_EXTENSION_WAY, $this->mall_id, ['mall_id' => $this->mall_id]);
  268. $all_withdraw = array_merge($default_withdraw_way, $extension_withdraw_way);
  269. $cash_type_keys = array_keys($all_withdraw);
  270. $get_system_setting = PlatformSetting::getConfByGroup('system', true);
  271. $bank_card_list = [];
  272. if (in_array('bank', $cash_type_keys) || in_array('joinpay', $cash_type_keys)) {
  273. $bank_card_list = UserBankCard::getUserCardList($user_id, $this->mall_id);
  274. }
  275. foreach ($cash_type as $i => $item) {
  276. if(in_array($item,['alipay_tax'])) continue;
  277. if (isset($all_withdraw[$item])) {
  278. $taxFee = 0;
  279. $name = '';
  280. if (isset($all_withdraw[$item])) {
  281. if (is_array($all_withdraw[$item])) {
  282. $name = $all_withdraw[$item]['name'] ?? '';
  283. $taxFee = $all_withdraw[$item]['taxFee'] ?? 0;
  284. } else {
  285. $name = $all_withdraw[$item];
  286. }
  287. }
  288. $cash_type_name[$i]['type'] = $item;
  289. $cash_type_name[$i]['taxFee'] = $taxFee;
  290. $cash_type_name[$i]['name'] = $name;
  291. $cash_type_name[$i]['img'] = $get_system_setting['api_url']['value'] . '/resources/img/payment/' . $item . '.png';
  292. if ('bank' == $item || 'joinpay' == $item || 'yunfast_pay' == $item) {
  293. $cash_type_name[$i]['bank_card_list'] = $bank_card_list;
  294. }
  295. }
  296. }
  297. }
  298. return $cash_type_name;
  299. }
  300. //编辑银行卡
  301. public function actionEditStoreBank()
  302. {
  303. if (\Yii::$app->request->isPost) {
  304. $params = \Yii::$app->request->post('form');
  305. $params['mall_id'] = $this->mall_id;
  306. $params['mch_id'] = $this->mch_id;
  307. $res = MchBank::setData($params);
  308. if ($res == false) $this->error('操作失败');
  309. return $this->success();
  310. } else {
  311. $params = \Yii::$app->request->get();
  312. $store_bank_info = MchBank::getOne([['id' => $params['id']], ['mall_id' => $this->mall_id], ['mch_id' => $this->mch_id]], true);
  313. return $this->success('ok', ['store_bank_info' => $store_bank_info]);
  314. }
  315. }
  316. //删除银行卡
  317. public function actionDelStoreBank()
  318. {
  319. $params = \Yii::$app->request->get();
  320. $params['mall_id'] = $this->mall_id;
  321. $params['mch_id'] = $this->mch_id;
  322. $params['status'] = StatusEnum::DELETE;
  323. $res = MchBank::setData($params);
  324. if ($res == false) $this->error('操作失败');
  325. return $this->success();
  326. }
  327. /**
  328. * 提现日志
  329. * @Author bing
  330. * @DateTime 2022-04-26 18:04:50
  331. * @return void
  332. * @copyright: Copyright (c) 2022 广东七件事集团
  333. */
  334. public function actionWithdrawalLog()
  335. {
  336. if (\Yii::$app->request->isAjax) {
  337. if (\Yii::$app->request->isGet) {
  338. $params = \Yii::$app->request->get();
  339. $where[] = ['mall_id' => $this->mall_id];
  340. $where[] = ['mch_id' => $this->mch_id];
  341. if (!empty($params['start'])) $where[] = ['>=', 'created_at', strtotime($params['start'])];
  342. if (!empty($params['end'])) $where[] = ['<=', 'created_at', strtotime($params['end'])];
  343. if (isset($params['withdraw_status']) && $params['withdraw_status'] !== '') $where[] = ['withdraw_status' => $params['withdraw_status']];
  344. $params['where'] = $where;
  345. $params['order'] = 'id desc';
  346. $page_data = MchWithdrawLog::listPage($params);
  347. if ($page_data === false) return $this->error(MchWithdrawLog::getStaticError());
  348. if (!empty($page_data['list'])) {
  349. foreach ($page_data['list'] as &$item) {
  350. if($item['type']=='balance'){
  351. $item['poundage_num'] = 0;
  352. }
  353. $item['extra'] = json_decode($item['extra'], true);
  354. }
  355. }
  356. return $this->success('ok', $page_data);
  357. }
  358. }
  359. }
  360. //编辑汇聚银行卡
  361. public function actionEditStoreBankPay()
  362. {
  363. if (\Yii::$app->request->isPost) {
  364. $post = \Yii::$app->request->post('form');
  365. $rules = [
  366. [['bank_card_no', 'id_no', 'payer_name', 'mobile_no','bank_account_type'], 'required'],
  367. ['bank_card_no', 'string', 'max' => 64],
  368. [['id_no', 'payer_name',], 'string', 'max' => 255],
  369. [['mobile_no'], 'string', 'max' => 32],
  370. ];
  371. $res = \Yii::$app->services->validate->validate($post, $rules);
  372. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  373. $post['mall_id'] = $this->mall_id;
  374. $obj = new BankCardHelper();
  375. $bank_info = $obj->bankInfo($post['bank_card_no']);
  376. if(empty($bank_info)) return $this->error('银行卡号有问题');
  377. $bank_info_arr = explode('-',$bank_info);
  378. $bankShortList = json_decode($obj->getBankShortList(),true);
  379. $bank_code = '';
  380. $bank_name = '';
  381. foreach ($bankShortList as $k=>$v){
  382. if(strpos($v,$bank_info_arr[0])!==false){
  383. $bank_code = $k;
  384. $bank_name = $v;
  385. break;
  386. }
  387. }
  388. if(empty($bank_name)||empty($bank_code)) return $this->error('无法识别的银行卡号的银行简码');
  389. $post['bank_code'] = $bank_code;
  390. $post['bank_name'] = $bank_name;
  391. $post['id_type'] = 1;
  392. switch ($bank_info_arr[2]){
  393. case '借记卡':
  394. $card_type = 'dc';
  395. $card_type_name = '储蓄卡';
  396. break;
  397. case '贷记卡':
  398. $card_type = 'cc';
  399. $card_type_name = '信用卡';
  400. break;
  401. default:
  402. return $this->error('无法识别的银行卡号');
  403. }
  404. $mch = Mch::findOne(['id'=>$this->mch_id,'status'=>StatusEnum::ENABLED]);
  405. if(empty($mch)) return $this->error('商户不存在');
  406. $post['user_id'] = $mch['user_id'];
  407. $post['card_type'] = $card_type;
  408. $post['card_type_name'] = $card_type_name;
  409. $bank_card_info = UserBankCard::findOne(['mall_id'=>$this->mall_id,'bank_card_no' => $post['bank_card_no'], 'status' => StatusEnum::ENABLED]);
  410. if (!empty($bank_card_info)) {
  411. return $this->error('银行卡已经被绑定');
  412. }
  413. $card_id = MchBank::addJoinPayBankCard($this->mall_id,$post);
  414. try {
  415. //调用汇聚接口:发送签约短信
  416. $settings = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_JOIN_PAY, 'basic');
  417. $fast_pay_class = new JoinPayFastPay($settings);
  418. $fast_pay_class->sendSignSms($card_id);
  419. return $this->success('操作成功', ['card_id' => $card_id]);
  420. } catch (\Exception $e) {
  421. return $this->error($e->getMessage());
  422. }
  423. } else {
  424. $params = \Yii::$app->request->get();
  425. $mch_bank_info = MchBank::getOne([['id' => $params['id']], ['mall_id' => $this->mall_id], ['mch_id' => $this->mch_id]], true);
  426. return $this->success('ok', ['mch_bank_info' => $mch_bank_info],ApiStatusEnum::CODE_SUCCESS,0);
  427. }
  428. }
  429. public function actionGetSmsCode(){
  430. try {
  431. $post = \Yii::$app->request->post();
  432. $rules = [
  433. [['card_id'], 'required'],
  434. [['card_id'], 'integer'],
  435. ];
  436. $res = \Yii::$app->services->validate->validate($post, $rules);
  437. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  438. $mch = Mch::findOne(['id'=>$this->mch_id,'status'=>StatusEnum::ENABLED]);
  439. if(empty($mch)) return $this->error('商户不存在');
  440. $model = UserBankCard::findOne(['id'=>$post['card_id'],'user_id'=>$mch['user_id']]);
  441. if(empty($model)) return $this->error('用户银行卡不存在');
  442. //调用汇聚接口:发送签约短信
  443. $settings = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_JOIN_PAY, 'basic');
  444. $fast_pay_class = new JoinPayFastPay($settings);
  445. $fast_pay_class->sendSignSms($model->id);
  446. return $this->success('操作成功', ['card_id' => $model->id]);
  447. } catch (\Exception $e) {
  448. return $this->error($e->getMessage());
  449. }
  450. }
  451. //签约
  452. public function actionSignContract()
  453. {
  454. if (!\Yii::$app->request->isPost) {
  455. return $this->error('请求方式错误');
  456. }
  457. $post = \Yii::$app->request->post();
  458. $rules = [
  459. [['card_id', 'sms_code'], 'required'],
  460. [['card_id'], 'integer'],
  461. ['sms_code', 'string'],
  462. ];
  463. $res = \Yii::$app->services->validate->validate($post, $rules);
  464. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  465. $mch = Mch::findOne(['id'=>$this->mch_id,'status'=>StatusEnum::ENABLED]);
  466. if(empty($mch)) return $this->error('商户不存在');
  467. $post['user_id'] = $mch['user_id'];
  468. $card_info = UserBankCard::findOne([
  469. 'mall_id' => $this->mall_id,
  470. 'status' => StatusEnum::ENABLED,
  471. 'id' => $post['card_id'],
  472. 'user_id' => $mch['user_id'],
  473. ]);
  474. if (empty($card_info)) return $this->error('银行卡不存在');
  475. $joinpay_card_info = JoinPayUserBankcard::findOne([
  476. 'mall_id' => $this->mall_id,
  477. 'status' => StatusEnum::ENABLED,
  478. 'card_id' => $post['card_id'],
  479. 'user_id' => $mch['user_id'],
  480. ]);
  481. if (empty($joinpay_card_info)) {
  482. return $this->error('银行卡数据异常');
  483. }
  484. if ($joinpay_card_info->is_sign == 1) {
  485. return $this->error('银行卡已经签约');
  486. }
  487. try {
  488. // 签约快捷支付
  489. $settings = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_JOIN_PAY, 'basic');
  490. $fast_pay_class = new JoinPayFastPay($settings);
  491. $fast_pay_class->sign($post['card_id'], $post['sms_code']);
  492. $card_info = ArrayHelper::toArray($card_info);
  493. $card_info['is_sign'] = 1;
  494. $card_info['is_auth'] = true;
  495. $card_info['icon'] = UserBankCard::getBankPicture($card_info['bank_code'], 'icon');
  496. unset($card_info['cvv'], $card_info['sign_no'], $card_info['payer_name'], $card_info['id_no']);
  497. return $this->success('签约成功', ['card_info' => $card_info], ApiStatusEnum::CODE_SUCCESS, 0);
  498. } catch (\Exception $e) {
  499. return $this->error($e->getMessage());
  500. }
  501. }
  502. //解约
  503. public function actionContractRelieve()
  504. {
  505. if (!\Yii::$app->request->isPost) {
  506. return $this->error('请求方式错误');
  507. }
  508. $post = \Yii::$app->request->post();
  509. $rules = [
  510. [['card_id'], 'required'],
  511. [['card_id'], 'integer'],
  512. ];
  513. $mch = Mch::findOne(['id'=>$this->mch_id,'status'=>StatusEnum::ENABLED]);
  514. if(empty($mch)) return $this->error('商户不存在');
  515. $res = \Yii::$app->services->validate->validate($post, $rules);
  516. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  517. $card_info = UserBankCard::findOne([
  518. 'mall_id' => $this->mall_id,
  519. 'id' => $post['card_id'],
  520. 'status' => StatusEnum::ENABLED,
  521. 'user_id' => $mch['user_id'],
  522. ]);
  523. $joinpay_card_info = JoinPayUserBankcard::findOne([
  524. 'mall_id' => $this->mall_id,
  525. 'user_id' => $mch['user_id'],
  526. 'card_id' => $post['card_id'],
  527. 'status' => StatusEnum::ENABLED,
  528. 'is_sign' => 1,
  529. ]);
  530. if (empty($card_info) || empty($joinpay_card_info)) {
  531. return $this->error('银行卡不存在或者已经解除签约');
  532. };
  533. try {
  534. // 解除快捷支付签约
  535. $settings = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_JOIN_PAY, 'basic');
  536. $fast_pay_class = new JoinPayFastPay($settings);
  537. $fast_pay_class->unsign($joinpay_card_info);
  538. return $this->success('解约成功');
  539. } catch (\Exception $e) {
  540. return $this->error($e->getMessage());
  541. }
  542. }
  543. }