java微信分享
先吐槽一下!!!
哎,张小龙写的教程真差,要研究半天才能用上,大家按我的步骤12345,包你药到病除:
1、官方参考:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN
2、后端参考下面后端例子,切记在WeiXinRequest类中填入自己的appid和appsecret就可以了。不过我例子中没有添加缓存大家可以用缓存加载一下。因为token的过期时间7200不需要去频繁的调用微信签名接口
4、前端参考下面前端例子!有个分享成功和失败的方法,要放到ready()中,不能放到外面,onMenuShareAppMessage要放到ready()中!!!切记!看代码:
签名那些都按照上面的样例来做即可;話不多説直接后端擼代碼。前端要注意的是 簽名的URL必須是完整的路徑 即 類似 http://www.baidu.com/xxx/xxx 最好用window.location.href 來取。
前端部分代码:
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta content="initial-scale=1,minimum-scale=1,maximum-scale=2,user-scalable=no,width=device-width" name="viewport"><meta name="theme-color" content="#000000"><link rel="manifest" href="/manifest.json"><link rel="shortcut icon" href="/favicon.ico"><script src="./polyfill.js"></script><title>123</title><link rel="stylesheet" type="text/html" href="/style.css"><link href="/static/css/main.0cc44144.css" rel="stylesheet"></head><body classname="no-scroll"><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script type="text/javascript" src="/static/js/common.4d193ec3.js"></script><script type="text/javascript" src="/static/js/main.bcc71316.js"></script></body></html><script>var htmls=document.getElementsByTagName("html")[0],widths=document.body.clientWidth;widths>600&&(widths=600),htmls.style.fontSize=100*widths/375+"px"</script><script src="./jweixin.js"></script><script>window.onload=function(){
let url="域名自己写/wx/share?shareUrl="+window.location.href
function post(token, url, params, callback){
return fetch(url, {
method: 'POST',
headers: {
'Content-Type':'application/x-www-form-urlencoded',
},
body:JSON.stringify(params)
}).
then((response) => {
return response.json()
}).
then((result) => {
console.log(result)
if (callback) {
callback(result)
}
}).catch((error) => {
if (callback) {
callback({
code:90001,
msg:'请求出错',
data:[],
timestamp:''
})
}
});
}
post(null, url, { shareUrl: url },(reuslt)=>{
if(reuslt){
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: 'wxef085e1d3842da75', // 必填,公众号的唯一标识
timestamp: reuslt.timestamp, // 必填,生成签名的时间戳
nonceStr: reuslt.nonceStr, // 必填,生成签名的随机串
signature: reuslt.signature,// 必填,签名,见附录1
jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.ready(function () {
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
alert('wechat check')
wx.onMenuShareAppMessage({
title: 'wjx wechat testing', // 分享标题
imgUrl: '分享图标', // 分享图标
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
console.log(666)
alert('wjx wechat share testing success')
},
cancel: function () {
// 用户取消分享后执行的回调函数
console.log(6663)
}
});
wx.onMenuShareTimeline({
title: 'wjx wechat testing', // 分享标题
imgUrl: '分享图标', // 分享图标
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
alert('wjx wechat share testing success')
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
});
wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
alert("微信验证失败");
})
}
} )
}</script>
后端完整代码如下:
public class WeiXinController {
@Autowired
private WeiXinRequest weiXinRequest;
@PostMapping(value = "/share")
public Map<String, String> getSignForWeiXin(@RequestParam String shareUrl) {
String ticket = weiXinRequest.getWeiXinTicket();
Sign sign = new Sign();
// 注意 URL 一定要动态获取,不能 hardcode
log.debug("[shareUrl] = " + shareUrl);
Map<String, String> ret = sign.sign(ticket, shareUrl);
for (Map.Entry entry : ret.entrySet()) {
System.out.println(entry.getKey() + ", " + entry.getValue());
}
return ret;
}
}
public class WeiXinRequest {
private static String appId = "*******";
private static String appSecret = "***";
public String getWeiXinTicket() {
String access_token;
String ticket;
//之后做缓存
Object act = null;
Object apiticket = null;
if (null == act) {
String url = "https://api.weixin.qq.com/cgi-bin/token";
String jsonStrToken = sendGet(url, "grant_type=client_credential&appid="+ appId + "&secret=" + appSecret);
log.debug("[jsonStrToken] = " + jsonStrToken);
JSONObject json = JSONObject.parseObject(jsonStrToken);
access_token = (String) json.getString("access_token");
if (access_token == null) {
return null;
}
} else {
access_token = (String) act;
}
if (null == apiticket) {
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
String jsonStrTicket = sendGet(url, "access_token=" + access_token + "&type=jsapi");
log.debug("[jsonStrTicket] = " + jsonStrTicket);
JSONObject json = JSONObject.parseObject(jsonStrTicket);
ticket = (String) json.get("ticket");
} else {
ticket = (String) apiticket;
}
return ticket;
}
/**
* 向指定URL发送GET方法的请求
*
* @param url
* 发送请求的URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
}
前端代碼略!!
java微信分享的更多相关文章
- Java微信分享接口开发
发布时间:2018-11-07 技术:springboot+maven 概述 微信JS-SDK实现自定义分享功能,分享给朋友,分享到朋友圈 详细 代码下载:http://www.demodas ...
- 分享 Java微信开发SDK
分享 Java微信开发SDK •发布于 4周前 •作者 朋也 •432 次浏览 •最后一次编辑是 2周前 •来自 分享 给大家分享两个java开发微信公众号的sdk jfinal-weixin ...
- java菜鸟之微信分享
前言:我终于理解了什么叫做教科书:教科书就是把一些简单容易的知识写成一堆谁都看不懂的书,这,就简称“教科书” 这些天接触到微信分享以及回调的问题,因为之前没接触过,所以这次做这个分享,碰了一点点壁,特 ...
- java实现微信分享
之前项目中涉及到了微信分享的功能,然后总结下供有需要的朋友参考下. 在做之前可以先看下<微信JS-SDK说明文档>,大致了解下.我自己的工程目录是 1.HttpService和HttpSe ...
- Android微信分享图片大于32k进行压缩
微信分享视频的时候,需要传一个图片数组,大小不能大于32k. 解决方案:使用Bitmap自带的compress方法解决了这个问题. 源码如下: <span style="font-si ...
- .net 微信分享功能
微信在国内目前无疑是最火的社交软件,智能手机装机必备. 微信api有java,php,Python语言的demo, 为毛没有C#的范例?兄长今天给各位带来一个.不叫哥(割)了,A股今天又暴跌[3912 ...
- React Native微信分享 朋友圈分享 Android/iOS 通用
超详细React Native实现微信好友/朋友圈分享功能-Android/iOS双平台通用 2016/06/16 | React Native技术文章 | Sky丶清| 暂无评论 | 1 ...
- 在Unity3D项目中接入ShareSDK实现安卓平台微信分享功能(可使用ShareSDK默认UI或自定义UI)
最近公司的大厅要重做,我协助主程一起制作新大厅和新框架,前面制作的编辑器也派上了用场.等全部功能做完后我会再写一个复盘,这两天主程在忙于写热更新的功能,所以把接入分享SDK功能的任务交给了我,Shar ...
- Java微信公众平台开发之获取地理位置
本部分需要用到微信的JS-SDK,微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包.通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...
随机推荐
- 《CSAPP》页表、页命中、缺页
页表 虚拟存储器系统需要某种方法来判定一个虚拟页是否在DRAM的某个地方. 这些功能由操作系统.存储器管理单元(MMU)中的地址翻译硬件和一个存放在物理存储器中的页表数据结构联合提供. 功能 将虚拟页 ...
- [剑指Offer]5-替换空格
链接 https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e?tpId=13&tqId=11210&tPa ...
- pythonj基础(五)元组和集合
一,什么是元祖 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 1.创建一个空元组 tu ...
- dtruss
一.简介 系统调用跟踪工具. 二.实例
- CSS学习总结4:派生选择器学习总结
派生选择器:通过依据元素在其位置的上下文关系来定义样式,你可以使标记更加简洁.派生选择器中一共分为三种:后代选择器.子元素选择器.相邻兄弟选择器. 1.初识派生选择器 实例:你希望列表中的 stron ...
- [JAVA]JAVA章3 如何获取及查看DUMP文件
一.dump基本概念 在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题.这些文件记录了JVM运行期间的内存占用.线程执行等情况,这就是我们常说的 ...
- List,set,Map理解
集合 集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...
- Myeclipse中的tomcat项目的内存溢出
tomcat中 内存溢出 在这里写上 -Xmx1024M -Xms1024M -XX:NewSize=128m -XX:MaxNewSize=128m -XX:PermSize=128m -XX:Ma ...
- Log4J日志整合及配置详解
Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松 ...
- vi分屏指令
用vi打开,view打开vsplit不支持 命令模式下::new,新建文件并分屏, 快捷键,Ctrl+W,然后马上按n键:spilt 水平分屏,将当前屏分为两个,水平的. Ctrl + w, s: ...