微信小程序开发-微信登录流程

咱们须要一个标识来记录用户的身份的惟一性,在微信中unionId就是咱们所须要的记录惟一ID,那么如何拿到unionId就成了关键,我将项目分为小程序和 后台PHP代码两部分来说。php

从小程序代码提及html

简单说下小程序的js代码登录流程算法

login -> 获取code -> getUserInfo获取iv和encryptedData -> 传给本身的服务器处理 -> 返回给小程序结果json

var API_URL = '本身服务器地址';
Page({
  onLoad: function(){
    console.log("iv");
    wx.login({
      success:function(res){
        if(res.code){
          var code = res.code;
          wx.getUserInfo({
            success:function(res2){
              console.log(res2);
              var encryptedData = encodeURTComponent(res2.encryptedData); //必定要把加密串转成URI编码
              var iv = res2.iv;
              //请求本身的服务器
              Login(code,encryptedData,iv);
            }
          })
        }else{
          console.log('获取用户登录状态失败'+ res.errMsg);
        }
      }
    })
  }
});

*  code: 服务器用来获取sessionKey的必要参数小程序

*  IV:加密算法的初始向量,encryptedData: 加密过的字符串。api

 

把code iv encryptedData 传递给咱们的服务器服务器

function Login(code,encryptedData,iv){
  console.log('code='+code+'&encryptedData='+encryptedData+'&iv='+iv);
  //建立一个dialog
  wx.showToast({
    title:'正在登录...',
    icon:'loading',
    duration: 1000
  });
  //请求服务器
  wx.request({
    url: API_URL,
    data:{
      code:code,
      encryptedData:encryptedData,
      iv:iv
    },
    method: 'GET', //OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE,CONNECT
    header:{
      'content-type':'application/json'
    },
    success: function(res){
      wx.hideToast();
      console.log('服务器返回'+res.data);
    },
    fail:function(){
      //wx.hideToast();
    },
    complete:function(){
      //complete
    }
  })
}

咱们所须要的unionId就在encryptedData中,因此服务器须要这些信息来把unionId解析出来。微信

服务器处理逻辑session

先下载微信的解密demo: https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html?t=20161122app

 咱们选择php,把除了demo外的三个php文件,放入咱们本身的项目,方便之后调用。

讲一下服务器的处理流程:

经过微信的https://api.weixin.qq.com/sns/jscode2session接口获取seesionKey,而后再经过sessionKey和iv来解密encryptedData数据获取UnionID

/*登录*/
public function weixinLogin( $user_id = null ){
  global $App_Error_Conf,$Gift_Ids,$Server_Http_Path,$Is_Local,$Test_User,$Good_Vcode,$WeiXin_Xd_Conf;
  $validator_result = input_validator(array('code','iv','encryptedData'));
  if(!empty($validator_result)){
    return response($validator_result);
  }
  $js_code = $_REQUEST['code'];
  $encryptedData = $_REQUEST['encryptedData'];
  $iv = $_REQUEST['iv'];
  $appid = $WeiXin_Xd_Conf['appid'];
  $secret = $WeiXin_Xd_Conf['secret'];
  $grant_type = $WeiXin_Xd_Conf['grant_type'];
  //从微信获取session_key
  $user_info_url = $WeiXin_Xd_Conf['code2session_url'];
  $user_info_url = sprintf("%s?appid=%s&js_code=%s&grant_type=%",$user_info_url,$appid,$secret,$js_code,$grand_type);
  $weixin_user_data = json_decode(get_url($user_info_url));
  $session_key = $weixin_user_data->session_key;
  //数据解密
  $data='';
  $wxBizDataCrypt = new WXBizDataCrypt($appid,$session_key);
  $errCode = $wxBizDataCrypt>decryptData($appid,$session_key,$encryptedData,$iv,$data);
}

最后拿到的这个data就是咱们解密后的encryptedData,里面会包含unionId.

这样就实现了微信的简单登陆。

 

 

 

 

 

 

 

 

 

 

 

原文地址:http://blog.csdn.net/sk719887916/article/details/53761107

相关文章
相关标签/搜索