PayBalance.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace app\model\system;
  11. use addon\cashier\model\order\CashierOrderPay;
  12. use app\model\BaseModel;
  13. use app\model\member\MemberAccount;
  14. use think\facade\Log;
  15. /**
  16. *
  17. */
  18. class PayBalance extends BaseModel
  19. {
  20. /**
  21. * 创建会员码生成记录
  22. * @param $param
  23. * @return array
  24. */
  25. public function create($param){
  26. model('pay_balance')->startTrans();
  27. try {
  28. $data = [
  29. 'auth_code' => $this->createAuthCode($param['member_id']),
  30. 'site_id' => $param['site_id'],
  31. 'member_id' => $param['member_id'],
  32. 'create_time' => time(),
  33. 'expire_time' => time() + 120,
  34. 'dynamic_code' => rand(1000, 9999)
  35. ];
  36. // 生成前将其他的失效
  37. model('pay_balance')->delete([ ['site_id', '=', $param['site_id'] ],['member_id', '=', $param['member_id']] ]);
  38. $res = model('pay_balance')->add($data);
  39. // 提交事务
  40. model('pay_balance')->commit();
  41. $barcode = getBarcode($data['auth_code'], '', 3);
  42. $qrcode = qrcode($data['auth_code'], 'upload/qrcode/pay/', $data['auth_code'], 16);
  43. $return = [
  44. 'auth_code' => $data['auth_code'],
  45. 'barcode' => 'data:image/png;base64,' . base64_encode(file_get_contents($barcode)),
  46. 'qrcode' => 'data:image/png;base64,' . base64_encode(file_get_contents($qrcode)),
  47. 'expire_time' => $data['expire_time'],
  48. 'dynamic_code' => $data['dynamic_code']
  49. ];
  50. // 删除
  51. @unlink($barcode);
  52. @unlink($qrcode);
  53. return $this->success($return);
  54. } catch (\Exception $e) {
  55. model('pay_balance')->rollback();
  56. Log::write('付款码生成失败:' . $e->getMessage().$e->getFile().$e->getLine());
  57. return $this->error('', '付款码生成失败');
  58. }
  59. }
  60. /**
  61. * 付款码支付
  62. * @param $auth_code
  63. * @param $out_trade_no
  64. */
  65. public function pay($auth_code, $out_trade_no){
  66. $pay_info = model('pay')->getInfo([ ['out_trade_no', '=', $out_trade_no] ]);
  67. if (empty($pay_info)) return $this->error('', '未获取到支付单据');
  68. if ($pay_info['pay_status'] != 0) return $this->error('', '支付单据状态异常');
  69. $pay_info['pay_json'] = !empty($pay_info['pay_json']) ? json_decode($pay_info['pay_json'], true) : [];
  70. $member_id = $pay_info['pay_json']['member_id'] ?? 0;
  71. $site_id = $pay_info['site_id'];
  72. $code_info = model('pay_balance')->getInfo([ ['auth_code', '=', $auth_code] ]);
  73. if (empty($code_info)) return $this->error('', '付款码已失效');
  74. if ($code_info['member_id'] != $member_id) return $this->error('', '不是当前会员的付款码');
  75. if ($code_info['status'] != 0) return $this->error('', '付款码状态异常');
  76. if ($code_info['expire_time'] < time()) return $this->error('', '付款码已失效');
  77. $member_info = model('member')->getInfo([ ['member_id', '=', $member_id ], ['site_id', '=', $site_id ], ['is_delete', '=', 0] ], 'balance,balance_money');
  78. if (empty($member_info)) return $this->error('', '未查找到会员信息');
  79. if (bccomp($pay_info['pay_money'], ($member_info['balance'] + $member_info['balance_money']), 2 ) == 1) return $this->error('', '余额不足');
  80. model('pay_balance')->startTrans();
  81. try {
  82. $cashier_order_pay = new CashierOrderPay();
  83. $cache = $cashier_order_pay->getCache($out_trade_no)['data'];
  84. $promotion = $cache['promotion'] ?? [];
  85. $promotion['is_use_balance'] = 1;
  86. $cache['promotion'] = $promotion;
  87. $cashier_order_pay->setCache($out_trade_no, $cache);
  88. $pay_data = [
  89. 'site_id' => $site_id,//站点id
  90. 'out_trade_no' => $out_trade_no,
  91. 'store_id' => 0,
  92. 'online_type' => 'online',
  93. 'pay_type' => 'BALANCE',
  94. 'member_id' => $member_id,
  95. ];
  96. $res = (new CashierOrderPay())->doPay($pay_data);
  97. if ($res['code'] != 0) {
  98. model('pay_balance')->rollback();
  99. return $res;
  100. }
  101. model('pay_balance')->update(['status' => 1, 'out_trade_no' => $pay_info['out_trade_no'], 'pay_time' => time() ], [ ['auth_code', '=', $auth_code] ]);
  102. model('pay_balance')->commit();
  103. return $this->success(['out_trade_no' => $out_trade_no]);
  104. } catch (\Exception $e) {
  105. model('pay_balance')->rollback();
  106. Log::write('付款码支付扣款失败:' . $e->getMessage().$e->getFile().$e->getLine());
  107. return $this->error('', '付款码支付扣款失败');
  108. }
  109. }
  110. /**
  111. * 查询信息
  112. * @param $condition
  113. * @param string $field
  114. * @return array
  115. */
  116. public function getInfo($condition, $field = '*'){
  117. $data = model('pay_balance')->getInfo($condition, $field);
  118. return $this->success($data);
  119. }
  120. /**
  121. * 创建会员支付码
  122. */
  123. private function createAuthCode($member_id){
  124. $code = [
  125. rand(1000, 9999),
  126. $member_id,
  127. (int)date('dis')
  128. ];
  129. $tmp = implode('', $code);
  130. for ($i = 0; $i < (18 - strlen($tmp)); $i++) {
  131. array_push($code, rand(0, 9));
  132. }
  133. shuffle($code);
  134. return implode('', $code);
  135. }
  136. /**
  137. * 检验付款码
  138. * @param $code
  139. * @param $member_id
  140. * @return array
  141. */
  142. public function checkPaymentCode($code, $member_id){
  143. $info = model('pay_balance')->getInfo([ ['auth_code|dynamic_code', '=', $code],['member_id', '=', $member_id] ], 'id,expire_time');
  144. if (empty($info)) return $this->error('', '无效付款码');
  145. if ($info['expire_time'] < time()) return $this->error('', '付款码已失效');
  146. model('pay_balance')->delete([ ['id', '=', $info['id'] ] ]);
  147. return $this->success();
  148. }
  149. }