微信h5获取用户openid,根据用户code,将code发送给后台从而得到用户openid,同时解决redirect_uri域名与后台配置不一致问题(详细教程)

想要在h5页面获取用户code从而得到用户openid的方式有两种,scope=snsapi_base(静默方式,会重定向到当前页并将code返回在url上)或者scope=snsapi_userinfo(非静默方式,会弹出用户授权页面,用户确认授权才会重定向url)两种方式,两者的区别是,前者只能拿到用户oppenid,后者可以拿到用户的其他信息,当然我这里做的功能比较简单,只需要知道用户是否关注该公众号,使用的是第一种方式,本文两种方式都会介绍到。

在html页面中一定要  引入微信的js文件,否则无法使用wx.的方式进行需要的设置及操作,这点很重要

微信开发官方文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html 

1.根据微信公众号官方文档提供的方法得到用户:appId,timestamp,nonceStr,signature,使用

$(document).ready(function () {
    wx.config({
        debug: false,
        appId: appId,
        timestamp:timestamp,
        nonceStr:nonceStr,
        signature:signature,
        jsApiList: ["onMenuShareTimeline", "onMenuShareAppMessage"] //这里根据自己需求设置,可以在    微信公众号文档查找相关设置,这里不过多介绍
    });

    getUserInfo(appId,window.location.href) //获取用户code

    //wx.confg设置成功后,即可通过
    wx.ready(function(){
        wx.onMenuShareTimeline({
            imgUrl:"", //绝对路径
            desc:"", //描述
        }) //这个是设置h5页面分享的一些参数,比如非公众号发布文档分享的小图片和描述等等,这只是举个例子,与获取用户code无关,可以忽略
    })
})

2.wx.config设置之后,就可以走获取用户code了,官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 

设置网页授权接口,设置——公众号设置——功能设置,微信后台后期如果更新,不在这个位置,可以在开发——接口权限中找到相应配置即可更改

微信h5获取用户openid,根据用户code,将code发送给后台从而得到用户openid,同时解决redirect_uri域名与后台配置不一致问题(详细教程)_第1张图片

代码:

    function getUserInfo(appId,redUrl){
        //公众号appid
        //redirect_uri 重定向的url,一般情况下会设置为当前url
        //response_type=code 默认值为code
        //scope=snsapi_base/snsapi_userinfo 静默/非静默方式
        
        let url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${encodeURI(redUrl)}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect`
        //window.location.href = url //这里有一个问题,如果直接跳转,会一直不停的跳转,我们只需要他跳转一次,得到code即可,所以需要在获取到code之后停止跳转

        //因为重定向跳转之后的url中一定带有code=字样,所以我就将他作为停止跳转,如果有更好的方法欢迎指出
            if(window.location.href.indexOf('code=') != -1){
                const obj = new URLSearchParams(window.location.search)
                let params = {}
                for (const iterator of obj) { params[iterator[0]] = iterator[1]}
            }else{
                window.location.href = url
            }
    }

/*
*这里的url我用了encodeURI方式转换了一下,微信官方文档没有提到需要使用这个方法转换一下url
*encodeURI方法转换url很重要,因为一开始没有使用encodeURI转换,一直报错redirect_uri域名错误,找了很久才发现是这个问题导致的
* 网上也有很多教程显示说是url与公众号后台设置的网页授权url不一致,都是瞎扯,明明设置的一样也会提示这个错误,完全是因为没有使用encodeURI方法转换url导致的
* 微信官方网页授权设置文档https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
*/

如果在调用getUserInfo的方法出现redirect_uri参数错误字样,一定就是redirect_uri的url没有使用  encodeURI  方法,这个很重要

我这里配置的是  www.****.cn

redirect_uri的url是:http://www.****.cn/***.html 或者 http://www.****.cn/**/***.html 都可以正常得到openid

 

会得到一个重定向的url,code=后面的参数就是用户code

如果使用非静默方式,会先弹出授权页面,点击确定后会返回静默方式的url,将得到的code发送给后台,后台会给你返回用户openid,即可完成授权功能

微信h5获取用户openid,根据用户code,将code发送给后台从而得到用户openid,同时解决redirect_uri域名与后台配置不一致问题(详细教程)_第2张图片

你可能感兴趣的:(微信公众号,微信公众号,微信h5,移动端,前端)