微信公众号分享内容自定义,点击链接可获点击用户的openid
2016-10-10 16:54
453 查看
今日在开发微信公众平台,需要用到分享功能。
本来,如果公众号申请的东西都ok了之后,微信打开微信公众号之后是可以实现分享的,但是这个分享其实是微信默认的分享,它只分享网页上的title(title),第一张图片(imgUrl),网站域名(desc)和网址(link)。而我们用到的分享功能需要自己去定义这些参数。
一开始,完全懵逼,完全不知道是怎么一回事。心想,我们怎么能通过网页操作微信呢?因为分享是微信app自带的啊。后来,才明白,原来微信浏览器会解析网页中的参数,如果网页中没有设置的话,他会使用默认的方法。找到原理就知道如何做啦,上代码,步骤如下:
1.导入微信js sdk <script type="text/JavaScript" src='<%=basePath%>javaScript/jweixin-1.0.0.js'></script>
2.<script language="javascript">
//分享-------start
var url=new URL('index.do?method=getWXSingn');//后台服务生成签名
var targetUrl = location.href.split('#')[0];
url.addPara('url',targetUrl);
var gjson = AjaxUtil.ajaxRequest(url.getURLString());//同步请求
//获取签名
wx.config({
debug: false,
appId: '',//申请的公众号id
timestamp: gjson.timestamp,
nonceStr: gjson.nonceStr,
signature: gjson.signature,
jsApiList: [//需要重写的功能列表
'onMenuShareTimeline',//朋友圈
'onMenuShareAppMessage',//朋友
'onMenuShareQQ',
'onMenuShareQZone',
'onMenuShareWeibo'
]
});
wx.ready(function () {
var shareData = {//自定义分享数据
title: '<%=productname%>',
desc: '<%=productname%>',
link: '<%=basePath%>oauth2servlet?&from_memberid=<%=memberid%>&productid=<%=productid%>',//链接地址
imgUrl: '<%=imgurl%>'
};
wx.onMenuShareAppMessage(shareData);
wx.onMenuShareTimeline(shareData);
wx.onMenuShareQQ(shareData);
wx.onMenuShareQZone(shareData);
wx.onMenuShareWeibo(shareData);
});
wx.error(function (res) {//错误处理
alert(res.errMsg);
});
----------------------------以上界面处理over------------------------------
----------------------------请求方法 ajaxRequest------------------------------
var AjaxUtil={
//同步请求
ajaxRequest:function(requestUrl){
var paras="",urlTemp="";
var urlIndex=requestUrl.indexOf("?");
if(urlIndex>-1){
urlTemp=requestUrl.substring(0,urlIndex);
paras=requestUrl.substring(urlIndex+1);
requestUrl=urlTemp;
}
var datareturn;
$.ajax({
async:false,
type: "POST",
url: requestUrl,
data:paras,
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
dataType: "json",
success: function(data){
datareturn=data;
},
failure:function (data) {
datareturn="请求的url出错,请检查!";
}
});
return datareturn;
}
}
-----------下面的难点就是 如何解析链接地址,并获取用户openid-------------
public class Oauth2Servlet extends HttpServlet {
//网页授权获取用户信息
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String from_memberid = request.getParameter("from_memberid");
System.out.println("doGet from_memberid="+from_memberid);
String appid = "";
String code=request.getParameter("code");
String productid=request.getParameter("productid");
// String backUri = "http://www.homeband.com.cn/communityWx/oauth2Servlet?from="+from+"&appid="+appid+"&productid="+productid;
String backUri="http://www.homeband.com.cn/communityWx/oauth2servlet?from_memberid="+from_memberid+"&productid="+productid;
if(null==code || "".equals(code)){
// String backUri = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"+"oauth2.jsp";
//URLEncoder.encode 后可以在backUri 的url里面获取传递的所有参数
backUri = URLEncoder.encode(backUri);
//scope 参数视各自需求而定,这里用scope=snsapi_base 不弹出授权页面直接授权目的只获取统一支付接口的openid
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
"appid=" + appid+
"&redirect_uri=" +
backUri+
"&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect";
System.out.println(url);
response.sendRedirect(url);
System.out.println("to get code ");
}else{
System.out.println("code ="+code);
//获取到code后获取token
String secret="";
String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appid+"&secret="+secret+"&code="+code+"&grant_type=authorization_code";
JSONObject jsonObject2 = CommonUtil.httpsRequest(url, "GET", null);
System.out.print("jsonObject2="+jsonObject2.toString());
String access_token=jsonObject2.getString("access_token");//网页授权接口
String openid=jsonObject2.getString("openid");
String refresh_token=jsonObject2.getString("refresh_token");
//根据oppenid获取用户id,如果注册过直接获取,如果没注册过重新注册(memberid,openid)
try {
String memberid=BackUtil.getMemberByOpenid(openid);
HttpSession session=request.getSession(true);
//设置Session值
session.setAttribute("memberid",memberid);
String detai_url="http://www.homeband.com.cn/communityWx/mall/shop/detail.jsp?productid="+productid+"&from_memberid="+from_memberid;
// System.out.println("detai_url="+detai_url);
response.sendRedirect(detai_url);
// request.setAttribute("productid", productid);
// request.setAttribute("from", from);
// request.getRequestDispatcher("/mall/shop/detail.jsp?footer_current=index").forward(request,response);
} catch (Exception e) {
e.printStackTrace();
}
/*if(access_token!=null && !"".equals(access_token)){//根据token获取微信用户信息,暂时不用
}*/
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
------------httpsRequest--------
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
try {
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new
Java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod);
// 当outputStr不为null时向输出流写数据
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// 注意编码格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 从输入流读取返回内容
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect();
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
} catch (Exception e) {
}
return jsonObject;
}
本来,如果公众号申请的东西都ok了之后,微信打开微信公众号之后是可以实现分享的,但是这个分享其实是微信默认的分享,它只分享网页上的title(title),第一张图片(imgUrl),网站域名(desc)和网址(link)。而我们用到的分享功能需要自己去定义这些参数。
一开始,完全懵逼,完全不知道是怎么一回事。心想,我们怎么能通过网页操作微信呢?因为分享是微信app自带的啊。后来,才明白,原来微信浏览器会解析网页中的参数,如果网页中没有设置的话,他会使用默认的方法。找到原理就知道如何做啦,上代码,步骤如下:
1.导入微信js sdk <script type="text/JavaScript" src='<%=basePath%>javaScript/jweixin-1.0.0.js'></script>
2.<script language="javascript">
//分享-------start
var url=new URL('index.do?method=getWXSingn');//后台服务生成签名
var targetUrl = location.href.split('#')[0];
url.addPara('url',targetUrl);
var gjson = AjaxUtil.ajaxRequest(url.getURLString());//同步请求
//获取签名
wx.config({
debug: false,
appId: '',//申请的公众号id
timestamp: gjson.timestamp,
nonceStr: gjson.nonceStr,
signature: gjson.signature,
jsApiList: [//需要重写的功能列表
'onMenuShareTimeline',//朋友圈
'onMenuShareAppMessage',//朋友
'onMenuShareQQ',
'onMenuShareQZone',
'onMenuShareWeibo'
]
});
wx.ready(function () {
var shareData = {//自定义分享数据
title: '<%=productname%>',
desc: '<%=productname%>',
link: '<%=basePath%>oauth2servlet?&from_memberid=<%=memberid%>&productid=<%=productid%>',//链接地址
imgUrl: '<%=imgurl%>'
};
wx.onMenuShareAppMessage(shareData);
wx.onMenuShareTimeline(shareData);
wx.onMenuShareQQ(shareData);
wx.onMenuShareQZone(shareData);
wx.onMenuShareWeibo(shareData);
});
wx.error(function (res) {//错误处理
alert(res.errMsg);
});
----------------------------以上界面处理over------------------------------
----------------------------请求方法 ajaxRequest------------------------------
var AjaxUtil={
//同步请求
ajaxRequest:function(requestUrl){
var paras="",urlTemp="";
var urlIndex=requestUrl.indexOf("?");
if(urlIndex>-1){
urlTemp=requestUrl.substring(0,urlIndex);
paras=requestUrl.substring(urlIndex+1);
requestUrl=urlTemp;
}
var datareturn;
$.ajax({
async:false,
type: "POST",
url: requestUrl,
data:paras,
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
dataType: "json",
success: function(data){
datareturn=data;
},
failure:function (data) {
datareturn="请求的url出错,请检查!";
}
});
return datareturn;
}
}
-----------下面的难点就是 如何解析链接地址,并获取用户openid-------------
public class Oauth2Servlet extends HttpServlet {
//网页授权获取用户信息
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String from_memberid = request.getParameter("from_memberid");
System.out.println("doGet from_memberid="+from_memberid);
String appid = "";
String code=request.getParameter("code");
String productid=request.getParameter("productid");
// String backUri = "http://www.homeband.com.cn/communityWx/oauth2Servlet?from="+from+"&appid="+appid+"&productid="+productid;
String backUri="http://www.homeband.com.cn/communityWx/oauth2servlet?from_memberid="+from_memberid+"&productid="+productid;
if(null==code || "".equals(code)){
// String backUri = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"+"oauth2.jsp";
//URLEncoder.encode 后可以在backUri 的url里面获取传递的所有参数
backUri = URLEncoder.encode(backUri);
//scope 参数视各自需求而定,这里用scope=snsapi_base 不弹出授权页面直接授权目的只获取统一支付接口的openid
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
"appid=" + appid+
"&redirect_uri=" +
backUri+
"&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect";
System.out.println(url);
response.sendRedirect(url);
System.out.println("to get code ");
}else{
System.out.println("code ="+code);
//获取到code后获取token
String secret="";
String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appid+"&secret="+secret+"&code="+code+"&grant_type=authorization_code";
JSONObject jsonObject2 = CommonUtil.httpsRequest(url, "GET", null);
System.out.print("jsonObject2="+jsonObject2.toString());
String access_token=jsonObject2.getString("access_token");//网页授权接口
String openid=jsonObject2.getString("openid");
String refresh_token=jsonObject2.getString("refresh_token");
//根据oppenid获取用户id,如果注册过直接获取,如果没注册过重新注册(memberid,openid)
try {
String memberid=BackUtil.getMemberByOpenid(openid);
HttpSession session=request.getSession(true);
//设置Session值
session.setAttribute("memberid",memberid);
String detai_url="http://www.homeband.com.cn/communityWx/mall/shop/detail.jsp?productid="+productid+"&from_memberid="+from_memberid;
// System.out.println("detai_url="+detai_url);
response.sendRedirect(detai_url);
// request.setAttribute("productid", productid);
// request.setAttribute("from", from);
// request.getRequestDispatcher("/mall/shop/detail.jsp?footer_current=index").forward(request,response);
} catch (Exception e) {
e.printStackTrace();
}
/*if(access_token!=null && !"".equals(access_token)){//根据token获取微信用户信息,暂时不用
}*/
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
------------httpsRequest--------
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
try {
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new
Java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod);
// 当outputStr不为null时向输出流写数据
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// 注意编码格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 从输入流读取返回内容
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect();
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
} catch (Exception e) {
}
return jsonObject;
}
相关文章推荐
- 微信公众号分享内容自定义,点击链接可获点击用户的openid
- iOS开发 - 友盟分享(自定义分享)如何让新浪分享显示蓝色文字,其他平台内容不显示链接
- 如何在不接入微信API的情况下自定义分享内容(图片、链接、标题)
- java获取点击微信自定义菜单的用户openid
- 微信公众号里内置浏览器右上角分享主题/内容/图片自定义 JS代码
- 微信公众号开发--获取网页授权并自定义菜单点击获得openid跳转
- PHP实现获取“分享到朋友圈”按钮点击状态及自定义分享内容接口
- 人脉通分享工能,点击分享到微信或者qq的分享链接打开H5,提示用户用浏览器打开,点击下载,有有app
- php版微信公众号自定义分享内容实现方法
- 微信公众号自定义转发窗口时如何判断用户点击的是“取消”还是“发送”
- Google将「用户主动分享的链接」给予更好的排名
- div下点击不同的链接,显示不同页面的内容
- 根据用户在tableview中点击(触摸)cell的自定义accessoryButton获得其indexpath
- 分享:QWebView中点击链接的处理
- 如何让用户直接获取想要的查询内容而不是一个个链接
- 分享一个jQuery的自动客户端本地保存插件Sisyphus.js - 帮助你自动保存用户输入内容
- F:在datagrid中 怎么实现 点击一行(多列)传一个id过去到第二页显示其具体内容,不用按钮、链接等?
- 私人云服务Jolicloud Me:收录用户在Web上的所有分享内容
- ASP.Net访问母版页(MasterPage)控件、属性、方法及母版页中调用内容页,获取用户自定义控件里面的子控件的方法