`
lvxing607
  • 浏览: 78988 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

微信分享接口调用

 
阅读更多
微信服务号中做运营活动,需要把页面分享到朋友圈,或者转发用户。这个功能很普遍,在写的时候有几个问题需要注意,在此记录,方便新接触的同学有个参考。

首先,如果之前没有接触过这个接口,还是要看下官方文档,有个基础的印象,链接如下:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN

接下来,可以自己试一下,如果还是有点问题,比如wx.config一直出现invalid signature,可以来参考下我的写法。

基本的方法就是js调用微信的wx.config().以及在config参数正确的时候调用相关的onMenuShareTimeline,onMenuShareAppMessage 也就是分享给朋友,分享给朋友圈。invalid signature问题可以先在微信 JS 接口签名校验工具上http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign把各个参数录入进去,看看是否正确。如果正确,还报错,就说明你的url多半是错了,对此我的做法是在页面上把当前request传到后端,解析出当前的全路径url,然后再来生成signature,简单粗暴,挺有效的

我的前端页面是用velocity写的,通过springmvc来调用,页面调用以及js的写法如下

#set($weiMap=$!dataTag.getWeiMap($request,$!code))
	<input type="hidden" id="shareUrl" name="shareUrl" value='https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxb7bd46a3ecfe69bb&redirect_uri=$!appTag.getAppUrl()/operate/operationShare.htm?id=$!userId&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect'/>
	<input type="hidden" id="appId" name="appId" value='$weiMap.get("appId")'/>
	<input type="hidden" id="timestamp" name="timestamp" value='$weiMap.get("timestamp")'/>
	<input type="hidden" id="nonceStr" name="nonceStr" value='$weiMap.get("nonceStr")'/>
	<input type="hidden" id="signature" name="signature" value='$weiMap.get("signature")'/>
	<input type="hidden" id="position" name="position" value='$!position'/>
	<input type="hidden" id="url" name="url" value='$weiMap.get("url")'/>
	<script src="$!appTag.getWebUrl()/js/sea.js" data-main="$!appTag.getWebUrl()/js/page/share_friend" data-config="$!appTag.getWebUrl()/js/config" type="text/javascript"></script>
</body>
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script>
  wx.config({
	    appId: $("#appId").val(),
	    timestamp: $("#timestamp").val(),
	    nonceStr: $("#nonceStr").val(), 
	    signature: $("#signature").val(),
       jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage'] 
	});
wx.ready(function(){
    wx.onMenuShareAppMessage({
      title: '“sidda杯”刷牙pk赛,迪士尼门票免费送!快来给我点赞助力,我要去迪士尼!',
      desc: '我当前排名第'+$("#position").val()+'位,快来点赞帮我投票吧亲!我要去迪士尼',
      link: $("#shareUrl").val(),
      imgUrl: 'http://mengya-web.oss-cn-hangzhou.aliyuncs.com/20160815142840.jpg',
    });
      
   wx.onMenuShareTimeline({
      title: '“sidda杯”刷牙pk赛,迪士尼门票免费送!快来给我点赞助力,我要去迪士尼!',
      link: $("#shareUrl").val(),
      imgUrl: 'http://mengya-web.oss-cn-hangzhou.aliyuncs.com/20160815142840.jpg',
    });
    
  });
	</script>

我用set在页面注入了后端的方法调用$weiMap=$!dataTag.getWeiMap($request,$!code),主要用来生成weiMap这样一个对象,来给wx.config配置相应的微信验证参数
在java中生成weiMap的参数是这样写的

public Map<String, String> getWeiMap(HttpServletRequest request,String code) {
		String jsapi_ticket = weixinService.getJsapiTicket();
		Map<String, String> ret = new HashMap<String, String>();
		String nonce_str = create_nonce_str();
		String timestamp = create_timestamp();
		String string1;
		String signature = "";
		String url = getUrl(request);
		// 注意这里参数名必须全部小写,且必须有序
		string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str
				+ "&timestamp=" + timestamp + "&url=" + url;
		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("appId", weixinService.getAppId());
		ret.put("nonceStr", nonce_str);
		ret.put("timestamp", timestamp);
		ret.put("signature", signature);
		ret.put("url", url);
		ret.put("jsapi_ticket", jsapi_ticket);

		return ret;
	}
public String getUrl(HttpServletRequest request){
		StringBuffer url=request.getRequestURL();
		if(StringUtils.isNotBlank(request.getQueryString())){
			url.append("?"+request.getQueryString());
		}
		return url.toString();
	}

其中getJsapiTicket这个方法主要是通过https的方式调用微信接口,我用redis缓存做了记录,代码如下,设计到https的请求实现,以及reids对应的key我就不贴出来了,大家应该有自己的方法来实现
public String getJsapiTicket() {
		String vresult = redisService.getRedis(null,
				Constant.RedisKeyEnum.WEIJSTICKET);
		if (StringUtils.isNotBlank(vresult)) {
			return vresult;
		}
		String url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+getToken()+"&type=jsapi";
		String params = null;
		try {
			String result = Https.doPost(url, params, "UTF-8", 604800, 604800);
			JSONObject jo = JSONObject.parseObject(result);
			String ticket=jo.get("ticket").toString();
			redisService.insertRedis(null, Constant.RedisKeyEnum.WEIJSTICKET, ticket,
					60);
			return ticket;
		} catch (Exception e) {
			weixinServiceLogger.error("获取微信jsticket出错 ", e);
			e.printStackTrace();
			return null;
		}
	}

注意jsticket这个方法调用微信是有次数限制的,所以大家最好缓存起来
后端的public Map<String, String> getWeiMap(HttpServletRequest request,String code)这个方法主要是用到veloctiy的toolbox这个东西来连接前后端调用的,另外对与request的调用也要在springmvc的配置veloctiy中的ViewResolver中放开,配置如下
 <!-- 配置视图的显示 -->
    <bean id="ViewResolver" class="com.healthy.business.velocity.resolver.FixedVelocityLayoutViewResolver">
		<property name="order" value="10" />
		<property name="suffix" value=".vm" />
		<property name="prefix" value="screen" />
		<property name="layoutUrl"  value="layout/default.vm"/>
		<property name="exposeSpringMacroHelpers" value="true" />
		<property name="dateToolAttribute" value="dateTool" />
		<property name="numberToolAttribute" value="numberTool" />
		<property name="toolboxConfigLocation" value="WEB-INF/conf/vm-toolbox.xml" />
		<property name="contentType" value="${web.contentType}"></property>
		<property name="templateEncoding" value="UTF-8"></property>
		<property name="exposeRequestAttributes" value="true"></property>
		<property name="exposeSessionAttributes" value="true" />
		<property name="allowSessionOverride" value="true" />
    </bean>

注意dateToolAttribute,toolboxConfigLocation,exposeRequestAttributes这些配置
分享到:
评论

相关推荐

    微信公众号接口调用 java demo

    微信公众号接口调用 java demo, maven工程, 包含获得微信 AccessToken, 获得微信用户信息, 微信公众号用于调用微信JS接口的临时票据, 微信分享, 发送模板消息等

    js微信分享接口调用详解

    主要为大家详细介绍了js微信分享接口调用的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    微信分享接口

    在微信分享接口的实现过程中,开发者首先需要注册并获取微信开放平台的AppID和AppSecret,这两个参数是所有微信接口调用的基础。然后,开发者需要在自己的应用中实现OAuth2.0授权流程,引导用户通过微信客户端进行...

    微信公众平台接口调用

    微信公众平台接口调用(java版);用来向普通用户传送信息;servlet中用到的map工具

    微信端html5页面调用分享接口示例

    主要介绍了微信端html5页面调用分享接口示例的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    HTML5手机调用微信分享

    * 4、新的分享接口,包含朋友圈、好友、微博的分享(for iOS) * 5、隐藏/显示右上角的菜单入口 * 6、隐藏/显示底部浏览器工具栏 * 7、获取当前的网络状态 * 8、调起微信客户端的图片播放组件 * 9、关闭公众...

    Appcan插件(微信分享插件)

    这些信息是进行微信分享接口调用的关键。 - **调用接口**:在代码中,你可以通过Appcan提供的API调用微信分享插件。具体的调用方式通常包括初始化、设置分享内容和触发分享等步骤。虽然描述中提到接口调用不详述,...

    微信JSSDK接口调用 分享到朋友圈实例

    微信JSSDK接口调用 分享到朋友圈实例,分享给朋友,给分享的内容添加标题,内容,图片等自定义。利用官方的dll快速简单的代码,内有例子和官网封装好的dll Senparc.Weixin.dll Senparc.Weixin.MP.dll

    php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)

    后台服务器可以调用微信的接口与微信用户进行讯息的通信,这样的行为就是在调用微信的接口,这些接口是基础接口,你不需要任何付费行为或者身份认证行为就可以调用。但是有一些高级接口,你的微信公众号必须达到一定...

    jQuery+ashx配置使用微信jssdk调用分享扫一扫接口

    使用ajax+ashx配置微信jssdk,调用分享接口,微信扫一扫接口示例

    微信分享后端接口

    本文将详细解析“微信分享后端接口”的实现,并探讨与之相关的技术知识点,包括微信分享、微信API的使用、IO流处理以及线程锁。 首先,微信分享是指通过微信平台将应用程序内的内容(如文章、图片、链接等)分享到...

    微信demo,调用微信接口

    微信接口调用是移动应用开发中的一个重要环节,尤其是在中国,微信作为一款全民级的应用,它的API接口被广泛用于实现各种功能,如分享、支付、登录等。本DEMO是针对Android平台,帮助开发者理解并实践如何在自己的...

    微信分享调用

    分享接口调用后,微信会回调你的处理类,告诉你分享是否成功。根据返回的结果,你可以给出相应的反馈给用户,如显示成功提示或错误信息。 7. **授权与登录**: 如果需要获取微信用户的个人信息,你还需要实现微信...

    Delphi XE10调用微信接口

    在调试过程中,确保你的设备已安装微信,并开启开发者模式,以便在真机上测试接口调用。 8. **其他辅助工具** "OrangeUI_IOS9Fix.exe" 可能是一个针对 iOS 9 的修复工具,用于解决特定版本操作系统上的兼容性问题...

    基于.Net的微信分享示例

    本文将详细解析基于.NET实现微信分享的示例,包括关键的类、接口以及前端调用的流程。 首先,我们来看标题中的"基于.Net的微信分享示例",这通常指的是使用C#语言和.NET Framework或.NET Core框架,通过微信开放...

    微信分享完整demo

    SDK(Software Development Kit)是微信提供的一套开发工具包,包含了各种接口调用的库文件、头文件以及示例代码,帮助开发者轻松集成微信功能。集成SDK通常包括添加库文件到项目、配置依赖项和链接器设置等步骤。 ...

    微信小程序开发附源码:浅谈微信JS-SDK 微信分享接口开发(介绍版).doc

    2. 在分享的页面中引入JS文件,例如`wxShare.js`,这个文件包含了对微信分享接口的调用和配置。 3. 在`wxShare.js`中,配置微信信息。这包括设置`debug`模式,填入`appId`、`timestamp`、`nonceStr`、`signature`...

    微信支付接口开发文档(最新版)

    微信支付接口是由腾讯公司提供的在线支付解决方案,允许商家通过API调用在自己的应用或网站上集成微信支付功能。主要接口包括:订单创建、支付确认、退款处理、交易查询等,以确保支付过程的安全性和便捷性。 2. *...

Global site tag (gtag.js) - Google Analytics