微信小程序php实现登陆的代码,微信小程序实现微信登录

步骤:

1.调用wx.login得到code

返回的结果示例:

{

code:"051nI5Pa1XJkDs0773Pa1OWYOa1nI5PF"

errMsg:"login:ok"

}

2.拿code换取session_key与openid

这里使用服务端来请求,以php为例

$code = $this->input->post('code');

$json = 'https://api.weixin.qq.com/sns/jscode2session?appid='.WxPayConfig::APPID.'&secret='.WxPayConfig::APPSECRET.'&js_code='.$code.'&grant_type=authorization_code';

header("Content-Type: application/json");

echo file_get_contents($json);

其中appid与appsecret换成自己小程序的

得到的返回结果如下:

{

"session_key": "odMd5E1qJI5KJH7OTBVZYg==",

"expires_in": 7200,

"openid": "oqMjq0BqLl6mRarbByCf9rOAc3k0"

}

4.生成用户或登录用户

如果该openid不存在于数据库中,认为是新用户,注册它,如果openid已存在于数据库,认为是老用户。

php代码如下:

class User_model extends CI_Model {

// 当前用户

private $user;

// 注册或更新用户

public function registOrUpdate($data) {

if ($this->verify($data)) {

$this->update(['session_key' => $data->session_key], ['uid' => $this->user->uid]);

} else {

$this->regist($data);

}

$response = [

'thirdSession' => $this->generate3rdSession()

];

echo json_encode($response);

}

// 注册用户

private function regist($data) {

$this->db->insert('user', $data);

}

// 更新用户

private function update($user, $condition) {

$this->db->update('user', $user, $condition);

}

// 检测用户是否存在

private function verify($data) {

$query = $this->db->get_where('user', ['openid'=>$data->openid]);

$user = $query->first_row();

$this->user = $user;

if ($query->num_rows()) {

return true;

}

return false;

}

}

5.服务端生成自己的3rd_session

// 创建随机数

private function generate3rdSession() {

return md5(mt_rand() . $this->user->openid);

}

在registOrUpdate方法的最末尾加上如下代码调用:

$response = [

'thirdSession' => $this->generate3rdSession()

];

echo json_encode($response);

经上,3rd_session发送到了小程序客户端,接下来要做的是将它保存到storage中,以便于后续的每次wx.request()调用。

提示:按照官方文档的时序图来看,以上的随机还是真随机,它不是良好示范,对安全严谨的用途,谨慎使用。

login.png?t=201758

登录时序图

6.小程序端本地存储服务端传来的3rd_session

//发起网络请求

wx.request({

url: 'http://localhost:3000/index.php/WXLogin/getSession',

data: {

code: res.code

},

header: {

"content-type": "application/x-www-form-urlencoded"

},

method: 'POST',

success: function (res) {

// 保存3rdSession到storage中

wx.setStorage({

key:"thirdSession",

data: res.data.thirdSession

})

},

fail: function (res) {

console.log(res);

}

})

附加福利——换取union_id打通公众号与小程序用户体系

// 获取unionid

private function getUnionId($encryptedData, $iv) {

require_once __DIR__ . '/../third_party/aes/wxBizDataCrypt.php';

$appid = 'wxcb935c2ec6734f08';

$pc = new WXBizDataCrypt($appid, $sessionKey);

$errCode = $pc->decryptData($encryptedData, $iv, $data );

if ($errCode == 0) {

$obj = json_decode($data);

var_dump($obj->unionId);

// unset($array["watermark"]);

return [

'unionid' => $obj->unionId,

'nickname' => $obj->nickName,

'avatarUrl' => $obj->avatarUrl,

'gender' => $obj->gender,

'country' => $obj->country,

'province' => $obj->province,

'city' => $obj->city,

'language' => $obj->language

];

} else {

print($errCode . "\n");

}

}

这样就得到了unionid,就可以与自己的同一开发平台的帐号体系下的应用打通了,否则不会返回unionid。

这里有个坑,就是要把require_once放在getUnionId方法体内,而不是类顶部,因为为干扰header("Content-type: application/json")的输出,导致小程序端拿到的res.data是string而不是json对象。

最后成功存到了数据库,得到自己关心的信息。

6be259f355ee

unionid.png

注意要先将小程序挂载在开放平台下

6be259f355ee

bind.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《C++ Primer Plus(第六版)》(25)(第十三章 类继承 笔记)

1.派生类构造函数的要点: 首先创建基类对象; 应通过成员初始化列表将基类的初始化信息传递给基类的构造函数; 派生类构造函数应初始化新增的数据成员 2.首先执行派生类的析构函数,然后自动调用基类的析构函数. 3.基类指针可以在不进行显式类型转换的情况下指向派生类对象,基类引…

php实际应用小例子,PHP4实际应用经验篇(6)

现在,你已经明白PHP允许你嵌套条件语句。然而,如果你再看看那个用来示范此概念的例子时你将同意那是既复杂又令人感到可怕。--------------------------------------------------------------------------------if($day"Thursday"){if($time&q…

electron知识点

1.打开chrome开发工具栏: BrowserWindow.openDevTools(); 转载于:https://www.cnblogs.com/cag2050/p/6227987.html

oracle 12c缩容磁盘组,oracle 表收缩

当使用delete表数据后,空间无法释放,可以使用表收缩释放表空间;注意:当delete表大量数据的时候要注意undo,可以使用:alter table emp nologging; 让其不生产日志一、表的增长方式当表被创建后&#xff0…

php解决与处理网站高并发 大流量访问的方法

方法/步骤 首先,确认服务器硬件是否足够支持当前的流量 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻底解决性能问题。 …

oracle 自动表分析,Oracle自动分析索引,表

--分析表REATE OR REPLACE PROCEDURE analyze_tables IS--rec integer;v_date1 number(10);v_date2 number(10);V_SQL varchar2(512);v_msg varchar2(512);BEGINFOR rec IN (SELECT table_name FROM user_tables)LOOPv_date1 : dbms_utility.get_time;V_SQL : ANALYZE TABLE |…

JavaScript 函数(作用域以及闭包)

JavaScript 函数(作用域以及闭包) ・执行环境及作用域 执行环境定义了变量或函数有权访问的其他数据。 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量或函数都保存在这个对象中, 虽然我们编写的代码无法访问这个对…

十天学会PHP(第五版),十天学会php之第五天

十天学会php之第五天学习目的:学会读取数据先看两个函数:1、mysql_query送出一个 query 字符串。 语法: int mysql_query(string query, int [link_identifier]); 返回值: 整数本函数送出 query 字符串供 MySQL 做相关的处理或者执行。若没有指定 link_i…

《DSP using MATLAB》第6章开始了

看到第6章了,标记一下,全书近一半,继续加油 构建滤波器的三种元件: 下面是函数floor和size的部分帮助截图 转载于:https://www.cnblogs.com/ky027wh-sx/p/6235509.html

codeql php,使用codeql 挖掘 ofcms

前言网上关于codeql的文章并不多,国内现在对codeql的研究相对比较少,可能是因为codeql暂时没有中文文档,资料也相对较少,需要比较好的英语功底,但是我认为在随着代码量越来越多,传统的自动化漏洞挖掘工具的…

谈谈个人代码对团队合作影响

这几天正接手一个项目,属于后期功能拓展,要拓展这个项目,一定程度上要看到源码的部分,然后烦心的事情就来了,这代码写的真是让人挺无语的,原先写完整个项目的是已有多年工作经验的开发者,但是整…

php 连接符.,PHP怎么在数字之间添加连接符

PHP实现数字之间添加连接符,我们可以通过PHP中的for循环思想来实现。这里的连接符指的是“-”符号。推荐参考:《PHP教程》那么对于新手来说,可能有一定难度。下面我们就通过简单的代码示例,给大家介绍PHP给数字之间添加连字符的实…

linux怎么安装git服务器,linux下安装git服务端

[rootm2 ~]# yum install -y epel-*[rootm2 ~]# yum install -y git创建仓库目录[rootm2 ~]# mkdir /mnt/githome初始化目录[rootm2 ~]# git init --bare /mnt/githome/添加一个git用户,用来给开发者通过ssh访问git仓库 (git-shell是禁止服务器登录)[rootm2 ~]# use…

Linux —— 常用命令集合

关机和重启命令 shutdown [选项] 时间 (添加&,把关机任务放在后台执行) 只有shutdown可以保存关机时资源 操作选项 重启: r 关机: h 取消一个关机任务: c 关机命令(不安全) halt poweroff init 0 (系统运行级别) 重启命令 reboot init 6 (系统运行级别…

嵌入式linux 时间同步,解决嵌入式Linux中的时区问题

如果说让我做上层软件的工作,我做起来可以得心应手,但是让我做平台方面的工作(系统问题解决、驱动编写、软件移植等工作),确实不熟悉。所以很多问题都是摸着石头过河,没有经验。许多问题在有经验的朋友那里是小菜一碟,…

安装zabbix及LNMP的平台的搭建

Zabbix3.0.3安装文档 环境rhel 5.8 IP:192.168.0.8 需要安装: Nginx Php Mysql Zabbix 安装步骤: 一 . Nginx1.6安装 安装nginx前要先安装pcre(支持正则表达式),最好也安装一下openssl(可以支持…

linux脚本ls输出到变量中,bash – 将命令输出的错误消息存储到shell变量中

只需将stdout(正常输出)重定向到/ dev / null并保留stderror:a$(cp log.txt 2>&1 >/dev/null)看一个例子:$a$(cp log.txt 2>&1 >/dev/null)$echo "$a"cp: missing destination file operand after ‘log.txt’Try cp --he…

IOS 修改UIAlertController的按钮标题的字体颜色,字号,内容

IOS 修改UIAlertController的按钮标题的字体颜色,字号,内容 UIAlertController *alertVC [UIAlertController alertControllerWithTitle:"提示" message:nil preferredStyle:UIAlertControllerStyleActionSheet];//修改标题的内容&#xff0c…

bzoj2243

2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6753 Solved: 2496[Submit][Status][Discuss]Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点…

[原创]mybatis中整合ehcache缓存框架的使用

mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别&#xff0c;除了在SqlMapConfig.xml设置二级缓存的总开关&#xff0c;还要在具体的mapper.xml中开启二级缓存。 1.开启mybatis的二级缓存 在核心配置文件SqlMapConfig.xml中加入 1 <settings> 2 <…