文章目录

  • 一、公众号管理,绑定域名
  • 二、在页面引入JS文件
  • 三、通过config接口注入权限验证配置
  • 四、通过ready接口处理成功验证
  • 五、步骤三中参数获取
    • 1、Controller层
    • 2、Service层方法实现
      • (1)首先是获取时间戳和随机串。
      • (2)生成随机串方法
      • (3)获取签名
      • (4)其中获取jsapi_ticket的方法
      • (5)获取jsapi_ticket前首先获取token
      • (6)接获取签名中的Sha1方法
  • 六、总结

一、公众号管理,绑定域名

进入微信公众号管理,在JS接口安全域名修改出配置自己的域名。

二、在页面引入JS文件

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js?v=7f54"></script>

三、通过config接口注入权限验证配置

wx.config({debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,appId: '${appId}', // 必填,公众号的唯一标识timestamp: '${timestamp}', // 必填,生成签名的时间戳nonceStr: '${nonceStr}', // 必填,生成签名的随机串signature: '${signature}',// 必填,签名jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline'] // 必填,需要使用的JS接口列表});

其中jsApiList表示需要使用的JS接口列表,上面“onMenuShareAppMessage”和“onMenuShareTimeline”分别是分享微信好友和分享微信朋友圈。后面第五步将会介绍在后台如何获取时间戳、随机串和签名等问题。

四、通过ready接口处理成功验证

   // 获取需要使用的相关参数var memberSid = "${member.memberSid}";var baseUrl = "${baseUrl}";var linkUrl = baseUrl + "/lachinHit.html?memberSid="+memberSid+"&f="+flag;var src =baseUrl+ "/images/activity/lachin/fenxiangPic.png"wx.ready(function(){wx.onMenuShareAppMessage({title: '我的标题', // 分享标题desc: '我的分享描述', // 分享描述link: linkUrl, // 分享链接 imgUrl: src, // 分享图标type: '', // 分享类型,music、video或link,不填默认为linkdataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空success: function () {alert("分享微信好友成功!");},cancel: function () {alert('分享微信好友失败');}});wx.onMenuShareTimeline({title: '我的标题', // 分享标题desc: '我的分享描述', // 分享描述link: linkUrl, // 分享链接 imgUrl: src, // 分享图标type: '', // 分享类型,music、video或link,不填默认为linkdataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空success: function () {alert("分享微信好友成功!");},cancel: function () {alert('分享朋友圈失败');}});});

五、步骤三中参数获取

1、Controller层

 JSONObject config = wxInfoService.JSConfig(request);model.addAttribute("member", member);model.addAttribute("appId", config.getString("appId"));model.addAttribute("timestamp", config.getString("timestamp"));model.addAttribute("nonceStr", config.getString("nonceStr"));model.addAttribute("signature", config.getString("signature"));

2、Service层方法实现

(1)首先是获取时间戳和随机串。

public JSONObject JSConfig(HttpServletRequest request) throws Exception {JSONObject json = new JSONObject();// 从配置文件中读取appidString appId = PropertiesLoader.get("appid");// 获取时间戳String timestamp = System.currentTimeMillis() / 1000 + "";// 生成随机串String nonceStr = CommonUtil.createNonceStr(10);String currentUrl = request.getRequestURL() + "";if (StringUtils.isNotEmpty(request.getQueryString())) {currentUrl = currentUrl + "?" + request.getQueryString();}// 获取签名,重要步骤String signature = getJSSign(nonceStr, timestamp, currentUrl);json.put("appId", appId);json.put("timestamp", timestamp);json.put("nonceStr", nonceStr);json.put("signature", signature);return json;}

(2)生成随机串方法

public static String createNonceStr(int length) {String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";String res = "";for (int i = 0; i < length; i++) {Random rd = new Random();res += chars.charAt(rd.nextInt(chars.length() - 1));}return res;}

(3)获取签名

签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。

public String getJSSign(String noncestr, String timestamp, String url)throws Exception {// 获取jsapi_ticketString ticket = getJSTicket();StringBuffer buffer = new StringBuffer();buffer.append("jsapi_ticket=" + ticket);buffer.append("&");buffer.append("noncestr=" + noncestr);buffer.append("&");buffer.append("timestamp=" + timestamp);buffer.append("&");buffer.append("url=" + url);String temp = buffer.toString();logger.info("getJSSign获取jsapi_ticket的参数为:currentUrl=" + url +"---timestamp=" + timestamp + "---nonceStr=" + noncestr +"----jsticket=" + ticket + "-----生成的signature=" + CommonUtil.Sha1(temp));return CommonUtil.Sha1(temp);}

(4)其中获取jsapi_ticket的方法

public String getJSTicket() throws Exception {String ticket = null;try {ticket = shopinRedis.get(Constants.JS_TICKET_KEY);if (ticket != null) {return ticket;}// 获取tokenString token = getToken();// url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + tokenString url = PropertiesLoader.get("wechat_api") + PropertiesLoader.get("js_ticket") + token;String result = HttpUtil.Get(url);JSONObject json = JSONObject.parseObject(result);ticket = json.getString("ticket");// 放入缓存this.shopinRedis.delete(Constants.JS_TICKET_KEY);this.shopinRedis.set(Constants.JS_TICKET_KEY, ticket, 60 * 60 * 1);} catch (Exception e) {e.printStackTrace();}return ticket;}

(5)获取jsapi_ticket前首先获取token

public String getToken() throws Exception {String accessToken = null;try {accessToken = shopinRedis.get(Constants.ACCESS_TOKEN_KEY);if (accessToken != null) {return accessToken;}// 读取配置信息中配置的appid和secretString appid = PropertiesLoader.get("appid");String secret = PropertiesLoader.get("secret");// url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secretString url = PropertiesLoader.get("wechat_api") + PropertiesLoader.get("access_token") + "&appid="+ appid + "&secret=" + secret;String result = HttpUtil.Get(url);JSONObject json = JSONObject.parseObject(result);accessToken = json.getString("access_token");// token放入缓存this.shopinRedis.delete(Constants.ACCESS_TOKEN_KEY);this.shopinRedis.set(Constants.ACCESS_TOKEN_KEY, accessToken, 60 * 60 * 2);} catch (Exception e) {e.printStackTrace();}return accessToken;}

(6)接获取签名中的Sha1方法

public final static String Sha1(String s) {char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f' };try {byte[] btInput = s.getBytes();// 获得MD5摘要算法的 MessageDigest 对象MessageDigest mdInst = MessageDigest.getInstance("sha-1");// 使用指定的字节更新摘要mdInst.update(btInput);// 获得密文byte[] md = mdInst.digest();// 把密文转换成十六进制的字符串形式int j = md.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf];str[k++] = hexDigits[byte0 & 0xf];}return new String(str);} catch (Exception e) {e.printStackTrace();return null;}}

六、总结

  • 以上针对公众号开发者配置
  • 如有异常,请仔细检查保证appid,secret等参数无误。
  • 如有问题,请参照:微信公众平台开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

微信公众号自定义分享实现(开发者)相关推荐

  1. php实现微信公众号分享,php实现微信公众号自定义分享内容的方法

    这篇文章主要介绍了php版微信公众号自定义分享内容实现方法,结合实例形式分析了php实现微信公众号自定义分享内容的接口调用与相关使用技巧,需要的朋友可以参考下 微信公众号号在手机中通过api接口可以实 ...

  2. php实现微信公众号分享,php版微信公众号自定义分享内容实现方法

    搜索热词 PHP版微信公众号自定义分享内容实现方法,希望对您有用.如果有疑问,可以联系我们. PHP版微信公众号自定义分享内容实现方法.分享给大家供大家参考,具体如下: 自定义分享内容了,下面我们来看 ...

  3. 微信公众号自定义分享IOS失效

    微信公众号自定义分享在IOS端遇到的问题:设置的分享链接如果和当前页面的url不一致就会失效,打开后白页. 解决思路:首先保证分享出去的页面都可以正常访问,然后在路由做页面访问限制,一般情况下,我们希 ...

  4. 微信公众号自定义分享注意事项

    在做公众号自定义分享时可能无效,发现需要注意以下几点: 1.公众号必须是认证过的,未认证的公众号是不行的. 2.公众号后台添加域名IP为白名单. 3.JS接口安全域名设置为项目域名. 4.引入官方JS ...

  5. 微信公众号自定义分享(vue)

    先附上微信公众平台,官网介绍的很详细, https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 微信公众号右上角自定 ...

  6. 微信公众号自定义分享标题、图片、链接

    脚本之家 https://www.jb51.net/Special/935.htm 微信JS接口签名校验工具  https://mp.weixin.qq.com/debug/cgi-bin/sandb ...

  7. laravel微信公众号自定义分享获取签名

    话不多话上代码! public function getConfig(Request $request) {//获取参数$url = $request->get('url');//公众号的app ...

  8. 微信公众号 自定义分享功能

    直接上自己最后成功的代码 WxShareController .java 其中JSConfig方法前端报错,后自行让前端传url,改成JSConfig1方法便完美了 package com.youru ...

  9. 微信公众号jssdk 分享/App原生应用接入分享开发及应用场景

    文章目录 前言 一.应用场景 二.Jssdk 接入准备工作 1.申请企业版微信公众号,并进行认证,并设置成为开发者 2.公众号配置 3.查看appid.设置密钥.并配置ip 白名单等 三.开发接入 1 ...

最新文章

  1. 河北大学计算机二级报名时间,河北大学关于2018年下半年学位授予工作安排的通知...
  2. android 旋转生命周期,生命周期-如何区分方向更改和离开应用程序android
  3. Webgoat学习笔记1
  4. Redis 入门指南(五)管理
  5. 手把手教你电脑下载b站视频
  6. 晶体晶振小结(XTAL与TCXO/VCXO/VC-OCXO等)-持续更新
  7. 晚安西南-----地破实验
  8. JAVA后台生成海报分享图片(简单配置轻松生成)
  9. 批量删除html网页,ie浏览器收藏夹网页批量删除方法
  10. js数组操作(pop,push,unshift,splice,shift方法)
  11. OTFS-SCMA学习笔记
  12. c+++怎样安装mysql,yum安装mysql | C/C++程序员之家
  13. 错误解决:failed calling webhook “dec-autonomy.xxx.io“: failed to call webhook:post
  14. gitlab:不能中文搜索
  15. 2018函授英语计算机统考,大学英语b网络统考
  16. 动态规划(pta例题)
  17. 项目规划管理 - 6
  18. 从此无心爱良夜,任他明月下西楼
  19. 2018粤港澳台物流高峰论坛在深圳成功举办
  20. 中冠百年|中年女性如何理财投资

热门文章

  1. Google Chorme
  2. 获取Word2vec训练得到的所有词与词向量
  3. 【Web技术】一文吃透 WebSocket 原理
  4. 我的世界服务器物品展示怎么得,我的世界物品展示框详解攻略 物品展示框怎么做...
  5. 【微信小程序】企业付款接口
  6. push大法破解登录框
  7. 原来华为手机还有3大隐藏省电功能,开启后,两天一充很简单
  8. 装X神器,让你的grafana看板变得炫酷起来
  9. 普通话转换成方言的语音识别方法
  10. RF基础(一) RF内建函数库BuiltIn