小程序保持登陆状态php,微信小程序登陆及登陆状态保持

695b76e49f5a97bebae8491d2b1f1017.png

在小程序中登录的第一步,就是先获取登录凭证。我们可以使用wx.login()方法并得到一个登录凭证。

我们可以在小程序的App代码中发起登录凭证请求,也可以在其他任何Page页面代码中发起登录凭证请求,主要根据你小程序的实际需要。

具体过程 可以看上图,不多说直接上代码

login.js

userInfo: function (res) {

console.log(res)

//取得用户信息

var code=wx.getStorageSync('code')

var rawData = res.detail.rawData;

var signature = res.detail.signature;

var encryptedData =res.detail.encryptedData;

var iv = res.detail.iv;

wx.request({

url: 'http://localhost/yyh/1000jaindex.php',

data: {"code": code,

'rawData':rawData,

"signature": signature,

'iv': iv,

'encryptedData': encryptedData,

'operation_name':'op_session',

'submit':"1"

},

method: 'post',

header: {

"Content-Type": 'application/x-www-form-urlencoded;charset=utf-8'

},

success: function (res) {

console.log(res);

let res=res.data

if (res.status==200){

wx.setStorageSync("openid", res.openid)

}

}}

op_sesion.php

$v) {

//数据过滤---以后补全

if(in_array($k,$this->keystr_arr,true)){

$v =$this->strrep($v);//定义动态变量

//检查请息信息是否是$hold_word字段内

if(in_array($k,$this->hold_word,true)){

//定义动态变量

$this->$k= $v ;

//echo("赋值后".$k."=".$v."

");

}

else{

// //echo "初始化中2".$k;

//PHP 中的中括号一般是用来通过数组的键名来获取数组相应的值

//把不是$hole_word字段内的 认为输入非法

$this->result = array(

'status' => 500, /* 返回状态,200 成功,500失败 */

'message'=> "非法访问" );

exit;

}

}

}

//echo "初始化成功";

}}

public function get_result(){

$this->login();

return json_encode($this->result,JSON_UNESCAPED_UNICODE);

die();

}

/*

*登录(调用wx.login获取)

* @param $code string

* @param $rawData string

* @param $signatrue string

* @param $encryptedData string

* @param $iv string

* @return $code 成功码

* @return $session3rd 第三方3rd_session

* @return $data 用户数据

*/

private function login()

{

//开发者使用登陆凭证 code 获取 session_key 和 openid

//通过sha1($rawData . $session_key)计算得出Signature2并与Signature比较

//并通过session_key 解密encryptedData后得到的完整用户数据

$APPID = $this->APPID;

$AppSecret =$this->AppSecret;

$code = $this->code;

$url = "https://api.weixin.qq.com/sns/jscode2session?appid=" . $APPID . "&secret=" . $AppSecret . "&js_code=" . $code . "&grant_type=authorization_code";

$arr = $this->vget($url); // 一个使用curl实现的get方法请求

//var_dump ($arr);

$arr = json_decode($arr, true);

$this->openid = $arr['openid']; //通过code 从api.weixin取得openid 和session_key

$session_key = $arr['session_key'];

$this->session_key = $session_key;

// 数据签名校验

$signature = $this->signature;

$rawData = $this->rawData;

$signature2 = sha1($rawData . $session_key); //计算得出Signature2

if ($signature != $signature2) {

return json_encode(['status' => 500, 'message' => '数据签名验证失败!'],JSON_UNESCAPED_UNICODE);

die();

}

else{

$this->result = array(

'status' => 200, /* 返回状态,200 成功,500失败 */

'message'=> "数据签名验证成功",

'openid'=>$this->openid,);

}

}

//一个使用curl实现的get方法请求

private function vget($url){

$info=curl_init();

curl_setopt($info,CURLOPT_RETURNTRANSFER,true);

curl_setopt($info,CURLOPT_HEADER,0);

curl_setopt($info,CURLOPT_NOBODY,0);

curl_setopt($info,CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($info,CURLOPT_SSL_VERIFYHOST, false);

curl_setopt($info,CURLOPT_URL,$url);

$output= curl_exec($info);

curl_close($info);

return $output;

}

//解密encryptedData 得到的完整用户数据注意解密前先应调用loing()方法取得$session_key

private function decipher(){

//echo "准备解密数据";

include_once("Vendor/wxBizDataCrypt.php"); //加载解密文件,在官方有下载

$encryptedData = $this->encryptedData;

$iv =$this->iv;

$session_key=$this->session_key;

$APPID=$this->$APPID;

$pc = new WXBizDataCrypt($APPID, $session_key);

$errCode = $pc->decryptData($encryptedData, $iv, $data); //其中$data包含用户的所有数据

if ($errCode == 0) {

$this->data=$data;

} else {

return $errCode;//打印失败信息

die;

}

}

openid 唯一对应用户身份的标识,网站可将此ID进行存储便于用户下次登录时辨识其身份,或将其与用户在网站上的原有账号进行绑定。公众号的openid的长度是28位。

其间跳过的坑: 获取openid时报错40029 invalid code

最后发现,appid与小程序里使用的不一致

Vendor/wxBizDataCrypt.php包可在腾迅获得

获取用户OpenID 参考 http://wiki.open.qq.com/wiki/mobile/获取用户OpenID

返回的公共码参考 http://wiki.open.qq.com/wiki/mobile/公共返回码说明#9000-9999.EF.BC.9AWAP.E7.BD.91.E7.AB.99.E6.8E.A5.E5.85.A5.EF.BC.8C.E6.A0.B9.E6.8D.AEAccess_Token.E8.8E.B7.E5.BE.97.E5.AF.B9.E5.BA.94.E7.94.A8.E6.88.B7.E8.BA.AB.E4.BB.BD.E7.9A.84openid.E6.97.B6.EF.BC.8C.E5.8F.91.E7.94.9F.E9.94.99.E8.AF.AF

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值