php 微信小程序转义403
function code 微信 iv 偶现 encryptedData 41003 encodeURIComponent
关于小程序微信授权登录提示41003
文章简介
之前做项目的时候遇到微信授权登录偶现的41003问题,也是排查了好久才找到原因,在这边做下记录,也做下分享。
原因一(iv和encryptedData转码问题)
因为微信小程序提供的特定授权按钮 button open-type=“getPhoneNumber”,获得的iv和encryptedData,会含有 "+ ?"特殊符号,所以前端这边传输的时候需要使用encodeURIComponent 函数进行 urlencode,后端接收urldecode,
例如:
// An highlighted block
let param = {
encryptedData: encodeURIComponent(e.detail.encryptedData),
iv: encodeURIComponent(e.detail.iv),
code: code
}
试了一下全部转码了,结果没啥卵用,还是没有解决 偶现的41003问题,重新排查,排查终于排查到了第二个原因。
原因二(wx.login()获取code顺序问题)
本来的的代码是这样,例:
// An highlighted block
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">微信一键登录,领取名片</button>
// An highlighted block
getPhoneNumber: function(e) {
uni.login({
success: function(loginRes) {
let param = {
encryptedData: encodeURIComponent(e.detail.encryptedData),
iv: encodeURIComponent(e.detail.iv),
code: loginRes.code
}
wx.request({
data: param,
success:function() {
})
}
})
}
经过尝试发现wx.login()里code的获取是不能放在 button* *open-type="getPhoneNumber"的回调函数里面的,code应该是需要提前获取了,例:
// An highlighted block
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">微信一键登录,领取名片</button>
// An highlighted block
// 每次已进入页面就请求code,存放本地,过了有效期五分钟,重新请求code
onShow() {
wxlogin()
// 微信登录code有效期 五分钟
this.globalTimer = setInterval(() => {
wxlogin()
}, 299990)
}
// 请求code方法
wxlogin = function() {
uni.login({
success: function(loginRes) {
uni.setStorageSync('code', loginRes.code);
}
})
}
// *button** ==*open-type="getPhoneNumber"回调
getPhoneNumber: function(e) {
let param = {
encryptedData: encodeURIComponent(e.detail.encryptedData),
iv: encodeURIComponent(e.detail.iv),
code: uni.getStorageSync('code');
}
wx.request({
data: param,
success:function() {
})
}
// 离开页面 清除定时器
onHide() {
if (this.globalTimer) {
clearInterval(this.globalTimer)
}
},
后端应该修改成这样:
/**
* 换取用户信息
* @param string $code 用户登录凭证(有效期五分钟)
* @param string $iv 加密算法的初始向量
* @param string $encryptedData 加密数据( encryptedData )
* @return array
* @throws InvalidDecryptException
* @throws InvalidResponseException
* @throws \WeChat\Exceptions\LocalCacheException
*/
public function userInfo($code, $iv, $encryptedData)
{
$result = $this->session($code);
if (empty($result['session_key'])) {
//code换取session失败 再试一次
$result = $this->session($code);
if (empty($result['session_key'])) {
throw new InvalidResponseException('Code 换取 SessionKey 失败', 403);
}
}
$userinfo = $this->decode($iv, $result['session_key'], $encryptedData);
if (empty($userinfo)) {
$iv = urldecode($iv);
$encryptedData = urldecode($encryptedData);
$userinfo = $this->decode($iv, $result['session_key'], $encryptedData);
if (empty($userinfo)) {
throw new InvalidDecryptException('用户信息解析失败', 403);
}
}
return array_merge($result, $userinfo);
}
改成这种提前获取code然后再传入getPhoneNumber的回调函数使用仪器传给后端发现 偶现的==41003== 问题就解决了。
引用 https://www.icode9.com/content-1-896152.html
php 微信小程序转义403的更多相关文章
- 微信小程序转义解析渲染html
今天开发小程序时,想调用商品详情字段,发现大部分是用编辑器编辑的html原生标签,无法在小程序直接使用. 后面自己使用正则和字符串替换,效果也不佳. 最后在网上找到了wx-mina-html-view ...
- 微信小程序 WXS实现json数据需要做过滤转义(filter)
前言 最近有在做小程序开发,在开发的过程中碰到一点小问题,描述一下先. 本人在职的公司对于后台获取的 json 数据需要做过滤转义的很多,不同的状态码会对应不同的文字,但是在微信小程序中又没有类似 v ...
- .net mvc 站点自带简易SSL加密传输 Word报告自动生成(例如 导出数据库结构) 微信小程序:动画(Animation) SignalR 设计理念(一) ASP.NET -- WebForm -- ViewState ASP.NET -- 一般处理程序ashx 常用到的一些js方法,记录一下 CryptoJS与C#AES加解密互转
.net mvc 站点自带简易SSL加密传输 因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net ...
- 微信小程序开发日记——高仿知乎日报(中)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...
- 微信小程序之知乎日报
上一次的<微信小程序之小豆瓣图书>制作了一个图书的查询功能,只是简单地应用到了网络请求,其他大多数小程序应有的知识.而本次的示例是知乎日报,功能点比较多,页面也比上次复杂了许多.在我编写这 ...
- 微信小程序入门——Mustache语法学习
微信小程序中用到了大量Mustache语法,特发此文学习一下 1.简单的变量调换:{{name}} 1 var data = { "name": "Willy" ...
- 两百条微信小程序跳坑指南(不定时更新)
微信小程序联盟出品 跳坑textarea<二百二十三>不显示文本及textarea相关问题集合跳坑<二百一十三> background-image无法获取本地资源图片....跳 ...
- 官方问答--微信小程序常见FAQ (17.8.21-17.8.27)
给提问的开发者的建议:提问之前先查询 文档.通过社区右上角搜索搜索已经存在的问题. 写一个简明扼要的标题,并且正文描述清楚你的问题. 提交 BUG:需要带上基础库版本号,设备信息(iOS, Andro ...
- 微信小程序语音识别服务搭建全过程解析(项目开源在github)
silk v3录音转olami语音识别和语义处理的api服务(ubuntu16.04服务器上实现) ## 重要的写在前面 重要事项一: 目前本文中提到的API已支持微信小程序录音文件格式:silk v ...
- 微信小程序语音识别服务搭建全过程解析(https api开放,支持新接口mp3录音、老接口silk录音)
silk v3(或新录音接口mp3)录音转olami语音识别和语义处理的api服务(ubuntu16.04服务器上实现) 重要的写在前面 重要事项一: 所有相关更新,我优先更新到我个人博客中,其它地方 ...
随机推荐
- macos修改hosts后清理dns缓存
sudo killall -HUP mDNSResponder sudo killall mDNSResponderHelper sudo dscacheutil -flushcache
- Flink-cdc同步mysql到iceberg丢失数据排查
一.获取任务信息 任务id:i01f51582-d8be-4262-aefa-000000 任务名称:ods_test1234 丢失的数据时间:2024-09-16 09:28:47 二.数据同步查看 ...
- Flink流式数据缓冲后批量写入Clickhouse
一.背景 对于clickhouse有过使用经验的开发者应该知道,ck的写入,最优应该是批量的写入.但是对于流式场景来说,每批写入的数据量都是不可控制的,如kafka,每批拉取的消息数量是不定的,fli ...
- IDEA 编辑java项目跳过测试
一.Idea配置
- jenkins+gitee+tomcat
1.Jenkins [系统配置]添加gitee服务 2.项目配置 General 配置之前配置的gitee服务连接 3.源码配置 4.构建配置 5.构建触发器配置 最重要的是: 6.在gitee中配置 ...
- HTML - 1、基础
<!DOCTYPE html> <!-- 指定网页内容的语言 --> <html lang="en"> <head> <!-- ...
- Linux操作文件IO
Linux操作文件IO 参考自:[北京迅为]嵌入式linux开发指南_v1.1(i.MX6ULL) 文件 IO 是 Linux 系统提供的接口,针对文件和磁盘进行操作,不带缓存机制: 标准 IO 是 ...
- autMan奥特曼机器人-定时推送的用法
一.定时推送功能简介 "定时推送"位于"系统管理"目录 主要有两个功能: 一是定时向某人或某群发送信息. 二是定时运行某指令,就是机器人给自己发指令,让自己运行 ...
- Emacs 的优点及与 DE 的比较
一.引言 在编程领域,对于工具的选择一直是开发者们热议的话题.今天,我们来探讨一下 Emacs 及其所具有的优点,并思考使用 Emacs 写程序是否真的比使用集成开发环境(IDE)更方便. 二.Ema ...
- Flink - [04] 窗口(Windows)
题记部分 一.Flink中的窗口是什么 (1)一般真实的流都是无界的,怎样处理无界的数据? (2)可以把无限的数据流进行切分,得到有限的数据集进行处理 -- 也就是得到有界流 (3)窗口(Window ...