【微信公众号开发】【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版 ...
随机推荐
- Directional RNA-seq data -which parameters to choose?
Directional RNA-seq data -which parameters to choose? REF: https://chipster.csc.fi/manual/library-ty ...
- java 之 dom4j解析xml
*dom4j,是一个组织,针对xml解析,提供解析器dom4j *dom4j不是javase的一部分,想要使用需要导入dom4j提供的jar包 *第一步:创建lib文件夹,将压缩文件放到此处 *第二步 ...
- p3168 [CQOI2015]任务查询系统(差分+主席树)
恕我才学浅薄,一开始想到的是树状数组+线段树,然后看了题解才第一次见到了差分这种神奇的科技 仔细想想,主席树的本质不就是前缀和嘛,加上一个差分也是可以的,没想到真是罪过罪过 对时间维护一个差分 在Si ...
- [RabbitMQ学习笔记] - 初识RabbitMQ
RabbitMQ是一个由erlang开发的AMQP的开源实现. 核心概念 Message 消息,消息是不具名的,它由消息头和消息体组成,消息体是不透明的,而消息头则由 一系列的可选属性组成,这些属性包 ...
- (转载)Rime输入法—鼠须管(Squirrel)词库添加及配置
为什么用Rime 13年底的时候,日本爆出百度的日本版本输入法的问题,要求政府人员停用,没当回事,反正我没用,当然了,有关搜狗和用户隐私有关的问题就一直没有中断过,也没太在意.但,前几天McAfee爆 ...
- Markdown 指南
Markdown 是一种轻量级的「标记语言」,使用用特殊的 Markdown 文档处理器将 Markdown 语法翻译成预设的文档格式.标题大小等,一般用于展示时输出的是 HTML.这个教程可以让使用 ...
- jquery 重要知识点总结
jquery 重要知识点总结1.一组标签用一个ul来管理,每一个标签是ul中的一个li:标签下面的内容就是用div来管理2.跟在浮动元素(float)之后的元素会围绕着浮动元素,如果不希望有这种围绕, ...
- windows下远程连接Mysql
使用“Ctrl + R”组合键快速打开cmd窗口,并输入“cmd”命令,打开cmd窗口. 使用“mysql -uroot -proot”命令可以连接到本地的mysql服务. 使用“use mysql” ...
- 基于 Python 和 Pandas 的数据分析(6) --- Joining and Merging
这一节我们将看一下如何通过 join 和 merge 来合并 dataframe. import pandas as pd df1 = pd.DataFrame({'HPI':[80,85,88,85 ...
- 【五】php 面向对象
面向对象 概念:按类进行分类,类是表示彼此之间可能互不相同,但是具有一些共同点的对象集合 多态性:不同的类对同一操作可以有不同的行为 继承:允许我们使用子类在类之间创建层次关系 类 关键字:class ...