UserExtractRepository.php 53 KB

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