微信小程序手机号验证开发遇到问题

公司小程序项目中快速登录需要实现微信用户授权手机登录、注册功能。结果遇到了

invalid code hint: [zHkDmt0sf-MBjga] rid: 64e3259f-1091b953-7e10f1da

 

目录

服务端文档

文档描述

返回信息

服务端代码

遇到问题

排查问题

1.服务端用错了appid serect

2.小程序端用错了appid serect

3.服务端用错了access_token

4.是否存在code使用了多次

5.非指定code

总结


服务端文档

文档描述

该接口需配合手机号快速验证或手机号实时验证能力一起使用,当用户同意后,可以通过 bindgetphonenumber 或 bindrealtimegetphonenumber 事件回调获取到动态令牌code,再调用该接口将code换取用户手机号。

注意:每个code只能使用一次,code的有效期为5min。

返回信息

 

功能流程

 

服务端代码

这里需要处理小程序发送过来code后,请求小程序手机号验证接口;

参数需要先获取小程序的access_token,和小程序获得的code。

class WeChat
{/*** 小程序appid* @var string*/protected static $min_AppId = '你的小程序 appid';/*** 小程序app secret* @var string*/protected static $min_AppSecret = '你的小程序secret';private static $_self;private function __construct(){// TODO: Implement __construct() method.}/*** 外部直接调用静态方法中的实例化* @return WeChat*/public static function getInstance(){if (!self::$_self instanceof self) {self::$_self = new self();}return self::$_self;}private function __clone(){// TODO: Implement __clone() method.}/*** 获取小程序接口调用凭证* @Author: Yjl* @Since: 2023/8/21 16:42* @return mixed*/protected function getMiniAccessToken(){$APPID = self::$min_AppId;$SECRET = self::$min_AppSecret;$url = "https://api.weixin.qq.com/cgi-bin/token?appid={$APPID}&secret={$SECRET}&grant_type=client_credential";$res = $this->linkCurl($url, 'GET');$res = djson($res);if (isset($res['errcode']) && $res['errcode']) {return [‘status’ => 0,’msg’ => $res['errmsg'],’data’=> ‘’];}return [‘status’ => 1,’msg’ => ‘success’,’data’=> $res['access_token']];}/*** 微信小程序-手机号快速验证* @Author: Yjl* @Since: 2023/8/21 16:01* @param $code* @return mixed*/public function getPhoneNumber($code){$res = $this->getMiniAccessToken();if ($res['status'] != 1) return $res;$url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" . $res['data'];$param = ['code' => $code];$data = json_encode($param);$header = array();$header[] = 'content-type:application/json';$res = $this->linkCurl($url, 'POST', $data, $header);$res = djson($res);if (isset($res['errcode']) && $res['errcode']) {return [‘status’ => 0,’msg’ => $res['errmsg'],’data’=> ‘’];}return [‘status’ => 1,’msg’ => ‘success’,’data’=> $res];}/*** 请求接口返回内容* @param $url :请求的URL地址* @param $method :请求方式POST|GET* @param $params :请求的参数* @param $header : 请求头* @return bool|string*/protected function linkCurl($url, $method, $params = array(), $header = array()){$ch = curl_init();curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HTTPHEADER, $header);curl_setopt($ch, CURLOPT_FAILONERROR, false);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);if (strpos("$" . $url, "https://") == 1) {curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);}curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);curl_setopt($ch, CURLOPT_TIMEOUT, 60);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);if ($method == "POST") {curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, $params);} else if ($params) {curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($params));}$response = curl_exec($ch);if ($response === false) {return false;}curl_close($ch);return $response;}
}

遇到问题

无效的code

invalid code hint: [zHkDmt0sf-MBjga] rid: 64e3259f-1091b953-7e10f1da

返回截图如下:

 

排查问题

1.服务端用错了appid serect

经过仔细排查代码内容,此项无问题。

2.小程序端用错了appid serect

经过前端同事对比,和原有小程序其他接口使用正常,此项可以排除。

3.服务端用错了access_token

因为服务端也有公众号操作,所以发现access_token用混了,改之后还是提示上方错误!

4.是否存在code使用了多次

通过前端打印请求日志和直接使用code请求微信接口,此项可排除。

5.非指定code

最后继续研究文档才发现此code非彼code;

怎么回事呢,项目中还有一个登录获取用户信息的也需要小程序端生成code,然后服务端去获取用户信息实现登录;跟手机号验证的code不是同一个code,前端给用混了。

文档如下:

步骤1:需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,通过 bindgetphonenumber 事件获取回调信息;

步骤2:将 bindgetphonenumber 事件回调中的动态令牌code传到开发者后台,并在开发者后台调用微信后台提供的 phonenumber.getPhoneNumber 接口,消费code来换取用户手机号。每个code有效期为5分钟,且只能消费一次。

注:getPhoneNumber 返回的 code 与 wx.login 返回的 code 作用是不一样的,不能混用。

总结

发现问题并解决了觉得很简单,但当时真的耽误了一天;为什么开始没发现这个问题,只能说是前后端联调的锅;在这里记录一下吧,之前从网上找解决方法的时候看到很多原因,我这里也提供一种解决思路吧;最后还是要多看文档,多做测试,多沟通。

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

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

相关文章

C++(Qt)软件调试---gdb调试入门用法(12)

gdb调试—入门用法(1) 文章目录 gdb调试---入门用法(1)1、前言1.1 什么是GDB1.2 为什么要学习GDB1.3 主要内容1.4 GDB资料 2、C/C开发调试环境准备3、gdb启动调试1.1 启动调试并传入参数1.2 附加到进程1.3 过程执行1.4 退出调试 4…

Spark第二课RDD的详解

1.前言 RDD JAVA中的IO 1.小知识点穿插 1. 装饰者设计模式 装饰者设计模式:本身功能不变,扩展功能. 举例: 数据流的读取 一层一层的包装,进而将功能进行进一步的扩展 2.sleep和wait的区别 本质区别是字体不一样,sleep斜体,wait正常 斜体是静态方法…

vue3+elementPlus table里添加输入框并提交校验

<template><div><el-form :model"info" ref"forms"><el-tableref"tableRef":data"info.data"border><el-table-column align"center" property"name" label"*姓名"><…

springboot整合rabbitmq

添加依赖 <!--RabbitMQ 依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</gro…

DFX概述 | Design For X | Design For Excellent

Design for X (DFX) Methods 什么是“Design for X”&#xff1f; Design for eXcellence是一种在设计和制造领域中的不断发展的原则哲学。它采用了全面和系统的设计方法&#xff0c;关注产品的各个方面——从概念生成到最终交付。 它提供了良好的实践和设计指南&#xff0c…

【RHEL】硬盘分区与格式化

fdisk命令 在linux中&#xff0c;fdisk是基于菜单的命令。对硬盘分区时&#xff0c;可以在fdisk命令后面直接加上要分区的硬盘作为参数(分区工具) 利用如下所示命令&#xff0c;打开fdisk操作菜单。 输入p,查看当前分区表。从命令执行结果可以到&#xff0c;/dev/mapper/rhel…

Python入门【原生字符串、边界字符、search函数、re模块中其他常用的函数 、贪婪模式和非贪婪模式、择一匹配(|)的使用、分组】(三十)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?

文章目录 前言什么是二分查找算法1.二分查找1.1 题目要求1.2 做题思路1.3 Java代码实现 2.在排序数组中查找元素的第一个和最后一个位置2.1 题目要求2.2 做题思路2.3 Java代码实现 3.搜索插入位置3.1 题目要求3.2 做题思路3.3 Java代码实现 4.x的平方根4.1 题目要求4.2 做题思路…

锚定医学营养 健启星深耕不辍

在生命医学中&#xff0c;营养被称为维持患者生命的物质基础。医学营养&#xff0c;是结合了医学临床营养、营养素与疾病预防等方面&#xff0c;并根据患者的医疗记录、身体检查及心理情况&#xff0c;由医生及专业营养师给出配比完善的营养素&#xff0c;以此来增加患者身体的…

控制台实现家庭记账本功能

需求&#xff1a; 在控制台实现家庭记账本的小功能&#xff0c;功能如下 参考代码如下&#xff1a; import java.util.Scanner;/*** <p>家庭账本-综合案例</p>** author 波波老师(weixin : javabobo0513)*/ public class Demo24 {public static void main(Strin…

docker之Compose与DockerSwarm

目录 Compose 简介 概念 为什么需要&#xff1f; 配置字段 常用命令 安装 1.下载 2.授权 使用 1.创建文件 2.启动 docker Swarm 关键概念 调度策略 spread binpack random 特性 集群部署 1.准备 2.创建swarm并添加节点 在主服务器上创建swarm集群 节点…

OpenCV中QR二维码的生成与识别(CIS摄像头解析)

1、QR概述 QR(Quick Response)属于二维条码的一种&#xff0c;意思是快速响应的意思。QR码不仅信息容量大、可靠性高、成本低&#xff0c;还可表示汉字及图像等多种文字信息、其保密防伪性强而且使用非常方便。更重要的是QR码这项技术是开源的&#xff0c;在移动支付、电影票、…

分布式锁 总结

分布式锁 在应用开发中&#xff0c;特别是web工程开发&#xff0c;通常都是并发编程&#xff0c;不是多进程就是多线程。这种场景下极易出现线程并发性安全问题&#xff0c;此时不得不使用锁来解决问题。在多线程高并发场景下&#xff0c;为了保证资源的线程安全问题&#xff0…

深度学习基础

文章目录 1. 数学基础1.1 标量和向量1.2 向量运算1.3 矩阵1.4 张量1.5 导数 2. numpy常用操作3. 梯度下降算法4. 反向传播4.1 完整的反向传播过程4.2 代码演示 5. 网络结构 -- 全连接层6. 激活函数6.1 激活函数-Sigmoid6.2 激活函数-tanh6.3 激活函数-Relu6.4 激活函数-Softmax…

Linux权限

Linux中一切皆文件&#xff0c;那么文件就应该有相对于的类型&#xff0c;而在Linux当中&#xff0c;类型不是直接看后缀来决定的。 -普通文件、文本、可执行、归档文件等d目录b块设备、block、磁盘c字符设备、键盘、显示器p管道文件s网络socket文件l链接文件 link 然后后面的九…

2023年京东儿童智能手表行业数据分析(京东销售数据分析)

儿童消费市场向来火爆&#xff0c;儿童智能手表作为能够实现定位导航&#xff0c;信息通讯&#xff0c;SOS求救&#xff0c;远程监听&#xff0c;智能防丢等多功能的智能可穿戴设备&#xff0c;能够通过较为精准的定位功能和安全防护能力保障儿童的安全&#xff0c;因而广受消费…

Oracle字段长度不足位数补零

Oracle字段长度不足位数补零 有时候从数据库中取出的月份值是1&#xff0c;而不是01&#xff0c;该怎么办呢 SELECTLPAD( CODE_MONTH, 2, 0 ) FROMtb_cube_TY001 WHERECODE_BM_MEATYPE TY20 AND code_measure MYLX01 AND code_month <> ~ AND CODE_ENTITY 01A AND…

k8s 安装istio (一)

前置条件 已经完成 K8S安装过程十&#xff1a;Kubernetes CNI插件与CoreDNS服务部署 部署 istio 服务网格与 Ingress 服务用到了 helm 与 kubectl 这两个命令行工具&#xff0c;这个命令行工具依赖 ~/.kube/config 这个配置文件&#xff0c;目前只在 kubernetes master 节点中…

Centos 7 安装系列(8):openGauss 3.0.0

安装依赖包&#xff1a; yum -y install libaio-devel flex bison ncurses-devel glibc-devel patch redhat-lsb-core readline-devel openssl-devel sqlite-devel libnsl 安装插件&#xff1a; yum install -y bzip2 net-tools为什么要安装这两个&#xff1f; 安装bzip2 是…

Ansible 创建使用角色

使用 Ansible Galaxy 和要求文件 /ansible/roles/requirements.yml 。从以下 URL 下载角色并安装到 /ansible/roles &#xff1a; http://materials/haproxy.tar 此角色的名称应当为 balancer http://materials/phpinfo.tar 此角色的名称应当为 phpinfo #创建 vim /ansible/r…