java 朋友圈功能开发_java开发的微信分享到朋友圈功能

本文介绍了如何使用Java开发微信分享到朋友圈的功能。首先,通过JSAPI注入权限,接着,当用户点击按钮时,调用微信的分享接口,自定义分享的标题、链接和图片。此外,还讨论了jsapi_ticket的获取限制和解决方案,如使用Spring定时任务每小时获取一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微信分享到朋友圈其实是微信中的一个内置功能,但当我们想自定义分享的内容的时候,就得自己写js代码调用微信的jsapi。

过程大体分为两步:

一、当你打开一个页面(你项目中需要加入分享朋友圈功能的页面)时,会执行一段js代码,这段js代码中实现了一个微信注入权限的功能,因为只有注入权限之后你才可以调用微信的分享朋友圈的功能,微信注入权限接口的js代码如下所示:

$(function(){

ajaxConfig();

});

function ajaxConfig(){

$.ajax({

type:"post",

dataType: "json",

data: {

url : location.href.split('#')[0]

},

url: "${pageContext.request.contextPath }/wxUser/testConfig.shtml",

success: function(obj){

if(obj.result == "success"){

//微信注入权限接口

wx.config({

debug: false,

appId: obj.appId,

timestamp: obj.timestamp,

nonceStr: obj.nonceStr,

signature: obj.signature,

jsApiList: [

'onMenuShareTimeline', //分享到朋友圈

]

});

}else{

alert("加载数据错误");

}

},

error:function(){

alert("系统请求异常!");

}

});

}

如果接口权限注入成功,这个接口需要5个重要的参数,公众号的appid,时间戳timestamp,随机字符串nonceStr,以及加密签名signature,这四个参数通过ajax的回调函数进行接收,后台代码的实现如下:

@RequestMapping("/testConfig")

public void testConfig(String url,Model model,HttpServletResponse response) throws IOException{

String jsapi_ticket = JsapiTicketTimeTask.jsapi_ticket;

String result;

if("".equals(jsapi_ticket)){

result = "error";

}

//进行数据的加密(url,jsapi_ticket,nonceStr,timestamp)等参数进行SHA1加密

Map ret = Sign.sign(jsapi_ticket, url);

String appId=WxConfigure.getAPPID();

String timestamp = ret.get("timestamp");

String nonceStr = ret.get("nonceStr");

String signature = ret.get("signature");

result = "success";

JSONObject jsonObject = new JSONObject();

jsonObject.put("timestamp", timestamp);

jsonObject.put("nonceStr", nonceStr);

jsonObject.put("signature", signature);

jsonObject.put("result", result);

jsonObject.put("appId", appId);

response.setContentType("application/json;charset=utf-8");

response.setHeader("Access-Control-Allow-Origin", "*");

response.getWriter().write(jsonObject.toString());

}

二、当你点击你页面的一个按钮时(携带有点击事件的标签,不一定非得是按钮),会弹出一个页面指向右上角提示你分享朋友圈(因为微信不能实现自定义的按钮直接分享到朋友圈,所以只能这样提示),会调用微信分享朋友圈的js代码,微信分享到朋友圈的js代码如下所示:

$("#share").on("click", function() {

$("#shareit").show();

wx.onMenuShareTimeline({

title: '欢迎来到慧聪网产业带性格色彩测试',

link: 'https://rong580.com/wzh/wxUser/toTestChoice.shtml',

imgUrl: '../img/zp-header.png',

trigger: function (res) {

},

success: function (res) {

alert('已分享');

window.location.href="toIndex.shtml?tag4="+4;

},

cancel: function (res) {

alert('已取消');

window.location.href="toIndex.shtml";

},

fail: function (res) {

alert(JSON.stringify(res));

}

});

});

$("#shareit").on("click", function(){

$("#shareit").hide();

})

这时候你点击分享朋友圈按钮,就可以将你自定义的内容分享到朋友圈了,这里的shareit就是你指引你分享到朋友圈的图片,通过点击事件可以控制它的显示与隐藏,这个图片你可以自定义,大概是这样的:

464b32d3b978ae63427a019386ea96aa.png

以上就是分享到朋友圈的功能实现;

在这个功能中会实现遇到一个问题,就是jsapiticket的获取,因为微信官方规定jsapiticket每天的获取次数是有限的,一旦超过次数就无法获取,这样就会影响到项目的正常功能,这里可以写一个定时器每小时获取一次就可以了。定时器利用spring的定时器来实现,直接在spring的配置文件中配置即可:

class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">

这里要注意一个问题,spring3和spring4中所使用的定时器是不一样的;

接下来附上相关的代码:

获取jsapiticket的类:

package chan.ye.dai.wexin;

import chan.ye.dai.http.Con2http;

import net.sf.json.JSONObject;

/**

*

* @ClassName: JsapiTicketTimeTask

* @Description: TODO(jsapi_ticket类)

* @author anyou

* @date 2016年12月9日 上午8:29:19

*

*/

public class JsapiTicketTimeTask {

public static String jsapi_ticket = "";

/**

*

* @Title: getTicket

* @Description: TODO(每隔一个小时调用一次微信获取jsapi的接口的任务调用器,在spring配置里面调用)

* @param 设定文件

* @return void 返回类型

* @throws

*/

public static void getTicket() {

//调用微信接口获取access_token凭证

//Constant.ACCESS_TOKEN = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

String _url = WexinUrlConst.WEXIN_USER_ACCESS_TOKEN.replace("APPID", WxConfigure.getAPPID()).replace("SECRET", WxConfigure.getAPPSECRET());

String resp = new Con2http().httpsRequest(_url, "GET", null);

if (!resp.contains("errcode")) {

JSONObject object = JSONObject.fromObject(resp);

String access_token = (String) object.get("access_token");

if(access_token != null && !"".equals(access_token)){

//如果可以获取access_token,即可以调用jsapi_tiket的凭证了

String ticketUrl = WexinUrlConst.JSAPI_TICKET.replace("ACCESS_TOKEN", access_token); //Constant.JSAPI_TICKET = https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

String ticketStr = new Con2http().httpsRequest(ticketUrl, "GET", null);

JSONObject ticketJson = JSONObject.fromObject(ticketStr);

String errmsg = (String) ticketJson.get("errmsg");

//如果调用成功,返回ok

if("ok".equals(errmsg)){

jsapi_ticket = (String) ticketJson.get("ticket");

}

}

}

}

}

sign类:

package chan.ye.dai.utils;

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.Formatter;

import java.util.HashMap;

import java.util.Map;

import java.util.UUID;

public class Sign {

public static Map sign(String jsapi_ticket, String url) {

Map ret = new HashMap();

String nonce_str = create_nonce_str();

String timestamp = create_timestamp();

String string1;

String signature = "";

//注意这里参数名必须全部小写,且必须有序

string1 = "jsapi_ticket=" + jsapi_ticket +

"&noncestr=" + nonce_str +

"&timestamp=" + timestamp +

"&url=" + url;

System.out.println(string1);

try

{

MessageDigest crypt = MessageDigest.getInstance("SHA-1");

crypt.reset();

crypt.update(string1.getBytes("UTF-8"));

signature = byteToHex(crypt.digest());

}

catch (NoSuchAlgorithmException e)

{

e.printStackTrace();

}

catch (UnsupportedEncodingException e)

{

e.printStackTrace();

}

ret.put("url", url);

ret.put("jsapi_ticket", jsapi_ticket);

ret.put("nonceStr", nonce_str);

ret.put("timestamp", timestamp);

ret.put("signature", signature);

return ret;

}

private static String byteToHex(final byte[] hash) {

Formatter formatter = new Formatter();

for (byte b : hash)

{

formatter.format("%02x", b);

}

String result = formatter.toString();

formatter.close();

return result;

}

private static String create_nonce_str() {

return UUID.randomUUID().toString();

}

private static String create_timestamp() {

return Long.toString(System.currentTimeMillis() / 1000);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值