java怎么实现微信分享到朋友圈功能?
java实现微信分享功能,java怎么实现微信分享到朋友圈功能?大家在平时都是通过微信来微信聊天,把好玩有趣的分享到微信朋友圈,那怎么实现微信分享到朋友圈功能?小编整理了java怎么实现微信分享到朋友圈功能?具有一定的参考价值,感兴趣的小伙伴们可以参考一下
微信分享功能开发
微信发送给朋友和分享到朋友圈功能开发出来,在这里给大家分享一下,避免大家走弯路。
一、服务器端程序
package com.wiimedia.controller;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import javax.servlet..HttpServletRequest;
import javax.servlet..HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.google.gson.Gson;
import com.wiimedia.model.Ticket;
import com.wiimedia.service.ArticleSolrService;
import com.wiimedia.service.TicketRepository;
import com.wiimedia.service.TicketRepositorySolr;
import com.wiimedia.utils.GetRandomStr;
import com.wiimedia.utils.SignatureBean;
import com.wiimedia.utils.weixin.WeixinUtil;
Project:mryl_phone_v2
*
*
Package:com.wiimedia.controller
*
*
Description:微信分享Controller
*
*
Company:Wiimedia
*
*@Athor:SongJia
*
*@Date:2016-7-15 上午09:34:10
*
*/
@Controller
@RequestMapping("/WeixinshareController/Api/Inteface")
public class WeixinshareController {
@Autowired
private TicketRepositorySolr ticketRepositorySolr;
@RequestMapping("/getSignature")
public String getSignature( HttpServletRequest request,
HttpServletResponse response) throws IOException, ParseException{
//获取签名页面链接
String url = request.getParameter("url");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//从数据库中获取标签,并检查标签是否过期
Ticket oldticket = ticketRepositorySolr.getTicketById("20160114wiimediamrylsong1152");
if(oldticket==null){//第一次访问,标签不存在。
executeTicket(response,"1",url,format);
return null;
}else{//标签存在,判断标签是否超时
String oldAcquiretime = oldticket.getAcquiretime();
long difference=format.parse(format.format(new Date())).getTime()-format.parse(oldAcquiretime).getTime();
if(difference>7100000){//标签超时,重新到微信服务器请求标签超时时间为7200秒(7200000毫秒)
executeTicket(response,"2",url,format);
return null;
}else{//标签未超时
/**
* 注意事项
* 1.签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
* 2.签名用的url必须是调用JS接口页面的完整URL。
* 3.出于安全考虑,开发者必须在服务器端实现签名的逻辑。
*
****根据第1点要求 signature 配置的时候很容易出错,需要把生成 Ticket的 noncestr和 timestamp传给客户端***
*/
String signature = signature(oldticket.getTicket(),oldticket.getTimestamp(),oldticket.getNoncestr(),url);
SignatureBean signatureBean = new SignatureBean();
signatureBean.setNoncestr(oldticket.getNoncestr());
signatureBean.setSignature(signature);
signatureBean.setTimestamp(oldticket.getTimestamp());
signatureBean.setUrl(url);
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print(new Gson().toJson(signatureBean));
return null;
}
}
}
/**
*
*
Project:mryl_phone_v2
*
*
:mryl_phone_v2
*
*
Description:更新和获取ticket的方法,因为用的solr所以更新和新增是一样的ID无则添加,有责更新
*
*
Company:Wiimedia
*
*@Athor:SongJia
*
*@Date:2016-7-15 上午09:45:00
*
*/
public void executeTicket(HttpServletResponse response,String flag,String url,SimpleDateFormat format) throws IOException{
//获取签名随即字符串
GetRandomStr randomStr = new GetRandomStr();
String noncestr = randomStr.getRandomString(15);
//获取签名时间戳
String timestamp = Long.toString(System.currentTimeMillis());
//请求accessToken
String accessTokenUrl ="api.weixin.qq/cgi-bin/token?grant_type=client_credential&appid=您的APPID&secret=您的密匙";
String tokenJson = WeixinUtil.Request(accessTokenUrl, "GET", null);
Gson gson = new Gson();
ShareAccess_Token token = gson.fromJson(tokenJson, ShareAccess_Token.class);
String to= token.getAccess_token();
//获取标签
String urlTicket ="api.weixin.qq/cgi-bin/ticket/getticket?access_token="+to+"&type=jsapi";
String ticketJson = WeixinUtil.Request(urlTicket, "GET", null);
Ticket ticket = gson.fromJson(ticketJson, Ticket.class);
String t = ticket.getTicket();
//String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
//我的Ticket ID是写死的
String acquiretime = format.format(new Date());
ticket.setTid("20160114wiimediamrylsong1152");
ticket.setAcquiretime(acquiretime);
ticket.setTimestamp(timestamp);
ticket.setNoncestr(noncestr);
//因为用的SOLR所以更新和添加的方法是一样的,可以根据自己具体需求进行修改,本文不再贴出代码.
if(flag.equals("2")){
ticketRepositorySolr.addTicketToSolr(ticket);
}else{
ticketRepositorySolr.addTicketToSolr(ticket);
}
/**
* 注意事项
* 1.签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
* 2.签名用的url必须是调用JS接口页面的完整URL。
* 3.出于安全考虑,开发者必须在服务器端实现签名的逻辑。
*
*根据第1点要求 signature 配置的时候很容易出错,需要把生成 Ticket的 noncestr和 timestamp传给客户端*
*/
String signature = signature(t,timestamp,noncestr,url);
SignatureBean signatureBean = new SignatureBean();
signatureBean.setNoncestr(noncestr);
signatureBean.setSignature(signature);
signatureBean.setTimestamp(timestamp);
signatureBean.setUrl(url);
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print(new Gson().toJson(signatureBean));
}
/**
*
*
Project:mryl_phone_v2
*
*
:mryl_phone_v2
*
*
Description:根据标签,时间戳,密匙,URL进行签名
*
*
Company:Wiimedia
*
*@Athor:SongJia
*
*@Date:2016-7-15 上午09:37:13
*
*/
private String signature(String jsapi_ticket, String timestamp, String noncestr, String url) {
jsapi_ticket = "jsapi_ticket=" + jsapi_ticket;
timestamp = "timestamp=" + timestamp;
noncestr = "noncestr=" + noncestr;
url = "url=" + url;
String[] arr = new String[] { jsapi_ticket, timestamp, noncestr, url };
// 将token、timestamp、nonce,url参数进行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
if (i != arr.length - 1) {
content.append("&");
}
}
MessageDigest md = null;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
content = null;
return tmpStr;
}
/**
* 将字节转换为十六进制字符串
*
* @param mByte
* @return
*/
private static String byteToHexStr(byte mByte) {
char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
tempArr[1] = Digit[mByte & 0X0F];
String s = new String(tempArr);
return s;
}
/**
* 将字节数组转换为十六进制字符串
*
* @param byteArray
* @return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
class ShareAccess_Token{
private String access_token;
private String expires_in;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String accessToken) {
access_token = accessToken;
}
public String getExpires_in() {
return expires_in;
}
public void setExpires_in(String expiresIn) {
expires_in = expiresIn;
}
}
}
分享功能已经开发完成,但是,在生成signature的时候会遇到很多问题,这里提供一些wx.config失败的排错方法。
① 确认自己的生成的signature是否正确
在微信提供的mp.weixin.qq/debug/cgi-bin/sandbox?t=jsapisign进行校验
② wx.config中使用的noncestr, timestamp与用以签名中的对应noncestr, timestamp是否一致一致…如上面(一.服务器代码)
(有可能因为JS页面加载顺序问题,服务器生成的signature,noncestr,timestamp在wx.config中没有获取到)。
③ 确认url是页面完整的url,包括GET参数部分
需要去掉#后面的部分
④ config 中的 appid 与用来获取 jsapi_ticket 的 appid 是否一致
⑤ 报错{errmsg:config:ok}是debug的正常返回把调试模式关掉就OK
wx.config debug: false,
这就是java怎么实现微信分享到朋友圈功能?的内容介绍,赶快运用到你的公众号吧,想要了找寻更多微信公众号素材,快来微微风吧,这里每天有不一样的精彩等着你。
更多推荐:
java微信签到功能实现:java做的一个简易的微信签到系统
微信公众号会议签到有哪几种方式?
Java如何实现JsApi方式的微信支付功能?
下一篇:微信小程序同步请求的几种方式
