微信小程序登录接口AV.User.loginWithWeapp回调返回中找不到openid

文档出处:

https://leancloud.cn/docs/weapp.html#一键登录

期望:

除了userinfo之外的openid,减少重复请求wx.login,方便后续微信支付

核心代码:

AV.User.loginWithWeapp().then(user => {});

其user数据如下:

{
    "authData": {
        "lc_weapp": {
            "code": "041FGoL31xBEtM1wQ6K316OcL31FGoLF"
        }
    },
    "city": "Wenzhou",
    "username": "2wqockee8bzh460gwhwl9xrxs",
    "emailVerified": false,
    "nickName": "黄秀杰",
    "language": "zh_CN",
    "gender": 1,
    "province": "Zhejiang",
    "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/DYAIOgq83eqSucF9v6bKPfUPSTuQjpqmr8jAZEOgsFjFCHc73UIlUAgnI2nz6aFdnkRWAxxy1uZGfC82Yp7fMg/0",
    "country": "CN",
    "mobilePhoneVerified": false,
    "objectId": "58a6b40d128fe1006478a086",
    "createdAt": "2017-02-17T08:27:57.203Z",
    "updatedAt": "2017-02-17T08:31:31.643Z"
}

没能找到openid,有code,但是传给微信端是过期的,提示has be used

目前的解决方案:

小程序端js代码

App({
    onLaunch: function () {
        // auto login via SDK
        var that = this;
        // 向LeanCloud请求登录
        AV.User.loginWithWeapp().then(user => {
            // 登录或生成用户成功,返回结果中已经含有过期的code(code has be used)
            wx.getUserInfo({
                success: ({userInfo}) => {
                    // 更新当前用户的信息,昵称头像等
                    user.set(userInfo).save();
                }
            });
        }).catch(console.error);
        // 授权微信登录以获取openid
        wx.login({
            success: function(res) {
                if (res.code) {
                    that.code = res.code;
                    // 获取openId并缓存
                    wx.request({
                        url: 'https://***.leanapp.cn/index.php/WXPay/getOpenId',
                        data: {
                            code: res.code,
                        },
                        method: 'POST',
                        header: {
                            'content-type': 'application/x-www-form-urlencoded'
                        },
                        success: function (response) {
                            console.log(response);
                            that.openid = response.data.openid;
                        }
                    });
                } else {
                    console.log('获取用户登录态失败!' + res.errMsg)
                }
            }
        });

    }
})

php后端代码

	public function getOpenId() {
		$code = $this->input->post('code');
		$json = 'https://api.weixin.qq.com/sns/jscode2session?appid='.WxPayConfig::APPID.'&secret='.WxPayConfig::APPSECRET.'&js_code='.$code.'&grant_type=authorization_code';
		header("Content-Type: application/json");
		echo file_get_contents($json);
	}

疑惑:

LeanCloud后台的社交组件既然已经持有了小程序的app id, app secret,是不是返回用户的openId更合理些,这样就不需要重复调用小程序wx.login接口了,也不需要的后端代码中配置app id, app secret了。

谢谢

4 人赞了这个帖子.

感谢你的建议。

根据微信建议的架构:

我们目前的设计是这样的:使用 loginWithWeapp 登录后 openid 会存在 user.authData 中(你可以在控制台看到),但是不返回给客户端。对于客户端,图中的「3rd_session」对应的是 user 的 sessionToken。在后续的操作中,例如请求云函数发起支付请求时,sessionToken 会附带在请求中,在云函数中(使用 masterKey)可以拿到对应的 user,以及 user.authData.lc_weapp.openid,然后可以用这个 openid 发起支付。整个过程中只有 loginWithWeapp 内部调用了一次 wx.login

我们提供了前后端的示例代码,包含了上述的完整的支付流程,可供参考:
小程序端: https://github.com/leancloud/leantodo-weapp
后端: https://github.com/leancloud/weapp-pay-getting-started/blob/master/cloud.js#L16

昨天下午刚刚注意到这此Demo,https://github.com/leancloud/leantodo-weapp,之前我的做法是自己搭PHP,带上腾讯提供的PHP SDK,通过git部署到https://***.leanapp.cn上,完成支付,对照你上面的提示,用MasterKey的方式试着做一遍,到时再来回帖。

谢谢

如果自己部署的php项目,怎么像云函数那样取出currentUser

AV.Cloud.define('order', (request, response) => {
  const user = request.currentUser;

是不是在小程序端post传入user.objectId,然后服务端使用masterKey取它的openid呢?这种方式可是良好实践?

谢谢

我要做的不是支付,是模板消息推送,还是需要用户的openid啊,有其他方式能获取到openid么?

客户端是不应该拿到 openId 的。应该在后端通过 masterKey 拿到 user(里有 openId),然后发模板消息推送。

目前loginwithweapp得到的auth中固定的lc_weapp,

建议管理后台支持绑定多个微信小程序,自定义authData中的字段。

云端cloud可以的

发自网易邮箱大师在2017年09月13日 18:24,85684001 写道:

85684001

September 13

我要做的不是支付,是模板消息推送,还是需要用户的openid啊,有其他方式能获取到openid么?

通过邮件回复或者在浏览器中访问 https://forum.leancloud.cn/t/av-user-loginwithweapp-openid/13455/6


之前的回复

leeyehLC 家族马甸大区首席执行

February 21

https://leancloud.cn/docs/leanenginecloudfunction_guide-php.html#参数信息

laeser

February 21

如果自己部署的php项目,怎么像云函数那样取出currentUser

AV.Cloud.define('order', (request, response) => {
  const user = request.currentUser;

是不是在小程序端post传入user.objectId,然后服务端使用masterKey取它的openid呢?这种方式可是良好实践?

谢谢

laeser

February 21

昨天下午刚刚注意到这此Demo,https://github.com/leancloud/leantodo-weapp,之前我的做法是自己搭PHP,带上腾讯提供的PHP SDK,通过git部署到https://***.leanapp.cn上,完成支付,对照你上面的提示,用MasterKey的方式试着做一遍,到时再来回帖。

谢谢


通过邮件回复或者在浏览器中访问 https://forum.leancloud.cn/t/av-user-loginwithweapp-openid/13455/6

如果你希望取消这些邮件的订阅,请访问你的用户设置

Leeyeh, 你说小程序端获取不到openid,(文档里也说小程序端不会获取到openid) 为什么我用官方的demo,小程序端却获得到openid呢?

这里指的是unionid吧。