Song200301090015 2023-03-24 06:14 采纳率: 100%
浏览 93
已结题

微信授权登录,云函数报错

用阿里云的云函数,做微信授权登录,用的是HBuild X 3.7.3,以下为代码和报错,感谢解答,如果有表述不清的地方也欢迎指正。
云函数:

'use strict';
exports.main = async (event, context) => {
    //event为客户端上传的参数
    console.log('event : ', event)

    let res = await uniCloud.httpclient.request({
        url: `https://api.weixin.qq.com/sns/jscode2session`,
        data: {
            appid: '已填',
            secret: '已填',
            js_code: event.code,
            grant_type: 'authorization_code'
        },
        dataType: 'json'
    });
    console.log('res', res);
    let jwt = require('jsonwebtoken');
    let mySecret = 'lv5n7okh99398gwax27m3asmq285m6xr';
    let token = jwt.sign({
        openid: res.data.openid,
        session_key: res.data.session_key
    }, mySecret, {
        expiresIn: '1d'
    });
    return {
        token
    };
}

客户端函数

<template>
    <view><button class="button" @click="login">微信授权登录</button></view>
</template>

<script>
const db = uniCloud.database();
export default {
    methods: {
        async login() {
            let token = uni.getStorageSync('token');
            if (!token) {
                let res = await uni.login({
                    provider: 'weixin',
                    onlyAuthorize: true
                });
                console.log(res[1].code);
                let code = res[1].code;
                let res2 = await uniCloud.callFunction({
                    name: 'getToken',
                    data: { code }
                });
                console.log(res2);
                token = res2.result.token;
                uni.setStorageSync('token', token);
                console.log('token', token);
            }
        }
    }
};
</script>

(本地云函数)报错如下:

img


(云端云函数)报错如下:

img

  • 写回答

8条回答 默认 最新

  • JoseKe 2023-03-26 20:43
    关注
    问题分析:
    根据报错信息,可以看出是云函数中使用了uniCloud.httpclient.request()方法,但是该方法在云函数中不可用,因此导致了报错。
    解决方案:
    1. 使用uni.request()方法代替uniCloud.httpclient.request()方法。
    2. 在云函数中使用uniCloud.httpclient.request()方法时,需要在云函数的配置文件中添加httpclient配置,如下所示:

    {
    "env": "your-env-id",
    "function": {
    "service": "your-service-name",
    "name": "your-function-name",
    "timeout": 30,
    "httpclient": {
    "timeout": 5000
    }
    }
    }

    其中,httpclient.timeout表示请求超时时间,单位为毫秒。
    3. 如果以上两种方法都无法解决问题,可以尝试在云函数中使用uniCloud.httpclient.request()方法时,将dataType参数改为text,如下所示:

    let res = await uniCloud.httpclient.request({
    url: `https://api.weixin.qq.com/sns/jscode2session`,
    data: {
    appid: '已填',
    secret: '已填',
    js_code: event.code,
    grant_type: 'authorization_code'
    },
    dataType: 'text'
    });
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 4月8日
  • 已采纳回答 3月31日
  • 赞助了问题酬金15元 3月24日
  • 创建了问题 3月24日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助