UserExtractRepository.php 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201
  1. <?php
  2. /**
  3. * @package merchant
  4. *
  5. * @author Qinii
  6. * @day 2020-06-16
  7. *
  8. *
  9. */
  10. namespace app\common\repositories\user;
  11. use alipay\aop\AlipayConfig;
  12. use alipay\aop\AopCertClient;
  13. use alipay\aop\request\AlipayFundTransUniTransferRequest;
  14. use app\common\enum\user\UserWithdrawalLimitRecordEnum;
  15. use app\common\repositories\BaseRepository;
  16. use app\common\dao\user\UserExtractDao as dao;
  17. use app\common\repositories\merchant\MerchantRepository;
  18. use crmeb\jobs\SendTemplateMessageJob;
  19. use crmeb\services\SwooleTaskService;
  20. use think\Exception;
  21. use think\facade\Db;
  22. use think\facade\App;
  23. use think\facade\Queue;
  24. class UserExtractRepository extends BaseRepository
  25. {
  26. /**
  27. * @var dao
  28. */
  29. protected $dao;
  30. protected $wxapp = array(
  31. 'app_id'=>'wxbf753066ac8686ba',
  32. 'applet_app_id'=>'wx9082e5ac2fdb513f',
  33. 'mchid'=>'1605734712',
  34. 'certPem'=>'/pkey/cert/apiclient_cert.pem',
  35. 'keyPem'=>'/pkey/cert/apiclient_key.pem'
  36. );
  37. /**
  38. * UserExtractRepository constructor.
  39. * @param dao $dao
  40. */
  41. public function __construct(dao $dao)
  42. {
  43. $this->dao = $dao;
  44. }
  45. /**
  46. * TODO
  47. * @param $id
  48. * @return bool
  49. * @author Qinii
  50. * @day 2020-06-16
  51. */
  52. public function getWhereCount($id)
  53. {
  54. $where['extract_id'] = $id;
  55. $where['status'] = 0;
  56. return $this->dao->getWhereCount($where) > 0;
  57. }
  58. /**
  59. * TODO
  60. * @param array $where
  61. * @param $page
  62. * @param $limit
  63. * @return array
  64. * @author Qinii
  65. * @day 2020-06-16
  66. */
  67. public function serach(array $where,$page,$limit)
  68. {
  69. if(isset($where['mer_id'])){
  70. $where['mer_id']=isset($where['mer_id'])?$where['mer_id']:"";
  71. }
  72. $mer_ids=[];
  73. if(isset($where['mer_name']) && $where['mer_name']!=''){
  74. $mer_ids=Db::name('merchant')->whereLike('mer_name','%'.$where['mer_name'].'%')->column('mer_id');
  75. }
  76. unset($where['mer_name']);
  77. $uids[]=0;
  78. $keyword='';
  79. if($where['keyword']!=''){
  80. $keyword=$where['keyword'];
  81. $uids=Db::name('user_certification')
  82. ->alias('uc')
  83. ->join('user_extract ue','uc.uid = ue.uid')
  84. ->join('user u','uc.uid = u.uid')
  85. ->whereLike('uc.user_name','%'.$where['keyword'].'%')
  86. ->whereOr('u.account','like','%'.$where['keyword'].'%')
  87. ->group('uc.uid')
  88. ->column('uc.uid');
  89. unset($where['keyword']);
  90. }
  91. $query = $this->dao->serach($where)
  92. ->when($keyword,function($query)use($keyword,$uids){
  93. $query->where(function($query)use($keyword,$uids){
  94. $query->where('real_name','like','%'.$keyword.'%')
  95. ->whereOr('bank_code','like','%'.$keyword.'%')
  96. ->whereOr('alipay_code','like','%'.$keyword.'%')
  97. ->whereOr('wechat','like','%'.$keyword.'%')
  98. ->whereOr('uid','in',$uids);
  99. });
  100. })
  101. ->when(($where['identity'] ?? '') == 'user', function ($query) {
  102. $query->where('mer_id is null');
  103. })
  104. ->when(($where['identity'] ?? '') == 'mer', function ($query) {
  105. $query->where('mer_id is not null');
  106. })
  107. ->when($mer_ids,function ($q) use ($mer_ids){$q->where('mer_id','in',$mer_ids);});
  108. $query_sql= clone $query;
  109. $count = $query->count();
  110. $list = $query->page($page,$limit)->order("extract_id desc")->select();
  111. if($list){
  112. foreach($list as $key => &$value){
  113. $value['real_name'] = $value['real_name'].'['.Db::name('user_certification') -> where('uid',$value['uid']) -> value('user_name').']';
  114. $value['phone'] =Db::name('user') -> where('uid',$value['uid']) -> value('phone');
  115. $value['mer_name'] ='平台';
  116. if($value['mer_id']){
  117. $value['mer_name'] = Db::name('merchant')->where('mer_id',$value['mer_id'])->value('mer_name');
  118. }
  119. }
  120. }
  121. if(isset($where['mer_id']) && $where['mer_id']!=''){
  122. $where2['mer_id']=isset($where['mer_id'])?$where['mer_id']:'';
  123. $mer_id = $where['mer_id'];
  124. $bill_number = Db::name("user_bill")->where('mer_id', $mer_id)->where('status', 1)->whereIn('commission_type', [7, 17, 19])->sum('number');
  125. $uids2=$query_sql->group('uid')->column('uid');
  126. //总额
  127. $zonge_1=$bill_number;
  128. $zonge_2=sprintf("%.2f", $bill_number * 0.06);
  129. //已提现
  130. $tixian_1=Db::name("user_extract") ->where($where2)->where('status',1)->whereIn('uid',$uids2)->sum("extract_price");
  131. $tixian_2=Db::name("user_extract") ->where($where2)->where('status',1)->whereIn('uid',$uids2)->sum("service_money");
  132. //审核中
  133. $shenhezhong_1=Db::name("user_extract") ->where($where2)->where('status',0)->whereIn('uid',$uids2)->sum("extract_price");
  134. $shenhezhong_2=Db::name("user_extract") ->where($where2)->where('status',0)->whereIn('uid',$uids2)->sum("service_money");
  135. //增加【实际提现】模块,实际提现金额=已提现金额*(1-综合服务费率)
  136. $countmoyer=[
  137. //总额
  138. ['className'=> 'el-icon-s-goods', 'count'=>$zonge_1, 'field'=>'元', 'name'=> '收益总额' ],
  139. ['className'=> 'el-icon-s-goods', 'count'=>$zonge_2, 'field'=>'元', 'name'=> '综合服务费总额' ],
  140. ['className'=> 'el-icon-s-goods', 'count'=>set_price_rtrim(decimal2($zonge_1-$zonge_2)), 'field'=>'元', 'name'=> '实际到账总额' ],
  141. //已提现
  142. ['className'=> 'el-icon-s-goods', 'count'=>$tixian_1, 'field'=>'元', 'name'=> '已提现总额' ],
  143. ['className'=> 'el-icon-s-goods', 'count'=>$tixian_2, 'field'=>'元', 'name'=> '综合服务费' ],
  144. ['className'=> 'el-icon-s-goods', 'count'=>set_price_rtrim(decimal2($tixian_1-$tixian_2)), 'field'=>'元', 'name'=> '实际到账总额' ],
  145. //审核中
  146. ['className'=> 'el-icon-s-goods', 'count'=>$shenhezhong_1, 'field'=>'元', 'name'=> '审核中总额' ],
  147. ['className'=> 'el-icon-s-goods', 'count'=>$shenhezhong_2, 'field'=>'元', 'name'=> '综合服务费' ],
  148. ['className'=> 'el-icon-s-goods', 'count'=>set_price_rtrim(decimal2($shenhezhong_1-$shenhezhong_2)), 'field'=>'元', 'name'=> '实际到账总额' ]
  149. ];
  150. }else{
  151. if (($where['identity'] ?? '') == 'user') {
  152. $bill_number = Db::name("user_bill")->where('status', 1)->whereNotIn('commission_type', [5, 7, 17, 19])->sum('number');
  153. }
  154. if (($where['identity'] ?? '') == 'mer') {
  155. $bill_number = Db::name("user_bill")->where('status', 1)->whereIn('commission_type', [7, 17, 19])->sum('number');
  156. }
  157. $zonge_1=$bill_number;
  158. $tixian_1=Db::name("user_extract")->when(($where['identity'] ?? '') == 'user', function ($query) {
  159. $query->where('mer_id is null');
  160. })
  161. ->when(($where['identity'] ?? '') == 'mer', function ($query) {
  162. $query->where('mer_id is not null');
  163. })->where('status',1)->sum("extract_price");
  164. $tixian_2=Db::name("user_extract")->when(($where['identity'] ?? '') == 'user', function ($query) {
  165. $query->where('mer_id is null');
  166. })
  167. ->when(($where['identity'] ?? '') == 'mer', function ($query) {
  168. $query->where('mer_id is not null');
  169. })->where('status',1)->sum("service_money");
  170. $shenhezhong_1=Db::name("user_extract")->when(($where['identity'] ?? '') == 'user', function ($query) {
  171. $query->where('mer_id is null');
  172. })
  173. ->when(($where['identity'] ?? '') == 'mer', function ($query) {
  174. $query->where('mer_id is not null');
  175. })->where('status',0)->sum("extract_price");
  176. $count1 = $query->where("status",1)->sum("extract_price");
  177. $count2 = Db::name("user")->sum("brokerage_price");
  178. if (($where['identity'] ?? '') == 'mer') {
  179. $count2 = Db::name("merchant")->sum("brokerage_price");
  180. }
  181. $countmoyer=[
  182. ['className'=> 'el-icon-s-goods', 'count'=>$zonge_1, 'field'=>'元', 'name'=> '奖励总额' ],
  183. ['className'=> 'el-icon-s-goods', 'count'=>$tixian_1, 'field'=>'元', 'name'=> '已提现' ],
  184. ['className'=> 'el-icon-s-goods', 'count'=>$tixian_1 - $tixian_2, 'field'=>'元', 'name'=> '实际提现' ],
  185. ['className'=> 'el-icon-s-goods', 'count'=>$zonge_1 - $tixian_1 - $shenhezhong_1, 'field'=>'元', 'name'=> '未提现' ],
  186. ['className'=> 'el-icon-s-goods', 'count'=>$shenhezhong_1, 'field'=>'元', 'name'=> '审核中' ],
  187. ];
  188. }
  189. return compact('count','list',"countmoyer");
  190. }
  191. /**
  192. * TODO
  193. * @param array $where
  194. * @param $page
  195. * @param $limit
  196. * @return array
  197. * @author Qinii
  198. * @day 2020-06-16
  199. */
  200. public function new_search(array $where,$page,$limit)
  201. {
  202. if(isset($where['mer_id'])){
  203. $where['mer_id']=isset($where['mer_id'])?$where['mer_id']:"";
  204. }
  205. $mer_ids=[];
  206. if(isset($where['mer_name']) && $where['mer_name']!=''){
  207. $mer_ids=Db::name('merchant')->whereLike('mer_name','%'.$where['mer_name'].'%')->column('mer_id');
  208. }
  209. unset($where['mer_name']);
  210. $uids[]=0;
  211. $keyword='';
  212. if($where['keyword']!=''){
  213. $keyword=$where['keyword'];
  214. $uids=Db::name('user_certification')
  215. ->alias('uc')
  216. ->join('user_extract ue','uc.uid = ue.uid')
  217. ->join('user u','uc.uid = u.uid')
  218. ->whereLike('uc.user_name','%'.$where['keyword'].'%')
  219. ->whereOr('u.account','like','%'.$where['keyword'].'%')
  220. ->group('uc.uid')
  221. ->column('uc.uid');
  222. unset($where['keyword']);
  223. }
  224. $query = $this->dao->serach($where)
  225. ->when($keyword,function($query)use($keyword,$uids){
  226. $query->where(function($query)use($keyword,$uids){
  227. $query->where('real_name','like','%'.$keyword.'%')
  228. ->whereOr('bank_code','like','%'.$keyword.'%')
  229. ->whereOr('alipay_code','like','%'.$keyword.'%')
  230. ->whereOr('wechat','like','%'.$keyword.'%')
  231. ->whereOr('uid','in',$uids);
  232. });
  233. })
  234. // ->when($where['identity'] == 'user', function ($query) {
  235. // $query->where('mer_id is null');
  236. // })
  237. // ->when($where['identity'] == 'mer', function ($query) {
  238. // $query->where('mer_id is not null');
  239. // })
  240. ->when($mer_ids,function ($q) use ($mer_ids){$q->where('mer_id','in',$mer_ids);});
  241. $query_sql= clone $query;
  242. $count = $query->count();
  243. $list = $query->page($page,$limit)->order("extract_id desc")->select();
  244. if($list){
  245. foreach($list as $key => &$value){
  246. $value['real_name'] = $value['real_name'].'['.Db::name('user_certification') -> where('uid',$value['uid']) -> value('user_name').']';
  247. $value['phone'] =Db::name('user') -> where('uid',$value['uid']) -> value('phone');
  248. $value['mer_name'] ='平台';
  249. if($value['mer_id']){
  250. $value['mer_name'] = Db::name('merchant')->where('mer_id',$value['mer_id'])->value('mer_name');
  251. }
  252. }
  253. }
  254. $where2['mer_id']=isset($where['mer_id'])?$where['mer_id']:'';
  255. $uids2=$query_sql->group('uid')->column('uid');
  256. //总额
  257. $zonge_1=Db::name("user_extract")->whereIn('uid',$uids2)->sum("extract_price");
  258. $zonge_2=Db::name("user_extract")->whereIn('uid',$uids2)->sum("service_money");
  259. //已提现
  260. $tixian_1=Db::name("user_extract")->where('status',1)->whereIn('uid',$uids2)->sum("extract_price");
  261. $tixian_2=Db::name("user_extract")->where('status',1)->whereIn('uid',$uids2)->sum("service_money");
  262. //审核中
  263. $shenhezhong_1=Db::name("user_extract")->where('status',0)->whereIn('uid',$uids2)->sum("extract_price");
  264. $shenhezhong_2=Db::name("user_extract")->where('status',0)->whereIn('uid',$uids2)->sum("service_money");
  265. //增加【实际提现】模块,实际提现金额=已提现金额*(1-综合服务费率)
  266. $countmoyer=[
  267. //总额
  268. ['className'=> 'el-icon-s-goods', 'count'=>$zonge_1, 'field'=>'元', 'name'=> '收益总额' ],
  269. ['className'=> 'el-icon-s-goods', 'count'=>$zonge_2, 'field'=>'元', 'name'=> '综合服务费总额' ],
  270. ['className'=> 'el-icon-s-goods', 'count'=>set_price_rtrim(decimal2($zonge_1-$zonge_2)), 'field'=>'元', 'name'=> '实际到账总额' ],
  271. //已提现
  272. ['className'=> 'el-icon-s-goods', 'count'=>$tixian_1, 'field'=>'元', 'name'=> '已提现总额' ],
  273. ['className'=> 'el-icon-s-goods', 'count'=>$tixian_2, 'field'=>'元', 'name'=> '综合服务费' ],
  274. ['className'=> 'el-icon-s-goods', 'count'=>set_price_rtrim(decimal2($tixian_1-$tixian_2)), 'field'=>'元', 'name'=> '实际到账总额' ],
  275. //审核中
  276. ['className'=> 'el-icon-s-goods', 'count'=>$shenhezhong_1, 'field'=>'元', 'name'=> '审核中总额' ],
  277. ['className'=> 'el-icon-s-goods', 'count'=>$shenhezhong_2, 'field'=>'元', 'name'=> '综合服务费' ],
  278. ['className'=> 'el-icon-s-goods', 'count'=>set_price_rtrim(decimal2($shenhezhong_1-$shenhezhong_2)), 'field'=>'元', 'name'=> '实际到账总额' ]
  279. ];
  280. return compact('count','list',"countmoyer");
  281. }
  282. public function get_user_extract_item($extract_id)
  283. {
  284. return Db::name('user_extract_item')->where('extract_id',$extract_id)->select();
  285. }
  286. /**
  287. * @param $uid
  288. * @return mixed
  289. * @author xaboy
  290. * @day 2020/6/22
  291. */
  292. public function userTotalExtract($uid)
  293. {
  294. return $this->dao->serach(['status' => 1, 'uid' => $uid])->sum('extract_price');
  295. }
  296. /**
  297. * TODO
  298. * @param $user
  299. * @param $data
  300. * @author Qinii
  301. * @day 2020-06-16
  302. */
  303. public function create($user,$data,$uid,$type=1)
  304. {
  305. $userData = Db::name('user') -> where('uid',$uid) -> find();
  306. if ($data["extract_type"]==1){
  307. $data["wechat"]=$userData['account'];
  308. $data["extract_pic"]='';
  309. $data["real_name"]=$userData['nickname'];
  310. $data['order_sn'] = 'wx'.time().rand(100000, 999999);
  311. }else if($data["extract_type"]==2) {
  312. if ($userData['ali_user_id'] == '0' || $userData['ali_user_id'] == '') {
  313. return false;
  314. }
  315. $data["alipay_code"] = $userData["account"];
  316. $data["real_name"] = $userData["nickname"];
  317. $data['order_sn'] = 'al' . time() . rand(100000, 999999);
  318. }else if($data["extract_type"]==3){
  319. $account_info=Db::name("user_withdraw_account")->where(["id"=>$data["bank_id"],"account_type"=>$data["extract_type"],"user_id"=>$uid])->find();
  320. if(!$account_info){
  321. return false;
  322. }
  323. $data["bank_code"]=$account_info["account"];
  324. $data["real_name"]=$account_info['info'];
  325. $data["bank_address"]=$account_info['bank_name'];
  326. $data['order_sn'] = 'tx'.time().rand(100000, 999999);
  327. $data["bank_info"]= json_encode($account_info, true);
  328. unset($data['bank_id']);
  329. }else{
  330. return false;
  331. }
  332. if ($data["extract_type"]==3){
  333. $data = Db::transaction(function()use($user,$data, $type,$uid){
  334. if($type==1){
  335. $brokerage_price = bcsub($user['brokerage_price'],$data['extract_price'],2);
  336. $user->brokerage_price = $brokerage_price;
  337. // 减少提现额度
  338. $user->withdrawal_limit = bcsub($user['withdrawal_limit'],$data['extract_price'],2);
  339. $data = [
  340. 'user_id' => $user->uid,
  341. 'pm' => UserWithdrawalLimitRecordEnum::PM['EXPEND']['code'],
  342. 'number' => $data['extract_price'],
  343. 'balance' => $user->withdrawal_limit,
  344. 'type_shop' => -1,
  345. 'order_sn' => '',
  346. 'remark' => '申请提现扣减提现额度'
  347. ];
  348. Db::name('user_withdrawal_limit_records')->insert($data);
  349. }else if ($type == 2) {
  350. $brokerage_price = bcsub($user['member_brokerage_price'],$data['extract_price'],2);
  351. $user->member_brokerage_price = $brokerage_price;
  352. }else if ($type == 3) {
  353. $hongbao = bcsub($user['hongbao'],$data['extract_price'],2);
  354. $user->hongbao = $hongbao;
  355. }
  356. $user->save();
  357. $service_money=bcmul($data['extract_price'],'0.1',2);
  358. $data['service_money']=$service_money;
  359. $data['status'] = 0;
  360. $data['uid'] = $user['uid'];
  361. $data['type']=$type;
  362. $data['withdrawal_type'] =3;
  363. return $this->dao->create($data);
  364. });
  365. }else{
  366. $data = Db::transaction(function()use($user,$data,$uid,$type){
  367. if($type==1){
  368. $brokerage_price = bcsub($user['brokerage_price'],$data['extract_price'],2);
  369. $user->brokerage_price = $brokerage_price;
  370. }else if ($type == 2) {
  371. $brokerage_price = bcsub($user['member_brokerage_price'],$data['extract_price'],2);
  372. $user->member_brokerage_price = $brokerage_price;
  373. }else if ($type == 3) {
  374. $hongbao = bcsub($user['hongbao'],$data['extract_price'],2);
  375. $user->hongbao = $hongbao;
  376. }
  377. $user->save();
  378. $service_money=bcmul($data['extract_price'],'0.1',2);
  379. $data['service_money']=$service_money;
  380. $data['status'] = 0;
  381. $data['uid'] = $user['uid'];
  382. $data['types'] = $type;
  383. $data['statbalanceus'] = $brokerage_price;
  384. $extract=$this->dao->create($data);
  385. $tea_price=Db::name('user_rich')->where('uid', $uid)->value('tea_price');
  386. $extract_price_yihu=0;
  387. $service_money_yihu=0;
  388. if($tea_price && $tea_price>0){
  389. if($tea_price>=$data['extract_price']){
  390. $extract_price_yihu= $data['extract_price'];
  391. $service_money_yihu= $data['service_money'];
  392. }else{
  393. $extract_price_yihu= $tea_price;
  394. $service_money_yihu= bcmul($tea_price,'0.1',2);
  395. }
  396. }
  397. // if($extract_price_yihu>0){
  398. $insertAll[]=array(
  399. 'extract_id'=>$extract->extract_id,
  400. 'uid'=> $data['uid'],
  401. 'extract_type'=> $data["extract_type"],
  402. 'extract_price'=> $extract_price_yihu,
  403. 'service_money'=> $service_money_yihu,
  404. 'order_sn'=> $data['order_sn'],
  405. 'type'=> 1,//0- 幸福宝 1-一壶茶
  406. );
  407. // }
  408. $insertAll[]=array(
  409. 'extract_id'=>$extract->extract_id,
  410. 'uid'=> $data['uid'],
  411. 'extract_type'=> $data["extract_type"],
  412. 'extract_price'=> ($data['extract_price']-$extract_price_yihu),
  413. 'service_money'=> ($data['service_money']-$service_money_yihu),
  414. 'order_sn'=> $data['order_sn'],
  415. 'type'=> 0,//0- 幸福宝 1-一壶茶
  416. );
  417. DB::name('user_extract_item')->insertAll($insertAll);
  418. return $extract;
  419. });
  420. }
  421. SwooleTaskService::admin('notice', [
  422. 'type' => 'extract',
  423. 'title' => '您有一条新的提醒申请',
  424. 'id' => $data->extract_id
  425. ]);
  426. return true;
  427. }
  428. public function create_yhc($user, $merchant, $data)
  429. {
  430. Db::name("merchant")->where("mer_id", $merchant['mer_id'])->dec('brokerage_price', $data['extract_price'])->update();
  431. $data["bank_code"]=$merchant["bank_account"];
  432. $data["bank_address"]=$merchant["bank_deposit"];
  433. $data['order_sn'] = 'tx'.time().rand(100000, 999999);
  434. $data["real_name"]=$user['nickname'];
  435. $data['status'] = 0;
  436. $data['uid'] = $user['uid'];
  437. $data['types'] = 1;
  438. $data['type'] = 1;
  439. $data['mer_id'] = $merchant['mer_id'];
  440. $data['withdrawal_type'] =3;
  441. return $this->dao->create($data);
  442. }
  443. public function switchStatus($id,$data)
  444. {
  445. Db::transaction(function()use($id,$data){
  446. $extract = $this->dao->getWhere(['extract_id' => $id]);
  447. $user = app()->make(UserRepository::class)->get($extract['uid']);
  448. if($data['status'] == '-1'){
  449. if (!empty($extract['mer_id'])) {
  450. //商户提现逻辑处理
  451. $mer = app()->make(MerchantRepository::class)->get($extract['mer_id']);
  452. $brokerage_price = bcadd($mer['brokerage_price'] ,$extract['extract_price'],2);
  453. $mer->brokerage_price = $brokerage_price;
  454. $mer->save();
  455. } else {
  456. //用户提现逻辑处理
  457. if($extract['types']==1){
  458. if($extract['type']==3){
  459. $user->hongbao = bcadd($user->hongbao,$extract['extract_price'],2);
  460. }else {
  461. $brokerage_price = bcadd($user['brokerage_price'] ,$extract['extract_price'],2);
  462. //返回余额
  463. $user->brokerage_price = $brokerage_price;
  464. }
  465. }else{
  466. if($extract['type']==3){
  467. $user->hongbao = bcadd($user->hongbao,$extract['extract_price'],2);
  468. }else{
  469. $member_brokerage_price = bcadd($user['member_brokerage_price'] ,$extract['extract_price'],2);
  470. //返回余额
  471. $user->member_brokerage_price = $member_brokerage_price;
  472. Db::name('user_rich')->where('uid',$extract['uid'])->inc('red', $extract['extract_price'])->update();
  473. Db::name('user_rich_log')->insert([
  474. 'uid' => $extract['uid'],
  475. 'red' => $extract['extract_price'],
  476. 'pm' => 1,
  477. 'time' => time(),
  478. 'order_id' => 0,
  479. 'mark' => '提现失败返还红积分'
  480. ]);
  481. }
  482. }
  483. $user->save();
  484. }
  485. // //返回积分
  486. // $user->score = bcadd($user['score'] ,$extract['extract_price'],2);
  487. // $user->save();
  488. // Db::name('user_sign_score')->where("order_type","extract") -> where("order_id",$id) -> update(['status'=>0]);
  489. }else{
  490. if($extract['type']==3){
  491. //加入红包出账记录
  492. $insertdata = [
  493. 'uid'=> $user->uid,
  494. 'number' => $extract['extract_price'],
  495. 'surplus' => $user->hongbao,
  496. 'mark' => '红包提现',
  497. 'type' => 2,
  498. 'status' => 1,
  499. 'addtime' => time(),
  500. ];
  501. Db::name('user_sign_hongbao')->insertGetId($insertdata);
  502. }
  503. //积分扣除
  504. // Db::name('user_sign_score')->where("order_type","extract") -> where("order_id",$id) -> update(['status'=>1]);
  505. }
  506. $this->dao->update($id,$data);
  507. });
  508. Queue::push(SendTemplateMessageJob::class,[
  509. 'tempCode' => 'ORDER_DELIVER_SUCCESS',
  510. 'id' =>$id
  511. ]);
  512. }
  513. /**
  514. * @remarks 微信商家转账到零钱
  515. * @author Tang
  516. * @created 2023/10/31
  517. */
  518. public function WechatTransfers($id)
  519. {
  520. $userdata=Db::name('user_extract')
  521. ->alias('u_e')
  522. ->leftJoin('user_extract_openid u_e_o','u_e.uid=u_e_o.uid')
  523. ->where(['extract_id' => $id,'extract_type'=>1])
  524. ->field('u_e.extract_price,u_e.uid,u_e_o.openid,u_e_o.type as u_e_o_type,u_e.service_money,u_e.withdrawal_type,u_e.order_sn,u_e.mer_id')
  525. ->find();
  526. if($userdata and !empty($userdata)){
  527. if($userdata['withdrawal_type']==2){
  528. $money= bcsub($userdata['extract_price'],$userdata['service_money'],2);
  529. }else{
  530. $money= bcsub($userdata['extract_price'],$userdata['service_money'],2);
  531. }
  532. // $money=$userdata['extract_price'];//测试不加手续手续费
  533. $res=$this->transfer('提现到微信零钱', $userdata['order_sn'], $money, $userdata['openid'],$userdata['u_e_o_type']);
  534. if(isset($res['code']) && isset($res['message'])) {
  535. return ['code'=>500,'msg'=>$res['message']];
  536. }else{
  537. Db::name('user_extract')->where('extract_id',$id)->update(['wx_status'=>1]);
  538. return ['code'=>201,'msg'=>'微信正在处理'];
  539. }
  540. // else if($res['batch_status']=='ACCEPTED' || $res['batch_status']=='PROCESSING'){
  541. // Db::name('user_extract')->where('extract_id',$id)->update(['wx_status'=>1]);
  542. // return ['code'=>201,'msg'=>'微信正在处理'];
  543. // }else if($res['batch_status']=='FINISHED'){
  544. // //FINISHED:已完成。批次内的所有转账明细单都已处理完成
  545. // Db::name('entropy_barter_bill')->where('order_no', $userdata['order_sn'])->where('pm',2)->update(['status'=>2,'remarks'=>'已到账']);
  546. // Db::name('user_extract')->where('extract_id',$id)->update(['status'=>1]);
  547. // return ['code'=>200,'msg'=>'审核成功'];
  548. // }
  549. // return ['code'=>500,'msg'=>'提现错误'];
  550. }else{
  551. return ['code'=>200,'msg'=>'未找到数据'];
  552. }
  553. }
  554. /**
  555. * 定时任务3分钟查询一次审核中的微信待处理的订单
  556. * @return array|bool
  557. * @throws \think\db\exception\DataNotFoundException
  558. * @throws \think\db\exception\DbException
  559. * @throws \think\db\exception\ModelNotFoundException
  560. */
  561. public function wechat_extract(){
  562. $user_extract_data=Db::name('user_extract')->where('wx_status',1)->where('status',0)->select();
  563. foreach ($user_extract_data as $v){
  564. $data=$this->batch_id($v['order_sn']);
  565. Db::name('log')->insert(['data'=>'微信审核------'.json_encode($data)]);
  566. if(isset($data['transfer_batch']['batch_status']) && $data['transfer_batch']['batch_status']=='FINISHED' && $data['transfer_batch']['success_num']==1){
  567. Db::name('entropy_barter_bill')->where('order_no', $v['order_sn'])->where('pm',2)->update(['status'=>2,'remarks'=>'已到账']);
  568. Db::name('user_extract')->where('extract_id',$v['extract_id'])->update(['status'=>1]);
  569. }else if(isset($data['transfer_batch']['batch_status']) && $data['transfer_batch']['batch_status']=='FINISHED' && $data['transfer_batch']['success_num']<1){
  570. $fail_msg='微信二次审核已驳回';
  571. Db::name('user_extract')->where('order_sn',$v['order_sn'])->update(['fail_msg'=>$fail_msg,'status_time'=>date('Y-m-d H:i:s'),'status'=>'-1']);
  572. if($v['withdrawal_type']==1){
  573. Db::name('user')->where('uid',$v['uid'])->inc('brokerage_price',$v['extract_price'])->update();
  574. }else{
  575. $eb_bill=Db::name('entropy_barter_bill')->where('order_no',$v['order_sn'])->where('pm',2)->find();
  576. Db::name('entropy_barter_bill')->where('id',$eb_bill['id'])->where('pm',2)->update(['status'=>3,'remarks'=>$fail_msg]);
  577. Db::name('entropy_barter_user_'.$v['mer_id'])->where('eb_id',$eb_bill['to_id'])->inc('wallet',$v['extract_price'])->update();
  578. }
  579. }else if(isset($data['transfer_batch']['batch_status']) && $data['transfer_batch']['batch_status']=='CLOSED'){
  580. $fail_msg=(isset($data['transfer_batch']['close_reason']) && $data['transfer_batch']['close_reason']!='')?$data['transfer_batch']['close_reason']:'系统超时未审核,已取消';
  581. Db::name('user_extract')->where('order_sn',$v['order_sn'])->update(['fail_msg'=>$fail_msg,'status_time'=>date('Y-m-d H:i:s'),'status'=>'-1']);
  582. if($v['withdrawal_type']==1){
  583. Db::name('user')->where('uid',$v['uid'])->inc('brokerage_price',$v['extract_price'])->update();
  584. }else{
  585. $eb_bill=Db::name('entropy_barter_bill')->where('order_no',$v['order_sn'])->where('pm',2)->find();
  586. Db::name('entropy_barter_bill')->where('id',$eb_bill['id'])->where('pm',2)->update(['status'=>3,'remarks'=>$fail_msg]);
  587. Db::name('entropy_barter_user_'.$v['mer_id'])->where('eb_id',$eb_bill['to_id'])->inc('wallet',$v['extract_price'])->update();
  588. }
  589. }
  590. }
  591. return true;
  592. }
  593. /**
  594. * 商家转账到零钱(公众号:程序员在囧途)
  595. * @param $batch_name
  596. * @param $out_trade_no
  597. * @param $money
  598. * @param $openid
  599. */
  600. private function transfer($batch_name, $out_trade_no, $money, $openid,$type=0)
  601. {
  602. $url = 'https://api.mch.weixin.qq.com/v3/transfer/batches';
  603. $pars = [];
  604. if($type==1){
  605. $pars['appid'] = $this->wxapp['applet_app_id'];//直连商户的appid 小程序的
  606. }else{
  607. $pars['appid'] = $this->wxapp['app_id'];//直连商户的appid APP的
  608. }
  609. $pars['out_batch_no'] = $out_trade_no;//商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一
  610. $pars['batch_name'] = $batch_name;//该笔批量转账的名称
  611. $pars['batch_remark'] = $batch_name;//转账说明,UTF8编码,最多允许32个字符
  612. $pars['total_amount'] = intval($money * 100);//转账总金额 单位为“分”
  613. $pars['total_num'] = 1;//转账总笔数
  614. $pars['transfer_detail_list'][0] = [
  615. 'out_detail_no' => 'transfer' . $out_trade_no,
  616. 'transfer_amount' => $pars['total_amount'],
  617. 'transfer_remark' => $batch_name,
  618. 'openid' => $openid
  619. ];//转账明细列表
  620. $token = $this->getToken($url,$pars);//获取token
  621. $res = $this->https_request($url, json_encode($pars), $token);//发送请求
  622. return json_decode($res, true);
  623. }
  624. /**
  625. * 通过商家批次单号查询批次单
  626. * @param $order_sn
  627. * @return mixed
  628. *
  629. * 【批次状态】 ACCEPTED:已受理。批次已受理成功,若发起批量转账的30分钟后,转账批次单仍处于该状态,可能原因是商户账户余额不足等。商户可查询账户资金流水,若该笔转账批次单的扣款已经发生,则表示批次已经进入转账中,请再次查单确认
  630. * PROCESSING:转账中。已开始处理批次内的转账明细单
  631. * FINISHED:已完成。批次内的所有转账明细单都已处理完成
  632. * CLOSED:已关闭。可查询具体的批次关闭原因确认
  633. */
  634. private function batch_id($order_sn)
  635. {
  636. $url = 'https://api.mch.weixin.qq.com/v3/transfer/batches/out-batch-no/'.$order_sn.'?need_query_detail=false';
  637. $token = $this->getToken($url,null,'GET');//获取token
  638. $res = $this->https_request($url, null, $token);//发送请求
  639. return json_decode($res, true);
  640. }
  641. private function https_request($url, $data = null, $token)
  642. {
  643. $curl = curl_init();
  644. curl_setopt($curl, CURLOPT_URL, (string)$url);
  645. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  646. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  647. if (!empty($data)) {
  648. curl_setopt($curl, CURLOPT_POST, 1);
  649. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  650. }
  651. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  652. //添加请求头
  653. $headers = [
  654. 'Authorization:WECHATPAY2-SHA256-RSA2048 ' . $token,
  655. 'Accept: application/json',
  656. 'Content-Type: application/json; charset=utf-8',
  657. 'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
  658. ];
  659. if (!empty($headers)) {
  660. curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
  661. }
  662. $output = curl_exec($curl);
  663. curl_close($curl);
  664. return $output;
  665. }
  666. private function getToken($url,$pars,$http_method='POST')
  667. {
  668. // $http_method = $http_method;//请求方法(GET,POST,PUT)
  669. $timestamp = time();//请求时间戳
  670. $url_parts = parse_url($url);//获取请求的绝对URL
  671. $nonce = $timestamp . rand('10000', '99999');//请求随机串
  672. if($pars){
  673. $body = json_encode((object)$pars);//请求报文主体
  674. }else{
  675. $body = '';
  676. }
  677. $stream_opts = [
  678. "ssl" => [
  679. "verify_peer" => false,
  680. "verify_peer_name" => false,
  681. ]
  682. ];
  683. // try {
  684. $filePath = App::getRootPath();
  685. $certPem= [
  686. 'certPem' => $filePath . $this->wxapp['certPem'],
  687. 'keyPem' => $filePath . $this->wxapp['keyPem'],
  688. ];
  689. $apiclient_cert_path = $certPem['certPem'];
  690. $apiclient_key_path = $certPem['keyPem'];
  691. $apiclient_cert_arr = openssl_x509_parse(file_get_contents($apiclient_cert_path, false, stream_context_create($stream_opts)));
  692. $serial_no = $apiclient_cert_arr['serialNumberHex'];//证书序列号
  693. $mch_private_key = file_get_contents($apiclient_key_path, false, stream_context_create($stream_opts));//密钥
  694. $merchant_id = $this->wxapp['mchid'];
  695. $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
  696. $message = $http_method . "\n" .
  697. $canonical_url . "\n" .
  698. $timestamp . "\n" .
  699. $nonce . "\n" .
  700. $body . "\n";
  701. openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
  702. $sign = base64_encode($raw_sign);//签名
  703. // $schema = 'WECHATPAY2-SHA256-RSA2048';
  704. $token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
  705. $merchant_id, $nonce, $timestamp, $serial_no, $sign);//微信返回token
  706. // } catch (\Exception $e) {
  707. // throw new \Exception(['msg' => $e->getMessage()]);
  708. // }
  709. return $token;
  710. }
  711. /**
  712. * 企业付款到零钱
  713. * @param $id
  714. * @return array
  715. * @throws \think\db\exception\DataNotFoundException
  716. * @throws \think\db\exception\DbException
  717. * @throws \think\db\exception\ModelNotFoundException
  718. */
  719. public function WechatTransfers_qiye($id)
  720. {
  721. // $extract = $this->dao->getWhere(['extract_id' => $id]);
  722. $userdata=Db::name('user_extract')
  723. ->alias('u_e')
  724. ->leftJoin('user_extract_openid u_e_o','u_e.uid=u_e_o.uid')
  725. ->where(['extract_id' => $id,'extract_type'=>1])
  726. ->field('u_e.extract_price,u_e.uid,u_e_o.openid,u_e.service_money,u_e.withdrawal_type,u_e.order_sn')
  727. ->find();
  728. if($userdata and !empty($userdata)){
  729. $params["mch_appid"]='wxbf753066ac8686ba';
  730. $params["mchid"] = '1605734712';
  731. $params["nonce_str"]= mt_rand(100000000,999999999);
  732. $params["partner_trade_no"] = $userdata['order_sn'];
  733. if($userdata['withdrawal_type']==2){
  734. $params["amount"]= bcmul(bcsub($userdata['extract_price'],$userdata['service_money'],2),100);
  735. }else{
  736. $params["amount"]= bcmul(bcsub($userdata['extract_price'],$userdata['service_money'],2),100);
  737. }
  738. $params["desc"]= '提现到微信零钱';
  739. $params["openid"]= $userdata['openid'];
  740. $params["check_name"]= 'NO_CHECK';
  741. $sign =$this->getSign($params);
  742. //生成签名
  743. $params['sign'] = $sign;
  744. //构造XML数据
  745. $xmldata = $this->ToXml($params); //数组转XML
  746. $url='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
  747. //发送post请求
  748. $res = $this->curl_post_ssl($url, $xmldata,[]);
  749. // Db::name('log')->insert(['data'=>json_encode($res)]);
  750. if(!$res){
  751. return ['code'=>500,'msg'=>'请求未能发送成功'];
  752. }
  753. //付款结果分析
  754. $content = $this->FromXml($res); //xml转数组
  755. Db::name('log')->insert(['data'=>'【微信提现返回】'.json_encode($content)]);
  756. if($content['result_code']=="SUCCESS"){
  757. $this->WechatTransfers_query($userdata['order_sn']);
  758. return ['code'=>200,'msg'=>'成功'];
  759. }else{
  760. // Db::name('log')->insert(['data'=>'else进来了']);
  761. Db::name('user_extract')->where('order_sn',$userdata['order_sn'])->update(['fail_msg'=>$content['err_code_des'],'status_time'=>date('Y-m-d H:i:s'),'status'=>'-1']);
  762. $extract_data=Db::name('user_extract')->where('order_sn',$userdata['order_sn'])->find();
  763. if($extract_data['withdrawal_type']==1){
  764. Db::name('user')->where('uid',$extract_data['uid'])->inc('brokerage_price',$extract_data['extract_price'])->update();
  765. }else{
  766. $eb_bill=Db::name('entropy_barter_bill')->where('order_no',$extract_data['order_sn'])->where('pm',2)->find();
  767. Db::name('entropy_barter_bill')->where('id',$eb_bill['id'])->where('pm',2)->update(['status'=>3,'remarks'=>$content['err_code_des']]);
  768. Db::name('entropy_barter_user_'.$extract_data['mer_id'])->where('eb_id',$eb_bill['to_id'])->inc('wallet',$extract_data['extract_price'])->update();
  769. }
  770. return ['code'=>201,'msg'=>$content['err_code_des']];
  771. }
  772. }else{
  773. return ['code'=>200,'msg'=>'未找到数据'];
  774. }
  775. }
  776. //付款到零钱查询
  777. public function WechatTransfers_query($order_sn)
  778. {
  779. // Db::name('log')->insert(['data'=>'微信提现查询走进来了']);
  780. $params["appid"]='wxbf753066ac8686ba';
  781. $params["mch_id"] = '1605734712';
  782. $params["nonce_str"]= mt_rand(100000000,999999999);
  783. $params["partner_trade_no"]= $order_sn;
  784. $sign =$this->getSign($params);
  785. //生成签名
  786. $params['sign'] = $sign;
  787. //构造XML数据
  788. $xmldata = $this->ToXml($params); //数组转XML
  789. $url='https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo';
  790. //发送post请求
  791. $res = $this->curl_post_ssl($url, $xmldata,[]);
  792. if(!$res){
  793. return ['code'=>500,'msg'=>'请求未能发送成功'];
  794. }
  795. //付款结果分析
  796. $content = $this->FromXml($res); //xml转数组
  797. // Db::name('log')->insert(['data'=>'查询'.json_encode($content)]);
  798. try {
  799. if($content['status']=='SUCCESS'){
  800. Db::name('entropy_barter_bill')->where('order_no',$content['partner_trade_no'])->where('pm',2)->update(['status'=>2,'remarks'=>'已到账']);
  801. Db::name('user_extract')->where('order_sn',$content['partner_trade_no'])->update(['status'=>1]);
  802. //$bill=Db::name('entropy_barter_bill')->where('order_no',$content['partner_trade_no'])->where('pm',2)->find();
  803. //$mer_id=Db::name('user_extract')->where('order_sn',$content['partner_trade_no'])->value('mer_id');
  804. //Db::name('entropy_barter_user_'.$mer_id)->where('eb_id',$bill['to_id'])->dec('wallet',$bill['number'])->update();
  805. }
  806. }catch (\Exception $e) {
  807. Db::name('log')->insert(['data'=>'提现到微信查询出错:'.$e->getFile().':'.$e->getLine().'【'.$e->getMessage().'】']);
  808. }
  809. }
  810. /**
  811. * @remarks 支付宝付款到零钱
  812. * @author Tang
  813. * @created 2021/9/9 12:59
  814. */
  815. public function AliTransfers($id)
  816. {
  817. try {
  818. $userdata=Db::name('user_extract')
  819. ->where(['extract_id'=>$id])
  820. ->find();
  821. $identity=Db::name('user')->where('uid',$userdata['uid'])->value('ali_user_id');
  822. if($userdata and !empty($userdata)){
  823. $app_cert_path=dirname(__FILE__). '/../../../../extend/alipay/aop/cert/appCertPublicKey.crt';
  824. $alipay_cert_path=dirname(__FILE__). '/../../../../extend/alipay/aop/cert/alipayCertPublicKey.crt';
  825. $alipay_root_cert_path=dirname(__FILE__). '/../../../../extend/alipay/aop/cert/alipayRootCert.crt';
  826. $url = "https://openapi.alipay.com/gateway.do";
  827. $app_id="2021002194632049";
  828. $privateKey="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDGxceDFVT6VTYClinyAdY4PxE6MadNYLZ3sbLOLV14e39kuu1lkKDBZ/KPRNruPlSPGdiRVe+L8v4rsVk6bthsS/vMk5aH1wQyt58/HvHmZ5QVo3U5UD7cgqqefTcRJjKhjjM1rU/OrOkOqyssaLRukW3jeKRlBccUgtaGsXXrbMxWYpzl1OMDhKRRUVxu3LTfqlMpHghOasQrgyD92q9wlUN7U6hBYzGUocO/N3sz97PZwptwWAW0r3CFdlLCpgnMr+xb/Zh8td1OKGl3wEghiGavgDDlc2+w/xtk1SZ3pJbnGAU+D+oyJ6r76po6vkyGIlLrKp/zQ50az7fObzgNAgMBAAECggEBAK60szERlMkaEAih92gQGTsCo5+keMnX0UjO1LvGv7rfwQ7GBVYZklGrjVRDTrHL8wJ70w+amptFDgVVMXncZzh4aG5c4heu8q+pGLyf9DlwnIWQT736O+YQqun2YGogSqwYkgYBuH2NGKKd66pytPPhutYN+WAZfesXPHrSizRJtZMfuZvvGzm6ZJLZ1LmhvkOuLrX4xrJGRs1nAwZOmOfi4MY5VASblfPj59fUim9hErocNaX4uiMVwmhQl2QuOM/EbTd1UkW+dkV/gyQMOFzpcfN+SEi+hdLN+JiR9TVEcwity6ihOG5+3X33GKzfY4WFxeHHUaqA0SQWSkKofMECgYEA5OF5Imtq8/6JjWJ0jvYCpUnj9742McGJZTWBoTn9Hp0d3bwyE3YbH8pBVJyvzlfPKB9TUjE2FzVZvQtxEu+ZxToccp/LPqlgITWNHCmEtzAgXW7ww2PafgDZJ2QRSyjLUeRIWSAkeilj64XMCEC/bEs/nb5nmUb2gnsNTvvpMLUCgYEA3lMMtaIZH1fMI4XMNaPFzeRiKc0FIcLEem/efnPetPuOCujIWQJ/x9cCDCcfqO59I1FXQuiC/E1dFvme2qs/H7h2bFu8RG0M/ZQWd9twg31Sh+R7gCQakFERag8HXc4AWfBGXCvMu1SmSovU49KecSLxYGOAUdp77j1GxtLiePkCgYAQjc45ExPVOd+w/iH4BQsD8Wgvju5Ugu7xBwGtK4iHIk36r5XfmnczwWkgOYTto6Qz/rAEDdMfspge+CjhebrhbOaJ08zbZ1ywijL+inIy3aQ5ncCEIUC4RE9wbehiSz0JWz1wVMbOnxe+/RpYrnYp2vdq7U6I430IyuWXhNjE0QKBgEtJUmd7oghEIgPxfiq37/b+HOPM4q0BGKnhkjW+JS+idAJru9SwjPbub2oQIZ+CS2wXUnZ86EZqKFjsZQflr7WdMLUXB5UgXKLOcCFcdSiB2t3b2JqXH0u5uCzzM+pnJSVPwXPa/TR+wOVDnu8bVr43OAgNCdouI4OUyo/vv/N5AoGATJaIvpsZ9v1zmhbtJbgPBM9dhD2PIp2ufZ7yvhGGzA02FqAbyAeVsI2d+W+uA6jJ1X87x27pQv//mFoFXStxX3/bhdgTWbUYEWobAhw1jBS1rMQfLuBGGI/LsHGhzau3U+59erC5sYhGgZKSdXDyjOduWQlPWAv6ufkNZ+I3FCU=";
  829. // 证书模式的测试
  830. $alipayConfig = new AlipayConfig();
  831. $alipayConfig->setAppId($app_id);
  832. $alipayConfig->setCharset("utf-8");
  833. $alipayConfig->setFormat("json");
  834. $alipayConfig->setSignType("RSA2");
  835. $alipayConfig->setServerUrl($url);
  836. $alipayConfig->setPrivateKey($privateKey);
  837. // content 和 path 只需要设置一个即可
  838. $alipayConfig->setAppCertPath($app_cert_path);
  839. //$alipayConfig->setAppCertContent()
  840. $alipayConfig->setAlipayPublicCertPath($alipay_cert_path);
  841. //$alipayConfig->setAlipayPublicCertContent()
  842. $alipayConfig->setRootCertPath($alipay_root_cert_path);
  843. //$alipayConfig->setRootCertContent()
  844. $aop = new AopCertClient($alipayConfig);
  845. $aop->isCheckAlipayPublicCert = true;
  846. $order_title='提现';
  847. if($userdata['withdrawal_type']==1){
  848. $order_title='幸福宝提现';
  849. $userdata['extract_price']=bcsub($userdata['extract_price'],$userdata['service_money']);
  850. }elseif($userdata['withdrawal_type']==2){
  851. $mer_name=Db::name('merchant')->where('mer_id',$userdata['mer_id'])->value('mer_name');
  852. $order_title='幸福宝-'.$mer_name.'提现';
  853. $userdata['extract_price']=bcsub($userdata['extract_price'],$userdata['service_money']);
  854. }
  855. // Db::name('log')->insert(['data'=>'AopCertClient']);
  856. $parameter = "{".
  857. "\"out_biz_no\":\"".$userdata['order_sn']."\",".
  858. "\"remark\":\"提现到支付宝\",".
  859. // "\"business_params\"":.json_encode(['payer_show_name_use_alias'=>'北京天地博爱网络科技有限公司']).
  860. "\"business_params\":\"{'payer_show_name_use_alias':'北京天地博爱网络科技有限公司'}\",".
  861. "\"biz_scene\":\"DIRECT_TRANSFER\",".
  862. "\"payee_info\":{".
  863. "\"identity\":\"".$identity."\",".
  864. "\"identity_type\":\"ALIPAY_USER_ID\",".
  865. // "\"name\":\"".$userdata['real_name']."\"".
  866. "},".
  867. "\"trans_amount\":\"".$userdata['extract_price']."\",".
  868. "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\",".
  869. "\"order_title\":\"".$order_title."\"".
  870. "}";
  871. $request = new AlipayFundTransUniTransferRequest ();
  872. $request->setBizContent($parameter);
  873. $response = $aop->execute($request);
  874. Db::name('log')->insert(['data'=>'【支付宝提现返回结果】'.$response]);
  875. $response=json_decode($response,true);
  876. if($response['alipay_fund_trans_uni_transfer_response']['code']=='10000'){
  877. return ['code'=>200,'msg'=>'成功'];
  878. }else{
  879. return ['code'=>201,'msg'=>$response['alipay_fund_trans_uni_transfer_response']['sub_msg']];
  880. }
  881. }else{
  882. return ['code'=>200,'msg'=>'未找到数据'];
  883. }
  884. }catch (Exception $exception){
  885. Db::name("log")->insert(array('data'=>$exception->getFile().':'.$exception->getLine().'【'.$exception->getMessage().'】'));//日志记录
  886. }
  887. }
  888. /*
  889. * Effect 微信生成签名
  890. * author tangshiwei
  891. * time 2021-09-09
  892. * */
  893. public function getSign($params) {
  894. ksort($params); //将参数数组按照参数名ASCII码从小到大排序
  895. foreach ($params as $key => $item) {
  896. if (!empty($item)) {
  897. //剔除参数值为空的参数
  898. $newArr[] = $key.'='.$item; // 整合新的参数数组
  899. }
  900. }
  901. $stringA = implode("&", $newArr); //使用 & 符号连接参数
  902. $stringSignTemp = $stringA."&key=70yfchPMifQCESGSFr53vOZmUJZ8Srql";//拼接key
  903. // key是在商户平台API安全里自己设置的
  904. $stringSignTemp = md5($stringSignTemp); //将字符串进行MD5加密
  905. $sign = strtoupper($stringSignTemp); //将所有字符转换为大写
  906. return $sign;
  907. }
  908. /**
  909. * @remarks curl 请求
  910. * @author Tang
  911. * @created 2021/9/9 13:14
  912. */
  913. function curl_post_ssl($url, $xmldata, $second = 30, $aHeader = array()){
  914. $dirs= App::getRootPath();
  915. $ch = curl_init();//初始化curl
  916. curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置执行最长秒数
  917. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
  918. curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
  919. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 终止从服务端进行验证
  920. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//
  921. curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');//证书类型
  922. curl_setopt($ch, CURLOPT_SSLCERT, $dirs.'pkey/cert/apiclient_cert.pem');//证书位置
  923. curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//CURLOPT_SSLKEY中规定的私钥的加密类型
  924. curl_setopt($ch, CURLOPT_SSLKEY, $dirs.'pkey/cert/apiclient_key.pem');//证书位置
  925. if (count($aHeader) >= 1) {
  926. curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//设置头部
  927. }
  928. curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
  929. curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);//全部数据使用HTTP协议中的"POST"操作来发送
  930. $data = curl_exec($ch);//执行回话
  931. if ($data) {
  932. curl_close($ch);
  933. return $data;
  934. } else {
  935. $error = curl_errno($ch);
  936. echo "call faild, errorCode:$error\n";
  937. curl_close($ch);
  938. return false;
  939. }
  940. }
  941. /**
  942. * @remarks 数组转xml
  943. * @author Tang
  944. * @created 2021/9/9 13:14
  945. */
  946. public function ToXml($data=array())
  947. {
  948. if(!is_array($data) || count($data) <= 0)
  949. {
  950. return '数组异常';
  951. }
  952. $xml = "<xml>";
  953. foreach ($data as $key=>$val)
  954. {
  955. if (is_numeric($val)){
  956. $xml.="<".$key.">".$val."</".$key.">";
  957. }else{
  958. $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
  959. }
  960. }
  961. $xml.="</xml>";
  962. return $xml;
  963. }
  964. /**
  965. * @remarks xml转数组
  966. * @author Tang
  967. * @created 2021/9/9 13:15
  968. */
  969. public function FromXml($xml)
  970. {
  971. if(!$xml){
  972. echo "xml数据异常!";
  973. }
  974. //将XML转为array
  975. //禁止引用外部xml实体
  976. libxml_disable_entity_loader(true);
  977. $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
  978. return $data;
  979. }
  980. public function band_account($type,$account,$info,$uid){
  981. $accountinfo=Db::name("user_withdraw_account")->where(["account_type"=>$type,"user_id"=>$uid])->find();
  982. $data=[
  983. "account_type"=>$type,
  984. "account"=>$account,
  985. "info"=>$info,
  986. 'update_time'=>date("Y-m-d H:i:s"),
  987. ];
  988. if ($accountinfo){
  989. Db::name("user_withdraw_account")->where("id",$accountinfo["id"])->update($data);
  990. }else{
  991. $data["user_id"]=$uid;
  992. $data["create_time"]=date("Y-m-d H:i:s");
  993. Db::name("user_withdraw_account")->insert($data);
  994. }
  995. return ["msg"=>'绑定成功'];
  996. }
  997. public function band_openid($openid, $uid, $nickname = '', $avatar = '')
  998. {
  999. // 屎山上边堆屎
  1000. $existUid = Db::name('user_extract_openid')->where('openid', $openid)->value('uid');
  1001. if (!empty($existUid) && $existUid != $uid) {
  1002. return false;
  1003. }
  1004. $check = Db::name('user_extract_openid')->where('uid', $uid)->value('openid');
  1005. if (!empty($check)) {
  1006. if ($check != $openid) {
  1007. return false;
  1008. }
  1009. } else {
  1010. Db::name("user_extract_openid")->insert([
  1011. 'uid' => $uid,
  1012. 'openid' => $openid,
  1013. 'type' => 1
  1014. ]);
  1015. }
  1016. /** @var UserRepository $userRepository */
  1017. $userRepository = app()->make(UserRepository::class);
  1018. $userRepository->updateUser(
  1019. $uid,
  1020. ['wechat_user_id' => $openid],
  1021. [
  1022. "type" => 1,
  1023. "uid" => $uid,
  1024. "nickname" => $nickname,
  1025. "avater" => $avatar,
  1026. ]
  1027. );
  1028. return true;
  1029. // $user_data["wechat_user_id"] = $openid;
  1030. // $user_count = Db::name('user')->where($user_data)->count();
  1031. // if ($user_count < 0) {
  1032. //
  1033. // }
  1034. // $data["openid"] = $openid;
  1035. // $count = Db::name("user_extract_openid")->where($data)->count();
  1036. // if ($count > 0) {
  1037. // return false;
  1038. // }
  1039. // $data["uid"] = $uid;
  1040. //
  1041. // $wx_type = input("wx_type/d", 0);
  1042. // $data["type"] = $wx_type == 1 ? 1 : 0;
  1043. // Db::name("user_extract_openid")->insert($data);
  1044. // return true;
  1045. // // return ["msg"=>'绑定成功'];
  1046. }
  1047. /*获取绑卡账户*/
  1048. public function band_account_info($type,$uid){
  1049. if($type=='1'){
  1050. $res=Db::name('user_extract_openid')->where('uid',$uid)->value('openid');
  1051. if(!$res){
  1052. return false;
  1053. }
  1054. return true;
  1055. }
  1056. $res = Db::name('user') -> where('uid',$uid) -> value('ali_user_id');
  1057. if($res && $res != '0' && $res != ''){
  1058. return true;
  1059. }
  1060. return false;
  1061. // $account=Db::name("user_withdraw_account")->where(["account_type"=>$type,"user_id"=>$uid])->find();//
  1062. //
  1063. // if ($account){
  1064. // if($account['account_type'] ==3){
  1065. // $account['icon'] = '';
  1066. // }
  1067. // return $account;
  1068. // }else{
  1069. // return false;
  1070. // }
  1071. }
  1072. public function listBank($where)
  1073. {
  1074. return Db::name("user_withdraw_account")->where($where)->order('id desc')->select();
  1075. }
  1076. /*添加银行卡*/
  1077. public function createBank($data){
  1078. $data["account_type"] = 3;
  1079. $data["info"] = $data['user_name'];
  1080. $real_name = $this->real_info($data['user_id']);
  1081. if(!$real_name){
  1082. return ['code'=>400,'msg'=>'请先实名认证'];
  1083. }
  1084. if($real_name['user_name'] != $data['user_name']){
  1085. return ['code'=>400,'msg'=>'认证信息与银行卡绑定用户不符'];
  1086. }
  1087. if(Db::name("user_withdraw_account")->where(['user_id'=>$data['user_id'],'account_type'=>3,'status'=>0])->value("id")){
  1088. //操作修改
  1089. $data['update_time'] = date("Y-m-d H:i:s");
  1090. Db::name("user_withdraw_account")->where(['user_id'=>$data['user_id'],'account_type'=>3,'status'=>0])->update($data);
  1091. return Db::name("user_withdraw_account")->where(['user_id'=>$data['user_id'],'account_type'=>3,'status'=>0])->value("id");
  1092. // return ['code'=>400,'msg'=>'只能绑定一张银行卡'];
  1093. }
  1094. $data['create_time'] = date("Y-m-d H:i:s");
  1095. return Db::name("user_withdraw_account")->insertGetId($data);
  1096. }
  1097. /*修改银行卡*/
  1098. public function saveBank($where=[],$data=[]){
  1099. $data['update_time'] = date("Y-m-d H:i:s");
  1100. $res = Db::name("user_withdraw_account")->where($where)->update($data);
  1101. return $res;
  1102. }
  1103. /*银行卡列表*/
  1104. public function list($where=[]){
  1105. $res = Db::name("user_withdraw_account")->where($where)->select();
  1106. return $res;
  1107. }
  1108. /*用户认证信息*/
  1109. public function real_info($uid){
  1110. $data = Db::name("user_certification")->where(["uid"=>$uid,'status'=>1])->find();
  1111. return $data;
  1112. }
  1113. }