unistarter无法实现微信一键登录

用的unistarter,需要实现微信一键登录,但一直显示获取第三方账号失败

img

对于使用 unistarter 实现微信一键登录时出现获取第三方账号失败的问题,可能有以下几个可能的原因和解决方法:

  1. AppID和AppSecret配置错误:确保您在 unistarter 的配置中正确填写了微信开放平台的 AppID 和 AppSecret。请检查配置文件或相关设置,确保凭证信息是准确的。

  2. 域名配置问题:微信一键登录需要在微信开放平台中配置授权回调域名。请确保您已在开放平台设置中正确配置了授权回调域名,且与 unistarter 中的域名配置一致。

  3. 网络访问问题:确保服务器能够正常访问微信开放平台的接口。检查网络设置、防火墙或代理等,确保服务器能够与微信开放平台进行通信。

  4. 版本兼容性问题:检查 unistarter 和微信开放平台的版本兼容性。如果 unistarter 的版本过旧,可能存在与最新版微信开放平台接口不兼容的情况。尝试更新 unistarter 或与 unistarter 开发者社区联系以获取更多支持。

  5. 日志调试:打开 unistarter 的日志调试功能,查看详细的错误信息和请求/响应日志。这可以帮助您更好地定位问题所在。

可能是这个问题

config.json
 注意:此文件中不要有注释,容易导致配置失效

检查小程序appid,用户openid是否正确

这个试试

// 微信一键登录
           getPhoneNumber(e) {
         
                if (e.detail.errMsg.indexOf('deny') > -1) {
                    // e.detail.errMsg
                    //获取手机号失败,前往手机登录界面
                    uni.showToast({
                        title: "获取手机号失败,请前往手机登录界面",
                        icon: "none"
                    })
                    this.routeTo();
                    return;
                } else {
                    const encryptedData = e.detail.encryptedData;
                    if (typeof encryptedData === 'undefined' || encryptedData == null || encryptedData === '') {
                        //前往手机登录界面
                        uni.showToast({
                            title: "获取手机号失败,请前往手机登录界面",
                            icon: "none"
                        })
                        this.routeTo();
                        return;
                    }
                }

                uni.showLoading({
                    title: '加载中...'
                });

               // 后端请求 bindWxMobileLogin接口
                bindWxMobileLogin({
                        code: this.wxcode,
                        iv: e.detail.iv,
                        encryptedData: e.detail.encryptedData,
                        // inviter_mobile: "",
                    })
                    .then((res) => {
                        uni.hideLoading()
                        // 缓存token,user,opendId的值
                        uni.setStorageSync('token', res.token)
                        uni.setStorageSync('pUser', res.pUser)
                        uni.setStorageSync('openId', res.openId)
                        uni.reLaunch({
                            url: this.route,
                            animationType: 'pop-in'
                        });


                    })
                    .catch((e) => {
                        uni.showToast({
                            title: "获取手机号失败,请前往手机登录界面",
                            icon: "none"
                        })
                        this.routeTo();
                        return;
                        // uni.hideLoading()
                        // this.getwxLogin()
                        // this.disabled = false;
                    });
            },

             

          //  请求失败想要跳转的页面
            routeTo() {
                return uni.navigateTo({
                    url: "./phone-login",
                    animationDuration: "pop-in",
                })
            },


这篇博客也许能帮助您https://blog.csdn.net/weixin_49296337/article/details/124755651

以下答案由GPT-4.0Plus大模型与博主A努力中.......共同编写:
这是因为uniapp中的uni.login授权登录仅支持微信开放平台帐号(开发者帐号),而不支持微信个人帐号。
要实现微信个人帐号的一键登录,有两种方案:

  1. 使用微信开发者工具自带的api,而不使用uni.login。具体步骤如下:
    (1)选择“项目”→“项目配置”→“权限配置”,勾选“微信登录”权限。
    (2)在代码中调用:
js
wx.login({
  success(res) {
    wx.getUserInfo({
      success(res) {
        // 获取到用户信息了
      }
    })
  }
})

(3)在app.json中配置"oauth": {"scope": "snsapi_userinfo"}。
(4)在小程序后台的“开发”→“开发设置”中将“AppID”与“项目设置”中的“AppID”保持一致。
2. 在服务端生成授权链接进行OAuth授权,并获取code后,再调用uni.requestBringAccessToken方法,将返回的access_token传递给uni.getUserInfo,从而获取用户信息。
具体步骤:
(1)服务端生成授权链接,例如:https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_uri=xxx&response_type=code&scope=snsapi_userinfo&state=xxx#wechat_redirect
(2)微信客户端访问该链接,授权后会重定向到redirect_uri?code=CODE&state=STATE。
(3)服务端调用微信的oauth2/access_token接口,传入appid, secret和code,换取access_token。
(4)uniapp调用uni.requestBringAccessToken(ACCESS_TOKEN)方法,将access_token传递给微信开放接口。
(5)在success回调中,调用uni.getUserInfo()获取用户信息。
这两个方案都需要后端服务的配合,前端独立无法实现微信个人帐号一键登录。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
为了实现微信一键登录,你需要将unistarter中的微信SDK替换为专门用于微信登录的SDK。这里,我提供一个基于Flask的示例代码,供你参考:

from flask import Flask, request, session, redirect
import requests
import json

app = Flask(__name__)
app.secret_key = 'your_secret_key'

@app.route('/')
def index():
    # 1. 用户打开网站首页
    if 'openid' in session:
        # 3. 如果用户已经登录,直接跳转到首页
        return "Hello, " + session['nickname']
    else:
        # 2. 如果用户还没有登录,调用微信授权接口
        openid = request.args.get('openid')
        if openid:
            # 4. 授权成功,将openid和access_token保存到session中
            session['openid'] = openid
            session['access_token'] = request.args.get('access_token')
            # 5. 调用微信接口获取用户信息,保存到session中
            res = requests.get('https://api.weixin.qq.com/sns/userinfo?access_token={}&openid={}&lang=zh_CN'.format(session['access_token'], openid))
            user_info = json.loads(res.text)
            session['nickname'] = user_info['nickname']
            session['headimgurl'] = user_info['headimgurl']
            # 6. 跳转到首页
            return redirect('/')
        else:
            # 7. 跳转到微信授权页面
            return redirect('https://open.weixin.qq.com/connect/oauth2/authorize?appid=your_appid&redirect_uri=http%3A%2F%2Fyour_redirect_uri&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect')

if __name__ == '__main__':
    app.run()

其中,your_secret_key为随机字符串,用于加密cookie数据;your_appid为你在微信开放平台申请的应用的AppID;your_redirect_uri为你在微信开放平台设置的回调地址,需要先进行url编码。

这份示例代码实现的是用户在第一次访问网站时,自动跳转到微信授权页面,用户授权后,获取用户信息并保存到session中,并跳转回首页展示用户昵称和头像。用户之后仍可以通过访问首页来自动登录。注意,这只是一个示例,实际实现可能需要根据你的具体需求进行修改。
如果我的回答解决了您的问题,请采纳!