微信小程序-微信登录wx.login(Thinkphp后端代码)

流程

主要通过微信登录,获取用户的三个信息:user_id(用户id),user_image(用户头像url),user_name(用户昵称)。

1、首次登录:

    调用wx.login获取code,code发送给后台获取openid并存到用户表中,将返回user_id存到内存中。然后跳转到授权页面,当用户允许授权时,通过agreeGetUser方法获取到微信用户的信息保存到用户表中,并将user_name和user_image存到内存中,最后跳转到首页。

2、非首次登录:

    调用wx.login获取code,code发送给后台获取openid,openid在用户表中已存在,则只改变用户登录时间,并返回user_id、user_name和user_image,存到内存后跳转首页。

代码

1、app.js

用户打开小程序时,会调用wx.login获取code,将code发送到后台获取openid。后台保存opendi并返回用户信息(首次登录信息为空,非首次登录信息存在)

App({
  onLaunch: function () {
    // 登录
    wx.login({
      success: function(res) {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
        if(res.code){
          wx.request({
            url: 'http://XX.com/WechatUser/login_do', //改成你服务端的方法
            data:{
              code:res.code
            },
            success:function(res){
              //如果是首次登录,会跳到授权页面
              if(!res.data.data.username || res.data.data.username == " "){
                wx.navigateTo({
                  url:'/pages/login/login',
                })
              }
              console.log(res.data.data)
              //首次登录,只会返回id;非首次登录,会返回三个信息
              wx.setStorageSync('userid', res.data.data.userid)
              wx.setStorageSync('username', res.data.data.username)
              wx.setStorageSync('userimage', res.data.data.userimage)
            }
          })
        }else{
          console.log('获取用户登录态失败!' + res.errMsg)
        }
      }
    })
  }
})

2、服务器端 login_do

获取到openid后,判断用户存在与否,不存在则保存openid,返回user_id;存在则修改登录时间,返回用户的信息

public function login_do()
    {
        try{
            extract(generateRequestParamVars());//接受参数的方法
            $result=GetWechatOpenId($code);//获取openid和session的方法在接下来的一块代码
            $conditions = array();
            $conditions['openid'] = $result['openid'];
            //判断用户是否存在
            if (!$user=D(self::$WECHAT_USER)->where($conditions)->find()) {
                //用户不存在,创建用户,没有详细信息
                $userid = D(self::$WECHAT_USER)->adds_do($result['openid']);
                $conditions = array();
                $conditions['id'] = $userid;
                $user = D(self::$WECHAT_USER)->where($conditions)->find();
            }
            else{
                //用户存在,修改登录时间
                D(self::$WECHAT_USER)->login_do($user['id']);//用户登录
            }

            $data=array();
            $data['userid']=$user['id'];
            $data['username']=$user['nickname'];
            $data['userimage']=$user['imageurl'];

            $ajaxReturnData['status'] = 1;
            $ajaxReturnData['message'] = '成功';
            $ajaxReturnData['data'] = $data;

        }catch (\Exception $e){
            $ajaxReturnData['status'] = 0;
            $ajaxReturnData['message'] = '失败';
        }
        $this->ajaxReturn($ajaxReturnData);
    }

 GetWechatOpenId方法:

function GetWechatOpenId($js_code)
{
    if (!$js_code) {
        throw new \Exception('code参数为null!');
    }

    //获取openid和session的地址
    //即 https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
    $url=C('WECHAT_GET_OPEN_ID');
    //定义好的appid、appsecret等有关小程序配置的数组常量
    $wechat_data=C('WECHAT_XCX_DATA');
    $param=array();
    $param[]='appid='.$wechat_data['appid'];
    $param[]='secret='.$wechat_data['appsecret'];
    $param[]='js_code='.$js_code;
    $param[]='grant_type=authorization_code';

    $params=join('&',$param);

    $url=$url.'?'.$params;
    $curl=new \Home\Common\Curl(); // 这个类具体内容在下方
    $result=$curl->go($url,'post');

    $result=json_decode($result,true);
    return $result;
}

放在Home\Common下的Curl.php

<?php
/*
 * Curl操作类
 */
namespace Home\Common;
class Curl {
   
    public function go($url,$method='POST',$data=''){
        if(!$url){
            return ;
        }
        if(!$method){
            return ;
        }
        $method=strtoupper($method);
        $header = array("Accept-Charset: utf-8"); 
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        //if($method=='POST'){
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        //}
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);
        if (curl_errno($ch)) {
            return curl_error($ch);
        }
        curl_close($ch);
        return $result;
    }
    
}

3、login.js

首次登录会跳转到授权界面。授权之后则要保存微信用户所有信息。

Page({
    data: {
        url: "/pages/index/index",
        userInfo: {
            nickname: "",
            sex: "",
            head_pic: ""
        },
        text: "微信授权登录"
    },
    agreeGetUser: function (e) {
        var that = this;
        var msg = e.detail.errMsg;
        if (msg == 'getUserInfo:fail auth deny') {
            console.log('用户不允许授权')
            wx.navigateTo({
            url: '/pages/login/login',
            })
        }
        if (msg == 'getUserInfo:ok') {
            console.log('用户允许授权')
            wx.switchTab({
                url: '/pages/index/index',
                fail:function(e){
                  console.log(e)
                }
            })
        }
        //授权保存用户信息
        var userid = wx.getStorageSync('userid');
        var username = wx.getStorageSync('username');
        if(!username){
            wx.request({
              url: 'http://XX.com/WechatUser/save_do',
                data: {
                    id: userid,
                    nickname: e.detail.userInfo.nickName,
                    imageurl: e.detail.userInfo.avatarUrl,
                    gender: e.detail.userInfo.gender,
                    province: e.detail.userInfo.province,
                    city: e.detail.userInfo.city,
                    country: e.detail.userInfo.country,
                },
                success: function (res) {
                    if (e.detail.userInfo.nickName){
                        wx.setStorageSync('username', e.detail.userInfo.nickName);
                        wx.setStorageSync('userimage', e.detail.userInfo.avatarUrl);
                    }
                }
            })
        }
      
    },
   
    onLoad: function(t) {
    }
});

4、save_do的model层方法

public function save_do()
    {
        extract(generateRequestParamVars());
        $conditions = array();
        $conditions['id'] = $id;
        $data = array();
        $data['nickname']=$nickname;
        $data['imageurl']=$imageurl;
        $data['gender']=$gender;
        $data['province']=$province;
        $data['city']=$city;
        $data['country']=$country;
        if($this->where($conditions)->save($data)===false){
            throw new \Exception('OPERATION_FAILED');
        }
    }

OK!

  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 写微信小程序后端需要以下几个步骤: 1. 环境搭建:需要搭建 PHP 环境,安装 ThinkPHP 框架,以及安装微信开发者工具。 2. 注册小程序:在微信公众平台注册小程序,获取小程序的 AppID 和 AppSecret,用于后续开发中的身份验证和 API 调用。 3. 配置接口:在微信公众平台中配置小程序的接口信息,包括接口地址、Token、EncodingAESKey 等信息。 4. 开发 API:根据小程序需求,设计并开发相应的 API 接口,可以使用 ThinkPHP 提供的 RESTful API 快速搭建。 5. 身份验证:在开发 API 的过程中,需要对请求进行身份验证,确保只有授权的用户可以访问相应的 API。 6. 数据库操作:使用 ThinkPHP 提供的数据库操作接口,对数据库进行增、删、改、查等操作。 7. 返回数据:在 API 接口的实现中,需要将查询到的数据返回给小程序端。可以使用 JSON 格式或其他格式。 8. 调试和部署:在开发过程中,需要进行调试和测试。当测试通过后,可以将代码部署到服务器上,供小程序调用。 总的来说,使用 ThinkPHP 开发微信小程序后端,需要掌握 PHP 开发技术和数据库操作技术,并熟悉微信小程序开发的流程和接口调用方式。 ### 回答2: thinkphp是一款基于PHP语言开发的MVC框架,用于构建Web应用程序。如果我们想要使用thinkphp来开发微信小程序后端,我们可以按照以下思路进行: 1. 搭建开发环境:首先,我们需要在本机搭建PHP开发环境,并安装thinkphp框架。可以使用XAMPP、WAMP或者LAMP等工具来搭建环境,并从thinkphp官方网站下载最新版本的框架。 2. 创建项目和模块:在thinkphp框架中,我们可以使用命令行工具或者手动创建来创建一个新的项目。然后,我们可以根据微信小程序的需求,创建相应的控制器、模型和视图等模块。 3. 配置数据库连接:在thinkphp的配置文件中,我们需要配置数据库连接信息,以便于在后端与数据库进行交互。可以在配置文件中设置数据库的类型、主机地址、数据库名、用户名和密码等。 4. 数据库操作:利用thinkphp提供的ORM(对象关系映射)功能,我们可以通过定义模型类来简化与数据库的交互。可以使用模型中提供的方法来进行数据的增删改查操作,以及数据的关联查询等。 5. 接口开发:对于微信小程序后端的交互,我们可以定义相应的接口来处理前端的请求。通过接口,前端可以发送HTTP请求到后端,并传递相应的参数。后端可以根据接口进行数据的处理和逻辑的操作,并返回相应的结果给前端。 6. 接口权限验证:在微信小程序中,我们可以使用微信提供的登录机制来获取用户的OpenID,并将其作为用户的唯一标识。在后端接口中,我们可以通过验证用户的OpenID来进行接口权限的控制,确保只有合法的用户才能访问接口。 7. 数据返回格式化:在后端的接口开发过程中,我们需要将数据以统一的格式返回给前端。可以使用thinkphp提供的返回格式封装函数,将数据封装成JSON格式并返回给前端。 总之,使用thinkphp开发微信小程序后端需要通过搭建开发环境、创建项目和模块、配置数据库连接、数据库操作、接口开发、接口权限验证等步骤。这样,我们就可以基于thinkphp框架来实现微信小程序后端逻辑和数据交互。 ### 回答3: thinkphp是一款开源的PHP框架,适用于快速开发Web应用程序。如果要使用thinkphp来开发微信小程序后端,可以按照以下思路进行: 1. 配置环境:首先,确保服务器上已经安装了PHP环境,并下载、安装好thinkphp框架,同时要确保安装了与微信小程序交互的SDK。 2. 数据库设计:根据小程序的需求,设计好数据库的表结构,包括用户表、数据表等。 3. 创建控制器:根据业务逻辑,在thinkphp中创建相应的控制器文件,用于处理来自小程序前端的请求。 4. 实现接口:在控制器中实现与小程序前端交互的接口,包括用户登录、数据查询、数据添加、数据更新等功能。可以使用thinkphp提供的数据库查询方法、数据验证、数据过滤等函数。 5. 用户验证:在接口中实现用户登录验证的逻辑,可以通过小程序前端传递的用户标识进行验证,并同时保存用户信息到数据库中。 6. 数据交互:通过接口,实现小程序前端与后台的数据交互。可以使用thinkphp提供的数据返回函数,将查询到的数据以JSON格式返回给小程序前端。 7. 安全性考虑:在小程序后端开发过程中,需要考虑数据的安全性。可以使用thinkphp的安全函数对接收到的数据进行过滤,避免SQL注入等安全问题。 8. 错误处理:在接口中,加入错误处理机制,对可能出现的错误进行捕获和处理,并返回相应的错误信息给小程序前端。 9. 日志记录:使用thinkphp提供的日志记录功能,对后端的运行情况进行记录,以便后期的排查和调试。 总之,使用thinkphp开发微信小程序后端,需要根据小程序的需求进行数据库设计,创建相应的控制器文件,实现接口以及相应的业务逻辑,并加入相应的安全性考虑和错误处理机制,以确保小程序后端的稳定性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值