Officialaccount.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace app\admin\controller;
  3. use app\admin\model\AdminLog;
  4. use app\common\controller\Backend;
  5. use think\Config;
  6. use think\Db;
  7. use think\Hook;
  8. use think\Session;
  9. use think\Validate;
  10. /**
  11. * 公众号扫一扫功能
  12. */
  13. class Officialaccount extends Backend
  14. {
  15. protected $noNeedLogin = ['login'];
  16. protected $noNeedRight = ['index', 'logout'];
  17. protected $layout = '';
  18. public function _initialize()
  19. {
  20. parent::_initialize();
  21. //移除HTML标签
  22. $this->request->filter('trim,strip_tags,htmlspecialchars');
  23. }
  24. public function index(){
  25. echo '测试连接成功';
  26. }
  27. /**
  28. *1.服务器接口,微信公众平台填写的url
  29. * http://域名/控制器/link
  30. */
  31. public function link(){
  32. $echostr=$_GET['echostr'];//微信服务器提供的 随机字符串
  33. if ($this->check()){//验证签名是否正确
  34. echo $echostr;
  35. exit;
  36. }
  37. }
  38. /**
  39. * 2.验证签名
  40. */
  41. public function check(){
  42. $signature=$_GET['signature']; //微信服务器提供的 微信加密签名
  43. $timestamp=$_GET['timestamp']; //微信服务器提供的 时间戳
  44. $nonce=$_GET['nonce']; //微信服务器提供的 随机数
  45. $token='z9EGslrxPpbicuy48mkw'; //自己定义的 Token
  46. $tmpArr = array($token,$timestamp,$nonce);//数组
  47. sort($tmpArr); //排序
  48. $tmpstr=implode($tmpArr); //数据转字符串
  49. $tmpstr=sha1($tmpstr); //字符串加密
  50. if ($tmpstr==$signature){
  51. return true;
  52. }else{
  53. return false;
  54. }
  55. }
  56. /**
  57. * 获取access_token存进数据库
  58. */
  59. public function access_token(){
  60. $token = Db::name("v_access_token")->find(1);
  61. $date = date('Y-m-d H:i:s');
  62. if (strtotime($token['addtime']) > strtotime($date)){
  63. return $token['access_token'];
  64. }else{
  65. $appid = "你的appid";
  66. $appsecret = "你的appsecret ";
  67. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";
  68. $rt = $this->request_get($url);
  69. $data['access_token']=$rt['access_token'];
  70. $data['addtime']= date("Y-m-d H:i:s", strtotime("$date +60 min"));
  71. $rt =DB::name("v_access_token")->where("id='1'")->save($data);
  72. if ($rt){
  73. $token = Db::name("v_access_token")->find(1);
  74. return $token['access_token'];
  75. }else{
  76. return "获取access_token错误";
  77. }
  78. }
  79. }
  80. /**
  81. * 3.发送http请求,并返回数据
  82. * @param $url
  83. * @return mixed
  84. */
  85. public function request_get($url){
  86. $curl = curl_init();// 1. 初始化一个 cURL 对象
  87. curl_setopt($curl,CURLOPT_URL,$url);// 2.设置你需要抓取的URL
  88. curl_setopt($curl,CURLOPT_HEADER,0);
  89. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1 );// 3.https必须加这个,不加不好使(不多加解释,东西太多了
  90. curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
  91. $res = curl_exec($curl);// 5. 运行cURL,请求网页
  92. curl_close($curl);// 6. 关闭URL请求
  93. $json_obj = json_decode($res,true);
  94. return $json_obj;
  95. }
  96. public function user(){
  97. //1.用户点击静默授权链接 获取用户的code
  98. $code = input("code");
  99. //2.通过code换取网页授权access_token
  100. $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$this->appid&secret=$this->appsecret&code={$code}&grant_type=authorization_code";
  101. $rt = $this->request_get($url);
  102. //拿着access_token换取用户信息
  103. if (!empty($rt['access_token'])) {
  104. Session('access_token', $rt['access_token'], 7200);
  105. Session('openid', $rt['openid'], 7200);
  106. }
  107. $access_token = Session('access_token');
  108. $openid = Session('openid');
  109. //3.获取用户基本信息
  110. $url = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$openid}&lang=zh_CN";
  111. $user_url = $this->request_get($url);
  112. $openid = $user_url['openid'];
  113. if($openid){
  114. $user = Db::name('v_user')->where("openid='$openid'")->find();
  115. if (!$user){
  116. $data['openid'] = $user_url['openid'];//用户openid
  117. $data['nickname'] = $user_url['nickname'];//用户名字
  118. $data['headimgurl'] = $user_url['headimgurl'];//用户头像
  119. $data['sex'] = $user_url['sex'];//用户性别
  120. $data['addtime'] = date('Y-m-d H:i:s');
  121. Db::name('v_user')->add($data);
  122. }//数据库没有用户信息添加到数据库mn_user用户表
  123. }else{
  124. $this->error('请使用手机进入',U('index'));
  125. }
  126. }
  127. }