WechatAccount.php 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
  4. * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
  5. * @author pillar<ltmn@qq.com>
  6. * 微信服务号-扫码登录处理
  7. */
  8. namespace app\system\controller\event;
  9. use think\Controller;
  10. use app\common\event\Passport;
  11. use app\common\facade\WechatMp;
  12. use app\common\model\SystemMember;
  13. use app\common\model\SystemWeb;
  14. use think\facade\Cookie;
  15. use filter\Filter;
  16. use Exception;
  17. class WechatAccount extends Controller{
  18. /**
  19. * 发起微信授权
  20. */
  21. public function index(){
  22. try {
  23. $app = WechatMp::official();
  24. $app->server->push(function ($message) {
  25. switch ($message['MsgType']) {
  26. case 'event':
  27. $open_id['appid'] = Filter::filter_escape($message['FromUserName']); //openid
  28. if($message['Event'] == 'subscribe' || $message['Event'] == 'SCAN'){ //关注|扫描带参数二维码事件
  29. $member = SystemMember::where(['open_id' => $open_id['appid']])->field('open_id')->find();
  30. if($member){
  31. $member->ticket = Filter::filter_escape($message['Ticket']); //Ticket
  32. $member->save();
  33. return '你好,你刚刚登录了「'.SystemWeb::config()['name'].'」';
  34. }else{
  35. //创建用户
  36. $rdm_code = getcode(6);
  37. $data['appid'] = $open_id['appid'];
  38. $data['ticket'] = Filter::filter_escape($message['Ticket']);
  39. $data['username'] = '公众号'.$rdm_code;
  40. $data['password'] = password_hash(md5($rdm_code),PASSWORD_DEFAULT);
  41. $data['safe_password'] = password_hash(md5('123456'),PASSWORD_DEFAULT);
  42. $data['login_time'] = time();
  43. $data['login_ip'] = request()->ip();
  44. $data['update_time'] = time();
  45. $data['create_time'] = time();
  46. SystemMember::create($data);
  47. return '你好,你刚刚注册了「'.SystemWeb::config()['name'].'」帐号';
  48. }
  49. }
  50. break;
  51. default:
  52. return '';
  53. break;
  54. }
  55. });
  56. $response = $app->server->serve();
  57. $response->send();
  58. }catch (Exception $e) {
  59. $this->error('授权失败');
  60. }
  61. }
  62. /**
  63. * 生成登录二维码
  64. */
  65. public function createCodes(){
  66. try {
  67. $rel = WechatMp::official()->qrcode->temporary('foo', 6 * 24 * 3600);
  68. Cookie::set('login_ticket',$rel['ticket'],$rel['expire_seconds']); //记录二维码ticket
  69. return enjson(200,'成功',$rel['url']);
  70. }catch (Exception $e) {
  71. return enjson(0);
  72. }
  73. }
  74. /**
  75. *检查登录状态
  76. */
  77. public function qrCodes(){
  78. if(Cookie::has('login_ticket')){
  79. $ticket = Cookie::get('login_ticket');
  80. $member = SystemMember::where(['ticket' => $ticket])->field('id,username,open_id,ticket')->find();
  81. if($member){
  82. $member->ticket = null; //Ticket
  83. $member->save();
  84. Passport::clearMiniapp();
  85. Passport::setlogout();
  86. Passport::setLogin($member);
  87. Cookie::delete('login_ticket');
  88. return enjson(200,'成功',['url' => url('system/passport.Index/index')]);
  89. }
  90. }
  91. return enjson(0);
  92. }
  93. }