UserController.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <?php
  2. namespace mini\controllers;
  3. use biz\user\services\UserAssetService;
  4. use biz\user\services\UserOldDataService;
  5. use biz\user\services\UserService;
  6. use common\components\stringUtil;
  7. use common\components\util;
  8. use common\services\xhMerchantExtendService;
  9. use common\services\xhMerchantService;
  10. use common\services\xhUserService;
  11. use Yii;
  12. use yii\web\Controller;
  13. use yii\helpers\Json;
  14. use linslin\yii2\curl;
  15. class UserController extends BaseController
  16. {
  17. public $enableCsrfValidation = false;
  18. public $secretKey = 'wx3hj5a26af5c17fb86921f3';
  19. public $withoutLogin = ['get-info'];
  20. //首次进入小程序,通过code获取用户的openid
  21. public function actionGetInfo()
  22. {
  23. $code = Yii::$app->request->get('code', '');
  24. if (empty($code)) {
  25. util::failInfo('没有CODE信息');
  26. }
  27. $merchant = $this->merchant;
  28. $account = $this->merchantId;
  29. $appId = $merchant['miniAppId'];
  30. $appSecret = $merchant['miniAppSecret'];
  31. $url = "https://api.weixin.qq.com/sns/jscode2session?appid={$appId}&secret={$appSecret}&js_code={$code}&grant_type=authorization_code";
  32. $curl = new curl\Curl();
  33. $result = $curl->get($url);
  34. $arr = Json::decode($result);
  35. $sessionKey = isset($arr['session_key']) ? $arr['session_key'] : '';
  36. $openid = isset($arr['openid']) ? $arr['openid'] : '';
  37. //用户来源
  38. $userSource = UserService::$userSourceId['mini']['name'];
  39. $user = UserService::getByMiniOpenId($openid, $account);
  40. if (empty($user)) {
  41. $userInfo = ['miniOpenId' => $openid, 'merchantId' => $account];
  42. $user = UserService::replaceUser($userInfo, $userSource, $account);
  43. }
  44. $cacheKey = 'sessionKey_' . $openid;
  45. Yii::$app->redis->executeCommand('SET', [$cacheKey, $sessionKey]);
  46. $userId = $user['id'];
  47. $asset = UserAssetService::getByUserId($userId);
  48. //敏感信息不输出
  49. unset($user['password']);
  50. unset($user['payPassword']);
  51. unset($user['openId']);
  52. unset($user['miniOpenId']);
  53. unset($user['unionId']);
  54. unset($user['alipayId']);
  55. $merchantExtend = xhMerchantExtendService::getByMerchantId($account);
  56. $memberIntegral = xhMerchantExtendService::getGradeList($merchantExtend, 'desc');
  57. $level = $asset['memberLevel'];
  58. $memberLevelName = '普通会员';
  59. if (!empty($level)) {
  60. $memberLevelName = $level . "级会员";
  61. }
  62. $discountName = '';
  63. if (isset($memberIntegral[$level]['discount'])) {
  64. $currentDiscount = $memberIntegral[$level]['discount'];
  65. $discountName = '享' . $currentDiscount . '折优惠';
  66. }
  67. $asset['memberLevelName'] = $memberLevelName;
  68. $asset['discountName'] = $discountName;
  69. //token对应的就是userId
  70. $token = 'SID_MINI_' . $account . '_' . $userId . '_' . date("mdHis") . '_' . stringUtil::charsShuffle(8);
  71. Yii::$app->redis->executeCommand('SET', [$token, $userId]);
  72. Yii::$app->redis->executeCommand('EXPIRE', [$token, 30 * 86400]);//过期
  73. $return = ['user' => $user, 'token' => $token, 'userAsset' => $asset, 'merchant' => $this->merchant];
  74. util::sendJson($return);
  75. }
  76. //获取用户信息 shish 2019.7.25
  77. public function actionGetUserInfo()
  78. {
  79. $asset = UserAssetService::getByUserId($this->userId);
  80. $asset['discountShow'] = $asset['discount'] == 100 ? 0 : str_replace('0', '', $asset['discount']);
  81. util::sendJson(['user' => $this->userInfo, 'userAsset' => $asset]);
  82. }
  83. //授权获取用户完整信息 shish 2019.7.25
  84. public function actionGetFullInfo()
  85. {
  86. $post = Yii::$app->request->post();
  87. $iv = $post['iv'];
  88. $encryptedData = $post['encryptedData'];
  89. $appId = $this->merchant['miniAppId'];
  90. $merchantId = $this->merchantId;
  91. $miniOpenId = $this->userInfo['miniOpenId'];
  92. if (empty($miniOpenId)) {
  93. util::failInfo('mini_open_id empty');
  94. }
  95. $cacheKey = 'sessionKey_' . $miniOpenId;
  96. $sessionKey = Yii::$app->redis->executeCommand('GET', [$cacheKey]);
  97. $weixinMiniSecret = Yii::getAlias("@vendor/weixinMiniSecret");
  98. require_once($weixinMiniSecret . '/wxBizDataCrypt.php');
  99. $pc = new \WXBizDataCrypt($appId, $sessionKey);
  100. $errCode = $pc->decryptData($encryptedData, $iv, $result);
  101. if ($errCode != 0) {
  102. Yii::info($result . ' ' . $errCode);
  103. util::failInfo('获取用户信息失败');
  104. }
  105. Yii::info('小程序获取用户信息:' . $result);
  106. $originalInfo = Json::decode($result);
  107. $source = UserService::$userSourceId['mini']['name'];
  108. $user = UserService::replaceUser($originalInfo, $source, $merchantId);
  109. unset($user['password']);
  110. unset($user['payPassword']);
  111. unset($user['openId']);
  112. unset($user['miniOpenId']);
  113. unset($user['unionId']);
  114. unset($user['alipayId']);
  115. $userId = $user['id'];
  116. $asset = UserAssetService::getByUserId($userId);
  117. //更新下访问时间
  118. UserService::updateById($userId, ['visitTime' => time()]);
  119. $merchantExtend = xhMerchantExtendService::getByMerchantId($merchantId);
  120. $memberIntegral = xhMerchantExtendService::getGradeList($merchantExtend, 'desc');
  121. $level = $asset['memberLevel'];
  122. $memberLevelName = '普通会员';
  123. if (!empty($level)) {
  124. $memberLevelName = $level . "级会员";
  125. }
  126. $discountName = '';
  127. if (isset($memberIntegral[$level]['discount'])) {
  128. $currentDiscount = $memberIntegral[$level]['discount'];
  129. $discountName = '享' . $currentDiscount . '折优惠';
  130. }
  131. $asset['memberLevelName'] = $memberLevelName;
  132. $asset['discountName'] = $discountName;
  133. util::successInfo('操作成功', 'A0001', ['user' => $user, 'userAsset' => $asset]);
  134. }
  135. public function actionGetMobile()
  136. {
  137. $post = Yii::$app->request->post();
  138. $iv = $post['iv'];
  139. $encryptedData = $post['encryptedData'];
  140. $merchantId = $this->merchantId;
  141. $merchant = $this->merchant;
  142. $appId = $merchant['miniAppId'];
  143. $miniOpenId = $this->userInfo['miniOpenId'];
  144. $user = $this->userInfo;
  145. if (!empty($user) && !empty($user['mobile'])) {
  146. $userId = $user['id'];
  147. UserService::updateById($userId, ['isMember' => 1]);
  148. UserAssetService::updateByUserId($userId, ['isMember' => 1]);
  149. util::successInfo('操作成功', 'A0001', ['mobile' => $user['mobile']]);
  150. }
  151. $cacheKey = 'sessionKey_' . $miniOpenId;
  152. $sessionKey = Yii::$app->redis->executeCommand('GET', [$cacheKey]);
  153. if (empty($sessionKey)) {
  154. util::failInfo('sesstion key empty');
  155. }
  156. $weixinMiniSecret = Yii::getAlias("@vendor/weixinMiniSecret");
  157. require_once($weixinMiniSecret . '/wxBizDataCrypt.php');
  158. $pc = new \WXBizDataCrypt($appId, $sessionKey);
  159. $errCode = $pc->decryptData($encryptedData, $iv, $result);
  160. if ($errCode != 0) {
  161. util::failInfo();
  162. }
  163. $arr = Json::decode($result);
  164. $mobile = isset($arr['purePhoneNumber']) ? $arr['purePhoneNumber'] : '';
  165. $userId = $user['id'];
  166. /**升级成为会员**/
  167. UserService::upgradeToMember($userId, $merchantId, ['mobile' => $mobile]);
  168. $user = UserService::getById($userId);
  169. util::successInfo('操作成功', 'A0001', ['mobile' => $mobile, 'user' => $user]);
  170. }
  171. }