微信转发指定的图文消息到朋友圈(JAVA版)

微信转发图文消息步骤

  • 微信转发图文消息步骤
    • 需求
    • 获取凭证
      • 获取aceess_token
      • 获取jsapi_ticket
      • 缓存获取的jsapi_ticket
      • 代码
    • config接口注入权限
      • 引入js文件
      • 微信权限注入接口
    • JS-SDK分享接口调用
    • 总结
    • 温馨提示

需求

当用户购买成功一样产品,为了使用户能够二次消费,可以在订单详细页面加一个红包按钮,当用户点击之后,可以分享特定的内容(一个title、一段描述、一条超连接、一张图片)给朋友或者分享到朋友圈,当用户点击之后进入一个输入手机号码(即登录账号或绑定的手机号码)的页面,提交之后随机抽取代金券。如果你吃过“美团外卖”,对于这个流程可能就很清晰了。
如下图流程步骤:
微信转发图文消息流程

获取凭证

我是利用spring封装简单的任务调度器,1个小时自动调用微信jsapi_ticket接口,获取微信使用JS-SDK使用的权限问题的。首先,为了获取jsapi_ticket需要access_token公众号的全局唯一票据。第二步,根据access_token获取jsapi_ticket。第三步,缓存获取的jsapi_ticket参数。

获取aceess_token

需要的参数:
请求连接(GET):https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
公众号AppID(应用ID):wx****************
公众号AppSecret(应用密钥):2b****************************e0

获取jsapi_ticket

需要的参数:
请求连接(GET):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
微信全局票据凭证(access_token):********

缓存获取的jsapi_ticket

设置一个静态的字符串,运用spring任务调度器,每隔一个小时改变该字符串的值。

代码

以上三个步骤集成在一个方法里,代码如下:

import java.util.Date;
import org.json.JSONException;
import org.json.JSONObject;
import com.qq.weixin.constant.Constant;
import com.qq.weixin.publics.WXUtils;public class JsapiTicketTimeTask {public static String jsapi_ticket = "";/*** * @method getTicket* @描述: TODO(每隔一个小时调用一次微信获取jsapi的接口的任务调用器,在spring配置里面调用) * @参数* @返回类型:void* @添加时间 2015-9-1下午04:22:16* @作者:Mr.zhou*/public void getTicket() {//调用微信接口获取access_token凭证//Constant.ACCESS_TOKEN = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRETString tokenUrl = Constant.ACCESS_TOKEN.replace("APPID", Constant.APPID).replace("APPSECRET", Constant.APPSECRET);String tokenStr = WXUtils.httpsRequest(tokenUrl, "GET", null);try {JSONObject tokenJson = new JSONObject(tokenStr);String access_token = (String) tokenJson.get("access_token");if(access_token != null && !"".equals(access_token)){//如果可以获取access_token,即可以调用jsapi_tiket的凭证了String ticketUrl = Constant.JSAPI_TICKET.replace("ACCESS_TOKEN", access_token);   //Constant.JSAPI_TICKET = https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapiString ticketStr = WXUtils.httpsRequest(ticketUrl, "GET", null);JSONObject ticketJson = new JSONObject(ticketStr);String errmsg = (String) ticketJson.get("errmsg");//如果调用成功,返回okif("ok".equals(errmsg)){jsapi_ticket = (String) ticketJson.get("ticket");}}} catch (JSONException e) {e.printStackTrace();}}

WXUtils.httpsRequest方法:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import javax.net.ssl.HttpsURLConnection;
import javax.servlet.http.HttpServletRequest;//http请求public static String httpsRequest(String requestUrl, String requestMethod, String outputStr){try {URL url = new URL(requestUrl);HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);// 设置请求方式(GET/POST)conn.setRequestMethod(requestMethod);conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");// 当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();return buffer.toString();} catch (ConnectException ce) {System.out.println("连接超时:{}");} catch (Exception e) {System.out.println("https请求异常:{}");}return null;}

spring XML任务调度器代码:

<bean id="jsapiTask" class="cn.ly.web.quartz.JsapiTicketTimeTask"></bean><bean id="timerTask"class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean"><property name="targetObject" ref="jsapiTask"></property><!--这是要执行的对象--><property name="targetMethod" value="getTicket"></property><!--这是要执行的对象的方法--></bean><!--执行的时间  --><bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"><property name="delay" value="1000"></property><!--这是在spring容器实例化后的1秒后执行--><property name="period" value="3600000"></property><!--这是每隔1小时后执行  --><property name="timerTask" ref="timerTask"></property><!--这是要对哪个任务进行再执行--></bean><!--开启计划  --><bean class="org.springframework.scheduling.timer.TimerFactoryBean"><property name="scheduledTimerTasks"><list><ref bean="scheduledTask" /><!--这是要执行的任务的时间规划加载进来  --></list></property></bean>

config接口注入权限

在需要调用微信转发图文消息的订单详细页面,首先需要引入微信的js文件(http://res.wx.qq.com/open/js/jweixin-1.0.0.js),然后加载该页面的时候需要进行ajax与服务器端进行参数的交互,根据获取的参数,调用微信的权限接口验证是否能够使用微信的接口功能。

引入js文件

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

微信权限注入接口

<script type="text/javascript">$(function(){ajaxConfig();});function ajaxConfig(){$.ajax({type:"post",dataType: "json",data: {url : location.href.split('#')[0]},url: "ajax_order/testConfig",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',  //分享到朋友圈'onMenuShareAppMessage'   //分享给朋友]});}else{alert("加载数据错误");}},error:function(){alert("系统请求异常!");}});}</script>

ajax_order/testConfig方法:

import java.util.Date;
import java.util.Map;import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;import com.opensymphony.xwork2.ActionSupport;
import com.qq.weixin.constant.Constant;
import com.qq.weixin.publics.Sign;@Component
@Scope("prototype")
public class ShareAction extends ActionSupport{private String timestamp,nonceStr,signature,appId=Constant.APPID;   //签名需要的参数private String url;   //JS-SDK授权的urlprivate String result;/*** * @method testConfig* @描述: TODO(微信config接口注入权限) * @参数@return* @返回类型:String* @添加时间 2015-9-2下午02:35:54* @作者:Mr.zhou*/public String testConfig(){//JsapiTicketTimeTask.jsapi_ticket 是通过spring调度器每1个小时与微信端进行通信,获取jsapi_ticket凭证String jsapi_ticket = JsapiTicketTimeTask.jsapi_ticket;if("".equals(jsapi_ticket)){result = "error";return SUCCESS;}//进行数据的加密(url,jsapi_ticket,nonceStr,timestamp)等参数进行SHA1加密Map<String, String> ret = Sign.sign(jsapi_ticket, url);timestamp = ret.get("timestamp");nonceStr = ret.get("nonceStr");signature = ret.get("signature");result = "success";return SUCCESS;}public String getTimestamp() {return timestamp;}public void setTimestamp(String timestamp) {this.timestamp = timestamp;}public String getNonceStr() {return nonceStr;}public void setNonceStr(String nonceStr) {this.nonceStr = nonceStr;}public String getSignature() {return signature;}public void setSignature(String signature) {this.signature = signature;}public String getAppId() {return appId;}public void setAppId(String appId) {this.appId = appId;}public void setUrl(String url) {this.url = url;}public String getUrl() {return url;}public void setResult(String result) {this.result = result;}public String getResult() {return result;}   }
}

Sign方法请点击下载,官方例子

JS-SDK分享接口调用

在上面的config权限注入成功之后,就可以调用微信的分享接口,把设定的内容分享给朋友或者朋友圈了。当然,如果内容是动态获取的,那么你就可以在调用当前接口的时候,ajax获取一些动态的信息,然后在调用分享接口。当前我是以静态的分享案例为例子。
注意:下面的wx.**方法,都是上面jsApiList包含的方法名称哦。比如你需要调用微信的导航接口,就需要在jsApiList列表里面添加‘openLocation’这个方法了。

$(function(){//当用户点击一个id为testBtn的按钮的时候激活事件$("#testBtn").click(function(){wx.onMenuShareAppMessage({title: '互联网之子',desc: '在长大的过程中,我才慢慢发现,我身边的所有事,别人跟我说的所有事,那些所谓本来如此,注定如此的事,它们其实没有非得如此,事情是可以改变的。更重要的是,有些事既然错了,那就该做出改变。',link: 'http://movie.douban.com/subject/25785114/',imgUrl: 'http://demo.open.weixin.qq.com/jssdk/images/p2166127561.jpg',trigger: function (res) {// 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回alert('用户点击发送给朋友');},success: function (res) {alert('已分享');},cancel: function (res) {alert('已取消');},fail: function (res) {alert(JSON.stringify(res));}});alert('已注册获取“发送给朋友”状态事件');wx.onMenuShareTimeline({title: '互联网之子',link: 'http://movie.douban.com/subject/25785114/',imgUrl: 'http://demo.open.weixin.qq.com/jssdk/images/p2166127561.jpg',trigger: function (res) {// 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回alert('用户点击分享到朋友圈');},success: function (res) {alert('已分享');},cancel: function (res) {alert('已取消');},fail: function (res) {alert(JSON.stringify(res));}});alert('已注册获取“分享到朋友圈”状态事件');});
});

总结

当你熟悉了以上的大致流程之后,你就可以调用一些微信JS-SDK的功能了,比如导航当前与目标位置,转发消息到朋友圈或者QQ空间等等。如果博客写得不好,还请大家多多包涵。= =!

温馨提示

微信2017年4月25日起,分享的链接一定要与公众号JS设置的安全域名一致哦。例如安全域名是www.abc.com 那么www.abc.com/123是成功的,但是www.def.com/123就不成功了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/72254.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成朋友圈转发点赞截图的小工具

当当当当&#xff01;开工大吉&#xff01; 新春虎年的第一个工作日&#xff0c;相信有不少的小伙伴跟TJ君一样&#xff0c;斗志满满的开始了新一年的工作之旅。 也肯定有不少的小伙伴还在休假&#xff0c;享受一年难得的相聚。 那么春节期间&#xff0c;大家都去了什么好玩的地…

微信截图不能截微信界面

有时候&#xff0c;大家用电脑微信快捷键 Alt A 时&#xff0c;不能截取 微信窗口 界面。 大家可能很迷茫&#xff0c;不要慌&#xff0c;so easy,一招搞定 1&#xff1a;点击微信聊天界面 小剪刀 2&#xff1a; 取消 截图时隐藏当前窗口 大功告成。

kafka消费指定每次最大消费消息数量 max.poll.records

一个属于new consumer的配置项&#xff0c;出现在0.10及其以上版本中。 #一次调用poll()操作时返回的最大记录数&#xff0c;默认值为500 spring.kafka.consumer.max-poll-records; Properties properties new Properties();properties.put("max.poll.records",2);…

Kafka 消费者读取数据

更多内容&#xff0c;前往 IT-BLOG 消费者不需要自行管理 offset&#xff08;分组topic分区&#xff09;&#xff0c;系统通过 broker 将 offset 存放在本地。低版本通过 zk 自行管理。系统自行管理分区和副本情况。消费者断线后会自动根据上一次记录的 offset 去获取数据&…

Kafka消费异常处理

异常 org.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member. This means that the time between subsequent calls to poll() was longer than the …

账户系统,余额与体现

参考连接: https://blog.pingxx.com/2018/02/27/用户账户系统该怎么用?/ 账户体系的建立实际上是将结清算分开(即实时清算/定时结算)利于更复杂的支付业务(如分账/层级分润等): 建立账户体系时要根据业务需求考虑各种账户(如余额账户/冻结资金账户/红包账户(不能提现但是能…

微信支付成功,如何刷新用户当前页面的余额

本项目中&#xff0c;使用微信支付&#xff0c;支付成功后&#xff0c;弹出提示框&#xff0c;并且目的是改变当前用户的余额。。。我们在互动直播项目中发现 &#xff0c;然而事情并没有那么简单。 代码如下&#xff1a; 我们知道&#xff0c;应该在appdelegate中调用微信支…

开源趣事~ 记给 OpenHarmony 提 PR 的那些事

大家好哇&#xff0c;许久不见&#xff0c;也感谢大家这么久一直以来的关注&#xff0c;也感谢在短视频盛行的今天&#xff0c;你们还能静下心来坚守文字的阵地。 说到这次的主题&#xff0c;参加鸿蒙项目的开源&#xff0c;也是小编第一次拥抱开源&#xff0c;就像是别人有困…

基于大规模边缘计算的千万级聊天室技术实践

在技术的迭代更新下&#xff0c;面对大型、超大型的直播场景&#xff0c;大规模边缘聊天室成为新热潮。 作者 | 张超 责编 | 王子彧 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 当前直播成为一种流行趋势&#xff0c;带货直播&#xff0c;网红带货&#…

JavaScript成功背后的四个关键人物!

前言&#xff1a;JavaScript能如此成功&#xff0c;至少有四位关键人物&#xff1a; 1. JavaScript作者Brendan Eich 2. JSLint&#xff0c;JSON作者Douglas Crockford 3. jQuery作者John Resig 4. Node.js作者Ryan Dahl。 Brendan Eich以及JavaScript的发明过程大家已经非常熟…

爬虫教程( 3 ) --- 手机 APP 数据抓取

1. Fiddler 设置 这是使用 fiddler 进行手机 app 的抓包&#xff0c;也可以使用 Charles&#xff0c;burpSuite 等。。。 电脑安装 Fiddler&#xff0c;手机 和 安装 fiddler 的电脑处于同一个网络里&#xff0c; 否则手机不能把 HTTP 发送到 Fiddler 的机器上来。 配置 Fiddle…

以某乎为实战案例,教你用Python爬取手机App数据

1 前言 最近爬取的数据都是网页端&#xff0c;今天来教大家如何爬取手机端app数据&#xff08;本文以ios苹果手机为例&#xff0c;其实安卓跟ios差不多&#xff09;&#xff01; 本文将以『某乎』为实战案例&#xff0c;手把手教你从配置到代码一步一步的爬取App数据&#xff0…

利用Python爬虫抓取手机APP的传输数据

大多数APP里面返回的是json格式数据&#xff0c;或者一堆加密过的数据 。这里以超级课程表APP为例&#xff0c;抓取超级课程表里用户发的话题。 1、抓取APP数据包 表单&#xff1a; 表单中包括了用户名和密码&#xff0c;当然都是加密过了的&#xff0c;还有一个设备信息&am…

22. 听说你想要用爬虫采集我的手机号?哎 ~ 我展示用的是图片

本篇博客我们实现图片渲染手机号码案例,用于防止爬虫直接采集文字信息。 爬虫训练场 本案例实现的效果如下所示 文章目录 bootstrap5 实现名片样式卡片补充数据生成逻辑生成用户 5 个汉字的昵称调用头像 API,生成图片将手机号码生成图片bootstrap5 实现名片样式卡片 在 Boo…

一种解决Qobuz客户端一直转圈加载不出来的思路

先上图&#xff0c;Qobuz在Win10上的客户端是这样滴 之前是最高音质&#xff0c;换到最差音质还是加载不出来。可能是我网络的问题&#xff0c;但是代理节点是没问题的。然后我尝试了一下Qobuz的Web Player。 就是登录之后画红圈这个 秒开好吧&#xff0c;也不卡顿&#xff…

2022年注册会计师(CPA)考试测试题及答案

1、某外国投资者协议购买境内公司股东的股权,将境内公司变更为外商投资企业,该外商投资企业的注册资本为700万美元。根据外国投资者并购境内企业的有关规定,该外商投资企业的投资总额的上限是( )万美元。 A&#xff0e;1000 B&#xff0e;1400 C&#xff0e;1750 D…

【PMP】PMP考试练习题(中英文对照)

1. A company wants to ensure that project failures are addressed in project documentation. Where should the project manager include them? A. Project management plan B. Risk management plan C. Change management plan D. Communications management plan 公司希…

PMP通过率大跌,是否与新版考试大纲有关?

通过率的增长和下降并不是只看考试内容或者说考试是否有重大改革来的&#xff0c;毕竟每年的考生水平都是不一的&#xff0c;我们也没有办法去确定一个考试的通过率高低是否准确&#xff0c;你相信那就是&#xff0c;不相信同样对于你是否能过通过考试也没有多大影响。 考试并不…

超级好用『PMP考试答题24计』一次通过考试~(1)

作为一个想一次通过PMP考试的老考试人。 刷题、报班、看视频、看教材甚至是通过人的经验贴都不会放过的我&#xff0c;只要是与通过PMP考试有关的都想去看看了解了解&#xff0c;避避坑。 但是内容有太多&#xff0c;而且考试的经验也就只能看看&#xff0c;在自己身上好像没…

PMP中文报名注意事项

随着PMP得到越来越多的关注和认可&#xff0c;报考人数也在逐年快速增长着。 而PMP的考试&#xff0c;分为英文报名和中文报名。在PMI官网通过英文报名之后才能进行英文报名。 一般报了机构的学员&#xff0c;机构都会提供英文代报名服务。 而中文报名因为涉及预约考点&…