zoukankan      html  css  js  c++  java
  • 微信小程序开发-微信登陆流程

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

    从小程序代码说起

    简单说下小程序的js代码登陆流程

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

    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: 加密过的字符串。

    把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解析出来。

    服务器处理逻辑

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

     我们选择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

  • 相关阅读:
    Spring面试,IoC和AOP的理解
    WEB打印(jsp版)
    Spring事务管理机制的实现原理-动态代理
    spring面试题
    oracle PLSQL基础学习
    oracle创建表空间
    WM_CONCAT字符超过4000的处理办法
    Oracle 数据泵使用详解
    Oracle 数据泵详解
    linux下启动oracle
  • 原文地址:https://www.cnblogs.com/baixuemin/p/6511142.html
Copyright © 2011-2022 走看看