【微信公众号开发】【10】JSJDK相关
前言:
1,优点:官方提供的,会调用后还算使用方便,不用费劲了解各个原生组件
缺点:使用上有限制(如:上传文件有大小限制),很容易踩坑,部分安卓手机及电脑端不支持pjax
总结:上手容易,坑很多
2,官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 (内容较多)
3,退出页面
4,选择性隐藏右上角的功能按钮
5,自定义分享内容
6,上传图片
7,图片查看
正文:
步骤:绑定域名——引入JS文件——权限验证——通过ready接口处理成功验证/通过error接口处理失败验证 ( 前三步请参照第二章—JS接口安全域名部分 )
1,权限验证
//1.js 入口页面URL,只在主页引用。
//主要为了解决使用pjax的页面,在获取微信授权时,在微信PC端,手机端表现形式不一致的问题
var entryUrl = location.href.split("#")[0]; //2.js 每个页面引用
var wxCount = 0; //获取授权失败后,重新尝试
var WX_URL = "http://" + document.domain; //当前域名 $(function () {
//获取授权
var wxUrl = location.href.split("#")[0];
getWxTicket(wxUrl);
//微信的签名只认第一个加载的页面的URL,只在入口签名一次在iOS上是可以的,但在安卓有些机型会签名不上,所以保险起见,每个页面都签名一次
}); function getWxTicket(wxUrl){
var url = window.location.href;
if(url.indexOf("/index") != -1){ //回退后首页签名不上,此处为特殊处理,应当不需要用到
wxUrl = WX_URL + "/index";
} $.ajax({
type : "post",
url : "/getTicket",
data : {
"url" : wxUrl
},
dataType : "json",
success : function(data){
var obj = data;
wx.config({
debug: false, //开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: obj.appId, //必填,公众号的唯一标识
timestamp: obj.timestamp, //必填,生成签名的时间戳
nonceStr: obj.nonceStr, //必填,生成签名的随机串
signature: obj.signature,//必填,签名,见微信开发文档附录1
jsApiList: ["hideMenuItems","showMenuItems","chooseImage","previewImage","uploadImage","downloadImage","closeWindow",
"onMenuShareTimeline","onMenuShareAppMessage","onMenuShareQQ","onMenuShareWeibo","onMenuShareQZone",
"scanQRCode", "getLocation"], // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.error(function (res) {
if(wxCount == 0){
wxCount = 1;
getWxTicket(entryUrl);
}
});
}
});
}
2,ready接口/error接口
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。
对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});
3,退出页面
WeixinJSBridge.invoke('closeWindow',{},function(res){});
但由于这个事件有响应时间,所以在还没退出时点回退按钮会退到上一页面
改进的写法:
history.pushState(null, null, document.URL);
setTimeout(function(){WeixinJSBridge.invoke('closeWindow',{},function(res){});},1000);
注:不知是否是我采用pjax的原因,部分手机出现进入页面立即闪退而不是点击回退再退出的问题,所以我实际开发中是把没有用这个方法的,直接都是退到入口页面
4,选择性隐藏右上角的功能按钮
wx.ready(function (){
wx.hideMenuItems({
menuList: [
'menuItem:favorite',
'menuItem:share:qq',
'menuItem:share:QZone',
'menuItem:share:weiboApp',
'menuItem:share:facebook',
'menuItem:openWithQQBrowser',
'menuItem:openWithSafari',
'menuItem:share:email',
'menuItem:originPage',
'menuItem:copyUrl',
'menuItem:share:brand'
]
});
wx.showMenuItems({
menuList: [
'menuItem:addContact'
]
});
});
5,自定义分享内容
wx.ready(function (){
//分享给好友
wx.onMenuShareAppMessage({
title: title,//标题
desc: desc,//描述
link: shareUrl,//地址
imgUrl: 'http://XX.png',//分享图片,如果不设定,会读取该页面第一张
type: '', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
},
cancel: function () {
}
});
//分享到朋友圈
wx.onMenuShareTimeline({
title: title,
desc:desc,
link: shareUrl,
imgUrl: 'http://XX.jpg',
success: function () {
},
cancel: function () {
}
});
wx.onMenuShareQQ({
title: title,
desc: desc,
link: shareUrl,
imgUrl: '',
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
wx.onMenuShareWeibo({
title: title,
desc: desc,
link: shareUrl,
imgUrl: '',
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
wx.onMenuShareQZone({
title: title,
desc: desc,
link: shareUrl,
imgUrl: '',
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
});
6,上传图片(如果只是上传到微信,微信只会保留一段时间的,所以上传后还要下载回本地)
function chooseImage() {
var length = $("#img1 li").length;//已经上传的张数
var count = 3-length;
if(length < 3){
wx.chooseImage({
count: count, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
var localIds = res.localIds;
if(localIds.length == 0){
layer.open({content:"请先选择图片", btn: '我知道了'});
return;
}
uploadImage(0,localIds.length,localIds,"exercise");
}
});
}else{
layer.open({content:"只能上传3张图片哦", btn: '我知道了'});
}
};
/**
* 该方法用来上传文件
* @param start:本地ID开始的下标(当前上传的图片的下标)
* @param end:本地ID的总个数(也就是选择的图片的总个数)
* @param IDs:当前批次选择的所有图片在本地ID的集合
* @param source:来源,后台根据这个存入不同的文件夹
* */
function uploadImage(start,end,IDs,source){
if(start<end){
var localId = IDs[start].toString();
wx.uploadImage({
localId: localId,
isShowProgressTips: 1,//显示进度条
success: function (res) {
var serverId = res.serverId; // 返回图片的服务器端ID
serverId = serverId.toString();
//上传到服务器
$.ajax({
type : "POST",
url : "downloadMedia",
data:{
"mediaId" : serverId,
"source" : source,
},
success : function(data){
if(data == ""){
layer.open({content:"格式错误", btn: '我知道了'});
return;
}else if(data == "false"){
layer.open({content:"access_token失效,请联系开发人员", btn: '我知道了'});
return;
}else{
if(source == "issue"){
$("#img1").html("<li data-path="+data+"><img src="+data+" style='cursor:pointer' class='myImg'></li>");
}else{
$("#img1").append("<li data-path="+data+"><img src="+data+" style='cursor:pointer' class='myImg'></li>");
}
}
},
error : function(){
layer.open({content:"抱歉,图片上传失败,请稍后再试", btn: '我知道了'});
}
});
start++;
//延迟1s,这1s用来显示图片信息,避免出现连续上传几次最后一次性显示图片的问题
setTimeout(function(){
uploadImage(start,end,IDs,source);
},500);
}
});
}
};
@ApiOperation(value = "使用微信上传图片接口后将图片下载回本地", notes = " ", response = Result.class)
@RequestMapping(value = "downloadMedia", method = RequestMethod.POST)
public String downloadMedia(String mediaId, String appId, String active) throws IOException {
logger.info(String.format("downloadMedia mediaId:%s appId:%s active:%s", mediaId, appId, active)); String savePath = dealSavePath(active); //拼接存储路径,视情况而定 String access_token = WeixinUtil.getAccessToken(appId);
String requestUrl = String.format(WxConfig.MEDIA_GET_URL, access_token, mediaId); // 拼接请求地址 try {
URL url = new URL(requestUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setRequestMethod("GET");
String fileExt = getFileType(conn.getHeaderField("Content-Type")); // 根据内容类型获取扩展名 if (fileExt.equals("") || !fileExt.equals(".jpg")){
return "";
} String fileName = mediaId + fileExt;
String filePath = Config.MEDIA_FILE + savePath + fileName; BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
FileOutputStream fos = new FileOutputStream(new File(filePath));
byte[] buf = new byte[8096];
int size = 0;
while ((size = bis.read(buf)) != -1)
fos.write(buf, 0, size);
fos.close();
bis.close();
conn.disconnect(); String realUrl = Config.REAL_MEDIA_DOMAIN + savePath + fileName;
logger.info("downloadMedia success, realUrl=" + realUrl); return realUrl;
} catch (Exception e) {
logger.error("downloadMedia error:" + e.getMessage());
return "";
}
}
7,图片查看(这里的图片地址必须要加上域名)
var imgDomain = "https://i.cnblogs.com/"; //当前域名 //单张
$("#pjax-content").on("click", ".my_singleImg",function(event) {
var imgArray = [];
var oParent = $(this).parent();
var imgSrc = $(this).data("src"); //当前图片路径
var curImageSrc = imgSrc.indexOf("http") != -1 ? imgSrc : imgDomain + imgSrc; if (curImageSrc && !oParent.attr("href")) {
var itemSrc = $(this).data("src");
var curItemSrc = itemSrc.indexOf("http") != -1 ? itemSrc : imgDomain + itemSrc;
imgArray.push(curItemSrc);
wx.previewImage({
current: curImageSrc,
urls: imgArray
});
}
}); //多张
$("#pjax-content").on("click", ".my_moreImg",function(event) {
var imgArray = [];
var oParent = $(this).parent();
var imgSrc = $(this).data("src");
var curImageSrc = imgSrc.indexOf("http") != -1 ? imgSrc : imgDomain + imgSrc; if (curImageSrc && !oParent.attr("href")) {
$(this).parent().find(".my_moreImg").each(function(index, el) {
var itemSrc = $(this).data("src");
var curItemSrc = itemSrc.indexOf("http") != -1 ? itemSrc : imgDomain + itemSrc;
imgArray.push(curItemSrc);
});
wx.previewImage({
current: curImageSrc,
urls: imgArray
});
}
});
【微信公众号开发】【10】JSJDK相关的更多相关文章
- C#微信公众号开发系列教程三(消息体签名及加解密)
http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...
- 微信公众号开发C#系列-9、多公众号集中管理
1.概述 通过前面8篇关于微信开发相关文章的学习,我们已经对微信常用开发有了一个比较深入的了解.前面的文章都是基于某一特定公众号的,在现实业务中同一单位个体运营着不至一个公众号,此时就需要对多个公众号 ...
- 微信公众号开发C#系列-7、消息管理-接收事件推送
1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...
- 微信公众号开发C#系列-2、微信公众平台接入指南
概述 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先 ...
- 微信公众号开发C#系列-12、微信前端开发利器:WeUI
1.前言 通过前面系列文章的学习与讲解,相信大家已经对微信的开发有了一个全新的认识.后端基本能够基于盛派的第三方sdk搞定大部分事宜,剩下的就是前端了.关于手机端的浏览器的兼容性问题相信一直是开发者们 ...
- 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转
线程安全使用(四) 这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationT ...
- 微信公众号开发系列-13、基于RDIFramework.NET框架整合微信开发应用效果展示
1.前言 通过前面一系列文章的学习,我们对微信公众号开发已经有了一个比较深入和全面的了解. 微信公众号开发为企业解决那些问题呢? 我们经常看到微信公众号定制开发.微信公众平台定制开发,都不知道这些能给 ...
- 微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/a1786223749/article/ ...
- C#微信公众号开发系列教程二(新手接入指南)
http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...
- NET微信公众号开发-5.0微信支付(待测试)
开发前准备. 1.0微信支付官方开发者文档 2.0官方demo下载 我们用c#所以选择.net版本 不过这个官方的demo根本跑步起来 3.0官方demo运行起来解决方案 4.0微信支付官方.net版 ...
随机推荐
- Shiro学习笔记 三(认证授权)
第一种首先基于角色的权限控制 1.由于不断的创建SecurityFactory工程等步骤重复多次,所以应该将这些步骤封装成一个工具类 还是首先看一下目录结构 主要用到文件 首先贴一下工具类的方法 pa ...
- 1、My Scripts
1.写一个包含命令.变量和流程控制的语句来清除/var/log的messages日志文件的shell脚本.(P26)(11-21) 2.利用$0和(dirname.basename)取出当前路径的目录 ...
- 【译】第20节---数据注解-InverseProperty
原文:http://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in-co ...
- SAP FI CO模块常用事务代码
...
- jQuery从0到1
jQuery不需要安装,把下载的jquery.js文件放在网站上的一个公共的位置,需要在某个页面使用jQuery时,再相对引用即可.——其中有压缩版和未压缩版,分别用于开发和发布.http://jqu ...
- arcgis 要素服务增删改查
两种方式: 第一种 要素服务的增删改操作,在ArcGIS API for JS中给我们提供了三个类用于要素的增Add,删Delete,改Update 添加draw和要素服务 //用于操作的要素图层,注 ...
- Python dict 将元祖转成字典
dict 关键字 dict3=dict(((),(),())) #dict 只有一个参数 输出:{'a': 97, 'b': 98, 'c': 99}
- python3 items() 与 python2 中iteritems()的区别
在Python2.x中, iteritems() 用于返回本身字典列表操作后的迭代 Python 3.x 里面, iteritems() 方法已经废除了,而 items() 得到的结果是和 2.x 里 ...
- Jmeter 老司机带你一小时学会Jmeter
Jmeter的安装 官网下载地址:http://jmeter.apache.org/download_jmeter.cgi 作为Java应用,是需要JDK环境的,因此需要下载安装JAVA,并且作必 ...
- ipconfig/all参数解析
本人是在搭建虚拟机时经常需要用到ipconfig/all名称查看宿主机的配置,但是对于该命令下的一些设置经常弄混,所以就花了点时间研究了一下. 参考文献:https://www.cnblogs.com ...