微信小プログラム-微信登録wx.login(Thinkphpバックエンドコード)


プロセス
主に微信でログインし、ユーザーの3つの情報を取得します:user_id(ユーザid)、user_image(ユーザアイコンurl)、user_name(ユーザーニックネーム).
1、初回ログイン:
呼び出しwx.loginはcodeを取得し、codeはバックグラウンド取得openidに送信してユーザーテーブルに併存し、user_を返すidはメモリに格納されます.次に、認証ページに移動し、ユーザが認証を許可すると、agreeGetUserメソッドによって取得された微信ユーザの情報をユーザテーブルに保存し、user_nameとuser_イメージはメモリに保存され、最後にトップページにジャンプします.
2、初回ログインではない:
呼び出しwx.loginはcodeを取得し、codeはバックグラウンドに送信してopenidを取得し、openidはユーザーテーブルにすでに存在する場合、ユーザーのログイン時間のみを変更し、user_を返すid、user_nameとuser_イメージ、メモリに保存してトップページにジャンプします.
コード#コード#
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;
}

HomeCommonの下にあるCurlphp

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!