3rdsession php,【小程序+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

// | 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

namespace app\wechat\controller;use think\Controller; //使用控制器

use think\Db; //使用数据库操作

usethink\Request;usethink\config;useWxdev\WXBizDataCrypt;/** 微信模块*/

class Wxrun extendsBase{function__construct(){

parent::__construct();

}public functionindex(){//指定json数据输出

return json(['code'=>110,'message'=>"Power By 研发中心","result"=>null]);

}//用户登陆

public functionuser_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)

}

}

})

}

})

三: 测试结果:

bd0ee4ce0b2c788f1355126ffa2fa42bff1.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值