Bank.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
  4. * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
  5. * @author pillar<ltmn@qq.com>
  6. * 个人收益记录
  7. */
  8. namespace app\fastshop\controller\api\v3;
  9. use app\fastshop\controller\api\Base;
  10. use app\fastshop\model\BankInfo;
  11. use app\fastshop\model\BankLogs;
  12. use app\fastshop\model\BankCash;
  13. use app\fastshop\model\BankRecharge;
  14. use app\fastshop\model\Vip;
  15. use app\fastshop\model\Bank as BankModel;
  16. use app\fastshop\model\Config;
  17. use app\common\facade\WechatPay;
  18. use app\common\model\SystemMemberPayment;
  19. use app\common\model\SystemMemberBank;
  20. use think\facade\Request;
  21. class Bank extends Base{
  22. public function initialize() {
  23. parent::initialize();
  24. $this->isUserAuth();
  25. }
  26. /**
  27. * 个人钱包
  28. * @param string $no
  29. * @return void
  30. */
  31. public function index(){
  32. $info = BankModel::where(['user_id' => $this->user->id])->find();
  33. if(empty($info)){
  34. return json(['code'=>204,'msg'=>'empty']);
  35. }else{
  36. $info['money'] = money($info['money']/100);
  37. $info['due_money'] = money($info['due_money']/100);
  38. $info['lack_money'] = money($info['lack_money']/100);
  39. $info['income_money'] = money($info['income_money']/100);
  40. $info['shop_money'] = money($info['shop_money']/100);
  41. return json(['code'=>200,'msg'=>'success','data' => $info]);
  42. }
  43. }
  44. /**
  45. * 个人收益记录
  46. * @param string $today 0是今天 1是历史
  47. * @return void
  48. */
  49. public function bill(){
  50. $param = [
  51. 'today' => $this->request->param('today/d'),
  52. 'page' => $this->request->param('page/s'),
  53. 'sign' => $this->request->param('sign/s')
  54. ];
  55. $rel = $this->apiSign($param);
  56. if($rel['code'] != 200){
  57. return enjson(204,'签名失败');
  58. }
  59. $list = [];
  60. $times = strtotime(date('Y-m-d 00:00:00'));
  61. $condition[] = ['user_id','=',$this->user->id];
  62. if($param['today']){
  63. $condition[] = ['update_time','<=',$times];
  64. }else{
  65. $condition[] = ['update_time','>=',$times];
  66. }
  67. $info = BankLogs::with(['formuser'=> function($query) {
  68. $query->field('id,face,nickname');
  69. }])->where($condition)->order('id desc')->paginate(10)->toArray();
  70. if(!empty($info['data'])){
  71. foreach ($info['data'] as $key => $value) {
  72. $list[$key] = $value;
  73. $list[$key]['update_time'] = date('Y-m-d H:i:s',$value['update_time']);
  74. $list[$key]['money'] = '¥'.$value['money'];
  75. $list[$key]['formuser'] = empty($value['formuser']) ? [] : $value['formuser'];
  76. }
  77. }
  78. return enjson(200,'成功',$list);
  79. }
  80. /**
  81. * 提现申请
  82. **/
  83. public function cash(){
  84. if (request()->isPost()) {
  85. $param = [
  86. 'money' => $this->request->param('money/d'),
  87. 'safepassword' => $this->request->param('safepassword/s'),
  88. 'sign' => $this->request->param('sign/s')
  89. ];
  90. $rel = $this->apiSign($param);
  91. if($rel['code'] != 200){
  92. return enjson(204,'签名失败');
  93. }
  94. $param['user_id'] = $this->user->id;
  95. $param['member_miniapp_id'] = $this->miniapp_id;
  96. if($param['money'] < 100){
  97. return json(['code'=>403,'msg'=>'充值金额最小100元']);
  98. }
  99. $validate = $this->validate($param, 'Bank.getcash');
  100. if (true !== $validate) {
  101. return json(['code'=>403,'msg'=>$validate]);
  102. }
  103. //判断是否完善了信息
  104. $bankInfo = BankInfo::where(['user_id' => $this->user->id])->find();
  105. if(empty($bankInfo)){
  106. return json(['code'=>302,'msg'=>'请先完善您的个人信息','url'=>'/pages/user/info']);
  107. }
  108. //判断安全密码是否正确
  109. if(!password_verify(md5($param['safepassword']),$this->user->safe_password)) {
  110. return json(['code'=>403,'msg'=>'安全密码不正确']);
  111. }
  112. $config = Config::field('cycle,lack_cash')->where(['member_miniapp_id' => $this->miniapp_id])->find();
  113. if($param['money'] < $config->lack_cash/100){
  114. return json(['code'=>403,'msg'=>'申请不能小于 '.money($config->lack_cash/100).' 元']);
  115. }
  116. //判断提现周期
  117. $bankCash = BankCash::where(['user_id' => $this->user->id])->field('state,update_time')->order('id desc')->find();
  118. if(!empty($bankCash)){
  119. if($bankCash->state == 0){
  120. return json(['code'=>403,'msg'=>'上次申请还未到账,禁止连续提现']);
  121. }else{
  122. $cycle = intval($config->cycle); //计算天数
  123. $day = intval((time()-$bankCash->update_time)/(86400));
  124. if($day < $cycle){
  125. return json(['code'=>403,'msg'=>'距离上次申请必须间隔'.$cycle.'天']);
  126. }
  127. }
  128. }
  129. //积分减少
  130. $rel = model('Bank')->cash($this->miniapp_id,$this->user->id,$param['money']);
  131. if(!$rel){
  132. return json(['code'=>403,'msg'=>"剩余积分不够"]);
  133. }
  134. model('BankLogs')->add($this->miniapp_id,$this->user->id,-($param['money']*100),'申请提取'.money(-$param['money']).' 已锁定');
  135. //增加申请记录
  136. $cash['user_id'] = $param['user_id'];
  137. $cash['money'] = $param['money']*100;
  138. $cash['member_miniapp_id'] = $param['member_miniapp_id'];
  139. $cash['update_time'] = time();
  140. $cash['state'] = 0;
  141. $cash['realmoney'] = 0;
  142. model('BankCash')->insert($cash);
  143. return json(['code'=>200,'message'=>"申请已提交,请等待审核."]);
  144. }
  145. }
  146. /**
  147. * 帐号充值
  148. * @access public
  149. */
  150. public function recharge(){
  151. if(request()->isPost()){
  152. $param['money'] = Request::param('money');
  153. $param['safepassword'] = Request::param('safepassword');
  154. $param['sign'] = Request::param('sign');
  155. $rel = $this->apiSign($param);
  156. if($rel['code'] != 200){
  157. return enjson(204,'签名失败');
  158. }
  159. $param['user_id'] = $this->user->id;
  160. $param['member_miniapp_id'] = $this->miniapp_id;
  161. if($param['money'] < 100){
  162. return json(['code'=>403,'msg'=>'充值金额最小100元']);
  163. }
  164. $validate = $this->validate($param, 'Bank.getcash');
  165. if (true !== $validate) {
  166. return json(['code'=>403,'msg'=>$validate]);
  167. }
  168. //判断安全密码是否正确
  169. if(!password_verify(md5($param['safepassword']),$this->user->safe_password)) {
  170. return json(['code'=>403,'msg'=>'安全密码不正确']);
  171. }
  172. //支付方式
  173. $config = Config::where(['member_miniapp_id' => $this->miniapp_id])->find();
  174. //支付参数
  175. $order_no = 'RE'.order_no();
  176. if($config->is_pay_types == 1){
  177. //判断云收银台
  178. if($config->goodpay_tax > 0){
  179. $goodpay_tax = $param['money']*$config->goodpay_tax/100;
  180. $bank_rel = SystemMemberBank::moneyJudge($this->miniapp->member_id,$goodpay_tax);
  181. if($bank_rel){
  182. return ['code'=>0,'message'=>'官方帐号余额不足,请联系管理员'];
  183. }
  184. }
  185. //支付接口
  186. $payment = SystemMemberPayment::where(['apiname'=>'wepay','member_miniapp_id'=>$this->miniapp_id])->find();
  187. if(empty($payment)){
  188. return enjson(403,'未开通微信支付功能');
  189. }
  190. $pay_coinfig = json_decode($payment->config);
  191. //云收银台
  192. $ispay = [
  193. 'name' => $this->miniapp->appname.'购买商品',
  194. 'mchid' => json_decode($payment->config)->mch_id,
  195. 'total_fee' => $param['money']*100,
  196. 'order_no' => $order_no,
  197. 'note' => $this->miniapp_id,
  198. 'notify_url' => api(3,'fastshop/goodpay/recharge',$this->miniapp_id),
  199. 'publickey' => uuid(1)
  200. ];
  201. $paydata = $this->makeSign($ispay,$pay_coinfig->key);
  202. }else{
  203. //去请求微信支付接口
  204. $payparm = [
  205. 'openid' => $this->user->miniapp_uid,
  206. 'miniapp_id' => $this->miniapp_id,
  207. 'name' => '会员积分充值',
  208. 'order_no' => $order_no,
  209. 'total_fee' => $param['money']*100,
  210. 'notify_url' => api(3,'fastshop/goodpay/recharge',$this->miniapp_id),
  211. ];
  212. $ispay = WechatPay::orderPay($payparm);
  213. if($ispay['code'] == 0){
  214. return enjson(403,$ispay['msg']);
  215. }
  216. $paydata = $ispay['data'];
  217. }
  218. BankRecharge::insert(['state'=>0,'money' => $param['money'],'order_no' => $order_no,'update_time'=>time(),'user_id' => $this->user->id,'member_miniapp_id' => $this->miniapp_id]);
  219. return enjson(200,'成功',['type' => $config->is_pay_types,'order' => $paydata]);
  220. }
  221. }
  222. /**
  223. * 把购物金转账给朋友
  224. * @return void
  225. */
  226. public function transfer(){
  227. if (request()->isPost()) {
  228. $param = [
  229. 'money' => $this->request->param('money/s'),
  230. 'sms_code' => $this->request->param('code/s'),
  231. 'phone_id' => $this->request->param('phone/s'),
  232. 'safepassword' => $this->request->param('safepassword/s'),
  233. 'sign' => $this->request->param('sign/s'),
  234. ];
  235. $rel = $this->apiSign($param);
  236. if($rel['code'] != 200){
  237. return enjson(204,'签名失败');
  238. }
  239. $validate = $this->validate($param, 'Bank.transfer');
  240. if (true !== $validate) {
  241. return json(['code'=>403,'msg'=>$validate]);
  242. }
  243. //判断安全密码是否正确
  244. if(!password_verify(md5($param['safepassword']),$this->user->safe_password)) {
  245. return json(['code'=>403,'msg'=>'安全密码不正确']);
  246. }
  247. //查找接收方用户存在不存在
  248. $info = model('SystemUser')->where(['member_miniapp_id' => $this->miniapp_id,'phone_uid'=>$param['phone_id']])->field('id')->find();
  249. if($info->isEmpty()){
  250. return json(['code'=>403,'msg'=>"未找到好友账户"]);
  251. }
  252. //积分减少
  253. $reldown = model('Bank')->transfer($this->miniapp_id,$this->user->id,$param['money'],false);
  254. if(!$reldown){
  255. return json(['code'=>403,'msg'=>"剩余积分不够"]);
  256. }
  257. model('BankLogs')->add($this->miniapp_id,$this->user->id,-($param['money']*100),'转账给好友扣除积分'.money(-$param['money']));
  258. //积分增加
  259. $relup = model('Bank')->transfer($this->miniapp_id,$info->id,$param['money'],true);
  260. if(!$relup){
  261. return json(['code'=>403,'msg'=>"未入账成功,请联系客服"]);
  262. }
  263. model('BankLogs')->add($this->miniapp_id,$info->id,$param['money']*100,'来自好友积分'.money($param['money']));
  264. return json(['code'=>200,'msg'=>"好友转账成功"]);
  265. }
  266. }
  267. /**
  268. * 提交个人提现信息
  269. **/
  270. public function bindBankInfo(){
  271. if (request()->isPost()) {
  272. $param = [
  273. 'name' => $this->request->param('name/s'),
  274. 'bankname' => $this->request->param('bankname/s'),
  275. 'idcard' => $this->request->param('idcard/s'),
  276. 'bankid' => $this->request->param('bankid/s'),
  277. 'bankid_confirm' => $this->request->param('bankid_confirm/s'),
  278. 'safepassword' => $this->request->param('safepassword/s'),
  279. 'sign' => $this->request->param('sign/s'),
  280. 'formId' => $this->request->param('formId/s'),
  281. ];
  282. $validate = $this->validate($param, 'Bank.bankInfo');
  283. if (true !== $validate) {
  284. return enjson(403,$validate);
  285. }
  286. $rel = $this->apiSign($param);
  287. if($rel['code'] != 200){
  288. return enjson(403,'签名失败');
  289. }
  290. //判断安全密码是否正确
  291. if(!password_verify(md5($param['safepassword']),$this->user->safe_password)) {
  292. return enjson(403,'安全密码不正确');
  293. }
  294. //更新银行信息
  295. $rel = BankInfo::editer($this->miniapp_id,$this->user->id,$param);
  296. if($rel){
  297. return enjson(403,'银行信息绑定成功');
  298. }else{
  299. return enjson(403,'银行信息绑定失败');
  300. }
  301. }
  302. }
  303. /**
  304. * 获取银行信息
  305. */
  306. public function getBankInfo(){
  307. if(!$this->user->safe_password){
  308. return json(['code'=>302,'msg'=>'请先设置您的安全密码','url'=>'/pages/helper/safepasspord']);
  309. }
  310. //更新银行信息
  311. $rel = BankInfo::where(['member_miniapp_id'=>$this->miniapp_id,'user_id' => $this->user->id])->field('name,idcard,bankname,bankid')->find();
  312. if($rel){
  313. $data['name'] = $rel['name'];
  314. $data['idcard'] = $rel['idcard'];
  315. $data['bankname'] = $rel['bankname'];
  316. $data['bankid'] = $rel['bankid'];
  317. return enjson(200,'成功',$data);
  318. }else{
  319. return enjson(204,'失败');
  320. }
  321. }
  322. /**
  323. * 判断是否VIP
  324. */
  325. public function isVip(){
  326. $rel = model('Vip')->where(['member_miniapp_id'=>$this->miniapp_id,'user_id' => $this->user->id,'state'=>1])->find();
  327. if($rel){
  328. return json(['code'=>200,'msg'=>"开通会员",'data' => $rel]);
  329. }else{
  330. $config = Config::where(['member_miniapp_id' => $this->miniapp_id])->find();
  331. return json(['code'=>204,'msg'=>"未开通会员",'data' => $config['regvip_price']]);
  332. }
  333. }
  334. /**
  335. * 开通会员
  336. */
  337. public function openVip(){
  338. $order_no = $this->user->invite_code.order_no();
  339. $rel = Vip::where(['member_miniapp_id'=>$this->miniapp_id,'user_id' => $this->user->id])->find();
  340. if($rel){
  341. if($rel['state'] == 1){
  342. return json(['code'=>403,'msg'=>"您已是专享特权会员了"]);
  343. }
  344. Vip::where(['id'=>$rel->id])->update(['state'=>0,'order_no' => $order_no,'update_time'=>time()]);
  345. }else{
  346. Vip::insert(['state'=>0,'order_no' => $order_no,'update_time'=>time(),'user_id' => $this->user->id,'member_miniapp_id' => $this->miniapp_id]);
  347. }
  348. //读取费用
  349. $config = Config::where(['member_miniapp_id' => $this->miniapp_id])->find();
  350. if($config['regvip_price'] <= 0){
  351. return json(['code'=>403,'msg'=>'暂时关闭开通会员功能']);
  352. }
  353. //支付参数
  354. if($config->is_pay_types == 1){
  355. //判断云收银台
  356. if($config->goodpay_tax > 0){
  357. $goodpay_tax = $config->regvip_price*$config->goodpay_tax/100;
  358. $bank_rel = SystemMemberBank::moneyJudge($this->miniapp->member_id,$goodpay_tax);
  359. if($bank_rel){
  360. return ['code'=>0,'message'=>'官方帐号余额不足,请联系管理员'];
  361. }
  362. }
  363. $payment = SystemMemberPayment::where(['apiname'=>'wepay','member_miniapp_id'=>$this->miniapp_id])->find();
  364. if(empty($payment)){
  365. return enjson(403,'未开通微信支付功能');
  366. }
  367. $pay_coinfig = json_decode($payment->config);
  368. $ispay = [
  369. 'name' => $this->miniapp->appname.'开通专享会员',
  370. 'mchid' => $pay_coinfig->mch_id,
  371. 'total_fee' => $config->regvip_price*100,
  372. 'order_no' => $order_no,
  373. 'note' => $this->miniapp_id,
  374. 'notify_url' => api(3,'fastshop/goodpay/openVip',$this->miniapp_id),
  375. 'publickey' => uuid(1)
  376. ];
  377. $paydata = $this->makeSign($ispay,$pay_coinfig->key);
  378. }else{
  379. $payparm = [
  380. 'openid' => $this->user->miniapp_uid,
  381. 'miniapp_id' => $this->miniapp_id,
  382. 'name' => $this->miniapp->appname.'开通专享会员',
  383. 'order_no' => $order_no,
  384. 'total_fee' => $config->regvip_price*100,
  385. 'notify_url' => api(3,'fastshop/goodpay/openVip',$this->miniapp_id),
  386. ];
  387. $ispay = WechatPay::orderPay($payparm);
  388. if($ispay['code'] == 0){
  389. return enjson(403,$ispay['msg']);
  390. }
  391. $paydata = $ispay['data'];
  392. }
  393. return enjson(200,'成功',['type' => $config->is_pay_types,'order' => $paydata]);
  394. }
  395. }