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

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

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 作用是不一样的,不能混用。

总结

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值