H5集成微信登录链入微信公众号
为响应轻应用模块的设计思路,为原有系统更方便快捷的集成入微信生态,编写接入微信公众号的用户体系的操作流程:
1. 准备工作
公众号信息(AppId,AppSecret);绑定为公众号的开发者
2. 操作说明
配置项
将AppId写到自己项目的Config文件中
全局引入
在项目的全局入口地方,加入代码逻辑[官方集成文档],逻辑如下:
- 第一步:用户同意授权,获取code
- 第二步:通过 code 换取网页授权access_token
- 第三步:刷新access_token(如果需要)
- 第四步:拉取用户信息(需 scope 为 snsapi_userinfo)
具体的代码片段在最下方,需要自己做适配性改造。
3. 集成后验证
将打包好的包放到测试服(需后端配置nginx),用ADS或手机微信浏览器打开
/**
* 处理Code
*/
handleCode: function () {
var _this = this;
console.log("检测是否微信浏览器,是否有session")
// 如果是微信浏览器 并且storage没有user信息
if (this.Util.isWeiXin() && !sessionStorage.getItem("wxInfo")) {
// Url参数
var urlData = this.Util.getParams(location.href);
console.log("UrlParams", urlData)
if (!urlData["code"]) {
console.log("url no has code")
// 参数中没有Code
this.jumpWxAuth()
} else {
// 参数中有Code
this.getLoginInfo()
}
} else {
console.log('login, get index data')
}
},
/**
* 跳转到授权地址
*/
jumpWxAuth: function(){
var state = Date.parse(new Date(new Date().getTime() + ((new Date().getTimezoneOffset() / 60) + 8) * 3600 * 1000).toString());
var url =
"https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
config.APPID +
"&redirect_uri=" +
encodeURIComponent(location.href) +
"&response_type=code&scope=snsapi_userinfo&state=" +
state +
"#wechat_redirect";
window.location.href = url;
}
/**
* 获取登录信息
* code {String} 微信Code
*/
getLoginInfo: function(code){
console.log("has code", code)
this.Http.get("/api/home/login", {
code: code,
}).then((res) => {
console.log("codelogin function res", res)
if (res.code == 1) {
sessionStorage.setItem("wxInfo", JSON.stringify(res.data));
window.location.href =
location.origin + location.pathname + location.hash;
} else {
this.$Message.error(res.msg);
}
});
}
/**
* @description 判断是不是微信浏览器
* @param void
* @returns void
*/
isWeiXin: () => {
var ua = window.navigator.userAgent.toLowerCase()
if (ua.match(/MicroMessenger/i)) {
if (ua.match(/MicroMessenger/i)[0] === 'micromessenger') {
return true
} else {
return false
}
} else {
return false
}
},
微信公众号自定义分享功能
需求:不管哪个页面,分享给用户,打开之后都是首页
- 在微信公众平台,公众号设置 -> 功能设置 -> 配置业务域名、js接口安全域名、网页授权域名。
- 开发文档参考 JS-SDK说明文档
- 开发遇到报错,签名不正确的情况
- 确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分
- 传参注意,需要前端 encodeURIComponent 转码,后端 解码
// APP.vue
// 如果是微信浏览器 并且storage没有user信息
if (isWeiXin() && !uni.getStorageSync('openId')) {
// Url参数
const code = getQueryString('code');
console.log(code);
if (!code) {
this.jumpWxAuth()
} else {
this.$gm.userDetails({ code }).then(res => {
console.log(res);
uni.setStorageSync('openId', res.data.openId);
// 通过code拿到openId之后重定向
window.location.href =
window.location.origin + window.location.pathname + window.location.hash
})
}
} else {
console.log('login, get index data')
}
// 需要使用分享的页面调用
setTimeout(() => {
const url = location.href.split('#')[0];
this.share({
title: '运工评选',
desc: '“2023年度诚信工会会员让利店评选”活动正在进行!',
img:'https://weixindev.shanxigh.com/file/upload/2023/10-11/a267c7a086f8426b91024fcc287ea197.png' }, url);
}, 1000)
//在需要自定义分享的页面中调用
share(data, url) {
if (!this.isWechat()) {
return;
}
// 每次都需要重新初始化配置,才可以进行分享
this.initJssdkShare(function(signData) {
jweixin.ready(function() {
var shareData = {
title: data.title || '',
desc: data.desc || '',
link: url,
imgUrl: data.img || '',
success: function(res) {
// 分享后的一些操作,比如分享统计等等
},
cancel: function(res) {}
};
console.log(shareData);
//分享给朋友接口
jweixin.updateAppMessageShareData(shareData);
//分享到朋友圈接口
jweixin.updateTimelineShareData(shareData);
});
jweixin.error(function(res) {
console.log(res);
});
}, url);
},
//初始化sdk配置
initJssdkShare( callback, url) {
uni.request({
url: this.$serverurlapi + '/front/getSignature',
method: 'post',
data: {
page: encodeURIComponent(url)
},
success: (res) => {
console.log(res)
if (res) {
let result = res.data.data;
jweixin.config({
debug: false,
appId: result.appId,
timestamp: result.timestamp,
nonceStr: result.nonceStr,
signature: result.signature,
jsApiList: [
"onMenuShareAppMessage",
"onMenuShareTimeline",
'updateTimelineShareData',
'updateAppMessageShareData'
]
});
//配置完成后,再执行分享等功能
if (callback) {
callback(result);
}
}
},
fail: (err) => {
console.log(err);
}
});
},