DefaultController.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. <?php
  2. namespace addons\HuifuPay\backend\controllers;
  3. use addons\HuifuPay\common\enums\AddonsHuifuPayEnum;
  4. use addons\HuifuPay\common\enums\HuifuPayEnum;
  5. use addons\HuifuPay\common\models\HuifuPayFastpayOrder;
  6. use addons\HuifuPay\common\models\HuifuPayOrderModel;
  7. use addons\HuifuPay\common\models\HuifupayPayRequestLog;
  8. use addons\HuifuPay\common\models\HuifuPayUserBankcard;
  9. use addons\HuifuPay\common\service\HuifuBillShareService;
  10. use addons\HuifuPay\common\service\HuifuService;
  11. use addons\Mch\common\models\MchWithdrawLog;
  12. use addons\Store\common\models\StoreWithdrawLog;
  13. use common\enums\AddonsEnum;
  14. use common\enums\ApiStatusEnum;
  15. use common\enums\DownloadEnum;
  16. use common\enums\PayTypeEnum;
  17. use common\enums\StatusEnum;
  18. use common\enums\WithdrawWayEnum;
  19. use common\helpers\csv\CsvExportHelper;
  20. use common\helpers\StringHelper;
  21. use common\models\common\PaidSinglePayLog;
  22. use common\models\common\PaymentTrade;
  23. use common\models\common\PaymentTradeOrder;
  24. use common\models\mall\MallAddons;
  25. use common\models\user\User;
  26. use common\models\user\UserWithdrawLog;
  27. use Exception;
  28. /**
  29. * 默认控制器
  30. *
  31. * Class DefaultController
  32. * @package addons\HuifuPay\backend\controllers
  33. */
  34. class DefaultController extends BaseController
  35. {
  36. /**
  37. * 首页
  38. *
  39. * @return string
  40. */
  41. public function actionIndex()
  42. {
  43. if (\Yii::$app->request->isAjax) {
  44. if (\Yii::$app->request->isGet) {
  45. $settings = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_HUIFU_PAY, 'basic');
  46. // $wechat = \Yii::$app->services->setting->mall->get($this->mall_id, 'wechat');
  47. if (empty($settings)) $settings = null;
  48. if (!empty($settings['huifupay_trade_channel'])) $settings['huifupay_trade_channel'] = json_decode($settings['huifupay_trade_channel'], true);
  49. if (!empty($settings['huifupay_ledger_list'])) $settings['huifupay_ledger_list'] = json_decode($settings['huifupay_ledger_list'], true);
  50. if (!empty($settings['huifupay_merchant'])) $settings['huifupay_merchant'] = json_decode($settings['huifupay_merchant'], true);
  51. $tactics_pay_setting = [];
  52. if (MallAddons::isInstall($this->mall_id, 'TacticsPay')) {
  53. $tactics_pay_setting = [
  54. 'is_installed' => 1,
  55. 'more_merchant_field' => HuifuPayEnum::getMoreMerchantField()
  56. ];
  57. }
  58. return $this->success('success', ['settings' => $settings, 'tactics_pay_setting' => $tactics_pay_setting]);
  59. } else {
  60. $post = \Yii::$app->request->post();
  61. $rules = [
  62. [['huifupay_status', 'huifupay_sys_id','huifupay_product_id','huifupay_huifu_id', 'huifupay_trade_channel',
  63. 'huifupay_mp_wx_open','huifupay_mp_wx_open_jhzs', 'huifupay_wechat_open', 'huifupay_wechat_h5_open','huifupay_wechat_app_open', 'huifupay_alipay_h5_open',
  64. 'huifupay_fast_pay_status','huifupay_big_pay_status','huifupay_big_trade_name','huifupay_balance_pay_status',
  65. 'huifupay_private_key', 'huifupay_public_key', 'huifupay_wechat_trade_name', 'huifupay_ledger_status',
  66. 'huifupay_alipay_trade_name', 'huifupay_fastpay_trade_name'], 'required'],
  67. [['huifupay_status', 'huifupay_mp_wx_open','huifupay_mp_wx_open_jhzs', 'huifupay_wechat_open', 'huifupay_wechat_h5_open','huifupay_wechat_app_open', 'huifupay_alipay_h5_open', 'huifupay_fast_pay_status','huifupay_big_pay_status','huifupay_ledger_status', 'huifupay_more_merchant_enable'], 'integer'],
  68. [['huifupay_status', 'huifupay_mp_wx_open','huifupay_mp_wx_open_jhzs', 'huifupay_wechat_open', 'huifupay_wechat_h5_open', 'huifupay_alipay_h5_open','huifupay_wechat_app_open','huifupay_balance_pay_status', 'huifupay_fast_pay_status','huifupay_big_pay_status','huifupay_ledger_status'], 'default', 'value' => 0],
  69. [['huifupay_wechat_trade_name', 'huifupay_alipay_trade_name', 'huifupay_fastpay_trade_name','huifupay_big_trade_name','huifupay_balance_trade_name'], 'string', 'max' => 10],
  70. [['huifupay_ledger_list', 'huifupay_merchant'], 'safe']
  71. ];
  72. if (empty($post['huifupay_trade_channel']) || !is_array($post['huifupay_trade_channel'])) return $this->error('汇付支付渠道填写错误');
  73. $res = \Yii::$app->services->validate->validate($post, $rules);
  74. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  75. // 组合多商户配置默认信息
  76. $more_field = array_column(HuifuPayEnum::getMoreMerchantField(), 'key');
  77. $sys_merchant_id = PayTypeEnum::HUIFUPAY . str_repeat('0', 12 - strlen(PayTypeEnum::HUIFUPAY));
  78. !isset($post['huifupay_merchant']) && $post['huifupay_merchant'] = [];
  79. $temp_merchant = array_column($post['huifupay_merchant'], null, 'merchant_id');
  80. if (isset($temp_merchant[$sys_merchant_id])) {
  81. foreach ($more_field as $key) {
  82. $temp_merchant[$sys_merchant_id][$key] = $post[$key] ?? '';
  83. }
  84. $temp_merchant[$sys_merchant_id]['is_sys'] = true;
  85. $post['huifupay_merchant'] = array_values($temp_merchant);
  86. }else {
  87. $field_row = ['merchant_id' => $sys_merchant_id];
  88. foreach ($more_field as $key) {
  89. $field_row[$key] = $post[$key] ?? '';
  90. }
  91. $field_row['is_sys'] = true;
  92. array_unshift($post['huifupay_merchant'], $field_row);
  93. }
  94. $configs = [
  95. 'basic' => $post,
  96. ];
  97. // dd($configs);
  98. \Yii::$app->services->setting->addons->set($this->mall_id, AddonsEnum::ADDONS_NAME_HUIFU_PAY, $configs);
  99. // 支付配置同时写入商城配置
  100. $huifupay_configs = [
  101. 'status' => $post['huifupay_status'],
  102. 'sys_id' => $post['huifupay_sys_id'],
  103. 'product_id' => $post['product_id'],
  104. 'huifu_id' => $post['huifu_id'],
  105. 'private_key' => $post['huifupay_private_key'],
  106. 'public_key' => $post['huifupay_public_key'],
  107. ];
  108. $data = [
  109. 'pay' => [
  110. 'huifupay' => json_encode($huifupay_configs),
  111. ],
  112. ];
  113. \Yii::$app->services->setting->mall->set($this->mall_id, $data);
  114. }
  115. return $this->success('保存成功', $post);
  116. }
  117. return $this->render('index');
  118. }
  119. public function actionBasicSetting()
  120. {
  121. if (\Yii::$app->request->isAjax) {
  122. if (\Yii::$app->request->isGet) {
  123. $group = \Yii::$app->request->get('group');
  124. if (empty($group) || !in_array($group, ['basic'])) return $this->error('参数错误');
  125. $settings = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_HUIFU_PAY, $group);
  126. return $this->success('success', ['settings' => $settings]);
  127. } else {
  128. $post = \Yii::$app->request->post();
  129. $group = $post['group'] ?? '';
  130. if (empty($group) || !in_array($group, ['basic']) || empty($post[$group])) return $this->error('参数错误');
  131. $rules = ['basic' => [
  132. [['huifupay_status', 'huifupay_sys_id','huifupay_product_id','huifupay_huifu_id', 'huifupay_trade_channel',
  133. 'huifupay_mp_wx_open', 'huifupay_wechat_open', 'huifupay_wechat_h5_open', 'huifupay_alipay_h5_open', 'huifupay_ledger_status',
  134. 'huifupay_fast_pay_status','huifupay_big_pay_status','huifupay_big_trade_name',
  135. 'huifupay_private_key', 'huifupay_public_key', 'huifupay_wechat_trade_name', 'huifupay_balance_pay_status','huifupay_balance_trade_name',
  136. 'huifupay_alipay_trade_name', 'huifupay_fastpay_trade_name'], 'required'],
  137. [['huifupay_status', 'huifupay_mp_wx_open', 'huifupay_wechat_open', 'huifupay_wechat_h5_open', 'huifupay_wechat_app_open','huifupay_alipay_h5_open', 'huifupay_fast_pay_status','huifupay_big_pay_status','huifupay_ledger_status'], 'integer'],
  138. [['huifupay_status', 'huifupay_mp_wx_open', 'huifupay_wechat_open', 'huifupay_wechat_h5_open', 'huifupay_alipay_h5_open', 'huifupay_big_trade_name','huifupay_big_pay_status','huifupay_ledger_status','huifupay_balance_pay_status','huifupay_wechat_app_open'], 'default', 'value' => 0],
  139. [['huifupay_wechat_trade_name', 'huifupay_alipay_trade_name', 'huifupay_fastpay_trade_name','huifupay_big_trade_name'], 'string', 'max' => 10],
  140. [['huifupay_ledger_list'], 'safe']
  141. ]];
  142. $res = \Yii::$app->services->validate->validate($post[$group], $rules[$group]);
  143. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  144. // dd($post);
  145. $configs = [
  146. $group => $post[$group],
  147. ];
  148. \Yii::$app->services->setting->addons->set($this->mall_id, AddonsEnum::ADDONS_NAME_HUIFU_PAY, $configs);
  149. // 支付配置同时写入商城配置
  150. if ('basic' == $group) {
  151. // huifupay
  152. $huifupay_configs = [
  153. 'status' => $post['basic']['huifupay_status'],
  154. 'sys_id' => $post['basic']['huifupay_sys_id'],
  155. 'product_id' => $post['basic']['product_id'],
  156. 'huifu_id' => $post['basic']['huifu_id'],
  157. 'private_key' => $post['basic']['huifupay_private_key'],
  158. 'public_key' => $post['basic']['huifupay_public_key'],
  159. ];
  160. $data = [
  161. 'pay' => [
  162. 'huifupay' => json_encode($huifupay_configs),
  163. ],
  164. ];
  165. \Yii::$app->services->setting->mall->set($this->mall_id, $data);
  166. }
  167. return $this->success('保存成功');
  168. }
  169. }
  170. return $this->render('/config/basic-setting');
  171. }
  172. public function actionFastpaySetting()
  173. {
  174. return $this->render('/config/fastpay-setting');
  175. }
  176. public function actionPayRecord()
  177. {
  178. if (\Yii::$app->request->isAjax) {
  179. if (\Yii::$app->request->isGet) {
  180. $order_no = \Yii::$app->request->get('order_no');
  181. $start_time = \Yii::$app->request->get('start_time');
  182. $end_time = \Yii::$app->request->get('end_time');
  183. $user_id = \Yii::$app->request->get('user_id');
  184. $user_keyword = \Yii::$app->request->get('user_keyword');
  185. $out_trade_no = \Yii::$app->request->get('out_trade_no');
  186. $pay_type = \Yii::$app->request->get('pay_type');
  187. $page = \Yii::$app->request->get('page', 1);
  188. $limit = \Yii::$app->request->get('limit', $this->pageSize);
  189. $wheres[] = ['mall_id' => $this->mall_id];
  190. if (empty($pay_type)) {
  191. $wheres[] = ['pay_type' => [18]];
  192. } else {
  193. if (!in_array($pay_type, [18])) {
  194. return $this->error('参数错误');
  195. }
  196. $wheres[] = ['pay_type' => $pay_type];
  197. }
  198. if (!empty($start_time)) $wheres[] = ['>=', 'created_at', strtotime($start_time . '00:00:00')];
  199. if (!empty($end_time)) $wheres[] = ['<=', 'created_at', strtotime($end_time . ' 23:59:59')];
  200. if (!empty($out_trade_no)) $wheres[] = ['like', 'out_trade_no', $out_trade_no];
  201. if (!empty($user_id)) $wheres[] = ['user_id' => $user_id];
  202. if (!empty($user_keyword)) {
  203. $users = User::find()
  204. ->select('id,nickname,mobile,avatar_url')
  205. ->where(['or', ['like', 'nickname', $user_keyword], ['like', 'mobile', $user_keyword]])
  206. ->asArray()
  207. ->indexBy('id')
  208. ->all();
  209. $user_ids = array_column($users, 'id');
  210. $wheres[] = ['user_id' => $user_ids];
  211. }
  212. $trade_ids = [];
  213. if (!empty($order_no)) {
  214. $payment_order_logs = PaymentTradeOrder::find()
  215. ->select('trade_id,order_no')
  216. ->where(['order_no' => $order_no])
  217. ->asArray()
  218. ->indexBy('trade_id')
  219. ->all();
  220. $trade_ids = array_column($payment_order_logs, 'trade_id');
  221. $wheres[] = ['id' => $trade_ids];
  222. }
  223. $params = [
  224. 'select' => 'id,mall_id,user_id,out_trade_no,pay_fee as amount,is_pay,pay_type,created_at,updated_at',
  225. 'where' => $wheres,
  226. 'order' => 'created_at desc,updated_at desc',
  227. 'page' => $page,
  228. 'limit' => $limit
  229. ];
  230. $pay_records = PaymentTrade::listPage($params,false,true);
  231. if (empty($pay_records['list'])) {
  232. if (false === $pay_records['list']) {
  233. return $this->error(PaymentTrade::getStaticError());
  234. }
  235. return $this->success('success', $pay_records);
  236. }
  237. if (empty($users)) {
  238. $user_ids = array_column($pay_records['list'], 'user_id');
  239. $users = User::find()
  240. ->select('id,nickname,mobile,avatar_url')
  241. ->where(['id' => $user_ids, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  242. ->asArray()
  243. ->indexBy('id')
  244. ->all();
  245. }
  246. if (empty($payment_order_logs)) {
  247. $trade_ids = array_column($pay_records['list'], 'id');
  248. $payment_order_logs = PaymentTradeOrder::find()
  249. ->select('trade_id,order_no')
  250. ->where(['trade_id' => $trade_ids])
  251. ->asArray()
  252. ->indexBy('trade_id')
  253. ->all();
  254. }
  255. $payment_order_union=[];
  256. if (!empty($pay_records)) {
  257. $trade_nos = array_column($pay_records['list'], 'out_trade_no');
  258. $payment_order_union = HuifuPayOrderModel::find()
  259. ->select('hf_order_no,trade_no')
  260. ->where(['trade_no' => $trade_nos])
  261. ->asArray()
  262. ->indexBy('trade_no')
  263. ->all();
  264. }
  265. foreach ($pay_records['list'] as &$record) {
  266. $user = $users[$record['user_id']] ?? [];
  267. $payment_order_log = $payment_order_logs[$record['id']] ?? [];
  268. $record['nickname'] = $user['nickname'] ?? '默认会员';
  269. $record['avatar_url'] = $user['avatar_url'] ?? \Yii::$app->request->hostInfo . '/resources/img/common/default-avatar.png';
  270. $record['mobile'] = $user['mobile'] ?? '';
  271. $record['order_no'] = $payment_order_log['order_no'] ?? '';
  272. //汇付单号
  273. $payment_order_huifu=$payment_order_union[$record['out_trade_no']] ?? [];
  274. $record['hf_order_no'] = $payment_order_huifu['hf_order_no'] ? $payment_order_huifu['hf_order_no'].' ':'';
  275. }
  276. $pay_records['export_list'] = huifupayFastpayOrder::fieldsList();
  277. return $this->success('success', $pay_records);
  278. }
  279. if(\Yii::$app->request->post('flag') == 'EXPORT'){
  280. $post = \Yii::$app->request->post();
  281. $post['mall_id'] = $this->mall_id;
  282. $filename = '支付记录-' . date('YmdHis').'_'.rand(10000,99999);
  283. $res = CsvExportHelper::exportDownLoadCenter($this->mall_id,$filename,DownloadEnum::TYPE_ORDERS,huifupayFastpayOrder::class,'exportHandle',$post);
  284. if ($res === false) return $this->error('加入导出任务失败'.CsvExportHelper::getStaticError());
  285. return $this->success('添加导出任务成功,任务完成后请在下载中心进行下载!');
  286. }
  287. }
  288. return $this->render('/pay-record/index');
  289. }
  290. public function actionSignRecord()
  291. {
  292. if (\Yii::$app->request->isAjax) {
  293. if (\Yii::$app->request->isGet) {
  294. $card_no = \Yii::$app->request->get('card_no');
  295. $start_time = \Yii::$app->request->get('start_time');
  296. $end_time = \Yii::$app->request->get('end_time');
  297. $user_id = \Yii::$app->request->get('user_id');
  298. $user_keyword = \Yii::$app->request->get('user_keyword');
  299. $page = \Yii::$app->request->get('page', 1);
  300. $limit = \Yii::$app->request->get('limit', $this->pageSize);
  301. $wheres[] = ['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'is_sign' => 1];
  302. if (!empty($card_no)) $wheres[] = ['like', 'bank_card_no', $card_no];
  303. if (!empty($start_time)) $wheres[] = ['>=', 'created_at', strtotime($start_time . '00:00:00')];
  304. if (!empty($end_time)) $wheres[] = ['<=', 'created_at', strtotime($end_time . ' 23:59:59')];
  305. if (!empty($user_id)) $wheres[] = ['user_id' => $user_id];
  306. if (!empty($user_keyword)) {
  307. $users = User::find()
  308. ->select('id,nickname,mobile,avatar_url')
  309. ->where(['or', ['like', 'nickname', $user_keyword], ['like', 'mobile', $user_keyword]])
  310. ->asArray()
  311. ->indexBy('id')
  312. ->all();
  313. $user_ids = array_column($users, 'id');
  314. $wheres[] = ['user_id' => $user_ids];
  315. }
  316. $params = [
  317. 'select' => 'id,mall_id,user_id,card_id,bank_name,bank_card_no,mobile_no,card_type_name,created_at,updated_at',
  318. 'where' => $wheres,
  319. 'order' => 'created_at desc',
  320. 'page' => $page,
  321. 'limit' => $limit,
  322. ];
  323. $sign_records = huifupayUserBankcard::listPage($params);
  324. if (empty($sign_records['list'])) {
  325. if (false === $sign_records['list']) {
  326. return $this->error(huifupayUserBankcard::getStaticError());
  327. }
  328. return $this->success('success', $sign_records);
  329. }
  330. if (empty($users)) {
  331. $user_ids = array_column($sign_records['list'], 'user_id');
  332. $users = User::find()
  333. ->select('id,nickname,mobile,avatar_url')
  334. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $user_ids])
  335. ->asArray()
  336. ->indexBy('id')
  337. ->all();
  338. }
  339. $sign_orders = huifupayFastpayOrder::find()
  340. ->select('order_no,bank_card_id')
  341. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'user_id' => $user_ids, 'is_sign' => 1])
  342. ->asArray()
  343. ->indexBy('bank_card_id')
  344. ->all();
  345. foreach ($sign_records['list'] as &$record) {
  346. $user = $users[$record['user_id']] ?? [];
  347. $sign_order = $sign_orders[$record['card_id']] ?? [];
  348. $record['nickname'] = $user['nickname'] ?? '默认会员';
  349. $record['avatar_url'] = $user['avatar_url'] ?? \Yii::$app->request->hostInfo . '/resources/img/common/default-avatar.png';
  350. $record['mobile'] = $user['mobile'] ?? '';
  351. $record['order_no'] = $sign_order['order_no'] ?? '';
  352. }
  353. return $this->success('success', $sign_records, ApiStatusEnum::CODE_SUCCESS, 0);
  354. }
  355. }
  356. return $this->render('/sign-record/index');
  357. }
  358. public function actionShareRecord()
  359. {
  360. if (\Yii::$app->request->isAjax && \Yii::$app->request->isGet) {
  361. $ret = (new HuifuBillShareService())->page($this->mall_id, \Yii::$app->request->get());
  362. return is_string($ret) ? $this->error($ret) : $this->success('获取成功', $ret);
  363. }
  364. return $this->render('/share-record/index');
  365. }
  366. public function actionShareRetry()
  367. {
  368. if (\Yii::$app->request->isAjax && \Yii::$app->request->isPost) {
  369. $ret = HuifuBillShareService::shareRetry($this->mall_id, \Yii::$app->request->post('id'));
  370. return is_string($ret) ? $this->error($ret) : $this->success('操作成功', $ret);
  371. }
  372. }
  373. public function actionGetMerchantId()
  374. {
  375. $merchant_id = PayTypeEnum::HUIFUPAY . StringHelper::generateRandCode(10 - strlen(PayTypeEnum::HUIFUPAY)) . rand(10, 99);
  376. return $this->success('获取成功', $merchant_id);
  377. }
  378. public function actionRequestLog()
  379. {
  380. $requestPath = HuifuPayEnum::getRequestPaths();
  381. $requestPathSearchList = [];
  382. foreach ($requestPath as $k => $v) {
  383. $requestPathSearchList[] = [
  384. 'value' => $k,
  385. 'label' => $v
  386. ];
  387. }
  388. if (!$this->request->isAjax) {
  389. return $this->render($this->action->id, ['request_path_search_list' => json_encode($requestPathSearchList)]);
  390. }
  391. $baseWhere = [
  392. 'mall_id' => $this->mall_id,
  393. 'status' => StatusEnum::ENABLED
  394. ];
  395. $where = [$baseWhere];
  396. $path = $this->request->get('path', '');
  397. if ($path) {
  398. $where[] = ['path' => $path];
  399. }
  400. $list = HuifupayPayRequestLog::listPage([
  401. 'where' => $where,
  402. 'order' => 'id desc'
  403. ]);
  404. foreach ($list['list'] as &$item) {
  405. $item['created_at_text'] = date('Y-m-d H:i:s', $item['created_at']);
  406. $item['type_text'] = $requestPath[$item['path']] ?? '-';
  407. }
  408. $this->success('success', $list);
  409. }
  410. }