小程序+thinkphp5 用户登陆,返回第三方session3rd

Posted 依然范儿特西

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小程序+thinkphp5 用户登陆,返回第三方session3rd相关的知识,希望对你有一定的参考价值。

服务器环境: centos7   php7.0

准备工作: 

  • 注册小程序,并获取 appid 、appsecret
  • 下载微信解密算法sdk : https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html
  • https 的域名。需要在小程序后台服务器域名那配置

   

代码实现

 一 、 thinkphp5 

1  /extend/wxdev   把下载的加密算法放进去 

     坑1 : 微信下载的文件编码为: UTF-8-bootom  ,注意自己转换一下(不会的直接新建文件。把代码复制进去)

     坑2 :wxBizDataCrypt.php文件中  构造函数, 微信官方使用的和类名一致, php 高版本不支持(亲测: PHP5.6支持, PHP7.0 不支持)。请改为: __construct 

 

2  新建微信配置文件: /application/extra/wechat.php   

<?php
// +----------------------------------------------------------------------
// | Desc: 微信配置文件
// +----------------------------------------------------------------------
// | Author: 依然范儿特西
// +----------------------------------------------------------------------

return [

    //微信小程序ID
    "wx_appid"=>"",
    //微信小程序密钥
    \'wx_appsecret\'=>"",
    //微信接口域名
    "wx_request_url"=>"https://api.weixin.qq.com/sns/jscode2session",

];

 

 

3   /application/common.php    

     
    /** 
     * 发送HTTP请求方法 
     * @param string $url  请求URL 
     * @param array $params 请求参数 
     * @param string $method 请求方法GET/POST 
     * @return array $data  响应数据 
     */
    function http_send($url, $params, $method = \'GET\', $header = array(), $multi = false){ 
        $opts = array( 
        CURLOPT_TIMEOUT    => 30, 
        CURLOPT_RETURNTRANSFER => 1, 
        CURLOPT_SSL_VERIFYPEER => false, 
        CURLOPT_SSL_VERIFYHOST => false, 
        CURLOPT_HTTPHEADER   => $header 
        ); 
        /* 根据请求类型设置特定参数 */
        switch(strtoupper($method)){ 
        case \'GET\': 
            $opts[CURLOPT_URL] = $url . \'?\' . http_build_query($params); 
            break; 
        case \'POST\': 
            //判断是否传输文件 
            $params = $multi ? $params : http_build_query($params); 
            $opts[CURLOPT_URL] = $url; 
            $opts[CURLOPT_POST] = 1; 
            $opts[CURLOPT_POSTFIELDS] = $params; 
            break; 
        default: 
            throw new Exception(\'不支持的请求方式!\'); 
        } 
        /* 初始化并执行curl请求 */
        $ch = curl_init(); 
        curl_setopt_array($ch, $opts); 
        $data = curl_exec($ch); 
        $error = curl_error($ch); 
        curl_close($ch); 
        if($error) throw new Exception(\'请求发生错误:\' . $error); 
        return $data; 
    } 

 

 

4 控制器代码:  /application/wechat/controller/Wx.php

<?php
namespace app\\wechat\\controller;
use  think\\Controller;   //使用控制器
use  think\\Db;  //使用数据库操作
use  think\\Request;
use  think\\config;
use Wxdev\\WXBizDataCrypt; 
/*
* 微信模块
 */
class Wxrun  extends Base{
    function __construct(){
        parent::__construct();
    }
    
    public function index(){
        // 指定json数据输出
        return json([\'code\'=>110,\'message\'=>"Power By 研发中心","result"=>null]);
    }
    
    //用户登陆
    public  function user_login(){
      $APPID = config::get("wechat.wx_appid"); 
      $AppSecret = config::get("wechat.wx_appsecret"); 
      $wx_request_url = config::get("wechat.wx_request_url"); 
      $code = input("code");
      $param = array( 
        \'appid\' => $APPID, 
        \'secret\' => $AppSecret, 
        \'js_code\' => $code, 
        \'grant_type\' => \'authorization_code\'
      ); 
       // 一个使用curl实现的get方法请求
      $arr = http_send($wx_request_url, $param, \'post\'); 
      $arr = json_decode($arr,true);
      if(isset($arr[\'errcode\']) && !empty($arr[\'errcode\'])){
          return json([\'code\'=>\'2\',\'message\'=>$arr[\'errmsg\'],"result"=>null]);
      }
      $openid = $arr[\'openid\'];
      $session_key = $arr[\'session_key\'];

      // 数据签名校验
      $signature = input("signature");
      $signature2 = sha1($_GET[\'rawData\'].$session_key);  //别用框架自带的input,会过滤掉必要的数据
      if ($signature != $signature2) {
          $msg = "shibai 1";
          return json([\'code\'=>\'2\',\'message\'=>\'获取失败\',"result"=>$msg]);
      }

      //开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密
      $encryptedData = $_GET[\'encryptedData\'];
      $iv = $_GET[\'iv\'];
      include_once (EXTEND_PATH. \'Wxdev/wxBizDataCrypt.php\');
      $pc = new \\WXBizDataCrypt($APPID, $session_key);
      $errCode = $pc->decryptData($encryptedData, $iv, $data);  //其中$data包含用户的所有数据
      if ($errCode != 0) {
          return json([\'code\'=>\'2\',\'message\'=>\'获取失败\',"result"=>null]);
      }
      /****** */
      //写自己的逻辑: 操作数据库等操作
       /****** */
      //生成第三方3rd_session
      $session3rd  = null;
      $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
      $max = strlen($strPol)-1;
      for($i=0;$i<16;$i++){
          $session3rd .=$strPol[rand(0,$max)];
      }
      return json([\'code\'=>\'1\',\'message\'=>\'获取成功\',"result"=>$session3rd]);

    }    
   

}

 

二 、 小程序代码:

 直接在 app.js 编写

 

// 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
        var code = res.code;
        wx.getUserInfo({
          success: res => {
            // 可以将 res 发送给后台解码出 unionId
            this.globalData.userInfo = res.userInfo
            var rawData = res.rawData;
            var signature = res.signature;
            var encryptedData = res.encryptedData;
            var iv = res.iv;
            wx.request({
              url: \'https://www.test.com/wechat/wx/user_login\',
              data: {
                "code": code,
                "rawData": rawData,
                "signature": signature,
                \'iv\': iv,
                \'encryptedData\': encryptedData
              },
              success: function (info) {
                console.log(info);
              }
            })
            // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
            // 所以此处加入 callback 以防止这种情况
            if (this.userInfoReadyCallback) {
              this.userInfoReadyCallback(res)
            }
          }
        })
      }
    })

 

三: 测试结果: 

 

以上是关于小程序+thinkphp5 用户登陆,返回第三方session3rd的主要内容,如果未能解决你的问题,请参考以下文章

小程序 判断是不是为新用户 登陆授权 封装request请求

微信小程序商城构建全栈应用 Thinkphp5

[作业管理系统开发实战三 ]用户登陆模块的后端代码(thinkphp5)

redis+thinkphp5的注册登陆关注基础例子

小程序微信登录

[小程序]微信小程序登陆并获取用户信息