Wechat.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <?php
  2. namespace app\controller\api;
  3. use app\service\api\UserServiceFacade;
  4. use app\service\api\MiniappServiceFacade;
  5. use app\service\api\MpServiceFacade;
  6. // use app\service\MessageSystemServiceFacade;
  7. use app\service\ConfServiceFacade;
  8. use plugin\ali_sms\service\AliSmsServiceFacade;
  9. use laytp\controller\Api;
  10. use laytp\library\Random;
  11. use laytp\library\Token;
  12. class WeChat extends Api {
  13. protected function _initialize()
  14. {
  15. $this->model = new \app\model\User();
  16. }
  17. public $noNeedLogin = [
  18. 'wechatJssdk',
  19. 'wechatAuth',
  20. 'wechatSilenceAuth',
  21. 'miniappAuth',
  22. 'miniappSilenceAuth',
  23. 'miniappUserInfo',
  24. 'authBindindPhone',
  25. 'wechatSilenceCode',
  26. 'notify'
  27. ];
  28. // 公众号jssdk
  29. public function wechatJssdk(){
  30. $app = MpServiceFacade::option();
  31. $APIs = array('updateAppMessageShareData','updateTimelineShareData','openLocation','getLocation','chooseWXPay');
  32. $uri = $this->request->param('uri');
  33. $app->jssdk->setUrl($uri);
  34. $res = $app->jssdk->buildConfig($APIs, $debug = false, $beta = false, $json = false);
  35. return $this->success('获取结果', $res);
  36. }
  37. // 公众号登录
  38. public function wechatAuth(){
  39. global $_GPC;
  40. $param = $this->request->param();
  41. $app = MpServiceFacade::option('snsapi_userinfo');
  42. $conf = ConfServiceFacade::groupGet('system.plan', true);
  43. $user = $app->oauth->user();
  44. // print_r($app->$oauth->redirect());
  45. if($user['id']){
  46. $userInfo = \app\model\User::where(['openid_wechat'=>$user['id'],'uniacid'=>$_GPC['uniacid']])->find();
  47. if(!empty($userInfo['id'])){
  48. $token = Random::uuid();
  49. $user['token'] = $token;
  50. $user['phone'] = $userInfo['phone'];
  51. $user['now_money'] = $userInfo['now_money'];
  52. Token::set($token, $userInfo['id'], 24 * 60 * 60 * 365);
  53. }else{
  54. $param['openid'] = $user['id'];
  55. $param['nickname'] = $user['nickname'];
  56. $param['avatar'] = $user['avatar'];
  57. $param['login_time'] = date('Y-m-d H:i:s');
  58. $param['uniacid'] = $_GPC['uniacid'];
  59. $param['openid_wechat'] = $user['id'];
  60. $param['coin'] = !empty($conf['register'])?$conf['register']:0;
  61. $param['id_number'] = Random::numeric(10);
  62. if(!empty($user['original']['unionid'])){
  63. $param['unionid'] = $user['original']['unionid'];
  64. }
  65. $saveRes = $this->model->save($param);
  66. $token = Random::uuid();
  67. $user['token'] = $token;
  68. Token::set($token, $this->model->id, 24 * 60 * 60 * 365);
  69. }
  70. return $this->success('获取结果', $user);
  71. }
  72. }
  73. // 公众号静默登录
  74. public function wechatSilenceAuth(){
  75. $app = MpServiceFacade::option('snsapi_base');
  76. $oauth = $app->oauth;
  77. return $oauth->redirect();
  78. }
  79. // 公众号静默登录
  80. public function wechatSilenceCode(){
  81. global $_GPC;
  82. $param = $this->request->param();
  83. $app = MpServiceFacade::option('snsapi_base');
  84. $response = $app->oauth->scopes(['snsapi_base'])->redirect('');
  85. $user = $app->oauth->user();
  86. if($user['id']){
  87. $userId = \app\model\User::where(['openid_wechat'=>$user['id']])->value('id');
  88. if($userId){
  89. $token = Random::uuid();
  90. $user['token'] = $token;
  91. Token::set($token, $userId, 24 * 60 * 60 * 365);
  92. }else{
  93. $param['openid'] = $user['id'];
  94. $param['login_time'] = date('Y-m-d H:i:s');
  95. $param['uniacid'] = $_GPC['uniacid'];
  96. $param['openid_wechat'] = $user['id'];
  97. $saveRes = $this->model->save($param);
  98. $token = Random::uuid();
  99. $user['token'] = $token;
  100. Token::set($token, $this->model->id,0);
  101. }
  102. return $this->success('获取结果', $user);
  103. }
  104. }
  105. public function wechatCode(){
  106. global $_GPC;
  107. $param = $this->request->param();
  108. $app = MpServiceFacade::option();
  109. // $response = $app->oauth->scopes(['snsapi_base']);
  110. $user = $app->oauth->user();
  111. if($user['id']){
  112. $userId = \app\model\User::where(['openid_wechat'=>$res['openid']])->value('id');
  113. if($userId){
  114. $token = Random::uuid();
  115. $res['token'] = $token;
  116. Token::set($token, $userId, 24 * 60 * 60 * 365);
  117. }else{
  118. $param['openid'] = $res['openid'];
  119. $param['login_time'] = date('Y-m-d H:i:s');
  120. $param['uniacid'] = $_GPC['uniacid'];
  121. $param['openid_wechat'] = $res['openid'];
  122. $saveRes = $this->model->save($param);
  123. $token = Random::uuid();
  124. $res['token'] = $token;
  125. Token::set($token, $this->model->id, 24 * 60 * 60 * 365);
  126. }
  127. return $this->success('获取结果', $res);
  128. }
  129. }
  130. // 小程序登录
  131. public function miniappAuth(){
  132. $app = MiniappServiceFacade::option();
  133. $post = $this->request->post();
  134. $decryptedData = $app->encryptor->decryptData($post['session_key'], $post['iv'], $post['encryptedData']);
  135. $data = array('avatar' => $decryptedData['avatarUrl'], 'nickname' => $decryptedData['nickName']);
  136. // print_r($decryptedData);
  137. $user = UserServiceFacade::getUser();
  138. $updateRes = $this->model->where('id', '=', $user['id'])->update($data);
  139. if (!$updateRes) throw new \Exception('保存基本信息失败');
  140. return $this->success('获取结果', $decryptedData);
  141. }
  142. // 小程序静默登录
  143. public function miniappSilenceAuth(){
  144. global $_GPC;
  145. // print_r(Random::uuid());
  146. $app = MiniappServiceFacade::option();
  147. $code = $this->request->post('code');
  148. $conf = ConfServiceFacade::groupGet('system.plan', true);
  149. if(!$code){
  150. return $this->error('注册失败,未上传code');
  151. }
  152. $res = $app->auth->session($code);
  153. if(!empty($res['errcode'])){
  154. return $this->error('注册失败,' . $res['errmsg'].'错误码-'.$res['errcode']);
  155. } else {
  156. $userId = \app\model\User::where(['openid_miniapp'=>$res['openid']])->value('id');
  157. // print_r($userId);
  158. if($userId){
  159. $token = Random::uuid();
  160. $res['token'] = $token;
  161. Token::set($token, $userId, 0);
  162. }else{
  163. $param['openid'] = $res['openid'];
  164. $param['login_time'] = date('Y-m-d H:i:s');
  165. $param['uniacid'] = $_GPC['uniacid'];
  166. $param['openid_miniapp'] = $res['openid'];
  167. $param['id_number'] = Random::numeric(10);
  168. $param['coin'] = !empty($conf['register'])?$conf['register']:0;
  169. $param['nickname'] = '默认用户';
  170. $saveRes = $this->model->save($param);
  171. $token = Random::uuid();
  172. $res['token'] = $token;
  173. Token::set($token, $this->model->id, 0);
  174. // MessageSystemServiceFacade::Unified($this->model->id,'用户注册成功通知','恭喜你注册成功');
  175. }
  176. return $this->success('获取结果', $res);
  177. }
  178. }
  179. // 授权获取小程序用户手机号直接绑定
  180. public function authBindindPhone(){
  181. $post = $this->request->param();
  182. if(!$post['session_key'] || !$post['iv'] || !$post['encryptedData']){
  183. return $this->error('注册失败,未上传session_key,iv或encryptedData');
  184. }
  185. $app = MiniappServiceFacade::option();
  186. $decryptedData = $app->encryptor->decryptData($post['session_key'], $post['iv'], $post['encryptedData']);
  187. $loginUserInfo = UserServiceFacade::getUserInfo();
  188. if($decryptedData['phoneNumber']){
  189. $updateRes = $this->model->where('id', '=', $loginUserInfo['id'])->update(array('phone' => $decryptedData['phoneNumber'],'update_time'=>date('Y-m-d H:i:s')));
  190. if (!$updateRes) throw new \Exception('保存基本信息失败');
  191. $loginUserInfo['phone'] = $decryptedData['phoneNumber'];
  192. return $this->success('获取结果', $loginUserInfo);
  193. } else {
  194. return $this->error('获取失败');
  195. }
  196. }
  197. // 手机号验证码登录授权绑定
  198. public function authBindindPhoneCode(){
  199. $post = $this->request->post();
  200. if(!$post['phone'] || !$post['code']){
  201. return $this->error('绑定失败,请上传手机号或验证码!');
  202. }
  203. $check = AliSmsServiceFacade::checkCode($post['phone'],'register',$post['code']);
  204. if(!$check){
  205. return $this->error('验证失败,'.AliSmsServiceFacade::getError());
  206. }
  207. $loginUserInfo = UserServiceFacade::getUserInfo();
  208. $updateRes = $this->model->where('id', '=', $loginUserInfo['id'])->update(array('phone' => $post['phone']));
  209. if (!$updateRes) throw new \Exception('保存基本信息失败');
  210. $loginUserInfo['phone'] = $post['phone'];
  211. return $this->success('获取结果', $loginUserInfo);
  212. }
  213. public function notify(){
  214. $code = $this->request->param('code','');
  215. $app = MpServiceFacade::option('snsapi_userinfo');
  216. $user = $app->oauth->user();
  217. // return $this->success('获取结果', $user);
  218. // header('Location:/addons/yizhi_dev/public/page');
  219. // file_put_contents(__DIR__ . '/dss.json', json_encode($user));
  220. }
  221. }