MerchantLakalaApplyRepository-备份.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. <?php
  2. /**
  3. * @package merchant
  4. *
  5. * @author xaboy
  6. * @day 2020-04-16
  7. *
  8. *
  9. */
  10. namespace app\common\repositories\merchant\apply;
  11. use app\common\dao\merchant\apply\MerchantHaikeApplyDao;
  12. use app\common\repositories\BaseRepository;
  13. use app\common\repositories\merchant\order\OrderMerchantRepository;
  14. use app\traits\HaikeApiRequest;
  15. use app\common\repositories\store\order\StoreOrderRepository;
  16. use think\facade\Db;
  17. use think\facade\Log;
  18. use Lakala\src\LakalaBoss;
  19. use Lakala\src\AES;
  20. /**
  21. * 拉卡拉商户入网业务申请
  22. * Class MerchantHaikeApplyRepository
  23. * @package app\common\repositories\merchant
  24. * @author ljj
  25. * @created 2021/2/20 14:28
  26. */
  27. class MerchantLakalaApplyRepository extends BaseRepository
  28. {
  29. /**
  30. * MerchantRepository constructor.
  31. * @param MerchantHaikeApplyDao $dao
  32. */
  33. public function __construct(MerchantHaikeApplyDao $dao)
  34. {
  35. $this->dao = $dao;
  36. }
  37. /**
  38. * 获取单条订单信息
  39. */
  40. public function getOne(string $agent_apply_no)
  41. {
  42. $where = ['agent_apply_no' => $agent_apply_no];
  43. return ($this->dao->getWhere($where));
  44. }
  45. /**
  46. * 创建申请订单lakala
  47. * @return array|\think\Model|null
  48. * @author ljj
  49. * @created 2021/2/20 10:45
  50. * @return mixed
  51. */
  52. public function createOrderlakala(array $params)
  53. {
  54. $intentionRepository = app()->make(MerchantIntentionApplyRepository::class);
  55. $intention = $intentionRepository->getOne(['mer_intention_id' => $params['mer_intention_id']]);
  56. if (!$intention)
  57. return ['code' => 500, 'msg' => '无申请信息'];
  58. $datas=[
  59. "row"=> [
  60. "merchant_name"=>$intention->mer_name,//子商户名称
  61. "merchant_short_n1ame"=>$intention->mer_name,//子商户简称
  62. "merc_start_time"=>$intention->merc_start_time,
  63. "merc_end_time"=>$intention->merc_end_time,
  64. "reg_address"=> $intention->addr,//注册/经营地址
  65. "merchant_id_type"=> "00",//是否三证合一
  66. "merchant_id_no"=>$intention->credit_code ,//信用代码\营业执照号
  67. "province"=>$this->getProvinceCode($intention->province_id) ,//省份地址i
  68. "city"=>$this->getProvinceCode($intention->city_id) ,//省份地址i
  69. "region"=>$this->getAreaCode($intention->area_id),//省份地址i
  70. "mccCd"=>$intention->mcc_cd ,//行业大类
  71. "mccSubCd"=>$intention->mcc_sub_cd ,//行业细类
  72. "merc_attr"=>$intention->merc_attr ,//商户性质
  73. "min_rtn_amt"=>$intention->min_rtn_amt ,//最低留存金额 以分为单位
  74. "fee_charge_glg"=>$intention->fee_charge_glg,//分账手续费承担方式
  75. /// mercIdEffDt
  76. ],
  77. "illey"=>[
  78. "enterpriseOwner"=>$intention->name,
  79. "enterpriseOwnerIdType"=>"00",
  80. "enterpriseOwnerIdNo"=>$intention->idcard_no,
  81. "enterpriseOwnerIdEffDt"=>$intention->identification_valid_date_start,
  82. "enterpriseOwnerIdExpDt"=>$intention->identification_valid_date_end,
  83. "ownImg1"=>$intention->card_positive_person,
  84. "ownImg2"=>$intention->card_back_person,
  85. ],
  86. "son"=>[
  87. "usrOprNm"=>$intention->name,
  88. "usrOprEmail"=>$intention->email,
  89. "usrOprMbl"=>$intention->name,
  90. ],
  91. "link"=>[
  92. "contactType"=>"0",
  93. "contactName"=>$intention->name,
  94. "contactMobile"=>$intention->phone,
  95. ],
  96. "stu"=>[
  97. "bank_name"=>$intention->bank_name,
  98. "stl_bank_name"=>$intention->bank_deposit,
  99. "bank_no"=>$this->getBankCode($intention->bank_branch),
  100. "account_no"=>$intention->bank_account,
  101. "bank_prov"=>"",
  102. "bank_city"=>"",
  103. "pas_stl_flg"=>$intention->pas_stl_flg,
  104. "stl_beg_amt"=>$intention->stl_beg_amt,
  105. ],
  106. ];
  107. $res=$this->lakalaru($datas,$intention->mer_id);
  108. return $res;
  109. // $paramOrder = [
  110. // 'apply_id' => $intention->mer_intention_id ? : 0,
  111. // 'mer_id' => $intention->mer_id ? : 0,
  112. // 'uid' => $intention->uid,
  113. // 'merch_no' => $merch_no,
  114. // 'agent_apply_no' => $orderId,
  115. // 'trade_type' => 'WX,ALI',
  116. // 'platform' => 1,
  117. // 'apply_type' => 1,
  118. // ];
  119. //
  120. // Db::transaction(function () use ($paramOrder) {
  121. // $merchantOrder = $this->dao->create($paramOrder);
  122. // return $merchantOrder;
  123. // });
  124. }
  125. /**
  126. * 拉卡拉入网
  127. * @param array $datas 商户数据
  128. * @param $mer_id 商户id
  129. * @data 2021-2-5
  130. */
  131. public function lakalaru($datas,$mer_id){
  132. $ids=$mer_id;
  133. $data = $datas["row"];
  134. $sonStore = $datas["illey"]; //子商户
  135. $sonManage = $datas["son"]; //子商户
  136. $sonLink = $datas["link"];//子商户联系方式
  137. $stu = $datas["stu"];//子商户结算信息开
  138. $password = substr(md5(time()),-16);
  139. $aes = AES::init();
  140. $lakalaBoss = LakalaBoss::getInstance();
  141. $params = [
  142. 'reqTime' => date('YmdHis'), //请求时间
  143. 'merchantName' => $data['merchant_name'] ?? '', //子商户名称
  144. 'merchantShortName' => $data['merchant_short_n1ame'] ?? '', //子商户简称
  145. 'mercIdEffDt' => date("Ymd",strtotime($data['merc_start_time'])) ?? '', //营业执照生效日期
  146. 'mercIdExpDt' => date("Ymd",strtotime($data['merc_end_time'])) ?? '',//'20260726', 营业执照到期日期
  147. 'regAddress' => $data['reg_address'] ?? '', //注册/经营地址
  148. 'merchantIdType' => $data['merchant_id_type'], //是否三证合一
  149. 'merchantIdNo' => $aes->encrypt($data['merchant_id_no'],$password), //信用代码\营业执照号
  150. 'province' => $data['province'] ?? '',//归属省
  151. 'city' => $data['city'] ?? '', //归属市
  152. 'region' => $data['region'] ?? '', //归属地区
  153. 'mccCd' => $data['mcc_cd'] ?? '', //行业大类
  154. 'mccSubCd' => $data['mcc_sub_cd'] ?? '', //行业细类
  155. 'mercAttr' => (string)$data['merc_attr'] ?? '',//商户性质
  156. 'administrator' => stripslashes(json_encode([ //子商户管理员信息开始
  157. [
  158. 'usrOprNm' => $sonManage['usrOprNm'], //子商户管理员姓名
  159. 'usrOprMbl' => $aes->encrypt($sonManage['usrOprNm'],$password), //子商户管理员姓名
  160. 'usrOprEmail' => $sonManage['usrOprEmail'], //子商户管理员Email
  161. 'mercCertTyp' => '1-RSA', //子商户接口类型
  162. ]
  163. ],JSON_UNESCAPED_UNICODE)),
  164. 'contact' => stripslashes(json_encode([ //子商户联系人信息开始
  165. [
  166. 'contactType' => $sonLink['contactType'], // 3 紧急联系人
  167. 'contactName' => $sonLink['contactName'], //子商户联系人姓名
  168. 'contactMobile' => $aes->encrypt($sonLink['contactMobile'],$password), //子商户联系人手机
  169. ]
  170. ],JSON_UNESCAPED_UNICODE)),
  171. 'owner' => stripslashes(json_encode([ //子商户法人信息
  172. [
  173. 'enterpriseOwner' => $sonStore['enterpriseOwner'], //子商户法人姓名
  174. 'enterpriseOwnerIdType' => $sonStore['enterpriseOwnerIdType'], //子商户法人证件类型 00:身份证
  175. 'enterpriseOwnerIdNo' => $aes->encrypt($sonStore['enterpriseOwnerIdNo'],$password),//子商户法人证件号码
  176. 'enterpriseOwnerIdEffDt' => $sonStore['enterpriseOwnerIdEffDt'], //子商户法人证件生效日期
  177. 'enterpriseOwnerIdExpDt' => $sonStore['enterpriseOwnerIdExpDt'], //子商户法人证件失效日期
  178. 'ownImg1' =>$sonStore['ownImg1'],//$sonStore['ownImg1'] ? explode("/",$sonStore['ownImg1'])[3]:"",//子商户法人证件照片正面
  179. 'othImg2' =>$sonStore['ownImg2'],//$sonStore['othImg2'] ? explode("/",$sonStore['othImg2'])[3] : "",//子商户法人证件照片反面
  180. ]
  181. ],JSON_UNESCAPED_UNICODE)),
  182. 'stlLst' => stripslashes(json_encode([ //结算信息
  183. [
  184. 'stlSign' => '0', //结算账号公私标志 0-对公
  185. 'selfStlFlg' => 'Y', //商户自结算标志 N-不允许 Y-允许
  186. 'bankName' => $stu['bank_name'] ?? '', //银行代码
  187. 'stlBankName' => $stu['stl_bank_name'] ?? '',//开户行名称
  188. 'lBnkNo' => $stu['bank_no'] ?? '',//联行行号
  189. 'stlOac' => $aes->encrypt($stu['account_no'],$password),//$stu['account_no'] //银行帐号
  190. 'bnkOpnName' => $stu['stl_bank_name'] ?? '', //银行开户名称
  191. 'opnBnkProv' => $stu['bank_prov'] ?? '', //支行归属省
  192. 'opnBnkCity' => $stu['bank_city'] ?? '', //支行归属市
  193. 'stlCls' => '1',//$stu['st_class'], //商户结算类型 1-结算到账户2-结算到银行账户
  194. 'stlPerd' => '0',//$stu['stl_perd'], //结算周期0-日 1-周2-旬3-月4-季5-半年6-年7-指定结算日
  195. 'pasStlFlg' => $stu['pas_stl_flg'], //暂停结算标志 0-正常结算 1-暂停结算
  196. 'minRtnAmt' => $data['min_rtn_amt'], //最低留存金额 以分为单位
  197. 'stlTrfDays' => '1',//$stu['stl_trf_days'], //结算划款天数
  198. 'stlDay' => "1", //结算日当结算周日为7时必填
  199. 'nextStlDt' => date('Ymd'), //下一结算日期
  200. 'stlBegAmt' => $stu['stl_beg_amt'], //结算起始金额
  201. ]
  202. ],JSON_UNESCAPED_UNICODE)),
  203. 'feeChargeFlg' => $data['fee_charge_glg'], //分账手续费承担方式
  204. 'certPhotoImg' => "photoimg.jpg",// $data['cert_photo_image'] ? explode("/",$data['cert_photo_image'])[3] : "", //证照照片
  205. 'secretKey' =>$lakalaBoss->signencrypt($password), //临时密钥
  206. ];
  207. //查看是否存在商户id值
  208. $isMerc = Db::name("merchant")->where(['mer_id'=>$ids])->find();
  209. if($isMerc['mer_id']){
  210. $params['outMerchantId'] = $isMerc['mer_id'];
  211. $result = $lakalaBoss->editStore($params);
  212. if($result['code'] != 0){
  213. return app('json')->fail($result['message']);
  214. }
  215. if($result['data']['status'] == 'S'){
  216. $updateArr = [
  217. 'mer_id' => $ids,
  218. 'send_data' => json_encode($params),
  219. 'result_data' => json_encode($result),
  220. "update_time" => time(),
  221. ];
  222. Db::name("merchant_extend")->where(['mer_id'=>$ids])->update($updateArr);
  223. // return app('json')->success($result['message']);
  224. return ['code' => 200, 'message' => $result['message']];
  225. }
  226. }else{
  227. $result = $lakalaBoss->registerStore($params);
  228. return $result;
  229. if($result['code'] != 0){
  230. // $this->error($result['message']);
  231. // return app('json')->fail($result['message']);
  232. return ['code' => 400, 'message' => $result['message']];
  233. }
  234. if($result['data']['status'] == 'S'){
  235. //更新信息到数据库
  236. $rs = Db::name("merchant_intention")->where(['mer_id'=>$ids])->update(['mer_id'=>$result['data']['outMerchantId'],'request_id'=>$result['data']['requestId']]);
  237. $insertArr = [
  238. 'mer_id' => $ids,
  239. 'send_data' => json_encode($params),
  240. 'result_data' => json_encode($result),
  241. "update_time" => time(),
  242. "create_time" => time(),
  243. ];
  244. Db::name("merchant_extend")->insert($insertArr);
  245. if($rs){
  246. //对图片进行压缩文件
  247. // system();
  248. /**
  249. * 子商户号
  250. * 最终图片路径
  251. */
  252. // self::upload_img($result['data']['outMerchantId'],'');
  253. return ['code' => 200, 'message' => "操作成功"];
  254. }
  255. return ['code' => 400, 'message' => "网络繁忙,请稍后进行操作!"];
  256. }else{
  257. return ['code' => 400, 'message' => $result['message']];
  258. }
  259. }
  260. }
  261. /**
  262. * 拉卡拉取消订单管理
  263. */
  264. public function autoCancelOrder($orderId){
  265. $orderRepository = app()->make(StoreOrderRepository::class);
  266. $orderInfo = $orderRepository->getOne($orderId);
  267. if (!$orderInfo)
  268. return ['return_code' => 500, 'return_msg' => '订单信息不存在'];
  269. if (!$orderInfo->paid)
  270. return ['return_code' => 500, 'return_msg' => '订单未完成支付'];
  271. //根据订单判断状态
  272. // $orderInfo = Db::name("order")->where(['id'=>$orderId,'order_status'=>1,'pay_status'=>1])->find();
  273. if(!$orderInfo){
  274. return ['code'=>0,'msg'=>'订单非法操作!'];
  275. }
  276. // //获得子订单信息,'status'=>1
  277. // $sonOrderInfo = Db::name("order_info")->where(['order_no'=>$orderInfo['order_no'],'status'=>1])->find();
  278. // if(!$sonOrderInfo){
  279. // return ['code'=>0,'msg'=>'订单非法操作!'];
  280. // }
  281. //取消订单手动
  282. $lakalaBoss = LakalaBoss::getInstance();
  283. // foreach ($storeLog as $k=>$v){
  284. //
  285. // }
  286. $sonArr[] = [
  287. 'detailOrderId' =>$orderInfo['order_sn'],
  288. 'detailRefundAmount' => ''.$orderInfo['pay_price']*100,
  289. 'rcvMerchantId' =>$orderInfo['mer_id']
  290. ];
  291. $arr = [
  292. 'refundOrderId'=>time().rand(10000,99999),
  293. 'orderId' => $orderInfo['order_no'],
  294. 'refundTolAmount' => ''.$orderInfo['pay_price']*100,
  295. 'refundDetail'=> json_encode($sonArr,JSON_UNESCAPED_UNICODE)
  296. ];
  297. //查看今天交易额是否可以直接进行退款 如果可以就直接退款 如果不足以退款 需要从拉卡拉的现金账户金额调用金额到待结算账户 在进行退款
  298. $lists = $lakalaBoss->rebackOrder($arr);
  299. if($lists['code'] == 0 && $lists['message'] == 'SUCCESS'){
  300. if($lists['data']['returnCode'] == '000000' && $lists['data']['returnMessage'] == 'SUCCESS'){
  301. return ['code'=>200,'msg'=>$lists['data']['tradeNo']];
  302. }else{
  303. return ['code'=>400,'msg'=>'非法操作!'];
  304. }
  305. }else{
  306. return ['code'=>400,'msg'=>$lists['message']];
  307. }
  308. }
  309. /**
  310. * 提现同意
  311. */
  312. public function pass($mer_id ,$order_sn,$real_money){
  313. $lakalaBoss = LakalaBoss::getInstance();
  314. $result = $lakalaBoss->widthdrawOrder($real_money*100,$mer_id,$order_sn);
  315. if($result['data']['returnCode'] != '000000'){
  316. return ['code' => 400, 'message' => "提现账号存在异常"];
  317. }
  318. return ['code' => 200, 'message' => "操作成功"];
  319. }
  320. public function getNameById($id)
  321. {
  322. return Db::name('merchant_intention')->where('mer_intention_id', $id)->value('name');
  323. }
  324. public function getBankCode($branch)
  325. {
  326. return Db::name('bank_code')->where('bank_branch', $branch)->value('bank_code');
  327. }
  328. public function getProvinceCode($province_id)
  329. {
  330. return Db::name('user_province')->where('province_id', $province_id)->value('province_code');
  331. }
  332. public function getCityCode($city_id)
  333. {
  334. return Db::name('user_city')->where('city_id', $city_id)->value('city_code');
  335. }
  336. public function getAreaCode($area_id)
  337. {
  338. return Db::name('user_area')->where('area_id', $area_id)->value('area_code');
  339. }
  340. /**
  341. * 获取唯一订单号
  342. * @return string
  343. * @author php迷途小书童
  344. * @created 2021/1/16 14:57
  345. */
  346. public function getNewOrderId($trade_type)
  347. {
  348. list($msec, $sec) = explode(' ', microtime());
  349. $msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', '');
  350. $orderId = $trade_type . $msectime . mt_rand(10000, max(intval($msec * 10000) + 10000, 98369));
  351. return $orderId;
  352. }
  353. /**
  354. * 回调处理
  355. * @return bool
  356. * @author php迷途小书童
  357. * @created 2021/1/16 15:12
  358. */
  359. public function doNotify($params)
  360. {
  361. $order = $this->dao->getWhere(['agent_apply_no' => $params['agent_apply_no']]);
  362. if (!$order)
  363. return false;
  364. //修改订单状态
  365. Db::transaction(function () use ($order, $params) {
  366. $order->status = $params['status'];
  367. $order->apply_no = $params['apply_no'];
  368. $order->save();
  369. });
  370. return true;
  371. }
  372. /**
  373. * 图片压缩
  374. * @return bool|mixed
  375. * @author php迷途小书童
  376. * @created 2021/1/30 17:17
  377. */
  378. public function getThumb($img)
  379. {
  380. $img = app()->getRootPath().'/public'.$img;
  381. $image = \think\Image::open($img);
  382. // 返回图片的宽度
  383. $width1 = $width = $image->width();
  384. if ($width > 1000) {
  385. $width1 = 1000;
  386. }
  387. $multiple = bcdiv($width, $width1);
  388. // 返回图片的高度
  389. $height = $image->height();
  390. $height1 = bcdiv($height, $multiple);
  391. $image->thumb($width1, $height1)->save($img);
  392. return $this->getImageBase64($img);
  393. }
  394. /**
  395. * 获取base64
  396. * @return mixed
  397. * @author php迷途小书童
  398. * @created 2021/1/30 17:11
  399. */
  400. public function getImageBase64($img)
  401. {
  402. $file = $img;
  403. if($fp = fopen($file,"rb", 0))
  404. {
  405. $gambar = fread($fp,filesize($file));
  406. fclose($fp);
  407. return chunk_split(base64_encode($gambar));
  408. } else {
  409. return false;
  410. }
  411. }
  412. }