微信公众号开发笔记(二):微信分享接口实现和问题

Java实现微信扫一扫功能获取签名 一、流程: 1) 前端请求后台接口,传入url 2) 后端接收请求,处理业务逻辑 1.获取token 2.拿token获取ticket 3.获取随机字符串(用自带的UUID就行) 4.获取当前时间戳,记得除以1000(10位数) 例如:1626139722 5.拼接参数(url是前端传过来的) String context = "jsapi_ticket=xxxx&noncestr=xxxx&timestamp=xxxx&url=xxxx“ 6.参... 阅读详情

上篇文章写到了公众号开发的基本配置(不明白的可以参考https://blog.youkuaiyun.com/TOP__ONE/article/details/78183209),这里继续写微信分享接口功能代码实现。

如果以下代码涉及到微信工具类方法,而我没有提到的,请到链接下载:https://download.youkuaiyun.com/download/top__one/10875681

实现微信页面的分享自定义接口功能,需要先配置js-sdk以下数据项,所以需要先获取这些数据项。

wx.config({
	debug : false,
	appId : appId,
	timestamp : timestamp,
	nonceStr : nonceStr,
	signature : signature,
	jsApiList : [ 'chooseWXPay', 'checkJsApi', 'closeWindow',
				'onMenuShareTimeline', 'onMenuShareAppMessage' ]
	});

1、后台接口程序开发

先对跳转分享页面action的基本编写,进行必要数据的封装

    /**
	 * 分享页初始化
	 * 
	 * @param map
	 * @return
	 */
	@RequestMapping(value = "/toshare")
	public String index(Model model, @RequestParam Map<String, String> map) {
		logger.info("进入分享主页");
		// 为了获取调取微信的jsdk的方法,进行配置数据项的封装
		Map<String, String> sign = getSingture(request);
                 model.addAttribute("sign", sign);
        //此host为访问域名,即项目域名,要和js安全域名一致
		String host = PropertieSingle.getInstance().getProperty("host");
		model.addAttribute("host", host);
		return "shareIndex";
	}

     /**
	 * 获取singture的公共方法
	 * 
	 * @param request
	 * @return
	 */
	private static Map<String, String> getSingture(HttpServletRequest request) {
		// response.setContentType("text/javascript;charset=utf-8");
		// FiXME 通过接口获取access_token,再通过access_token获取jsapi_ticket
		String wechatTicket = WechatServiceUtil.getWechatTicket();
		String strBackUrl = "http://" + request.getServerName() // 服务器地址
//				 + ":"
//				 + request.getServerPort() //端口号
				+ request.getContextPath() // 项目名称
				+ request.getServletPath(); // 请求页面或其他地址
		if (!StringUtils.isEmpty(request.getQueryString()))
			strBackUrl += "?" + (request.getQueryString()); // 参数
		Map<String, String> sign = Sign.sign(wechatTicket, strBackUrl);
		sign.put("appId", PropertieSingle.getInstance().getProperty("APPID"));
		return sign;
	}

其中里面的Sign工具类代码

package com.chinatsp.wechat.util;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.UUID;


public class Sign {
    public static void main(String[] args) {
        String jsapi_ticket = "jsapi_ticket";

        // 注意 URL 一定要动态获取,不能 hardcode
        String url = "http://example.com";
        Map<String, String> ret = sign(jsapi_ticket, url);
        for (Map.Entry entry : ret.entrySet()) {
            System.out.println(entry.getKey() + ", " + entry.getValue());
        }
    };

    /**
     * 这是jssdk中需要的那个singture签名
     * @param jsapi_ticket
     * @param url
     * @return
     */
    public static Map<String, String> sign(String jsapi_ticket, String url) {
        Map<String, String> ret = new HashMap<String, String>();
        String nonce_str = create_nonce_str();//定义的字符串
        String timestamp = create_timestamp();//同上
        String string1;
        String signature = "";
        
        System.out.println(nonce_str);
        System.out.println(timestamp);
        System.out.println(jsapi_ticket);
        System.out.println(url);
        
        //注意这里参数名必须全部小写,且必须有序
        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;
    }

    public static String create_nonce_str() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }

    public static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }
}

其中wechatTicket的获取代码如下,另附TicketAPI.

/**
*这里是用到了redis缓存,tiket的有效期为7200s,我设置redis过期时间为7000s
*tiket每天获取次数有限,所以尽量做一个缓存处理
*/
public static String  getWechatTicket(){
        //获取TICKET,从redis中
		String ticket= RedisUtils.getCachRedisData(WechatBean.TICKET);
		if(ticket==null){
            //获取token
			Ticket t= TicketAPI.ticketGetticket(getWechatToken());
	RedisUtils.setCachRedisDataTimeLong(WechatBean.TICKET,Integer.parseInt(WechatBean.WECHAT_TOKEN_TIME+""),t.getTicket());
			return t.getTicket();
		}else{
			return ticket;
		}
	}

 另附TicketAPI.ticketGetticket方法代码

package weixin.popular.api;

import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;

import weixin.popular.bean.Ticket;
import weixin.popular.client.LocalHttpClient;

/**
 * JSAPI ticket
 * @author LiYi
 *
 */
public class TicketAPI extends BaseAPI{

	/**
	 * 获取 jsapi_ticket
	 * @param access_token
	 * @return
	 */
	public static Ticket ticketGetticket(String access_token){
		HttpUriRequest httpUriRequest = RequestBuilder.post()
				.setUri(BASE_URI + "/cgi-bin/ticket/getticket")
				.addParameter("access_token",access_token)
				.addParameter("type", "jsapi")
				.build();
		return LocalHttpClient.executeJsonResult(httpUriRequest,Ticket.class);
	}
}

至此,后台获取token、ticket、sign等参数,然后跳转前台页面,进行页面数据配置

2、进行页面js-sdk数据配置,通过config接口注入权限验证配置

首先需要引用js: <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

注:请注意,原有的 wx.onMenuShareTimeline、wx.onMenuShareAppMessage、wx.onMenuShareQQ、wx.onMenuShareQZone 接口,即将废弃。请尽快迁移使用客户端6.7.2及JSSDK 1.4.0以上版本支持的 wx.updateAppMessageShareData、updateTimelineShareData 接口。

我此处引用的是1.2.0版本js,此博文也是在1.2.0版本基础上进行的。后面后附上我试用1.4版本js的问题。

在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.4.0.js

如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.4.0.js (支持https)。

备注:支持使用 AMD/CMD 标准模块加载方法加载

页面代码:

<script type="text/javascript">
	$(document).ready(
			function() {
				var appId = $("#appId").val();
				var timestamp = $("#timestamp").val();
				var nonceStr = $("#nonceStr").val();
				var signature = $("#signature").val();
				wx.config({
					debug : true,
					appId : appId,
					timestamp : timestamp,
					nonceStr : nonceStr,
					signature : signature,
					jsApiList : [ 'chooseWXPay', 'checkJsApi', 'closeWindow',
							'onMenuShareTimeline', 'onMenuShareAppMessage' ]
				});

				wx.error(function(res) {
					//alert(JSON.stringify(res));
					// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
				});
				wx.checkJsApi({
					jsApiList : [ 'checkJsApi', 'onMenuShareTimeline',
							'onMenuShareAppMessage' ], // 需要检测的JS接口列表,所有JS接口列表见附录2,
					success : function(res) {
						//alert(res);
						// 以键值对的形式返回,可用的api值true,不可用为false
						// 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
					}
				});

			});

	wx.ready(function() {
			var title = "分享朋友圈?";
			var desc = "晒能力,抢大红包";
			var link = "https://blog.youkuaiyun.com/TOP__ONE/article/details/78183209";
			var imgUrl ="https://blog.youkuaiyun.com/TOP__ONE/share_logo.png";
				wx.onMenuShareTimeline({
							title : title, // 分享标题
							link : link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
							imgUrl : imgUrl, // 分享图标
							success : function() {
								// 用户确认分享后执行的回调函数
								$.ajax({
								   type: "POST",
								   async: false,
								   url: "",
								   success : function(msg) {
										
									}
								}); 
							},
							cancel : function() {
								// 用户取消分享后执行的回调函数
								//window.location.href='*.action';
							}
						});

				wx.onMenuShareAppMessage({
					title : title, // 分享标题
					desc : desc, // 分享描述
					link : link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
					imgUrl : imgUrl, // 分享图标
					type : '', // 分享类型,music、video或link,不填默认为link
					dataUrl : '', // 如果type是music或video,则要提供数据链接,默认为空
					success : function() {
						// 用户确认分享后执行的回调函数
						$.ajax({
						   type: "POST",
						   async: false,
						   url: "",
						   success : function(msg) {
								
							}
						}); 
					},
					cancel : function() {
						// 用户取消分享后执行的回调函数
					}
				});

			});

</script>

此代码中appId、timestamp、nonceStr、signature均为后台封装的sign中的值,通过自己方法获取即可。

wx.config中的debug更改为true可查看配置情况。

至此,微信分享接口demo即开发完毕。更详细官方链接https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

--------------------------------------贞操 分割线---------------------------------------

在微信分享过程中也遇到了一些问题,比如

1、签名错误invalid signature,需要检查页面wx.config中的字段是否正确,需要检查js安全域名是否与项目域名一致。一般检查顺序如下:

(1)确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。

(2)确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timestamp一致。

(3)确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。

(4)确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。

(5)确保一定缓存access_token和jsapi_ticket。

(6)确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取,而且需要encodeURIComponent),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。

如果后台返回的config 信息 与微信签名工具校验一致的话,那很有可能是前端访问的url和后台生成签名的url不一致导致,看是否需要encodeURIComponent或者decode下。

2、安卓分享成功,ios分享不成功问题

(1) IOS分享的时候图片的链接地址 和 link 都需要在 JS安全域名下并且带http头。

(2)网上搜的资源还有说是 图片大小不能超过32kb,这个不知道有没有用,没试过

(3)分享的link等url中包含中文会导致ios分享不成功,需要对中文字段进行编码处理 例:

  var link = "*.action?name=" + encodeURIComponent($('#uname').val());

因为安卓可以解析,IOS可能解析不了

(4)微信版本低,也有可能导致分享不成功

更多错误代码请详见https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115附录5

 

 

微信公众号开发 自定义分享 从前台到Java后台 调用微信JS接口分享朋友圈 20180811写在前面的话 有很多人遇到问题之后问我,结果大多数是因为配置问题,所以请详细阅读前面的配置步骤。 20181016注意事项 收到反馈,之前写的接口即将废弃,源代码中的js接口需要修改,详情请参考https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115中的分享接口,需要修改接口名称和参数列表... 阅读详情

相关推荐

H5微信分享自定义标题和图片的实现及遇到的各种坑

一、前情提要 很多时候我们刚做出来的h5微信分享出去标题显示的是网页名称,描述是网页的URL,也没有图片,这样很不好看。如下图: 我们期望像APP分享的那样,可以自定义标题内容、描述以及好看的图片。如下图: 要实现这个效果则需要用到微信公众号的JS-SDK。微信官方文档 二、实现步骤 首先需要一个微信公众号的id及公众号号的密钥。这里我们主要说前端的代码实现。后端代码具体实现方式可以参考:ja...

cuteJingle的博客 4170

微信公众号之获取ticket

我们可以观看官方的简介点击也就是说我们通过sdk可以得到更多的开发能力,比如拍照、选图、语音、位置等手机系统的能力,此外还可以使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。我们在调用js-sdk的时候,需要使用临时票据,他的有效期是7200秒,且调用的次数非常有限,所以我们尽量把它缓存下来在获取的时候,我们还是需要,获取的接口为。

youhebuke225的博客 4994

微信jsapi 调用分享接口

# 微信官网开发文档 微信JS-SDK说明文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 文档里面介绍我们需要调用的接口以及js代码. ## 针对分享接口 因为公司业务要求显现分享功能,但是查看了网上的很多资料各抒己见,搞得头晕,最后总结一句话,不是自己,看着都恶心.最后自己整理了一下...

qq_36349616的博客 2132

微信公众号js-sdk使用步骤总结

微信公众号js-sdk使用步骤总结 1. 域名绑定 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 可填写三个域名或路径(例:wx.qq.com或wx.qq.com/mp),需使用字母、数字及“-”的组合,不支持IP地址、端口号及短链域名。 填写的域名须通过ICP备案的验证。 将文件MP_verify_UhBvKrxosbLJmeos.txt(点击下载)上传至填写...

E.N.Edward 1886

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

qq_36773158的博客 4646

如何利用东南大学齿轮箱数据集进行故障诊断?从数据采集到模型训练全流程解析

本文详细解析如何利用东南大学齿轮箱数据集进行故障诊断,涵盖从数据采集到模型训练的全流程。通过信号预处理、特征工程构建及多种机器学习模型对比,帮助开发者高效实现工业设备健康管理。特别适合希望将AI技术应用于工业场景的Python开发者。

m2n3b4v5c6的博客 376

微信公众号网页调用微信扫一扫功能

目录 前言: 准备条件: 用到的微信接口 代码: 效果: 总结: 前言: 最近其他项目组需要在微信公众号里面调用微信的扫一扫功能,于是就帮忙一起搞了搞,一开始以为挺简单,从网上搜一下教程弄一下就可以了,没成想还挺麻烦的,网上的教程呢好多都是会了不用看,不会的看了也没啥用的。于是自己在弄完以后想着写一篇博客,造福一下大家。希望对大家能有所帮助。 准备条件: 1、ICP备案的域名,并且绑定对应的外网服务器。 用处:你写的扫一扫功能的代码只有放到这个域名所对...

m0_37027631的博客 1万+

保姆级教程:在ROS Noetic下,手把手教你将自定义A*全局规划器打包成插件(附避坑指南)

本文提供了一份详细的ROS Noetic下自定义A*全局规划器插件开发指南,涵盖从环境准备、算法优化到插件配置与调试的全流程。通过实战案例和避坑技巧,帮助开发者高效实现机器人导航中的全局路径规划,特别适合需要优化ROS导航栈的开发者。

weixin_29168675的博客 285

微信公众号获取jsapi_ticket(多类型)

一、jsapi_ticket是什么? jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。 二、注意事项 ...

蔡龙的技术交流站 2万+

Containerd容器运行时的私有仓库镜像推送push和镜像拉取问题解决

向/etc/containerd/config.toml配置添加如下配置,然后重启containerd。向/etc/containerd/config.toml配置添加如下配置,然后重启containerd。通过crictl为k8s拉取镜像如下所示。可以通过ctr命令进行镜像推送。往私有仓库推送镜像如下。

Bulut0907 1万+

Robocopy 参数进阶:/MIR 镜像同步与 /PURGE 删除操作的风险规避指南

本文深入解析Robocopy的/MIR镜像同步与/PURGE删除操作的高级用法及风险规避策略。通过实际案例和四重防护机制,指导用户安全实现目录同步,避免数据丢失风险,特别适用于远程主机间的数据复制与备份场景。

weixin_33462927的博客 356

Vue开发微信公众号调用微信JS-SDK的分享接口(实现微信公众号分享功能)

描述 使用微信提供的分享功能,其实就是JSSDK使用,使用它提供的接口功能。 可以先看下微信公众号开发文档,上面介绍的很详细。提供了那些功能,怎么去使用。 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#67 代码 绑定域名这个不需要说了。 引入js文件的话直接在Vue项目中找到index.html...

闲云野鸟的博客 1966

刚体转动欧拉方程:从理论到卫星姿态控制的实践

刚体转动欧拉方程是描述刚体旋转运动的基本动力学方程,在卫星姿态控制、机器人学、航空航天等领域有着广泛应用。本文将详细讲解欧拉方程的物理概念、数学推导、数值计算方法,并重点分析其在卫星姿态控制系统中的具体应用。

ScilogyHunter的博客 642

微信公众号网页分享功能开发

现在每天都可以看到很多微信分享的链接上面有网站或者商家的自定义的分享标题,和分享链接的描述及分享出去的图像,例如下面的分享出去的链接:                        上面这个是微信的js-SDK页面分享给微信好友在聊天列表中显示的视觉效果。       微信JS-SDK Demo :这个是微信网页分享出去的标题。      微信JS-SDK,帮助第三方为用户提供更优质的移动

zhengyangzkr的博客 3万+

YOLOv11数据集增强 | 引入多种数据集增强方法,支持图像和标签同步扩充增强

本文介绍了YOLOv11目标检测中的数据集增强技术,重点解决图像与标注标签同步扩充的关键问题。文章系统分析了三类增强方法:几何变换(翻转、旋转、缩放)、颜色变换(亮度、对比度调整)和高级增强(Mosaic、MixUp),并探讨了其在小样本检测、复杂场景泛化和多方向目标识别等场景的应用价值。针对核心的标签同步问题,提供了基于Python和OpenCV的详细代码实现示例,展示如何对图像进行水平翻转和缩放操作时精确调整YOLO格式边界框坐标。该技术能有效解决训练数据不足和多样性匮乏问题,显著提升模型的泛化性能。

走向CTO的路上... 1512

090、Sensor上电时序与帧同步的驱动级实现——以索尼IMX766为例的AVDD/DVDD/IOVDD时序调优

摘要: 本文以索尼IMX766传感器为例,深入探讨了传感器上电时序与帧同步的驱动级实现问题。通过分析某车载项目量产中的高温黑屏故障,揭示了AVDD/DVDD/IOVDD时序偏差导致传感器内部状态机异常的根源。文章详细解读了IMX766三路电源的时序约束(如AVDD与DVDD需在1ms内同步至90%),并提供了驱动代码级实现方案,包括电源使能顺序、延时控制及帧同步配置。针对多摄同步场景,强调了曝光时间寄存器写入一致性的重要性。最后结合产线问题定位经验,提出通过示波器抓取电源波形验证时序合规性的方法。全文聚焦硬

zzfmlxs的博客 259

微信公众号开发中分享功能 分享微信朋友圈/微信好友

微信公众号中经常遇到的问题就是分享链接到微信朋友圈 微信好友一类的需求。 下边走一下需要操作的流程 1.首先再项目中(一般就放到自己的公共文件中引入即可,vue中引入到index.html中)引入微信js 链接。 目前最高版本应该是1.4.0 <script type="text/JavaScript" src="http://res.wx.qq.com/open/js/jweixin-1....

MtangEr的博客 4012

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

告别复杂开发:wechat.js让微信JS接口集成变得简单高效

在微信生态开发中,你是否曾为繁琐的JS接口调用而头疼?wechat.js正是为了解决这个问题而生的轻量级JavaScript库,它让微信分享、网络检测和菜单控制变得异常简单。作为一款专注于简化微信JS接口集成的工具,wechat.js通过统一的API设计,帮助开发者快速实现微信内置浏览器的各种功能。 ## 📱 为什么需要wechat.js? 微信内置浏览器提供了丰富的JS接口,但原生的调用方

gitblog_00044的博客 501

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

微信公众号H5开发——JSSDK调用微信接口

wx.config({ debug: false, //是否 开启调试模式,建议调试的时候debug 改为true appId: data.resData.appId, // 必填,公众号的唯一标识 timestamp: data.resData.timestamp, // 必填,生成签名的时间戳 nonceStr: data.resData.

qq_26542023的博客 5311

wechat.js完全指南:如何轻松实现微信分享与菜单控制

wechat.js是一款专注于微信环境下的JavaScript工具库,提供了微信分享、网络状态检测和菜单控制等核心功能,帮助开发者快速集成微信生态的常用功能。无论是实现朋友圈分享、控制菜单显示,还是检测用户网络状态,wechat.js都能提供简洁易用的接口。 ## 快速开始:安装与引入 ### 一键安装步骤 wechat.js支持通过bower包管理器快速安装,只需在项目目录中执行以下命令:

gitblog_00209的博客 563

微信公众号(三)分享接口的坑

官方文档 分享接口 使用的是1.4的JSDK 首要任务是进行配置在(二)中讲过 接口的填写 jsApiList: [] // 必填,需要使用的JS接口列表 &quot;updateTimelineShareData&quot;,&quot;updateAppMessageShareData&quot;, (1.4.0) 'onMenuShareAppMessage', 'onMenuShareTimeline',(1.4.0以前...

Sinker的博客 2982

Vue微信公众号分享全过程

Vue关于微信分享的资料很少,记录一下本人开发的全过程,不足之处多多指点。 微信公众号的文档就不贴了。 下载微信js-sdk 推荐使用npm安装,npm install jweixin-module --save 分享页面引用 var wx = require('jweixin-module') 后端签名接口(java spring boot 开发) controller @RequestMa...

loading-world 2271

基于vue-cli3开发微信公众号网页——调取微信分享,微信支付接口

第一步安装微信jdk npm install weixin-js-sdk 第二步封装微信接口方法 //微信支付方法 import wx from "weixin-js-sdk"; /* 微信支付方法 获取微信加签信息 @param{data}:获取的微信加签 @param{cb}:成功回调 @param{errorCb}:失败回调 @param{share}:判断是否是...

金祥林的博客 2480

使用uni app实现H5微信分享功能

一、描述 要实现自定义微信分享功能,需要使用到微信官方提供的 js-sdk,微信JS-SDK是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包,通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。 二、准备工作 下载 HBuilderX 并安装 j...

xy1073028328的博客 1万+

tp5.1微信公众号JSSDK 接口分享 坑

今天在用tp5.1 整微信分享接口时 所发生的坑事件 1.报 { "errMsg": "config:invalid signature" } 错误 这个问题比较简单 打印下 signature 看看它是否缺参数 自己仔细去对比 上代码 function shareWx(){ $request=new Request; $jsapi_ticket = $t...

wanganji5252的博客 2082

实现微信自定义分享(缩略图、标题、描述)

实现微信自定义分享(缩略图、标题、描述)

david_Xuan的博客 5543
上一篇: 微信公众号开发笔记(一):配置公众号开发模式
下一篇: 微信公众号开发笔记(三):微信JSAPI支付功能开发
TOP__ONE
博客等级 码龄10年 74粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值