HarmonyOS鸿蒙Next中微信登录第一次授权不能获取微信code,第二次才能获取,帮忙看看问题

HarmonyOS鸿蒙Next中微信登录第一次授权不能获取微信code,第二次才能获取,帮忙看看问题

import common from '@ohos.app.ability.common';
import * as wxopensdk from '@tencent/wechat_open_sdk';
import { OnWXResp, WXApi, WXEventHandler } from './WXApiWrap';

export const kRoute = "OAuth"

@Entry({ routeName: kRoute })
@Component
struct OAuth {
  private wxApi = WXApi
  private wxEventHandler = WXEventHandler
  @State authResultText: string = ''
  private onWXResp: OnWXResp = (resp) => {


    console.info('compressedImage', 'packing onWXResp',JSON.stringify(resp ?? {}, null, 2));
    this.authResultText = JSON.stringify(resp ?? {}, null, 2)
  }

  aboutToAppear(): void {
    this.wxEventHandler.registerOnWXRespCallback(this.onWXResp)
  }

  aboutToDisappear(): void {
    this.wxEventHandler.unregisterOnWXRespCallback(this.onWXResp)
  }

  build() {
    Column({ space: 20 }) {
      Text("授权登录").fontSize(20).fontWeight("bold").width('100%').padding(16)
      Button("授权登录").onClick(async () => {

        let req = new wxopensdk.SendAuthReq
        req.isOption1 = false
        req.nonAutomatic = true
        req.scope = 'snsapi_userinfo'
        req.state = 'none'
        req.transaction = 'test123'
        let finished1 = await this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req)
        let finished = await this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req)
        console.log("send request finished: ", finished)
      }).width('80%')

      Text(this.authResultText)
        .width('80%')
        .fontSize(17)
        .lineHeight(20)
    }
  }
}

 console.info('compressedImage', 'packing onWXResp',JSON.stringify(resp ?? {}, null, 2)); 这句话第一次回调,第二次才有

更多关于HarmonyOS鸿蒙Next中微信登录第一次授权不能获取微信code,第二次才能获取,帮忙看看问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

开发者您好,请问您指的是您代码里的finished1无法获取到微信code吗?获取不到微信code是否有报错?麻烦提供一下您的hilog日志

更多关于HarmonyOS鸿蒙Next中微信登录第一次授权不能获取微信code,第二次才能获取,帮忙看看问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


开发者你好,可以先参考以下方案排查一下,如未解决可以再反馈并提供完整的日志信息。

【常见FAQ】

Q:为什么点击支付跳转微信后,走不到微信的onResp()方法内? A:排查以下两项。

  • 检查引入的包是否正确。 若是跨模块引入自定义微信API封装类,依赖中可能存在同名、相似实现的封装类,导致引入错误而运行不报错,但无法进入预期文件的onResp()方法内。

    若项目包含多个模块,WXAPI的注册在主模块中实现,则回调类应该存在于common模块或使用模块中,而不是在主模块中。否则会造成循环依赖,引起异常。

  • 检查module.json5配置。 若包的引入没问题而依旧存在走不到onResp()方法的现象,则排查是否在App module的module.json5里加入了用于检查微信是否安装的如下配置。若存在,建议删除"wxopensdk",只保留"weixin"
"querySchemes": [
    "weixin",
    "wxopensdk" // 若无法进入onResp()方法回调,建议删除该行
]

关注,顶贴,

在HarmonyOS鸿蒙Next中,微信登录首次授权无法获取code,通常与微信SDK初始化或授权流程时序有关。请检查以下方面:确保微信SDK已正确集成,且应用签名与微信开放平台配置一致。首次调用时,授权请求参数可能未完全就绪,或回调监听未及时注册。建议在应用启动时提前完成SDK初始化,并验证授权回调URL的配置。若问题持续,可尝试在授权前添加短暂延迟,确保组件加载完成。

问题出在代码逻辑上。在 ButtononClick 事件中,您连续两次调用了 this.wxApi.sendReq 方法。

let finished1 = await this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req)
let finished = await this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req)

这会导致在第一次点击按钮时,实际上向微信发送了两次授权请求。HarmonyOS与微信客户端的交互以及回调的注册/触发可能存在时序问题。第一次请求可能因为回调监听器尚未完全就绪,或者微信客户端处理连续请求的机制,导致其响应(包含code)没有被您的 onWXResp 回调成功捕获。而第二次请求发出时,环境已经稳定,因此回调正常触发,您收到了code。

解决方案: 删除重复的 sendReq 调用,确保一次点击只发送一次请求。

onClick 中的代码修改为:

Button("授权登录").onClick(async () => {
    let req = new wxopensdk.SendAuthReq
    req.isOption1 = false
    req.nonAutomatic = true
    req.scope = 'snsapi_userinfo'
    req.state = 'none'
    req.transaction = 'test123'
    // 只保留一次 sendReq 调用
    let finished = await this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req)
    console.log("send request finished: ", finished)
}).width('80%')

这样修改后,第一次点击按钮就会正常触发微信授权流程,并在授权成功后通过 onWXResp 回调返回包含 code 的响应。

回到顶部