Member.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <?php
  2. /**
  3. * 会员服务
  4. */
  5. namespace app\weixin\service;
  6. use app\weixin\model\AccountLog;
  7. use app\weixin\model\Complain;
  8. use app\weixin\model\UserBalanceLog;
  9. use app\weixin\model\UserProfile;
  10. use app\weixin\model\Member as MemberModel;
  11. use app\weixin\model\Wechat;
  12. use think\Db;
  13. class Member
  14. {
  15. /**
  16. * 会员信息认证审核
  17. * @param $userId 用户ID
  18. * @param $status 审核状态:2-成功,3-失败
  19. * @param string $scene 审核类型:idcard-身份证,education-学历,position-职业/工作
  20. * @param string $failRemark 审核失败原因
  21. * @return array|int
  22. */
  23. public static function checkAuth($userId, $status, $scene='idcard', $failRemark=''){
  24. try {
  25. // 验证认证信息是否存在
  26. $field = 'id,userid,idcard,idcard_check,education_check,position_check';
  27. $info = UserProfile::getInfo(['userid'=> $userId],$field);
  28. if(empty($info)){
  29. return 2122;
  30. }
  31. if(!in_array($status, [2,3])){
  32. return 2127;
  33. }
  34. //var_dump($info);
  35. // 审核处理
  36. $sceneNames = ['idcard'=>'身份证','education'=> '学历','position'=> '工作'];
  37. switch($scene){
  38. case 'idcard': // 身份认证审核
  39. // 验证状态
  40. $idcardCheck = isset($info['idcard_check'])? intval($info['idcard_check']) : 0;
  41. if($idcardCheck != 0 && $idcardCheck != 1 && $status == 2){
  42. return 2123;
  43. }
  44. $data = [
  45. 'idcard_check'=> $status,
  46. 'idcard_fail'=> $failRemark? trim($failRemark) : '',
  47. ];
  48. break;
  49. case 'education': // 学历认证审核
  50. // 验证状态
  51. $educationCheck = isset($info['education_check'])? intval($info['education_check']) : 0;
  52. if($educationCheck != 0 && $educationCheck != 1 && $status == 2){
  53. return 2123;
  54. }
  55. $data = [
  56. 'education_check'=> $status,
  57. 'education_fail'=> $failRemark? trim($failRemark) : '',
  58. ];
  59. break;
  60. case 'position': // 工作认证审核
  61. // 验证状态
  62. $positionCheck = isset($info['position_check'])? intval($info['position_check']) : 0;
  63. if($positionCheck != 0 && $positionCheck != 1 && $status == 2){
  64. return 2123;
  65. }
  66. $data = [
  67. 'position_check'=> $status,
  68. 'position_fail'=> $failRemark? trim($failRemark) : '',
  69. ];
  70. break;
  71. default:
  72. return 2126;
  73. break;
  74. }
  75. // 更新数据处理
  76. Db::startTrans();
  77. if(!UserProfile::saveData(['userid'=> $userId], $data)){
  78. Db::rollback();
  79. return 2125;
  80. }
  81. // 审核通过奖励处理
  82. $remark = '';
  83. $sceneName = isset($sceneNames[$scene])? $sceneNames[$scene] : '信息';
  84. $field = 'id,openid,user_nickname,real_name,redheart';
  85. $memberInfo = MemberModel::getInfo(['id'=> $userId], $field);
  86. if($status == 2){
  87. // 身份认证更新生日
  88. $idcard = isset($info['idcard'])? trim($info['idcard']) : '';
  89. if($scene == 'idcard' && $idcard){
  90. $birthday = substr($idcard, 6,8);
  91. $birthday = substr($birthday,0,4).'-'.substr($birthday,4,2).'-'.substr($birthday,6,2);
  92. $birthday = $birthday? strtotime($birthday) : 0;
  93. if($birthday){
  94. MemberModel::saveData(['id'=> $userId], ['birthday'=> $birthday]);
  95. }
  96. }
  97. $siteInfo = cmf_get_site_info();
  98. $awardNum = isset($siteInfo[$scene.'_award_redheart'])? intval($siteInfo[$scene.'_award_redheart']) : 0;
  99. if($awardNum){
  100. $redheart = isset($memberInfo['redheart'])? intval($memberInfo['redheart']) : 0;
  101. if(!MemberModel::saveData(['id'=> $userId], ['redheart'=> intval($redheart + $awardNum)])){
  102. Db::rollback();
  103. return 2125;
  104. }
  105. // 账户明细
  106. $remark = "{$sceneName}认证成功奖励{$awardNum}个爱心";
  107. $accountData = [
  108. 'type' => 4,
  109. 'account_type' => 1,
  110. 'change_type' => 1,
  111. 'user_id' => $userId,
  112. 'money' => $awardNum,
  113. 'balance' => $redheart,
  114. 'created_at' => date('Y-m-d H:i:s'),
  115. 'remark' => "{$sceneName}认证成功奖励{$awardNum}个爱心",
  116. ];
  117. AccountLog::insertGetId($accountData);
  118. }
  119. }
  120. Db::commit();
  121. // 推送审核信息
  122. $openid = isset($memberInfo['openid'])? $memberInfo['openid'] : '';
  123. if ($openid) {
  124. $realname = isset($memberInfo['real_name']) ? $memberInfo['real_name'] : '';
  125. $checkTime = date('Y.m.d H:i');
  126. $remark = $status==2? "感谢您的使用,点击进入公众号,遇见一段爱情!" : '请修改后重新提交';
  127. $params = [
  128. 'title' => $status==2? "恭喜!您的{$sceneName}认证已经通过审核!\n\n审核时间:\t{$checkTime}" : $failRemark."\n\n审核时间:\t{$checkTime}",
  129. 'remark' => $remark,
  130. 'type' => 'auth',
  131. 'keywords' => [
  132. /*'keyword1' => [
  133. 'value' => $realname,
  134. 'color' => '#173177',
  135. ],*/
  136. 'keyword1' => [
  137. 'value' => "{$sceneName}认证",
  138. 'color' => '#173177',
  139. ],
  140. 'keyword2' => [
  141. 'value' => $status==2? '审核通过' : '认证失败',
  142. 'color' => '#173177',
  143. ],
  144. ],
  145. 'url' => $status==2? url('/weixin/match/index', '', '', true) : url('/weixin/auth/' . $scene, '', '', true),
  146. ];
  147. PRedis::set('auths:message:u_'.$userId, ['result' => $memberInfo, 'params' => $params], 600);
  148. Wechat::sendTplMsg($openid, $params);
  149. }
  150. // 认证分销收益结算
  151. $inviteInfo = MemberModel::getInviteInfo($userId);
  152. $inviteId = isset($inviteInfo['invite_id'])? $inviteInfo['invite_id'] : 0;
  153. if($inviteInfo && $inviteId>0){
  154. PRedis::set('markets:auth:entry' . $scene, ['inviteInfo'=> $inviteInfo, 'memberInfo' => $memberInfo], 7200);
  155. $types = ['idcard'=> 5, 'education'=> 6, 'position'=> 7];
  156. $type = isset($types[$scene])? $types[$scene] : 0;
  157. if($type && !UserBalanceLog::checkHasMarket($inviteId, $userId, $type)){
  158. Award::marketAward($inviteId, $userId, $type);
  159. }
  160. }
  161. return ['id'=> $userId];
  162. } catch (\Exception $exception){
  163. // var_dump($exception);
  164. return 1015;
  165. }
  166. }
  167. /**
  168. * 投诉用户审核奖励
  169. * @param $userId 举报用户ID
  170. * @param array $info 举报数据:至少含举报用户、被举报用户、举报类型、举报内容、举报时间
  171. * @return array|false
  172. * @throws \think\Exception
  173. * @throws \think\db\exception\DataNotFoundException
  174. * @throws \think\db\exception\ModelNotFoundException
  175. * @throws \think\exception\DbException
  176. * @throws \think\exception\PDOException
  177. */
  178. public static function checkComplain($userId, $info = [])
  179. {
  180. $cid = isset($info['id'])? $info['id'] : 0;
  181. if(empty($cid) || Complain::where(['id'=> $cid])->value('status') != 1){
  182. return false;
  183. }
  184. $userInfo = MemberModel::where(['id' => $userId, 'user_status' => 1])
  185. ->field('id,user_login,user_nickname,openid,redheart')
  186. ->find();
  187. $nickname = isset($userInfo['user_nickname']) ? $userInfo['user_nickname'] : '';
  188. $redheart = isset($userInfo['redheart']) ? floatval($userInfo['redheart']) : 0;
  189. if (empty($userInfo)) {
  190. return false;
  191. }
  192. $siteInfo = cmf_get_site_info();
  193. $awardNum = isset($siteInfo['complain_award_redheart']) ? intval($siteInfo['complain_award_redheart']) : 0;
  194. if ($awardNum > 0) {
  195. $cuid = isset($info['c_uid'])? $info['c_uid'] : 0;
  196. $cUserInfo = MemberModel::alias('u')
  197. ->leftJoin('sg_user_profile sp','sp.userid=u.id')
  198. ->where(['u.id' => $cuid, 'u.user_status' => 1])
  199. ->field('u.id,u.openid,u.user_login,u.user_nickname,u.openid,u.redheart,sp.wechat_code')
  200. ->find();
  201. if (empty($cUserInfo)){
  202. return false;
  203. }
  204. // 更新状态
  205. Complain::where(['id'=> $cid])->update(['status'=> 2]);
  206. // 冻结被举报用户
  207. $freezing = isset($info['remark'])? $info['remark'] : '被人举报';
  208. MemberModel::where(['id'=> $cuid,'user_type'=> 2])->update(['user_status'=> 0,'freezing'=> $freezing]);
  209. // 奖励入账
  210. MemberModel::where(['id' => $userId])->update(['redheart' => moneyFormat($redheart + $awardNum), 'updated_at' => date('Y-m-d H:i:s')]);
  211. // 账户明细
  212. $dateTime = date('Y-m-d H:i:s');
  213. $cNickname = isset($cUserInfo['user_nickname']) ? $cUserInfo['user_nickname'] : '';
  214. $logData = [
  215. 'user_id' => $userId,
  216. 'type' => 4,
  217. 'account_type' => 1,
  218. 'change_type' => 1,
  219. 'money' => $awardNum,
  220. 'balance' => $redheart,
  221. 'remark' => "举报用户[ID:$cuid],昵称[{$cNickname}]审核通过奖励",
  222. 'created_at' => $dateTime,
  223. ];
  224. db('account_log')->insertGetId($logData);
  225. // 发送模板消息给举报用户
  226. $openid = isset($userInfo['openid'])? $userInfo['openid'] : '';
  227. if($openid){
  228. $wechatCode = isset($cUserInfo['wechat_code'])? $cUserInfo['wechat_code'] : '暂无';
  229. $params = [
  230. 'title' => "尊敬的{$nickname}用户,您举报的用户经平台核实已审核通过,请谨慎与该用户联系\n\n被举报用户:\t{$cNickname}(昵称)\n\n对方微信号: \t{$wechatCode}\n\n申请时间:\t{$dateTime}",
  231. 'remark' => "脱单需主动,交友需谨慎!",
  232. 'type' => 'confirm',
  233. 'keywords' => [
  234. 'keyword1' => [
  235. 'value' => '举报用户',
  236. 'color' => '#173177',
  237. ],
  238. 'keyword2' => [
  239. 'value' => '已审核',
  240. 'color' => '#173177',
  241. ],
  242. ],
  243. ];
  244. Wechat::sendTplMsg($openid, $params);
  245. }
  246. // 被举报用户通知
  247. $cOpenid = isset($cUserInfo['openid'])? $cUserInfo['openid'] : '';
  248. $cnickname = isset($cUserInfo['nickname'])? $cUserInfo['nickname'] : '';
  249. if($cOpenid){
  250. $params = [
  251. 'title' => "尊敬的{$cnickname}用户,由于您的账号被多人举报经平台已经将您的账号冻结,若有疑问请联系平台客服\n\n举报原因:\t{$freezing}",
  252. 'remark' => "脱单需主动,交友需真诚!",
  253. 'type' => 'confirm',
  254. 'keywords' => [
  255. 'keyword1' => [
  256. 'value' => '举报反馈',
  257. 'color' => '#173177',
  258. ],
  259. 'keyword2' => [
  260. 'value' => '已审核',
  261. 'color' => '#173177',
  262. ],
  263. ],
  264. ];
  265. Wechat::sendTplMsg($cOpenid, $params);
  266. }
  267. return true;
  268. }
  269. return false;
  270. }
  271. }