SalesmanNewStoreForm.php 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\alliance\models\store;
  8. use app\models\Admin;
  9. use app\models\BrowseLog;
  10. use app\models\Cart;
  11. use app\models\Cat;
  12. use app\models\Goods;
  13. use app\models\Option;
  14. use app\models\Order;
  15. use app\models\OrderDetail;
  16. use app\models\Store;
  17. use app\models\SalesmanNewStore;
  18. use app\models\StoreMini;
  19. use app\models\StoreReOrder;
  20. use app\models\User;
  21. use app\models\SaasUser;
  22. use app\models\UserShareLog;
  23. use app\models\WechatConfig;
  24. use app\modules\alliance\behaviors\StoreAdmin;
  25. use EasyWeChat\Factory;
  26. use EasyWeChat\Kernel\BaseClient;
  27. use yii\base\Model;
  28. use yii\db\Expression;
  29. use app\models\OrderRefund;
  30. use app\modules\admin\models\StoreForm;
  31. use app\utils\ShareQrcode;
  32. use app\modules\admin\models\WechatThirdForm;
  33. use app\utils\WechatMerchant\Merchant;
  34. use app\models\District;
  35. use app\modules\admin\models\WechatMiniMerchantForm;
  36. use app\models\MerchantInfo;
  37. use app\models\Salesman;
  38. use app\modules\admin\models\AlipayThirdForm;
  39. class SalesmanNewStoreForm extends Model
  40. {
  41. public $saas_user_id;
  42. public $store_params_fields = [
  43. //是否餐饮行业(0否、1是)、微信渠道(0不启用、1启用)、支付宝渠道(0不启用、1启用)
  44. 'is_food','plat_wechat','plat_alipay',
  45. //商城logo
  46. 'store_logo',
  47. //门店logo、门店内环境、营业执照、资质证件、身份证正面、身份证反面
  48. 'md_logo', 'md_pic', 'license_copy', 'qualify', 'id_card_copy', 'id_card_national',
  49. //营业执照名称、主体类型(个体户SUBJECT_TYPE_INDIVIDUAL、企业SUBJECT_TYPE_ENTERPRISE、政府机关SUBJECT_TYPE_INSTITUTIONS、其他组织SUBJECT_TYPE_OTHERS)、企业代码类型( 1统一社会信用代码(18位)、2组织架构代码(9位xxxxxxxxxx-x)、3营业执照注册号(15位))、
  50. 'license_name', 'subject_type', 'code_type',
  51. //企业代码、营业执照长期(0否、1是)、营业执照有效期开始、营业执照有效期结束、营业执照是否三证合一(0否、1是)
  52. 'code', 'code_is_long', 'period_begin', 'period_end', 'is_composite',
  53. //小程序名称、法人姓名、法人身份证号、法人微信号、法人手机号
  54. 'mini_nickname', 'legal_persona_name', 'legal_persona_id_card_number', 'legal_persona_wechat', 'legal_persona_phone',
  55. //身份证长期有效(0否、1是)、身份证有效期开始、身份证有效期结束、身份证地址、联系邮箱
  56. 'card_is_long', 'card_period_begin', 'card_period_end', 'id_card_address', 'contact_email',
  57. //银行名称、银行开户行名称、账户类型(BANK_ACCOUNT_TYPE_CORPORATE对公、BANK_ACCOUNT_TYPE_PERSONAL个人)、银行账号名称、银行账号
  58. 'bank_name', 'bank_address_name', 'bank_account_type', 'bank_account_name', 'bank_account_no',
  59. //开户行地址编码(410311)、开户行地址编码列表(["410000", "410300", "410311"])、开户行地址列表["河南省", "洛阳市", "洛龙区"]
  60. 'bank_address_code', 'bank_address_code_list', 'bank_address_list',
  61. //门店小程序类目(B0043)、小程序类目(["XS1014_XS2111"])
  62. // 'md_mini_categoryId', 'mini_categoryIds',
  63. //门店区域({'province_id':"1506", 'city_id':"1507", 'district_id':"1508"})、门店地址描述、门店坐标lat、门店坐标lng
  64. 'md_area', 'md_address', 'md_location_lat', 'md_location_lng',
  65. //支付宝的邮箱帐号或手机号
  66. 'alipay_account',
  67. ];
  68. //业务员新建商家详情
  69. public function info($id) {
  70. $model = SalesmanNewStore::findOne(['salesman_saas_id' => $this->saas_user_id, 'id' => $id]);
  71. $bind = 0;
  72. $store_info = [];
  73. if($model['store_id']){
  74. $store = Store::findOne($model['store_id']);
  75. $store_info = [
  76. 'name' => $store->name,
  77. 'logo' => $store->logo,
  78. 'contact_tel' => $store->contact_tel,
  79. ];
  80. }else{
  81. $store_info = [
  82. 'name' => $model->getParams('mini_nickname'),
  83. 'logo' => $model->getParams('store_logo'),
  84. 'contact_tel' => $model->getParams('legal_persona_phone'),
  85. ];
  86. }
  87. $saas_user = null;
  88. if($model->store_id){
  89. $admin = Admin::findOne([
  90. 'type' => 'store',
  91. 'type_id' => $model->store_id,
  92. ]);
  93. if($admin->saas_user_id){
  94. $bind = 1;
  95. $saas_user_ = SaasUser::findOne($admin->saas_user_id);
  96. $saas_user = [
  97. 'name' => $saas_user_->name,
  98. 'avatar' => $saas_user_->avatar
  99. ];
  100. }
  101. }
  102. $extData = [];
  103. $model = $this->checkUpdatStatus($model, $extData);
  104. $store_params = json_decode($model->store_params, true);
  105. $store_info['is_food'] = $store_params['is_food'];
  106. $store_info['plat_alipay'] = $store_params['plat_alipay'];
  107. $store_info['plat_wechat'] = $store_params['plat_wechat'];
  108. return [
  109. 'code' => 0,
  110. 'data' => $model,
  111. 'bind' => $bind,
  112. 'store_info' => $store_info,
  113. 'saas_user' => $saas_user,
  114. 'mini_pay_sign_url' => $extData['mini_pay_sign_url'], //商户扫码验证
  115. ];
  116. }
  117. public function checkUpdatStatus($model, &$extData = []) {
  118. $mini_pay_sign_url = '';
  119. //更新微信小程序状态
  120. if(!empty($model->store_mini_id) && empty($model->store_mini_appid)){
  121. $form = new WechatThirdForm();
  122. $form->store_id = $model->store_id;
  123. $res = $form->getRegisterStatus($model->store_mini_id);
  124. $model->store_mini_errmsg = WechatThirdForm::staticGetZnMsg($res);
  125. $model->save();
  126. }
  127. //更新微信小程序基础信息状态
  128. if(!empty($model->store_mini_appid) && empty($model->store_mini_info)){
  129. $form = new WechatThirdForm();
  130. $form->store_id = $model->store_id;
  131. $res = $form->getMiniInfo('', $model->store_mini_appid);
  132. if($res['code'] == 0){
  133. $item = $res['store_mini'];
  134. if (!empty($item['signature']) && !empty($item['mini_url']) && !empty($item['mini_nickname'] && !empty($item['categories']))) {
  135. $model->store_mini_info = 1;
  136. $model->store_mini_info_errmsg = '已完成';
  137. $model->save();
  138. }
  139. }
  140. }
  141. //更新进件状态
  142. if($model->store_mini_pay_apply_id && empty($model->store_mini_pay_sub_mchid)){
  143. $Merchant = new Merchant();
  144. $pay_apply_info = $Merchant->queryApplyment($model->store_mini_pay_apply_id);
  145. debug_log([__METHOD__, $model->id, $pay_apply_info], __CLASS__ . '.log');
  146. if (!isset($pay_apply_info['code']) && !isset($pay_apply_info['msg'])) {
  147. if($pay_apply_info['applyment_state'] == 'APPLYMENT_STATE_TO_BE_SIGNED'){
  148. $mini_pay_sign_url = $pay_apply_info['sign_url'];
  149. }
  150. if($pay_apply_info['applyment_state_msg'] && $model->store_mini_pay_errmsg != $pay_apply_info['applyment_state_msg']){
  151. $model->store_mini_pay_errmsg = $pay_apply_info['applyment_state_msg'];
  152. if($pay_apply_info['applyment_state'] == 'APPLYMENT_STATE_FINISHED'){
  153. $model->store_mini_pay_sub_mchid = $pay_apply_info['sub_mchid'];
  154. $this->wxMiniPayIsUse($model);
  155. }
  156. $model->save();
  157. }
  158. }
  159. }
  160. //更新支付宝小程序状态
  161. if(!empty($model->store_ali_mini_id) && empty($model->store_ali_mini_appid)){
  162. $form = new AlipayThirdForm();
  163. $form->mini_id = $model->store_ali_mini_id;
  164. $getMiniShenheStatus = $form->getMiniShenheStatus($form->mini_id);
  165. if(is_object($getMiniShenheStatus)){
  166. if($getMiniShenheStatus->min_app_id){
  167. $model->store_ali_mini_appid = $getMiniShenheStatus->min_app_id;
  168. $model->store_ali_mini_errmsg = '已完成';
  169. $model->save();
  170. }
  171. if(!$getMiniShenheStatus->min_app_id && $getMiniShenheStatus->status == 'PROCESS' && $model->store_ali_mini_errmsg != '待确认'){
  172. $model->store_ali_mini_errmsg = '待确认';
  173. $model->save();
  174. }
  175. }
  176. }
  177. //更新支付宝当面付状态
  178. if(!empty($model->store_ali_mini_appid) && empty($model->store_ali_mini_pay)){
  179. $form = new AlipayThirdForm();
  180. $form->mini_id = $model->store_ali_mini_id;
  181. $signstatus = $form->signstatusOk($model->store_ali_mini_pid, 'I1011000100000000001');
  182. if($signstatus){
  183. $model->store_ali_mini_pay = 1;
  184. $model->store_ali_mini_pay_errmsg = '已完成';
  185. $model->save();
  186. }
  187. }
  188. //更新支付宝门店状态
  189. if(!empty($model->store_ali_mini_appid) && empty($model->store_ali_mini_shop_id)){
  190. $form = new AlipayThirdForm();
  191. $form->mini_id = $model->store_ali_mini_id;
  192. $antMerchantExpandShop = $form->antMerchantExpandShop();
  193. if(is_object($antMerchantExpandShop)){
  194. $model = SalesmanNewStore::findOne(['salesman_saas_id' => $this->saas_user_id, 'id' => $model->id]);
  195. }
  196. }
  197. $extData['mini_pay_sign_url'] = $mini_pay_sign_url;
  198. return $model;
  199. }
  200. //业务员新建商家
  201. public function save($id, $data, $type = 0) {
  202. $t = \Yii::$app->db->beginTransaction();
  203. if($data){
  204. if(is_string($data)){
  205. $data = json_decode($data, true);
  206. }
  207. foreach($this->store_params_fields as $k){
  208. if(!isset($data[$k])){
  209. return [
  210. 'code' => 1,
  211. 'msg' => '参数缺失,' . $k,
  212. ];
  213. }
  214. }
  215. }
  216. $msgExt = [];
  217. $model = $id ? SalesmanNewStore::findOne($id) : new SalesmanNewStore();
  218. $model->salesman_saas_id = $this->saas_user_id;
  219. if($data){
  220. $model->store_params = json_encode($data, JSON_UNESCAPED_UNICODE);
  221. }
  222. $model->type = $type;
  223. if(!$model->save()){
  224. return [
  225. 'code' => 1,
  226. 'msg' => '数据保存失败,' . array_shift($model->getFirstErrors()),
  227. ];
  228. }
  229. if($type == 0){
  230. $initSaasUser = $this->initSaasUser($model, $msgExt);
  231. if(isset($initSaasUser['code']) && $initSaasUser['code'] != 0){
  232. return $initSaasUser;
  233. }
  234. $saas_user = $initSaasUser['data'];
  235. $initStore = $this->initStore($model, $saas_user, $msgExt);
  236. if(isset($initStore['code']) && $initStore['code'] != 0){
  237. return $initStore;
  238. }
  239. $notRollback = 0;
  240. if($model->getParams('plat_wechat')){
  241. $wxFastRegisterMini = $this->wxFastRegisterMini($model);
  242. if(isset($wxFastRegisterMini['code']) &&$wxFastRegisterMini['code'] != 0){
  243. // $model->store_mini_errmsg = $wxFastRegisterMini['msg'];
  244. return $wxFastRegisterMini;
  245. }
  246. $notRollback = 1;
  247. }
  248. if($model->getParams('plat_alipay')){
  249. $isvCreateMini = $this->isvCreateMini($model);
  250. if(isset($isvCreateMini['code']) &&$isvCreateMini['code'] != 0){
  251. if($notRollback){
  252. $model->store_ali_mini_errmsg = $isvCreateMini['msg'];
  253. $model->save();
  254. }else{
  255. return $isvCreateMini;
  256. }
  257. }
  258. }
  259. }
  260. $t->commit();
  261. return [
  262. 'code' => 0,
  263. 'msg' => '操作成功。' . implode(',', $msgExt),
  264. 'data' => $model,
  265. ];
  266. }
  267. public function wxFastRegisterMini($model, &$msgExt = [], $refresh = 0){
  268. if(!empty($model->store_mini_id) && !$refresh){
  269. return;
  270. }
  271. $form = new WechatThirdForm();
  272. $form->store_id = $model->store_id;
  273. $form->name = $model->getParams('license_name');
  274. $form->code = $model->getParams('code');
  275. $form->code_type = $model->getParams('code_type');
  276. $form->legal_persona_wechat = $model->getParams('legal_persona_wechat');
  277. $form->license_pic = $model->getParams('license_copy');
  278. $form->legal_persona_name = $model->getParams('legal_persona_name');
  279. $res = $form->fastRegisterMini($refresh);
  280. debug_log([__METHOD__, $model->id, $refresh, $res], __CLASS__ . '.log');
  281. if($res['code'] == 0){
  282. $store_mini_id = $res['data'];
  283. $model->store_mini_id = $store_mini_id;
  284. $model->store_mini_errmsg = '注册审核中';
  285. if(!$model->save()){
  286. return [
  287. 'code' => 1,
  288. 'msg' => 'store_mini_id数据保存失败,' . array_shift($model->getFirstErrors()),
  289. ];
  290. }
  291. $msgExt[] = 'store_mini_id关联成功';
  292. }
  293. debug_log([__METHOD__, $model->id, $refresh, $msgExt], __CLASS__ . '.log');
  294. return $res;
  295. }
  296. public static function setMiniInfo($model, $refresh = 0){
  297. if(!empty($model->store_mini_info) && !$refresh){
  298. return;
  299. }
  300. if(!$model->store_mini_appid){
  301. return [
  302. 'code' => 1,
  303. 'msg' => '请先完成小程序创建',
  304. ];
  305. }
  306. $item = StoreMini::findOne($model->store_mini_id);
  307. $self = new self();
  308. $return = [
  309. 'code' => 0,
  310. 'msg' => '',
  311. ];
  312. if(empty($item['mini_nickname'])){
  313. $res = $self->setNickname($model);
  314. if($res['code'] != 0){
  315. $return['code'] = 1;
  316. $return['msg'] .= $res['msg'] . '。';
  317. }
  318. }
  319. if(empty($item['mini_url'])){
  320. $res = $self->setHeadImage($model);
  321. if($res['code'] != 0){
  322. $return['code'] = 1;
  323. $return['msg'] .= $res['msg'] . '。';
  324. }
  325. }
  326. if(empty($item['signature'])){
  327. $res = $self->setSignature($model);
  328. if($res['code'] != 0){
  329. $return['code'] = 1;
  330. $return['msg'] .= $res['msg'] . '。';
  331. }
  332. }
  333. if(empty($item['categories'])){
  334. $res = $self->addCategory($model);
  335. if($res['code'] != 0){
  336. $return['code'] = 1;
  337. $return['msg'] .= $res['msg'] . '。';
  338. }
  339. }
  340. $res = $return;
  341. if($res['code'] == 0){
  342. $model->store_mini_info = 1;
  343. $model->store_mini_info_errmsg = '已完成';
  344. }else{
  345. $model->store_mini_info_errmsg = $res['msg'];
  346. }
  347. $model->save();
  348. return $res;
  349. }
  350. /**
  351. * 修改头像
  352. */
  353. public function setHeadImage($model){
  354. $form = new WechatThirdForm();
  355. $form->mini_id = $model->store_mini_id;
  356. $form->head_img_media_id = $model->getParams('store_logo');
  357. $form->x1 = 0;
  358. $form->y1 = 0;
  359. $form->x2 = 1;
  360. $form->y2 = 1;
  361. $res = $form->setHeadImage();
  362. debug_log([__METHOD__, $model->id, $res], __CLASS__ . '.log');
  363. return $res;
  364. }
  365. /**
  366. * 设置名称
  367. * 使用各项media_id,设置名称
  368. */
  369. public function setNickname($model){
  370. $form = new WechatThirdForm();
  371. $form->mini_id = $model->store_mini_id;
  372. $form->mini_nickname = $model->getParams('mini_nickname');
  373. $form->id_card = $model->getParams('id_card_copy');
  374. $form->license = $model->getParams('license_copy');
  375. $res = $form->setMiniNianname();
  376. debug_log([__METHOD__, $model->id, $res], __CLASS__ . '.log');
  377. return $res;
  378. }
  379. /**
  380. * 修改简介
  381. */
  382. public function setSignature($model){
  383. $form = new WechatThirdForm();
  384. $form->mini_id = $model->store_mini_id;
  385. $form->signature = $model->getParams('mini_nickname');
  386. $res = $form->setSignature();
  387. debug_log([__METHOD__, $model->id, $res], __CLASS__ . '.log');
  388. return $res;
  389. }
  390. /**
  391. * 添加类目
  392. */
  393. public function addCategory($model){
  394. $form = new WechatThirdForm();
  395. $form->mini_id = $model->store_mini_id;
  396. if($model->getParams('is_food')){
  397. $form->categories = [
  398. [
  399. 'first' => '220',
  400. 'second' => '632',
  401. 'certicates' => [
  402. [
  403. 'key' => '食品经营许可证',
  404. 'value' => $model->getParams('qualify'),
  405. ]
  406. ],
  407. ],
  408. ];
  409. }else{
  410. $form->categories = [
  411. [
  412. 'first' => '287',
  413. 'second' => '298',
  414. ],
  415. [
  416. 'first' => '150',
  417. 'second' => '670',
  418. ]
  419. ];
  420. }
  421. $res = $form->addCategory();
  422. return $res;
  423. }
  424. public function initSaasUser($model, &$msgExt = []) {
  425. $phone = $model->getParams('legal_persona_phone');
  426. $saas_user = SaasUser::find()->where(['mobile' => $phone, 'is_delete' => 0])->one();
  427. if (!$saas_user) {
  428. $saas_user = new SaasUser();
  429. $saas_user->access_token = \Yii::$app->security->generateRandomString();
  430. $saas_user->name = substr_replace($phone, '******', 3, 6);
  431. $saas_user->mobile = $phone;
  432. $saas_user->bytedance_open_id = '';
  433. $saas_user->platform_open_id = '';
  434. $saas_user->avatar = \Yii::$app->request->hostInfo . \Yii::$app->request->baseUrl . '/web/v1/statics/images/avatar.png';
  435. $saas_user->store_id = -1;
  436. if(!$saas_user->save()){
  437. return [
  438. 'code' => 1,
  439. 'msg' => 'saas_user数据保存失败,' . array_shift($saas_user->getFirstErrors()),
  440. ];
  441. }
  442. $msgExt[] = 'saas_user创建成功';
  443. }
  444. return [
  445. 'code' => 0,
  446. 'data' => $saas_user,
  447. ];
  448. }
  449. public function initStore($model, $saas_user, &$msgExt = []) {
  450. if(!empty($model->store_id)){
  451. return;
  452. }
  453. $phone = $model->getParams('legal_persona_phone');
  454. $area = $model->getParams('md_area');
  455. $form = new StoreForm();
  456. $storeAdd = $form->add($model->getParams('mini_nickname'), '', 'cyy'.$phone, $area, 0);
  457. if($storeAdd['code'] != 0){
  458. return $storeAdd;
  459. }
  460. $msgExt[] = 'store创建成功';
  461. $model->store_id = $storeAdd['store']['id'];
  462. if(!$model->save()){
  463. return [
  464. 'code' => 1,
  465. 'msg' => 'store_id数据保存失败,' . array_shift($model->getFirstErrors()),
  466. ];
  467. }
  468. $store = Store::findOne($storeAdd['store']['id']);
  469. $salesman = Salesman::findOne(['saas_user_id' => $model->salesman_saas_id, 'is_delete' => 0]);
  470. $store->salesman_id = $salesman->id;
  471. if(!$store->save()){
  472. return [
  473. 'code' => 1,
  474. 'msg' => 'store_id数据保存失败,' . json_encode($store->errors, JSON_UNESCAPED_UNICODE),
  475. ];
  476. }
  477. $msgExt[] = 'store_id关联成功';
  478. $this->upStore($model);
  479. }
  480. public function upStore($model) {
  481. debug_log([__METHOD__, $model->id], __CLASS__ . '.log');
  482. Option::setGroup('store', [
  483. [
  484. 'name' => 'logo',
  485. 'value' => $model->getParams('store_logo'),
  486. ],
  487. [
  488. 'name' => 'coordinate',
  489. 'value' => $model->getParams('md_location_lat') . ',' . $model->getParams('md_location_lng'),
  490. ],
  491. [
  492. 'name' => 'address_info',
  493. 'type' => 'address_info',
  494. 'value' => [
  495. "province_id" => $model->getParams('md_area')['province_id'],
  496. "city_id" => $model->getParams('md_area')['city_id'],
  497. "district_id" => $model->getParams('md_area')['district_id']
  498. ],
  499. ],
  500. [
  501. 'name' => 'address',
  502. 'value' => $model->getParams('md_address'),
  503. ],
  504. [
  505. 'name' => 'contact_tel',
  506. 'value' => $model->getParams('legal_persona_phone'),
  507. ],
  508. ], $model->store_id);
  509. \app\modules\admin\models\SettingForm::staticUpStore($model->store_id);
  510. }
  511. public static function wechatPush($msg, $store_mini) {
  512. debug_log([__METHOD__, $msg, $store_mini->id], __CLASS__ . '.log');
  513. $model = SalesmanNewStore::findOne(['store_mini_id' => $store_mini->id]);
  514. if(!$model){
  515. return;
  516. }
  517. if(!$msg['appid']){
  518. $msg['errcode'] = $msg['status'];
  519. $msg['errmsg'] = $msg['msg'];
  520. $model->store_mini_errmsg = WechatThirdForm::staticGetZnMsg($msg);
  521. }else{
  522. $model->store_mini_errmsg = '注册成功';
  523. $model->store_mini_appid = $msg['appid'];
  524. }
  525. if(!$model->save()){
  526. \Yii::error([__METHOD__, $msg, $store_mini->id, array_shift($model->getFirstErrors())]);
  527. }
  528. if($msg['appid']){
  529. $form = new self();
  530. $wechatPayApply = $form->wechatPayApply($model);
  531. $setMiniInfo = self::setMiniInfo($model);
  532. }
  533. }
  534. //微信进件
  535. public function wechatPayApply($model, $refresh = 0) {
  536. if(!empty($model->store_mini_pay_apply_id) && !$refresh){
  537. return;
  538. }
  539. if($refresh && !$model->store_mini_appid){
  540. return [
  541. 'code' => 1,
  542. 'msg' => '请先完成小程序创建',
  543. ];
  544. }
  545. $Merchant = new Merchant();
  546. $contact_info = [
  547. "contact_name" => $model->getParams('legal_persona_name'),
  548. "contact_id_number" => $model->getParams('legal_persona_id_card_number'),
  549. "mobile_phone" => $model->getParams('legal_persona_phone'),
  550. "contact_email" => $model->getParams('contact_email'),
  551. ];
  552. $subject_info = [
  553. "subject_type" => $model->getParams('subject_type'),
  554. "business_license_info" => [
  555. "license_copy" => $model->getParams('license_copy'),
  556. "license_number" => $model->getParams('code'),
  557. "merchant_name" => $model->getParams('license_name'),
  558. "legal_person" => $model->getParams('legal_persona_name'),
  559. "period_end" => $model->getParams('code_is_long') ? '长期' : $model->getParams('period_end'),
  560. "is_long" => $model->getParams('code_is_long'),
  561. "period_begin" => $model->getParams('period_begin'),"2022-12-14"
  562. ],
  563. "organization_info" => [
  564. "is_composite" => 1,
  565. "organization_copy" => "",
  566. "organization_code" => "",
  567. "org_period_begin" => "",
  568. "org_period_end" => "",
  569. "is_long" => 0
  570. ],
  571. "certificate_info" => [
  572. "is_long" => 0,
  573. "cert_copy" => "",
  574. "cert_type" => "",
  575. "cert_number" => "",
  576. "merchant_name" => "",
  577. "company_address" => "",
  578. "legal_person" => "",
  579. "period_begin" => "",
  580. "period_end" => ""
  581. ],
  582. "identity_info" => [
  583. "is_long" => 0,
  584. "id_doc_type" => "IDENTIFICATION_TYPE_IDCARD",
  585. "id_card_info" => [
  586. "id_card_copy" => $model->getParams('id_card_copy'),
  587. "id_card_national" => $model->getParams('id_card_national'),
  588. "id_card_name" => $model->getParams('legal_persona_name'),
  589. "id_card_number" => $model->getParams('legal_persona_id_card_number'),
  590. "card_period_begin" => $model->getParams('card_period_begin'),
  591. "card_period_end" => $model->getParams('card_is_long') ? '长期' : $model->getParams('card_period_end'),
  592. "id_card_address" => $model->getParams('id_card_address'),
  593. ],
  594. "id_doc_info" => [
  595. "id_doc_copy" => "",
  596. "id_doc_name" => "",
  597. "id_doc_number" => "",
  598. "doc_period_begin" => "",
  599. "doc_period_end" => ""
  600. ],
  601. "owner" => true
  602. ]
  603. ];
  604. $business_info = [
  605. "merchant_shortname" => $model->getParams('mini_nickname'),
  606. "service_phone" => $model->getParams('legal_persona_phone'),
  607. "sales_info" => [
  608. "sales_scenes_type" => [
  609. "SALES_SCENES_MINI_PROGRAM"
  610. ],
  611. "mini_program_info" => [
  612. "mini_program_sub_appid" => $model->store_mini_appid
  613. ]
  614. ]
  615. ];
  616. $bank_account_info = [
  617. "bank_account_type" => $model->getParams('bank_account_type'),
  618. "account_name" => $model->getParams('bank_account_name'),
  619. "account_bank" => $model->getParams('bank_name'),
  620. "bank_name" => $model->getParams('bank_address_name'),
  621. "code_list" => $model->getParams('bank_address_code_list'),
  622. "address_list" => $model->getParams('bank_address_list'),
  623. "account_number" => $model->getParams('bank_account_no'),
  624. "bank_address_code" => $model->getParams('bank_address_code'),
  625. ];
  626. $Merchant->submitErrRollback = 1;
  627. $res = $Merchant->submit($contact_info, $subject_info, $business_info, $bank_account_info, 0, $model->store_mini_appid, $model->store_id);
  628. debug_log([__METHOD__, $model->id, $res], __CLASS__ . '.log');
  629. if($res['code'] == 0){
  630. $merchant_info = $res['data'];
  631. $model->store_mini_pay_apply_id = $merchant_info->applyment_id;
  632. $model->store_mini_pay_errmsg = '审核中';
  633. }else{
  634. $model->store_mini_pay_errmsg = $res['msg'];
  635. }
  636. $model->save();
  637. return $res;
  638. }
  639. // 微信进件开始使用/暂停使用
  640. public function wxMiniPayIsUse($model){
  641. try{
  642. $count = MerchantInfo::find()->where(['bind_store_id' => $model->store_id, 'is_delete' => 0])->count();
  643. if($count == 0 || $count >= 2){
  644. return;
  645. }
  646. $merchantInfo = MerchantInfo::findOne(['applyment_id' => $model->store_mini_pay_apply_id, 'bind_store_id' => $model->store_id, 'is_delete' => 0]);
  647. if($merchantInfo && $merchantInfo->is_use == 2){
  648. $form = new WechatMiniMerchantForm();
  649. $form->id = $merchantInfo->id;
  650. $form->is_use = 1;
  651. $res = $form->unbind();
  652. return $res;
  653. }
  654. } catch (Exception $ex) {
  655. }
  656. }
  657. //业务员新建商家列表
  658. public function getList($type = 0, $data = []) {
  659. $query = SalesmanNewStore::find()->where(['is_delete' => 0, 'salesman_saas_id' => $this->saas_user_id]);
  660. if($type > -1){
  661. $query->andWhere(['type' => $type]);
  662. }
  663. if(isset($data['begin_time']) && $data['begin_time'] > -1){
  664. $query->andWhere(['>', 'created_at', strtotime($data['begin_time'])]);
  665. }
  666. if(isset($data['end_time']) && $data['end_time'] > -1){
  667. $query->andWhere(['<', 'created_at', strtotime($data['end_time'])]);
  668. }
  669. //audit_statuc
  670. if(isset($data['audit_statuc']) && $data['audit_statuc'] > -1){
  671. //审核完成
  672. if($data['audit_statuc'] == 1){
  673. $query->andWhere([
  674. 'and',
  675. 'JSON_EXTRACT(store_params, "$.plat_wechat") = 1',
  676. ['>', 'store_mini_appid', 0],
  677. ['>', 'store_mini_pay_sub_mchid', 0],
  678. ]);
  679. $query->andWhere([
  680. 'and',
  681. 'JSON_EXTRACT(store_params, "$.plat_alipay") = 1',
  682. ['>', 'store_ali_mini_appid', 0],
  683. ['>', 'store_ali_mini_shop_id', 0],
  684. ]);
  685. }
  686. //审核中
  687. if($data['audit_statuc'] == 3){
  688. $query->andWhere([
  689. 'or',
  690. ['=', 'store_mini_appid', 0],
  691. ['=', 'store_mini_pay_sub_mchid', 0],
  692. ['=', 'store_ali_mini_appid', 0],
  693. ['=', 'store_ali_mini_shop_id', 0],
  694. ]);
  695. }
  696. }
  697. if(isset($data['is_food']) && $data['is_food'] > -1){
  698. if($data['is_food'] == 1){
  699. $query->andWhere('JSON_EXTRACT(store_params, "$.is_food") = 1');
  700. }else{
  701. $query->andWhere('JSON_EXTRACT(store_params, "$.is_food") = 0');
  702. }
  703. }
  704. if(isset($data['plat_wechat']) && $data['plat_wechat'] > -1){
  705. if($data['plat_wechat'] == 1){
  706. $query->andWhere('JSON_EXTRACT(store_params, "$.plat_wechat") = 1');
  707. }else{
  708. $query->andWhere('JSON_EXTRACT(store_params, "$.plat_wechat") = 0');
  709. }
  710. }
  711. if(isset($data['plat_alipay']) && $data['plat_alipay'] > -1){
  712. if($data['plat_alipay'] == 1){
  713. $query->andWhere('JSON_EXTRACT(store_params, "$.plat_alipay") = 1');
  714. }else{
  715. $query->andWhere('JSON_EXTRACT(store_params, "$.plat_alipay") = 0');
  716. }
  717. }
  718. if(isset($data['sort_time']) && $data['sort_time'] > -1){
  719. if($data['sort_time'] == 1){
  720. $query->orderBy('created_at ASC');
  721. }else{
  722. $query->orderBy('created_at DESC');
  723. }
  724. }
  725. if(isset($data['store_name']) && $data['store_name']){
  726. $querystore_name = (new \yii\db\Query())->select('id')->from(Store::tableName())->where(['like', 'name', trim($data['store_name'])]);
  727. $query->andWhere(['store_id' => $querystore_name]);
  728. }
  729. debug_log($query->createCommand()->getRawSql(), 'sal.log');
  730. $list = pagination_make($query);
  731. foreach($list['list'] as &$item){
  732. if($item['store_id']){
  733. $store = Store::findOne($item['store_id']);
  734. $item['store_info'] = [
  735. 'name' => $store->name,
  736. 'logo' => $store->logo,
  737. 'contact_tel' => $store->contact_tel,
  738. ];
  739. }else{
  740. $store_params = json_decode($item['store_params'], true);
  741. $item['store_info'] = [
  742. 'name' => $store_params['mini_nickname'] ?? '',
  743. 'logo' => $store_params['store_logo'] ?? '',
  744. 'contact_tel' => $store_params['legal_persona_phone'] ?? '',
  745. ];
  746. }
  747. unset($item['store_params']);
  748. }
  749. return [
  750. 'code' => 0,
  751. 'data' => $list,
  752. 'msg' => 'ok',
  753. 'q' => $query->createCommand()->getRawSql(),
  754. ];
  755. }
  756. //业务员新建商家绑定商户二维码
  757. public function qr($id) {
  758. $model = SalesmanNewStore::findOne(['salesman_saas_id' => $this->saas_user_id, 'id' => $id]);
  759. $_time = microtime(true);
  760. $cacheKey = 'SalesmanNewStore_qr' . $_time;
  761. $cacheV = [
  762. 'salesman_saas_id' => $this->saas_user_id,
  763. 'store_id' => $model->store_id,
  764. 'id' => $model->id,
  765. ];
  766. cache()->set($cacheKey, $cacheV, 120);
  767. $scene = "cyyk:" . $_time;
  768. $res = ShareQrcode::wxQrcode('pages/index/index', $scene, 600, true, true);
  769. // $res = ShareQrcode::wxQrcode('salesman/salesman/applyShop', $scene, 600, true, true);
  770. if (isset($res['code']) && $res['code'] == 1) {
  771. return $res;
  772. }
  773. return [
  774. 'code' => 0,
  775. 'data' => [
  776. 'qr_url' => $res['url_path']
  777. ]
  778. ];
  779. }
  780. //业务员新建商家扫码绑定商户(商户扫码)
  781. public function qrBind($id = 0) {
  782. $_time = post_params('cyyk', 0);
  783. $cacheKey = 'SalesmanNewStore_qr' . $_time;
  784. $cache = cache()->get($cacheKey);
  785. if(!$cache){
  786. return [
  787. 'code' => 1,
  788. 'msg' => '参数错误,请重新扫码',
  789. ];
  790. }
  791. $id = $cache['id'];
  792. $salesman_saas_id = $cache['salesman_saas_id'];
  793. $store_id = $cache['store_id'];
  794. $model = SalesmanNewStore::findOne(['salesman_saas_id' => $salesman_saas_id, 'id' => $id]);
  795. $store_id = $model->store_id;
  796. $form = new StoreForm();
  797. $setPassword = $form->setPassword($store_id, '', '', '', $this->saas_user_id);
  798. if($setPassword['code'] != 0){
  799. return $setPassword;
  800. }
  801. cache()->delete($cacheKey);
  802. return [
  803. 'code' => 0,
  804. 'msg' => 'ok',
  805. ];
  806. }
  807. //支付宝
  808. //快速注册小程序
  809. public function isvCreateMini($model, &$msgExt = [], $refresh = 0){
  810. if(!empty($model->store_ali_mini_id) && !$refresh){
  811. return;
  812. }
  813. $form = new AlipayThirdForm();
  814. $form->bind_store_id = $model->store_id;
  815. $form->alipay_account = $model->getParams('alipay_account');
  816. $form->legal_personal_name = $model->getParams('legal_persona_name');
  817. $form->license_name = $model->getParams('license_name');
  818. $form->license_no = $model->getParams('code');
  819. $form->license_pic = $model->getParams('license_copy');
  820. $form->AppName = $model->getParams('mini_nickname');
  821. $form->ServicePhone = $model->getParams('legal_persona_phone');
  822. $form->contact_name = $model->getParams('legal_persona_name');
  823. $res = $form->isvCreateMini();
  824. debug_log([__METHOD__, $model->id, $res], __CLASS__ . '.log');
  825. if($res['code'] == 0){
  826. $store_mini_id = $res['id'];
  827. $model->store_ali_mini_id = $store_mini_id;
  828. $model->store_ali_mini_errmsg = '注册审核中';
  829. if(!$model->save()){
  830. return [
  831. 'code' => 1,
  832. 'msg' => 'store_ali_mini_id数据保存失败,' . array_shift($model->getFirstErrors()),
  833. ];
  834. }
  835. $msgExt[] = 'store_ali_mini_id关联成功';
  836. }
  837. debug_log([__METHOD__, $model->id, $msgExt], __CLASS__ . '.log');
  838. return $res;
  839. }
  840. public static function aliPush($msg, $store_ali_mini) {
  841. debug_log([__METHOD__, $msg, $store_ali_mini->id], __CLASS__ . '.log');
  842. $model = SalesmanNewStore::findOne(['store_ali_mini_id' => $store_ali_mini->id]);
  843. if(!$model){
  844. return;
  845. }
  846. if(!$msg['min_app_id']){
  847. $model->store_ali_mini_errmsg = '商家拒绝或超时';
  848. }else{
  849. $model->store_ali_mini_errmsg = '注册成功';
  850. $model->store_ali_mini_appid = $msg['min_app_id'];
  851. $model->store_ali_mini_pid = $msg['pid'];
  852. $form = new self();
  853. $signFaceToFace = $form->signFaceToFace($model);
  854. $aliCreatedShop = $form->aliCreatedShop($model);
  855. }
  856. if(!$model->save()){
  857. \Yii::error([__METHOD__, $msg, $store_ali_mini->id, array_shift($model->getFirstErrors())]);
  858. }
  859. }
  860. public static function aliPushFaceToFace($msg, $store_ali_mini) {
  861. debug_log([__METHOD__, $msg, $store_ali_mini->id], __CLASS__ . '.log');
  862. $model = SalesmanNewStore::findOne(['store_ali_mini_id' => $store_ali_mini->id]);
  863. if(!$model){
  864. return;
  865. }
  866. $status = $msg->order_status;
  867. switch ($status) {
  868. case "MERCHANT_INFO_HOLD": //异常单 4
  869. $store_ali_mini_pay_errmsg = '异常单';
  870. break;
  871. case "MERCHANT_AUDITING": //审核中 3
  872. $store_ali_mini_pay_errmsg = '审核中';
  873. break;
  874. case "MERCHANT_CONFIRM": //待确认 5
  875. $store_ali_mini_pay_errmsg = '待确认';
  876. break;
  877. case "MERCHANT_CONFIRM_SUCCESS": //商户确认成功 6
  878. $store_ali_mini_pay_errmsg = '商户确认成功';
  879. break;
  880. case "MERCHANT_CONFIRM_TIME_OUT": //商户超时未确认 7
  881. $store_ali_mini_pay_errmsg = '商户超时未确认';
  882. break;
  883. case "MERCHANT_APPLY_ORDER_CANCELED": //审核失败或商户拒绝 8
  884. $store_ali_mini_pay_errmsg = '审核失败或商户拒绝';
  885. break;
  886. }
  887. if($store_ali_mini_pay_errmsg != $model->store_ali_mini_pay_errmsg){
  888. $model->store_ali_mini_pay_errmsg = $store_ali_mini_pay_errmsg;
  889. if(!$model->save()){
  890. \Yii::error([__METHOD__, $msg, $store_ali_mini->id, array_shift($model->getFirstErrors())]);
  891. }
  892. }
  893. }
  894. public static function aliPushAntShop($msg, $store_ali_mini) {
  895. debug_log([__METHOD__, $msg, $store_ali_mini->id], __CLASS__ . '.log');
  896. $model = SalesmanNewStore::findOne(['store_ali_mini_id' => $store_ali_mini->id]);
  897. if(!$model || $model->store_ali_mini_shop_id){
  898. return;
  899. }
  900. $shop_id = $msg->shop_id;
  901. $model->store_ali_mini_shop_id = $shop_id;
  902. $model->store_ali_mini_shop_errmsg = '创建成功';
  903. if(!$model->save()){
  904. \Yii::error([__METHOD__, $msg, $store_ali_mini->id, array_shift($model->getFirstErrors())]);
  905. }
  906. }
  907. //签约当面付
  908. public function signFaceToFace($model, $refresh = 0){
  909. if(!empty($model->store_ali_mini_shop_id) && !$refresh){
  910. return;
  911. }
  912. if(!$model->store_ali_mini_appid){
  913. return [
  914. 'code' => 1,
  915. 'msg' => '请先完成小程序创建',
  916. ];
  917. }
  918. debug_log([__METHOD__, $model->id], __CLASS__ . '.log');
  919. $form = new AlipayThirdForm();
  920. $form->mini_id = $model->store_ali_mini_id;
  921. $form->params_data = [
  922. "alipay_account" => $model->getParams('alipay_account'),
  923. "contact_name" => $model->getParams('license_name'),
  924. "service_phone" => $model->getParams('legal_persona_phone'),
  925. "service_email" => $model->getParams('contact_email'),
  926. "app_logo" => $model->getParams('md_logo'),
  927. ];
  928. $res = $form->agentCreate($model->store_ali_mini_id);
  929. debug_log([__METHOD__, $model->id, $res], __CLASS__ . '.log');
  930. if($res['code'] == 0){
  931. $model->store_ali_mini_pay_errmsg = '审核中';
  932. }else{
  933. $model->store_ali_mini_pay_errmsg = $res['msg'];
  934. }
  935. $model->save();
  936. return $res;
  937. }
  938. //params_data mini_id 创建门店
  939. public function aliCreatedShop($model, $refresh = 0)
  940. {
  941. if(!empty($model->store_ali_mini_shop_id) && !$refresh){
  942. return;
  943. }
  944. if(!$model->store_ali_mini_appid){
  945. return [
  946. 'code' => 1,
  947. 'msg' => '请先完成小程序创建',
  948. ];
  949. }
  950. debug_log([__METHOD__, $model->id], __CLASS__ . '.log');
  951. $form = new AlipayThirdForm();
  952. $form->mini_id = $model->store_ali_mini_id;
  953. $form->attributes = [
  954. "mini_id" => $model->store_ali_mini_id,
  955. "params_data" => [
  956. "business_address" => [
  957. "city_code" => District::getAdcodeById($model->getParams('md_area')['city_id']),
  958. "district_code" => District::getAdcodeById($model->getParams('md_area')['district_id']),
  959. "province_code" => District::getAdcodeById($model->getParams('md_area')['province_id']),
  960. "longitude" => $model->getParams('md_location_lng'),
  961. "latitude" => $model->getParams('md_location_lat'),
  962. "address" => $model->getParams('md_address'),
  963. ],
  964. "store_id" => "",
  965. "shop_category" => ["A0002","B0043"],
  966. "shop_name" => $model->getParams('license_name'),
  967. "shop_type" => "01",
  968. "qualifications" => [
  969. "industry_qualification_image" => "",
  970. "industry_qualification_type" => ""
  971. ],
  972. "out_door_images" => $model->getParams('md_logo'),
  973. ]
  974. ];
  975. $res = $form->AntMerchantExpandShopCreate();
  976. debug_log([__METHOD__, $model->id, $res], __CLASS__ . '.log');
  977. if($res['code'] == 0){
  978. $model->store_ali_mini_shop_errmsg = '审核中';
  979. }else{
  980. $model->store_ali_mini_shop_errmsg = $res['msg'];
  981. }
  982. $model->save();
  983. return $res;
  984. }
  985. }