微信小程序获取openid【非云开发版】【第零期】

说在前面

此方法需要自己有一台云服务器

用云开发应该能更快更高效的获取openid,但是我也想熟练下云服务器的使用,因为后续数据库等(若不使用云开发)也需要php+nginx部署到云服务器上


梳理下顺序,大概流程如下:

  1. 调用 wx.login(),获取临时 code

相关文档 https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html

  1. 通过request方式,调用一个api,将获取到的 code 发送给后台换取 openid

相关文档 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
(api:https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=CODE&grant_type=authorization_code)
四个变量:

  • APPID:开发者的appid
  • SECRET: 开发者的appsecret(一串不可修改的随机码)
  • js_code: wx.login(res)中的res.code
  • grant_type: ‘authorization_code’(就是这个)

本来有了这些东西就能获得openid,unionid了,但是微信鬼精得很,使用浏览器可以直接访问那个api,但是在微信开发者工具里面不行。

因为——

微信api开头是“api.weixin.qq.com”,微信官方不允许直接request这个链接

因此有了第三步

  1. 在自己的服务器上通过nginx+php部署,将request发到自己php,并由此php发送请求
    港真,很麻烦吼,只是获取一个openid,还要自己租个服务器,部署这么多东西,没办法嗷,谁让我们不使用人家自己给的云服务器(云开发)喏

指路文章:

CentOS 7配置php+nginx 环境

修改了:
A. nginx.conf修改部分配置A:

 location ~ \.php$ {
            root           /var/www/html;  # 项目的根目录
            fastcgi_pass   127.0.0.1:9000;  # 应该是随便选,如果用socket通信就不行不知为何
            #fastcgi_index  DIR/test.php;  # 注释本行和注释下面的index效果是一样的
            index         DIR/test.php;  # 这里的路径是在root下的相对路径
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  # 照抄
            include        /usr/local/nginx/conf/fastcgi.conf;  # 若不在(通常都不在)nginx安装文件内, 需要通过绝对路径include到安装的nginx里
        }

B. conf修改部分配置B:ssl部分(需要先把域名解析到服务器公网ip上,教程参考服务器平台官方解析教程)

server{
       listen 6002 ssl;

       server_name 182.61.200.6 www.baidu.com baidu.com; # 公网ip 域名

       # ssl on;
   
       ssl_certificate /usr/local/nginx/cert/server.crt;  # ssl证书 .crt格式
       
       ssl_certificate_key /usr/local/nginx/cert/server.key;  # ssl证书 .key格式
   
       ssl_session_timeout 5m;
       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   
       ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
   
       ssl_prefer_server_ciphers on;
   }

test.php文件填写


    $code = $_GET['js_code'];  # 由小程序端发送此参数
    $secret = "c88e029182d8e163f1c06186d31bbb44";  # 开发者的appsecret
    $appid = "wxbf870da625e4f1c1";  # 开发者的appid
    $url = "https://api.weixin.qq.com/sns/jscode2session?appid=".$appid."&secret=".$secret."&js_code=".$code."&grant_type=authorization_code";

    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_TIMEOUT,30);

    $content = curl_exec($ch);
    $status = (int)curl_getinfo($ch,CURLINFO_HTTP_CODE);
    if ($status == 404) {
        return $status;
    }
    curl_close($ch);  # 养成close的好习惯
    
    
    print_r($content);
    return $content;
?>

参数也可以通过在url后面加 “?js_code=【res.code】” 查看效果
不过每个code只能request一次,所以需要先将下文中.wx.request部分注释


微信小程序端.js文件填写

wx.login({
                success: function (res) {
                  console.log('code为————' + res.code)
                  if (res.code) {
                    console.log('通过login接口的code换取openid');
                    //通过code 换取openid--开始
                    wx.request({//通常获取openid需要从后端获取,因为appid 和 secret最好不要在前端展示
                        url: 'https://xcx2022.cn:6002/hitsz/test_openid.php',//如果未勾选 不校验合法域名会报错  请在小程序开发工具,右上角点击详情,的本地设置
                        data: {
                        js_code: res.code
                        },
                        method: 'GET',
                        header: { 'content-type': 'application/json' },
                        success: function (openIdRes) {
                        	console.log("登录成功返回的值:" + openIdRes.data);
                        },
                        fail: function (error) {
                        	console.info("获取用户openId失败");
                        	console.info(error);
                        }
                    })
                  //通过code 换取openid--结束
                  }
                }
              })

结果展示

在这里插入图片描述

你可能感兴趣的:(小程序+云服务器,微信小程序,php,nginx,服务器)