微信关于网页授权access_token和普通access_token的区别
本文也是做一个笔记,根据自己的调用经历,再到网上查阅资料去验证,防止自己弄混淆。如果以后发现了新的异同,会在进行补充.
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。小程序无需配置IP白名单。
一、两种access_token的获取:
网页授权access_token的获取:
https://blog.csdn.net/cl11992/article/details/86528704
全局access_token的获取:
https://blog.csdn.net/cl11992/article/details/86304653
二、官方解释
关于网页授权access_token和普通access_token的区别
微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;
其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。
三、自己相同点
同名
有效期:两者有效时间都是7200s。
四、自己不同点
网页授权access_token需要先获取code,才能才获取网页授权access_token;全局access_token可以直接调接口进行获取。
使用范围:通过网页授权获得的access_token,只能获取到对应的微信用户信息(授权作用域scope必须为snsapi_userinfo),与微信用户是一对一关系;而全局的access_token可以获取所有用户信息。
次数限制:网页授权的access_token获取次数没有限制;全局access_token每天获取最多次数为2000次(这个次数可以申请增加)。
小程序地址选择仿美团(附源码)
代码很简单
var city = require('../../utils/city.js');
var app = getApp()
Page({
data: {
searchLetter: [],
showLetter: "",
winHeight: 0,
// tHeight: 0,
// bHeight: 0,
cityList: [],
isShowLetter: false,
scrollTop: 0,//置顶高度
scrollTopId: '',//置顶id
city: "上海市",
hotcityList: [{ cityCode: 110000, city: '北京市' }, { cityCode: 310000, city: '上海市' }, { cityCode: 440100, city: '广州市' }, { cityCode: 440300, city: '深圳市' }, { cityCode: 330100, city: '杭州市' }, { cityCode: 320100, city: '南京市' }, { cityCode: 420100, city: '武汉市' }, { cityCode: 410100, city: '郑州市' }, { cityCode: 120000, city: '天津市' }, { cityCode: 610100, city: '西安市' }, { cityCode: 510100, city: '成都市' }, { cityCode: 500000, city: '重庆市' }]
},
onLoad: function () {
// 生命周期函数--监听页面加载
var searchLetter = city.searchLetter;
var cityList = city.cityList();
var sysInfo = wx.getSystemInfoSync();
var winHeight = sysInfo.windowHeight;
var itemH = winHeight / searchLetter.length;
var tempObj = [];
for (var i = 0; i < searchLetter.length; i++) {
var temp = {};
temp.name = searchLetter[i];
temp.tHeight = i * itemH;
temp.bHeight = (i + 1) * itemH;
tempObj.push(temp)
}
this.setData({
winHeight: winHeight,
itemH: itemH,
searchLetter: tempObj,
cityList: cityList
})
},
onReady: function () {
// 生命周期函数--监听页面初次渲染完成
},
onShow: function () {
// 生命周期函数--监听页面显示
},
onHide: function () {
// 生命周期函数--监听页面隐藏
},
onUnload: function () {
// 生命周期函数--监听页面卸载
},
onPullDownRefresh: function () {
// 页面相关事件处理函数--监听用户下拉动作
},
onReachBottom: function () {
// 页面上拉触底事件的处理函数
},
clickLetter: function (e) {
console.log(e.currentTarget.dataset.letter)
var showLetter = e.currentTarget.dataset.letter;
this.setData({
showLetter: showLetter,
isShowLetter: true,
scrollTopId: showLetter,
})
var that = this;
setTimeout(function () {
that.setData({
isShowLetter: false
})
}, 1000)
},
//选择城市
bindCity: function (e) {
console.log("bindCity")
this.setData({ city: e.currentTarget.dataset.city })
},
//选择热门城市
bindHotCity: function (e) {
console.log("bindHotCity")
this.setData({
city: e.currentTarget.dataset.city
})
},
//点击热门城市回到顶部
hotCity: function () {
this.setData({
scrollTop: 0,
})
}
})
Javascript控制页面物理返回事件处理
点击物理返回键.关闭窗口
pushHistory();
window.addEventListener("popstate", function(e) {
//alert("我监听到了浏览器的返回按钮事件啦");//根据自己的需求实现自己的功能
//alert('guanbi');
WeixinJSBridge.call('closeWindow');
if (typeof(WeixinJSBridge) != "undefined") {
WeixinJSBridge.call('closeWindow');
} else {
if (navigator.userAgent.indexOf("MSIE") > 0) {
if (navigator.userAgent.indexOf("MSIE 6.0") > 0) {
window.opener = null;
window.close();
} else {
window.open('', '_top');
window.top.close();
}
} else if (navigator.userAgent.indexOf("Firefox") > 0) {
window.location.href = 'about:blank ';
//window.history.go(-2);
} else {
window.opener = null;
window.open('', '_self', '');
window.close();
}
}
}, false);
window.onbeforeunload = function() {
return;
}
function pushHistory() {
var state = {
title: "title",
url: ""
};
window.history.pushState(state, "title", "");
}
点击物理返回键,返回到指定页面
window.addEventListener("popstate", function(e) {
window.location.href="{:url('sdns/index/index')}";
}, false);
function pushHistory() {
var state = {
title: "title",
url: "#"
};
window.history.pushState(null,null, "#");
}
禁用物理返回键
XBack = {};
(function(XBack) {
XBack.STATE = 'x - back';
XBack.element;
XBack.onPopState = function(event) {
event.state === XBack.STATE && XBack.fire();
XBack.record(XBack.STATE); //初始化事件时,push一下
};
XBack.record = function(state) {
history.pushState(state, null, location.href);
};
XBack.fire = function() {
var event = document.createEvent('Events');
event.initEvent(XBack.STATE, false, false);
XBack.element.dispatchEvent(event);
};
XBack.listen = function(listener) {
XBack.element.addEventListener(XBack.STATE, listener, false);
};
XBack.init = function() {
XBack.element = document.createElement('span');
window.addEventListener('popstate', XBack.onPopState);
XBack.record(XBack.STATE);
};
})(XBack); // 引入这段js文件
XBack.init();
XBack.listen(function() {});
禁止返回并给个提示
pushHistory();
window.addEventListener("popstate", function(e) {
popTip("禁止返回");
XBack = {};
(function(XBack) {
XBack.STATE = 'x - back';
XBack.element;
XBack.onPopState = function(event) {
event.state === XBack.STATE && XBack.fire();
XBack.record(XBack.STATE); //初始化事件时,push一下
};
XBack.record = function(state) {
history.pushState(state, null, location.href);
};
XBack.fire = function() {
var event = document.createEvent('Events');
event.initEvent(XBack.STATE, false, false);
XBack.element.dispatchEvent(event);
};
XBack.listen = function(listener) {
XBack.element.addEventListener(XBack.STATE, listener, false);
};
XBack.init = function() {
XBack.element = document.createElement('span');
window.addEventListener('popstate', XBack.onPopState);
XBack.record(XBack.STATE);
};
})(XBack); // 引入这段js文件
XBack.init();
XBack.listen(function() {});
}, false);
function pushHistory() {
var state = {
title: "title",
url: "#"
};
window.history.pushState(null,null, "#");
}
VisualSVN项目管理技巧
第一步:找一台电脑,内存足够大,用来搭建局域网svn主机
安装VisualSVN教程:
https://jingyan.baidu.com/article/870c6fc36a31d0b03fe4be3f.html
汉化版svn下载
http://www.mycodes.net/70/1544.htm
第二步:在VisualSVN里面选择Users创建所有开发人员的账号密码,用文本记录好
第三步:创建对应的项目分组,比如说我要创建一个电商的项目分组,可以直接创建对应的电商名称简写,勾选相关开发人员到对应的分组即可。
第四步:点击Reositories 创建对应的项目名称,可以用中文命名,创建项目的时候就可以直接勾选项目权限分组,切记千万别允许所有人访问。
1)第一步
2)第二步:
3)第三步:
4)第四步:
5)第五步:
6)第六步:
在每个项目下面分别有trunk跟tags两个目录。
Trunk目录为开发目录,tags目录为稳定的项目版本目录。下面分别对这两个目录的格式做一下规范。
上面就是一个完整项目的所有步骤,以及目录结构,每一个目录都可以单独设置权限,只有tags目录有最高管理权限,开发人员只有trunk目录的权限,项目经理或者项目负责人才有tags的权限,一旦项目结束,删除对应的开发人员的目录权限。
Db目录放置的是可以直接执行的sql文件,如果项目sql文件过大,需要另附上说明文档讲明导入方案。
Doc目录是项目相关的所有文件,包括线上线下项目安装运行的的详细步骤,以及psd图,项目确认函,功能表文档。
Html 静态html文件目录
Project 源码目录
MiniProgram 小程序源码目录
Tags里面的目录结构也是一样的,含义也是一样的。最外层包了一个版本号,主要是方便项目回退以及代码版本管理。
做这个的目的也是为了提高项目质量,严格做好codereview工作。