微信公众号分享内容自定义,点击链接可获点击用户的openid

今日在开发微信公众平台,需要用到分享功能。

本来,如果公众号申请的东西都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;
}


猜你喜欢

转载自blog.csdn.net/u014165193/article/details/51243414