基于ThinkPHP框架小程序获取微信用户信息并将存进数据库

场景描述:
在微信小程序中,我们可能用到很多种登陆方式,例如用手机作为标识登陆亦或者用微信信息作为标识登陆(但这写都要看你的项目需要),在这里我说一下如何使用微信信息作为标识登陆。

编程思路:
分三步走,第一步微信信息获取发送给后台-》第二步解密微信信息验证数据库-》登陆成功保存缓存并且更新token

小程序前端处理

 1 //调用登录接口,获取 code
 2 wx.login({
 3       success: function (res) {
 4         //微信js_code
 5         that.setData({ wxcode: res.code });
 6         //获取用户信息
 7         wx.getUserInfo({
 8           success: function (res) {
 9             //获取用户敏感数据密文和偏移向量
10             that.setData({ encryptedData: res.encryptedData })
11             that.setData({ iv: res.iv })
12           }
13         })
14       }
15     })

为了让大家看得更清楚,我在这里直接打印到视图层(),数据获取到了,接下来将数据发送到后台,有时候后台解密用户信息失败,可能是因为你获取小程序的用户信息再获取用户的code导致的,所以先获取code码再获取用户加密信息

 1 //获取post数组,thinkphp5封装好的input函数,而tp3是I()函数;如果前端使用的是json类型的数据,tp3I函数是获取不了的,只能使用输入流的形式 file_get_contents(‘php://input‘);
 2 //这里缺少对数据的验证,大家不要学我,tp5是有验证层
 3
 4     //tp5,获取json和formdata类型
 5     $data = input(‘post.‘);
 6
 7     //获取微信信息的基本url,其中%s是转换符,这条url应该存到全局文件中,怎么传自己想
 8     $baseInfoUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
 9     $infoUrl = sprintf($baseInfoUrl, ‘填写你的微信小程序appid‘,‘填写你的小程序secret_key‘,$data[‘code‘);
10
11     $apiData = json_decode(httpCurl($apiUrl), true);    //这个是异步调用api,方法在底部
12
13    //获取微信用户session_key
14    (!isset($apiData[‘session_key‘])) ?
15             throw new Exception(‘获取微信信息失败‘)
16             $errCode = $this->decryptData(‘你的aooppid‘, $apiData[‘session_key‘], $data[‘encryptedData‘], $data[‘iv‘], $data);    //方法在文章底部
17
18         //判断解密是否出错
19         ($errCode != 0) ?
20             throw new Exception(‘解密微信信息失败‘)
21             $data = json_decode($data, true);//通过引用改变了data信息,解密后获取用户unionId和session_key前者辨别公众号信息,后者获取手机信息(个人认为)
22
23     //到这一步就获取到用户的所有信息了$data
24
25     //判断用户是否存在,不存在就新增,存在就更新用户信息
26
27     //更新用户信息Token和其他基本信息

附带异步调用api和解密微信信息

 1   /**
 2      * 检验数据的真实性,并且获取解密后的明文.
 3      * @param $encryptedData string 加密的用户数据
 4      * @param $iv string 与用户数据一同返回的初始向量
 5      * @param $data string 解密后的原文
 6      *
 7      * @return int 成功0,失败返回对应的错误码
 8      */
 9     public function decryptData($appid, $sessionKey, $encryptedData, $iv, &$data)
10     {
11         $OK = 0;
12         $IllegalAesKey = -41001;//encodingAesKey 非法
13         $IllegalIv = -41002;
14         $IllegalBuffer = -41003;//aes 解密失败
15         $DecodeBase64Error = -41004;//解密后得到的buffer非法
16
17         if (strlen($sessionKey) != 24) {
18             return $IllegalAesKey;
19         }
20         $aesKey = base64_decode($sessionKey);
21
22
23         if (strlen($iv) != 24) {
24             return $IllegalIv;
25         }
26         $aesIV = base64_decode($iv);
27
28         $aesCipher = base64_decode($encryptedData);
29
30         $result = openssl_decrypt($aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
31
32         $dataObj = json_decode($result);
33         if ($dataObj == NULL) {
34             return $IllegalBuffer;
35         }
36         if ($dataObj->watermark->appid != $appid) {
37             return $IllegalBuffer;
38         }
39         $data = $result;
40         return $OK;
41     }
42
43
44 /**
45  * curl请求访问
46  * @param $url string 地址
47  * @param $data string post数据
48  * @return mixed string 返回结果
49  */
50 function httpCurl($url,$data = "")
51 {
52     $curl = curl_init();
53     curl_setopt($curl, CURLOPT_URL, $url);
54     curl_setopt($curl, CURLOPT_REFERER, $url);
55     curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Linux; Android 5.0; SM-N9100 Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36 V1_AND_SQ_5.3.1_196_YYB_D QQ/5.3.1.2335 NetType/WIFI");
56     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
57     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
58     if($data != ‘‘){
59         curl_setopt($curl,CURLOPT_POST,1);
60         curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
61     }
62     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
63     $result = curl_exec($curl);
64     return $result;
65 }

原文地址:https://www.cnblogs.com/wadhf/p/12108051.html

时间: 2024-11-03 20:45:17

基于ThinkPHP框架小程序获取微信用户信息并将存进数据库的相关文章

PHP 微信公众号/小程序获取openid,用户信息

1.获取code (获得openid的前置条件) 地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=redirectUrl&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect 需要填写APPID,回调地址 redirectUrl(拿到code后

小白学react之网页获取微信用户信息

通过上一篇<小白学react之EJS模版实战>我们学习了如何通过EJS模版生成我们高定制化的index.html文件. 本篇我们将会继续延续我们的alt-tutorial项目的实战计划,去获取微信扫码用户的信息,并将头像显示在我们页面的右上角上. 最终实战效果将如下所示. 首先根据我们的网站url生成二维码,比如我们可以通过浏览器的FeHelper来生成: 然后用户通过微信扫码: 最后用户确定授权后获取到用户的基本信息,并将头像显示在右上角: 1. 内网穿透准备 我们获取微信用户信息的过程中,

Magicodes.WeiChat——使用OAuth 2.0获取微信用户信息

使用Magicodes.WeiChat,可以很方便的获取到微信用户的信息.在使用OAuth 2.0之前,你先需要做以下操作: 1)在开发者中心修改[网页授权获取用户基本信息],在弹出的界面输入自己的根域名.比如:weichat.chinacloudsites.cn 如下图所示: 2)配置菜单或者链接(如果使用特性“WeChatOAuth”,本步骤可以略过,这里只是介绍下原理,具体请参考步骤3的说明).Magicodes.WeiChat在控制器WeiChatController中进行处理,配置路径

Android 微信登录昵称乱码问题,及获取微信用户信息

微信第三方登录时昵称,username乱码问题解决方法如下: /** * 获取微信用户信息 * @param access_token 调用凭证 * @param openid 普通用户的标识,对当前开发者帐号唯一 * @return */ public static String getWeixinUserinfo(String access_token, String openid){ String URLs = ChildendConstant.WEIXIN_USERINFO;//微信登录

python flask获取微信用户信息报404,nginx问题

在学习flask与微信公众号时问题,发现测试自动回复/wechat8008时正常,而测试获取微信用户信息/wechat8008/index时出现404.查询资料后收发是nginx配置问题. 在location后面加上=是严格匹配,url后面必须完全一至,不加等号则是只要url是以该信息开头就匹配成功.所以去掉等号,重启nginx正常. 将 location = /wechat8008 {改为 location /wechat8008 { 重启nginx sudo /usr/local/nginx

python获取微信小程序openid及用户信息

填坑记录:1.个人微信公众订阅号是不能申请微信认证的.公众号的类型在注册时一旦选择就不能更改,微信公众号认证的功能除个人订阅号外,都可以申请认证,因而个人订阅号不能申请认证.这句话的意思就是个人订阅号无法开发小程序. 2.个体户营业执照(个体户)可申请微信服务号并申请开发小程序,但需微信认证复用资质并用新邮箱注册小程序账号 3.微信开发工具创建微信小程序填写的appid是小程序的appid(不是微信公众号的),不能是个人小程序的appid,个人小程序没有获取用户信息的权限 4.调用接口获取用户信

SpringCloud : 接入 微信公众号平台(四)、获取微信用户信息接口

代码参考: import com.phpdragon.wechat.proxy.config.WeChatConfig; import com.phpdragon.wechat.proxy.dto.mp.user.GetOauthUserInfoDto; import com.phpdragon.wechat.proxy.dto.mp.user.GetOpenidDto; import com.phpdragon.wechat.proxy.dto.mp.user.GetUserInfoDto;

集成微信第三方登录功能获取微信用户信息

最近公司要做微信的第三方登录,本来打算直接用第三方的框架就算了,就闲的想自己集成试试看. 然后发现被腾讯坑得不省人事. 前提,应用必须要在微信开发平台上注册,并且通过审核,有微信登录的权限. 首先,下载官方的demo.把libs的jar包拷到自己的工程里. 在应用的包名下,建一个wxapi的包目录,在里建一个叫WXEntryActivity的activity并实现IWXAPIEventHandler监听,用于微信回调数据! 下面是我自己的WXEntryActivity,OnUserInfoLis

php获取微信用户信息(没测试过)

<?php /** * 通过$appid.$appsecret获得基础支持的接口唯一凭证access_token,返回值为array类型 */ function get_access_token_base($appid , $appsecret ) { $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";