FastPayController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. <?php
  2. namespace addons\HuifuPay\api\modules\v1\controllers;
  3. use addons\HuifuPay\common\service\FastPayService;
  4. use addons\HuifuPay\common\models\HuifuPayUserBankcard;
  5. use addons\HuifuPay\common\models\HuifuPayFastpayOrder;
  6. use common\enums\AddonsEnum;
  7. use common\enums\ApiStatusEnum;
  8. use common\enums\StatusEnum;
  9. use common\helpers\ArrayHelper;
  10. use common\models\common\UserBankCard;
  11. class FastPayController extends BaseController
  12. {
  13. public $modelClass = '';
  14. /**
  15. * 不用进行登录验证的方法
  16. *
  17. * 例如: ['index', 'update', 'create', 'view', 'delete']
  18. * 默认全部需要验证
  19. *
  20. * @var array
  21. */
  22. protected $authOptional = [];
  23. public function actionCardList()
  24. {
  25. $list = UserBankCard::lists([
  26. 'where' => [
  27. ['user_id' => $this->user_id],
  28. ['mall_id' => $this->mall_id],
  29. ['status' => StatusEnum::ENABLED]
  30. ],
  31. 'order' => 'created_at desc'
  32. ]);
  33. if (empty($list)) return $this->success('success', ['list' => []], ApiStatusEnum::CODE_SUCCESS, 0);
  34. $card_ids = array_column($list, 'id');
  35. $union_user_card_list = HuifuPayUserBankcard::lists(['where' => [['card_id' => $card_ids]], 'index' => 'card_id']);
  36. foreach ($list as &$item) {
  37. $item['is_sign'] = 0;
  38. if (isset($union_user_card_list[$item['id']])) {
  39. $item['is_sign'] = $union_user_card_list[$item['id']]['is_sign'];
  40. }
  41. $item['icon'] = UserBankCard::getBankPicture($item['bank_code']);
  42. $item['back_image'] = UserBankCard::getBankPicture($item['bank_code'], 'back');
  43. }
  44. return $this->success('success', ['list' => $list], ApiStatusEnum::CODE_SUCCESS, 0);
  45. }
  46. /**
  47. * @name:
  48. * @msg: 添加银行卡并签约接口,提交订单页面添加并签约银行卡
  49. * @param {*}
  50. * @return {*}
  51. */
  52. public function actionAddCardAndSign()
  53. {
  54. if (!\Yii::$app->request->isPost) {
  55. return $this->error('请求方式错误');
  56. }
  57. $post = \Yii::$app->request->post();
  58. //'bank_code', 'card_type', 'card_type_name' 这三个参数由后端处理,前端不提交该参数
  59. $rules = [
  60. [['id_type', 'bank_card_no', 'id_no', 'payer_name', 'mobile_no','sdate'], 'required'],
  61. [['id_type','is_longer'], 'integer'],
  62. ['id_type', 'default', 'value' => 1],
  63. ['is_longer', 'default', 'value' => 0],
  64. ['bank_card_no', 'string', 'max' => 64],
  65. [['id_no', 'payer_name', 'bank_name','sdate','edate'], 'string', 'max' => 255],
  66. [['mobile_no', 'bank_code', 'card_type', 'card_type_name'], 'string', 'max' => 32],
  67. ];
  68. $res = \Yii::$app->services->validate->validate($post, $rules);
  69. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  70. $validate_card = UserBankCard::validateCardInfo($post['bank_card_no'],$post['bank_name']);
  71. $post = array_merge($post,$validate_card);
  72. $bank_card_info = UserBankCard::findONe(['bank_card_no' => $post['bank_card_no'], 'status' => StatusEnum::ENABLED]);
  73. if (!empty($bank_card_info)) {
  74. return $this->error('银行卡已经被绑定');
  75. }
  76. $post['user_id'] = $this->user_id;
  77. $user_bank_card_data = [
  78. 'user_id' => $this->user_id,
  79. 'bank_card_no' => $post['bank_card_no'],
  80. 'payer_name' => $post['payer_name'],
  81. 'bank_name' => $post['bank_name'],
  82. 'bank_code' => $post['bank_code'],
  83. 'card_type' => $post['card_type'],
  84. 'card_type_name' => $post['card_type_name'],
  85. ];
  86. $model = UserBankCard::setData($this->mall_id, $user_bank_card_data);
  87. if (false === $model) return $this->error(UserBankCard::getStaticError());
  88. $post['card_id'] = $model->id;
  89. $resj = HuifuPayUserBankcard::setData($this->mall_id, $post);
  90. if (false === $resj) return $this->error(HuifuPayUserBankcard::getStaticError());
  91. try {
  92. //调用汇付接口:发送签约短信
  93. $fast_pay_class = new FastPayService($this->mall_id);
  94. $fast_pay_class->sendSignSms($model->id);
  95. return $this->success('操作成功', ['card_id' => $model->id]);
  96. } catch (\Exception $e) {
  97. return $this->error($e->getMessage());
  98. }
  99. }
  100. /**
  101. * @name:
  102. * @msg: 去签约接口,会员中心银行卡列表页面
  103. * @param {*}
  104. * @return {*}
  105. */
  106. public function actionToSign()
  107. {
  108. if (!\Yii::$app->request->isPost) {
  109. return $this->error('请求方式错误');
  110. }
  111. $post = \Yii::$app->request->post();
  112. $rules = [
  113. [['card_id','id_type', 'bank_card_no', 'id_no', 'payer_name', 'mobile_no','sdate'], 'required'],
  114. [['card_id','id_type','is_longer'], 'integer'],
  115. ['id_type', 'default', 'value' => 1],
  116. ['is_longer', 'default', 'value' => 0],
  117. ['bank_card_no', 'string', 'max' => 64],
  118. [['id_no', 'payer_name', 'bank_name','sdate','edate'], 'string', 'max' => 255],
  119. [['mobile_no', 'bank_code', 'card_type', 'card_type_name'], 'string', 'max' => 32],
  120. ];
  121. $res = \Yii::$app->services->validate->validate($post, $rules);
  122. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  123. $card_info = UserBankCard::find()
  124. ->select('user_id,payer_name,bank_name,bank_code,bank_card_no,card_type,card_type_name')
  125. ->where(['mall_id' => $this->mall_id, 'id' => $post['card_id'], 'status' => StatusEnum::ENABLED])
  126. ->asArray()
  127. ->limit(1)
  128. ->one();
  129. if (empty($card_info)) {
  130. return $this->error('银行卡不存在');
  131. }
  132. $validate_card = UserBankCard::validateCardInfo($post['bank_card_no'],$post['bank_name']);
  133. $post = array_merge($post,$validate_card);
  134. $post['user_id'] = $this->user_id;
  135. $model = HuifuPayUserBankcard::setData($this->mall_id, $post);
  136. if (false === $model) return $this->error(HuifuPayUserBankcard::getStaticError());
  137. try {
  138. $fast_pay_class = new FastPayService($this->mall_id);
  139. $fast_pay_class->sendSignSms($post['card_id']);
  140. return $this->success('操作成功', ['card_id' => $post['card_id']]);
  141. } catch (\Exception $e) {
  142. return $this->error($e->getMessage());
  143. }
  144. }
  145. /**
  146. * @name:
  147. * @msg: 签约
  148. * @param {*}
  149. * @return {*}
  150. */
  151. public function actionSignContract()
  152. {
  153. if (!\Yii::$app->request->isPost) {
  154. return $this->error('请求方式错误');
  155. }
  156. $post = \Yii::$app->request->post();
  157. $rules = [
  158. [['card_id', 'sms_code'], 'required'],
  159. [['card_id'], 'integer'],
  160. ['sms_code', 'string'],
  161. ];
  162. $res = \Yii::$app->services->validate->validate($post, $rules);
  163. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  164. $card_info = UserBankCard::findOne([
  165. 'mall_id' => $this->mall_id,
  166. 'status' => StatusEnum::ENABLED,
  167. 'id' => $post['card_id'],
  168. 'user_id' => $this->user_id,
  169. ]);
  170. if (empty($card_info)) return $this->error('银行卡不存在');
  171. $huifupay_card_info = HuifuPayUserBankcard::findOne([
  172. 'mall_id' => $this->mall_id,
  173. 'status' => StatusEnum::ENABLED,
  174. 'card_id' => $post['card_id'],
  175. 'user_id' => $this->user_id,
  176. ]);
  177. if (empty($huifupay_card_info)) {
  178. return $this->error('银行卡数据异常');
  179. }
  180. if ($huifupay_card_info->is_sign == 1) {
  181. return $this->error('银行卡已经签约');
  182. }
  183. try {
  184. // 签约快捷支付
  185. $fast_pay_class = new FastPayService($this->mall_id);
  186. $reuslt=$fast_pay_class->sign($post['card_id'], $post['sms_code']);
  187. $card_info = ArrayHelper::toArray($card_info);
  188. $card_info['is_sign'] = 1;
  189. $card_info['is_auth'] = true;
  190. $card_info['icon'] = UserBankCard::getBankPicture($card_info['bank_code'], 'icon');
  191. unset($card_info['cvv'], $card_info['sign_no'], $card_info['payer_name'], $card_info['id_no']);
  192. return $this->success('签约成功', ['card_info' => $card_info], ApiStatusEnum::CODE_SUCCESS, 0);
  193. } catch (\Exception $e) {
  194. return $this->error($e->getMessage());
  195. }
  196. }
  197. /**
  198. * @name:
  199. * @msg: 解除快捷支付签约
  200. * @param {*}
  201. * @return {*}
  202. */
  203. public function actionContractRelieve()
  204. {
  205. if (!\Yii::$app->request->isPost) {
  206. return $this->error('请求方式错误');
  207. }
  208. $post = \Yii::$app->request->post();
  209. $rules = [
  210. [['card_id'], 'required'],
  211. [['card_id'], 'integer'],
  212. ];
  213. $res = \Yii::$app->services->validate->validate($post, $rules);
  214. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  215. // 获取当前用户银行卡绑定汇付信息
  216. $bankCardInfo = HuifuPayUserBankcard::find()
  217. ->where(['mall_id' => $this->mall_id, 'card_id' => $post['card_id'], 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED,
  218. 'is_sign' => 1,
  219. ])
  220. ->with(['card' => function ($query) use ($post) {
  221. $query->where(['mall_id' => $this->mall_id, 'user_id' => $this->user_id,
  222. 'status' => StatusEnum::ENABLED, 'id' => $post['card_id']]);
  223. }])
  224. ->one();
  225. if (empty($bankCardInfo) || empty($bankCardInfo['card'])) {
  226. return $this->error('银行卡不存在或者已经解除签约');
  227. }
  228. // 进行解绑
  229. try {
  230. $service = new FastPayService($this->mall_id);
  231. $result = $service->unsign($bankCardInfo);
  232. if (!$result) {
  233. return $this->error('解绑失败');
  234. }
  235. } catch (\Exception $e) {
  236. return $this->error('解绑失败');
  237. }
  238. return $this->success('解绑成功');
  239. }
  240. /**
  241. * @name:
  242. * @msg: 发送快捷支付支付短信
  243. * @param {*}
  244. * @return {*}
  245. */
  246. public function actionPaySms()
  247. {
  248. if (!\Yii::$app->request->isPost) {
  249. return $this->error('请求方式错误');
  250. }
  251. $post = \Yii::$app->request->post();
  252. $rules = [
  253. [['card_id', 'trade_id'], 'required'],
  254. [['card_id', 'trade_id'], 'integer'],
  255. ];
  256. $res = \Yii::$app->services->validate->validate($post, $rules);
  257. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  258. $huifupay_card_info = HuifuPayUserBankcard::findOne([
  259. 'mall_id' => $this->mall_id,
  260. 'user_id' => $this->user_id,
  261. 'card_id' => $post['card_id'],
  262. 'status' => StatusEnum::ENABLED,
  263. 'is_sign' => 1,
  264. ]);
  265. if ( empty($huifupay_card_info)) throw new \Exception('银行卡不存在或者未开通快捷支付');
  266. try {
  267. $fast_pay_class = new FastPayService($this->mall_id);
  268. $fast_pay_class->sendPaySms($post['trade_id'], $huifupay_card_info, $this->mall_id);
  269. return $this->success('操作成功');
  270. } catch (\Exception $e) {
  271. return $this->error($e->getMessage());
  272. }
  273. }
  274. }