微信服务号菜单项可以直接获取用户openId吗?

我的微信服务号有菜单项点击后跳转到关联的小程序的指定页面,下面服务号后台创建菜单的代码
image.png
我想要在用户点击 “新用户注册” 菜单项时获取用户的 openId 并作为参数传递给小程序页面可以实现吗?

是不是需要先跳转到H5页面,获取到 openId 后再跳转到小程序页面才能行得通?我不想要这个过程,想要用户点击菜单项后直接跳转到小程序页面可以实现吗?

阅读 716
4 个回答

所以为啥不直接在小程序页面里面直接获取用户的 OpenID。要通过微信公众号的H5页面去获取,然后再跳转到小程序。
直接点击菜单跳转到小程序,然后小程序直接获取用户的 OpenID 不就行了吗??
另外,公众号的OpenId 和小程序的 OpenId 也不通用啊。

有个重点 公众号的 openid与小程序的 openid 不能通用

其实也可以在小程序的webview中获取公众号的openid
h5在webview中获取到公众号openid后
使用wx.miniProgram.postMessage发送给小程序
之后使用wx.miniProgram.navigateTo跳转的页面即可接收到

服务号菜单的点击之后是直接跳的,微信不会在这个过程自动给用户的 openId,要么用中间页或者小程序里处理
中间页:
服务号菜单 -> H5页面(获取openId) -> 小程序页面(带参数)

先去服务号注册:

new ViewButtonMini(
    name: "新用户注册",
    DevMaterial.VISITOR_MINI.APPID,
    pagepath: "pages/register/register"
);

小程序(pages/register/register)

Page({
  data: {
    openId: '',
    userInfo: null,
    loading: true
  },

  onLoad: function() {
    this.getUserOpenId();
  },

  getUserOpenId: function() {
    wx.showLoading({
      title: '加载中...',
    });

    wx.login({
      success: (res) => {
        if (res.code) {
          // 发送 res.code 到后台换取 openId
          wx.request({
            url: 'https://your-api-domain/api/wx/getOpenId',
            method: 'POST',
            data: {
              code: res.code
            },
            success: (response) => {
              const { openId } = response.data;
              this.setData({
                openId,
                loading: false
              });
             
              this.checkUserRegistration(openId);
            },
            fail: (err) => {
              console.error('获取openId失败:', err);
              wx.showToast({
                title: '网络错误,请重试',
                icon: 'none'
              });
            },
            complete: () => {
              wx.hideLoading();
            }
          });
        }
      },
      fail: (err) => {
        console.error('wx.login 失败:', err);
        wx.showToast({
          title: '登录失败,请重试',
          icon: 'none'
        });
      }
    });
  },

  checkUserRegistration: function(openId) {
    wx.request({
      url: 'https://your-api-domain/api/user/check',
      method: 'POST',
      data: { openId },
      success: (res) => {
        if (res.data.isRegistered) {
          // 已注册用户跳转到首页
          wx.switchTab({
            url: '/pages/index/index'
          });
        }
        // 未注册则停留在注册页面
      }
    });
  }
});

WXML :

<view class="register-container">
  <block wx:if="{{loading}}">
    <view class="loading">加载中...</view>
  </block>
  <block wx:else>
    <form bindsubmit="handleSubmit">
      <view class="form-item">
        <text class="label">手机号码</text>
        <input 
          type="number" 
          name="phone" 
          placeholder="请输入手机号码"
          maxlength="11"
        />
      </view>
      
      <view class="form-item">
        <text class="label">姓名</text>
        <input 
          type="text" 
          name="name" 
          placeholder="请输入姓名"
        />
      </view>

      <button 
        class="submit-btn" 
        type="primary" 
        form-type="submit"
      >提交注册</button>
    </form>
  </block>
</view>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏