|
1 2 3 4 5 6 7 8 9 |
string txt = @"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIQAAAARCAMAAAArMfRlAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACZFBMVEX////61s/+9vTxkn7wiHP5zsXtblX4yb/sZkv++Pftb1b4y8H74NrueGD+9/XyloTxjXn4y8LvhG7//v7+9fP619D2uKz86uf1saTtcVjsalDqXUDsak/qWz/98vD0qpvrYETvgGrvg23vgWvqWj3ud1/1r6H1sqT629T5z8frZEn3w7n++vrsbVT7497//v3vgWv50Mf4xrz2t6vqWz74ysH73dfrYUX2u6/3vrP1rZ/saU7ufWb1sKLsZ0zwinXvf2jtb1XrYkb1s6btcFf//PvueGHznYzsbVP4xbvynYvqXUHuemPvhW/97+z749785uHufGX85N/73df62NH50MjrX0P3wLTvgmz2ua362NHtcln61c7rX0L85uL51Mz//PzqXD/zoZH+9PL98e74ycDsbFLrYEX2t6rvgGnufGXtdVzudl72uq7ymYfxkn/wh3HzpJTrZkvvg27xlYLxkH3wiXX86ub85eH97ur98/HsaE7udl7rY0jsaE32uq73vLHymoj//f397er5zcTzn4797+3tcVj508vsa1L4yL72vLD0qpv+9/b3w7jwhnHrZEjuemL0qJn86OTzno32taj3vrL74dv739n739rqXkLsa1H+8/H3wrf73tj2tajrZUr4zMPue2Txk4D3wLXwjHj++ff0pZX50sr3wrf3wbbtc1v1saPzpJTtdV3wh3LwhXDzopL/+/ryl4X2tqn74dzvfmjxjnvueWL1r6H1s6Xxj3v86OT++vn4x7398O75zcT1tKf3v7T86eXwjHj0q5z0ppbwi3f97uv85ODtdFv4xLry8julAAAAAWJLR0QAiAUdSAAAA41JREFUSMfVlPtbTEEYx9+2Op1yqLRa02XjNCnataxuK2pbhYguIqRsRCKEdS1JS5RyTyQUIRa5leu63/1TZs6Zczbxk/U8Ht8f5jvv2dl5P+eddw7Afy8fzd/by9ePyVcK/TkyBPDyb4FBo0AYPUYOgkNU+ZAwdGyYd4m14zxzPlwnKZwkHo9QRCRCKCqaDHqAmAkTxVgcJ4riJLIwXiBKmCwIUxIBDMapXr69adp0D4RZdjP/SyVmJCUD6HHK8IX+qWRGINJC1B0sSPaZ6UaOm6WB2RERGenxoDpRJtaBxopQlm2O6iBk56gQ3FxJ86TEofO1EBaUaKDz3AUL8/z8FmErOavFFCKfVCJ8glBAIQoDRkIUYbk2S5KKAZbiqYqTR2nLCISkNOMwzyz5fSWWrwBYiUsJ1CoSleXq9eV4tV6vt9OFtCuiKkLWEIi1SZUjIdaxRirJouP6RMUBCqo2KBDJGcM8t1rZYuOmGkmbNpJg8xb71pm127Ra7fZQCrHD4diJdzkcjt2Mdk+ZfBwJNhLsLY1CaOI+S101l1G/1rx/EUINtYYDNXTbmkbFwV54UCdDNKX4WYe5M5pdsMCAQBoekhs20jra5ns4gbwlL0HUi2I1ziONKTZJEM1HdskQRxvo2bWEKZWw17Wa0+l2qdNXyMmPKQ5tR9oliOMnTp46XelxgGWs3c7gM/JZ2OedBZOzgy92QmIwg6A61+k5t/OlFtaYF7pMALrSFu5iXLd0HMgiQQB3aWQlLpclAIVw4g4tfaI40ZRxCkQLx10x9/RevdYO0HfdSZ7dqCqQIDiqiu10RDT1zVhBuR2Gsj3y/5sa+hlEch2Njbdut0i9cFzxxnSXKxtn3+nE7dI/FAfIqSj6qRIL716g0T2SbwDg/gOlEg8f4UgLq0SJP6m+v02+otcfs4341QyiPJpsuber+DyeTBoP5ytOV9FKCCy5oEIM2uwjjgNg1m71O2JiEP1xa+a2DT0pV65RPJflkCH668NA95TjevLaGQR0GBE6eRbgWV1VasNsj6sQ2eQTiHoVB3j+guV7iYvc7pxXvNvt5gc1MVsG6oOa4LXT2fMGKt8OOfIhqxF6azPfPQTeupWpi0BAbCt4KZPrKJsZBlwu14z3Q+SS7ghc/OFjMi3HJ1H83Az5o+gNuveODF/6NNCZoqqbPPr6TfvH6WV9P+Hta3ivblf5v0ZQ9QOnhO0Euy9VSAAAAABJRU5ErkJggg=="; var tmpArr = txt.Split(','); byte[] bytes = Convert.FromBase64String(tmpArr[1]); using (MemoryStream ms = new MemoryStream(bytes)) { ms.Write(bytes, 0, bytes.Length); var img = Image.FromStream(ms, true); img.Save("demo.png"); } |
摘自:http://www.itnose.net/detail/6387947.html
View Detailsbase64的形式为“data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0。。。。”; 当接收到上边的内容后,需要将data:image/png;base64,这段内容过滤掉,过滤成:“iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0。。。”;然后进行保存。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
app.post(<span class="hljs-string">'/upload'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(req, res)</span></span>{ <span class="hljs-comment">//接收前台POST过来的base64</span> <span class="hljs-keyword">var</span> imgData = req.body.imgData; <span class="hljs-comment">//过滤data:URL</span> <span class="hljs-keyword">var</span> base64Data = imgData.replace(<span class="hljs-regexp">/^data:image\/\w+;base64,/</span>, <span class="hljs-string">""</span>); <span class="hljs-keyword">var</span> dataBuffer = <span class="hljs-keyword">new</span> Buffer(base64Data, <span class="hljs-string">'base64'</span>); fs.writeFile(<span class="hljs-string">"image.png"</span>, dataBuffer, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(err)</span> </span>{ <span class="hljs-keyword">if</span>(err){ res.send(err); }<span class="hljs-keyword">else</span>{ res.send(<span class="hljs-string">"保存成功!"</span>); } }); }); from:https://segmentfault.com/a/1190000005364299 |
总结整理时下流行的浏览器User-Agent大全 此文章转至:http://www.360doc.com/content/12/1012/21/7662927_241124973.shtml 用于学习 一、基础知识篇: Http Header之User-Agent User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标 识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计;例如用手机访问谷歌和电脑访问是不一样的,这些是谷歌根据访问者的 UA来判断的。UA可以进行伪装。 浏览器的UA字串的标准格式:浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识版本信息。但各个浏览器有所不同。 字串说明: 1、浏览器标识 出于兼容及推广等目的,很多浏览器的标识相同,因此浏览器标识并不能说明浏览器的真实版本,真实版本信息在 UA 字串尾部可以找到。 2、操作系统标识 3、加密等级标识 N: 表示无安全加密 I: 表示弱安全加密 U: 表示强安全加密 4、浏览器语言 在首选项 > 常规 > 语言中指定的语言 5、渲染引擎 显示浏览器使用的主流渲染引擎有:Gecko、WebKit、KHTML、Presto、Trident、Tasman等,格式为:渲染引擎/版本信息 6、版本信息 显示浏览器的真实版本信息,格式为:浏览器/版本信息 浏览器User-Agent的详细信息 PC端: safari 5.1 – MAC User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50 safari 5.1 – Windows User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 […]
View DetailsGoogle Project Zero 黑客 Tavis Ormandy 报告在流行密码管理工具 LastPass 中发现了一个高危0day 漏洞,允许恶意网站完整访问用户的账号。漏洞已经报告给了 LastPass,细节没有披露。巧合的是另一位安全研究人员 Mathias Karlsson 也报告了 LastPass 的一个类似漏洞,目前还不清楚两个漏洞是否相同。 Karlsson 在其博客上描述了他的发现:LastPass的密码自动填写功能存在bug,允许恶意网站欺骗 LastPass 相信它是另一个网站比如Twitter,窃取用户登录凭证。Karlsson建议用户关闭自动填写功能。LastPass称它已经修复了漏洞,漏洞主要影响 Firefox 用户。 相关链接 Lastpass 的详细介绍:请点这里 Lastpass 的下载地址:请点这里 from:http://www.oschina.net/news/75639/lastpass-0day-bug
View Details一年一度的IEEE Spectrum编程语言排行盛宴又来了,来看看今年7月26日发布的前十名榜单。这个排行榜已经进行了三年。IEEE Spectrum的排序是来自10个重要数据源的综合,例如 IEEE Xplore, GitHub, CareerBuilder 等等,他们根据数据源对48种语言给出不同角度的排列。调整不同的权重,可以得到不同的排序结果。用户甚至可以根据自己的情况,调整权重,得到相应的排序 结果。 感兴趣的朋友可以点击这个链接进入网站查看结果:Interactive: The Top Programming Languages 2016。 我们来对比一下去年和今年的前十榜单(左边2016年,右边2015年),看看这一年的趋势。 可 以发现,C取代Java成为第一名,Python和C++换了位置,C和R换了位置,PHP和JavaScript保持原来的位置不动。另外,需要重点提 出的是,2016年第十名出现了新的角色:Go,Go原来在去年榜中排第13位,而去年第10名的Matlab在今年榜中位居第14名。 总体而言,仅就前10名来看,上升的语言有:C、Python、R和Go。 纵观整个48种语言此起彼伏的发展势头,参与排行榜制作的Nicholas Diakopoulos撰文表示,与大数据相关的语言普遍存在上升趋势,比如Go、Julia、R、Scala甚至是Python。 榜 单前十名的竞争是最为激烈的。谷歌的Go前年第19名,去年第13名,今年更是挤进前10,充分说明了其日益增长的影响力。Diakopoulos分析 说,Go的快速上升跟Github上的使用率上升有关。据统计,2016年Github上以Go为主要语言的的原始仓库数量是2014年的四倍,另外在 Reddit上人们对Go的讨论也较多,如今有关Go的帖子比2014年翻了三倍。 专 门用于数据统计分析的R语言排名一路飙升,从14年的第13名,到15年的第6名,再到今年的第5名。但是R语言最重要的一点,是它在学术研究论文中被提 及的次数显著上升。IEEE Xplore是收录了数百万的学术论文、行业标准和专著的权威数据库,这个排行榜也给IEEE Xplore的数据源以较大权重。数据显示,2015年IEEE Xplore中仅有39篇论文讨论R语言,今年相关论文数量达到了244篇。 而Scala从前年第18名升至今年15名,Julia 从去年40名跃升至今年的33名。 在 招聘市场的权重里,虽然Java 和Python一直在人才市场中居于霸主地位,但Diakopoulos表示雇主们对于R和Scala的兴趣明显在上升。2014年招聘网站 CareerBuilder和Dice上所列的R和Scala相关工作只有136个,但到2016年这一数量翻了四倍,达到631个。 榜单一定程度上反映了学术和市场趋势,读者可以根据自己的实际情况来参考,来规划自己的学术和职业发展方向。 稿源:雷锋网 from:http://www.oschina.net/news/75640/ieee-spectrum-latest-rank
View DetailsGrafika 是一个 PHP 的图像处理库。可用于改变图像大小、剪切、比较,以及添加水印等操作。同时可以创建一些文本图片、几何图形并应用一些过滤器。基于 Imagick 和 GD 构建。 特征 智能裁剪 图像比较 感知哈希 高级图像处理过滤器 贝塞尔曲线 示例代码: ? 1 2 3 4 5 6 7 useGrafika\Grafika; $editor= Grafika::createEditor(); $editor->open( "path/to/jpeg/image.jpg"); $editor->resizeExact( 200, 200 ); $editor->save( "path/to/edited.jpg", null, 90 ); osc地址:http://www.oschina.net/p/grafika
View DetailsEmoji表情字符现在在APP已经广泛支持了。但是Mysql的UTF8编码对Emoji字符的支持却不是那么好。所以我们经常会遇到这样的异常: Incorrect string value: '\xF0\x90\x8D\x83…' for column 原因是Mysql里UTF8编码最多只能支持3个字节,而Emoji表情字符使用的UTF8编码,很多都是4个字节,有些甚至是6个字节。 解决的方案有两种: 1.使用utf8mb4的mysql编码来容纳这些字符。 2.过滤掉这些特殊的表情字符。 关于第一种解决方法,请参考:http://segmentfault.com/a/1190000000616820 和 http://info.michael-simons.eu/2013/01/21/java-mysql-and-multi-byte-utf-8-support/ 有大量细节需要注意,例如:mysql版本,mysql的配置,mysql connector的版本等等。。 因为我们使用的云数据库,所以我选择了过滤这些特殊字符。其实过滤的方式很简单,直接使用正则表达式匹配编码范围,然后替换就行了。 下面是我的代码。 更多可以参考:http://stackoverflow.com/questions/27820971/why-a-surrogate-java-regexp-finds-hypen-minus import org.apache.commons.lang3.StringUtils; public class EmojiFilterUtils { /** * 将emoji表情替换成* * * @param source * @return 过滤后的字符串 */ public static String filterEmoji(String source) { if(StringUtils.isNotBlank(source)){ return source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*"); }else{ return source; } } public static void main(String[] arg ){ try{ String text = "This is a smiley \uD83C\uDFA6 face\uD860\uDD5D \uD860\uDE07 \uD860\uDEE2 \uD863\uDCCA \uD863\uDCCD \uD863\uDCD2 \uD867\uDD98 "; System.out.println(text); System.out.println(text.length()); System.out.println(text.replaceAll("[\\ud83c\\udc00-\\ud83c\\udfff]|[\\ud83d\\udc00-\\ud83d\\udfff]|[\\u2600-\\u27ff]", "*")); System.out.println(filterEmoji(text)); }catch (Exception ex){ ex.printStackTrace(); } } } from:http://blog.csdn.net/shootyou/article/details/44852639
View DetailsNo. 文字表記 10進表記 16進表記 文字 Comment 001 " " " """ quotation mark = APL quote 002 & & & "&" ampersand 003 < < < "<" less-than sign 004 > > > ">" greater-than sign 005     " " no-break space = non-breaking space iSO 8859-1 characters char glyph HTML tag ¡ ¡ ¢ ¢ £ £ ¤ ¤ ¥ ¥ ¦ ¦ § § ¨ ¨ © © ª ª « « ¬ ¬ ­ ® ® ¯ ¯ ° ° ± ± […]
View Details基本原理 用nodejs怎样来实现对微信公众平台的开发呢? 别的就不多说了,先来简单介绍微信公众平台的基本原理。 微信服务器就相当于一个转发服务器,终端(手机、Pad等)发起请求至微信服务器,微信服务器,然后将请求转发给自定义服务(这里就是我们的具体实现)。服务处理完毕,然后转发给微信服务器,微信服务器再将具体响应回复到终端;通信协议为:HTTP;数据格式为:XML。 具体的流程如下图所示: 其实,我们需要做的事情,就是对HTTP请求,做出响应。具体的请求内容,我们按照特定的XML格式去解析,处理完毕后,也要按照特定的XML格式返回。 平台注册 要想完成对微信公众平台的开发,我们需要注册一个微信公众平台帐号。注册步骤如下: 打开微信公共平台的官网,https://mp.weixin.qq.com/,点击“立即注册”。 然后根据提示,填写基本信息,邮箱激活,选择类型,信息登记,公众号信息,完成注册。 在注册完成以后,我们要对公众号进行一些基本的设置。登录公众号,找到【公众号设置】,然后设置头像以及其它信息。 nodejs环境搭建 我们需要在公网上找一台服务器,以便可以启动我们的nodejs的环境,启动环境后通过设置访问地址,我们就可以接收微信服务器发送的消息了,并且我们也可以向微信服务器发送消息了。 在公网的服务器中安装完成nodejs以后,我们还需要安装一些nodejs所用到的模块,如:express,node-xml,jssha等模块。可以通过npm命令进行安装。 我们通过nodejs来实现向微信服务器消息的发送与接收,以及与微信服务器的签名认证。 在我们右面的编辑环境中已经为同学们安装了nodejs环境。我们在接下来内容中就为同学们来实现微信服务器的签名认证。 创建express框架 我们在前面的课程中已经安装了express模块,并且在我们右面的环境中已经创建了一个名为app.js的文件。现在我们就在这个文件中完成express框架。如下代码:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="hljs-keyword">var</span> express = <span class="hljs-built_in">require</span>(<span class="hljs-string">"express"</span>); <span class="hljs-keyword">var</span> path=<span class="hljs-built_in">require</span>(<span class="hljs-string">'path'</span>); <span class="hljs-keyword">var</span> app = express(); server = <span class="hljs-built_in">require</span>(<span class="hljs-string">'http'</span>).Server(app); app.set(<span class="hljs-string">'views'</span>,__dirname); <span class="hljs-comment">// 设置视图 </span> app.set(<span class="hljs-string">'view engine'</span>, <span class="hljs-string">'html'</span>); app.engine( <span class="hljs-string">'.html'</span>, <span class="hljs-built_in">require</span>( <span class="hljs-string">'ejs'</span> ).__express ); <span class="hljs-built_in">require</span>(<span class="hljs-string">'./index'</span>)(app); <span class="hljs-comment">//路由配置文件</span> server.listen(<span class="hljs-number">80</span>,<span class="hljs-function"><span class="hljs-keyword">function</span>()</span>{ <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'App start,port 80.'</span>); }); |
然后再添加一个名为test.html的文件。写入以下内容
|
1 2 3 4 5 6 7 8 9 10 11 |
<span class="xml"><span class="hljs-meta"><!DOCTYPE html></span> <span class="hljs-tag"><<span class="hljs-name">html</span>></span> <span class="hljs-tag"><<span class="hljs-name">head</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>></span> <span class="hljs-tag"><<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>></span> <span class="hljs-tag"><<span class="hljs-name">title</span>></span>汇智网<span class="hljs-tag"></<span class="hljs-name">title</span>></span> <span class="hljs-tag"></<span class="hljs-name">head</span>></span> <span class="hljs-tag"><<span class="hljs-name">body</span>></span> <span class="hljs-tag"><<span class="hljs-name">div</span>></span><span class="hljs-tag"><<span class="hljs-name">%=</span></span></span><span class="ruby">issuccess</span><span class="xml"><span class="hljs-tag">%></span><span class="hljs-tag"></<span class="hljs-name">div</span>></span> <span class="hljs-tag"></<span class="hljs-name">body</span>></span> <span class="hljs-tag"></<span class="hljs-name">html</span>></span> </span> |
我们还要添加一个名为index.js的文件,来实现我们的路由。点击编辑环境中的添加文件按钮,添加文件,然后我们写入以下代码,其中GET请求用来验证配置的URL合法性,POST请求用来处理微信消息。
|
1 2 3 4 5 6 7 8 |
<span class="hljs-built_in">module</span>.exports = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(app)</span></span>{ app.get(<span class="hljs-string">'/'</span>,<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(req,res)</span></span>{ res.render(<span class="hljs-string">'test'</span>,{issuccess:<span class="hljs-string">"success"</span>}) }); app.get(<span class="hljs-string">'/interface'</span>,<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(req,res)</span></span>{}); app.post(<span class="hljs-string">'/interface'</span>,<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(req,res)</span></span>{}); } |
这样我们需要的express框架就完成了,当然我们还可以添加public公共文件夹以及我们要用到的中间件。保存文件,点击【提交运行】,然后点击【访问测试】,去试试吧。记下访问测试的地址,我们将在下一节中会用到该地址。 微信服务器配置 我们登录微信公众平台,在开发者模式下面找到基本配置,然后修改服务器配置。如图所示: 首先URL要填写公网上我们安装nodejs接收与发送数据的路径。我们可以填写上节中【访问测试】的地址,然后加上对应的路由就可以了。
|
1 2 |
<span class="hljs-string">http:</span><span class="hljs-comment">//724515db515222a9efffd6b092aa955d.me.hubwiz.com/interface</span> |
上面代码是我的访问测试的地址,然后加上前面课程中的路由,同学们要根据自己的访问测试地址与路由来填写。 Token要与我们自定义服务器端的token一致。填写完成以后,就可以点击提交了,在提交以前,我们启动app.js(点击【提交运行】)。这样根据我们的路由匹配就可以验证签名是否有效了。 当配置完成以后,一定要启用配置。 网址接入 公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:
|
1 2 3 4 5 6 |
参数 描述 signature 微信加密签名 timestamp 时间戳 nonce 随机数 echostr 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。 signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 加密/校验流程: 将token、timestamp、nonce三个参数进行字典序排序; 将三个参数字符串拼接成一个字符串进行sha1加密; 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。 参数排序 首先我们确认请求是来自微信服务器的get请求,那么就可以在index.js文件中进行添加代码了。然后在app.get('/interface',function(req,res){});的function中进行添加。 先来获取各个参数的值,如下代码:
|
1 2 3 4 5 6 |
<span class="hljs-keyword">var</span> token=<span class="hljs-string">"weixin"</span>; <span class="hljs-keyword">var</span> signature = req.query.signature; <span class="hljs-keyword">var</span> timestamp = req.query.timestamp; <span class="hljs-keyword">var</span> echostr = req.query.echostr; <span class="hljs-keyword">var</span> nonce = req.query.nonce; |
我们在这里对token进行设置,让其与微信服务器中设置的token一致。 然后对其中的token、timestamp、nonce进行排序,如下代码:
|
1 2 3 4 5 6 |
<span class="hljs-keyword">var</span> oriArray = <span class="hljs-keyword">new</span> <span class="hljs-keyword">Array</span>(); oriArray[<span class="hljs-number">0</span>] = nonce; oriArray[<span class="hljs-number">1</span>] = timestamp; oriArray[<span class="hljs-number">2</span>] = token; oriArray.sort(); |
这样我们就完成了排序。 参数加密 在上节中我们已经对参数进行了排序,然后我们在这一节中要将参数组成一个字符串,进行SH-1加密。在加密以前要用到jssha模块,在我们的文件中要引用该模块。
|
1 2 |
<span class="hljs-keyword">var</span> jsSHA = <span class="hljs-keyword">require</span>(<span class="hljs-string">'jssha'</span>); |
在上一节课中我们已经对参数排序完成,并存放在数组中,我们可以通过join方法来生成一个字符串,如下代码:
|
1 2 |
<span class="hljs-keyword">var</span> original = oriArray.<span class="hljs-keyword">join</span>(<span class="hljs-string">''</span>); |
最后对该数据进行加密,如下代码:
|
1 2 3 4 |
<span class="hljs-keyword">var</span> jsSHA = <span class="hljs-keyword">require</span>(<span class="hljs-string">'jssha'</span>); <span class="hljs-keyword">var</span> shaObj = <span class="hljs-keyword">new</span> jsSHA(original, <span class="hljs-string">'TEXT'</span>); <span class="hljs-keyword">var</span> scyptoString=shaObj.getHash(<span class="hljs-string">'SHA-1'</span>, <span class="hljs-string">'HEX'</span>); |
好了这样就生成了我们需要的签名字符串scyptoString。 签名对比 我们已经得到了我们想要的签名字符串scyptoString,然后我们就可以与来自微信服务器的签名进行对比了,对比通过,则我们就可以接收与发送消息了。
|
1 2 3 4 5 6 |
<span class="hljs-selector-tag">if</span>(signature == scyptoString){ <span class="hljs-comment">//验证成功</span> } <span class="hljs-selector-tag">else</span> { <span class="hljs-comment">//验证失败</span> } |
本参考了如下网站,更多内容也请访问: http://www.hubwiz.com/course/569dc7fdacf9a45a69b051cd/ from:http://my.oschina.net/u/2275217/blog/630770
View Details“哦,天那。相比其他开发者,我又笨又没准备。老板会知道我是多么无能,我要被炒鱿鱼了。” 这种想法,在我们作为一名软件开发人员刚进入工作领域的时候,非常常见。我也不例外。这种想法会让人觉得自己不如其他的开发者,感觉自己是滥竽充数的,感觉自己像一个全面的傻瓜,当涉及到写代码的时候。 在短短的几个月后,我第一次获得一份真正编程工作的兴奋——改善和维护一个基于 web 的研究平台——终于变成了绝对的恐惧,那些消极负面的想法在我的脑海里不断地涌入。即使在我去了更大节奏更快的组织机构,以及之后终于开创了我自己的企业,这些想法也在不断地蚕食我。 我总是觉得自己写的每一行代码都那么笨重,低效,如果展示给任何其他有才干的开发者看绝对会被批判得体无完肤。我感觉自己很笨,他们发现这一点不过是时间问题。 听起来很熟悉?如果你有我这种想法,有绝大多数软件开发者都有的这种想法,很大的可能是会惶惶而不可终日。 下面我要介绍一些我发现的有助于,你作为一个初出茅庐的开发人员,提升你自己和你的职业生涯前景的关键策略,并在推动职业发展时保持一种健康的心态。 作为一个初出茅庐的开发人员提升自己和职业生涯前景 无论你是正在找你的第一份工作,还是盯上了潜在的晋升,在一定程度上你都需要与其他的开发者竞争。为了确保你能从中脱颖而出,这里有一些关键的步骤可以帮助你迈向成功。 1. 找一种你喜欢用到工作中的语言。 要成为一个更优秀的程序员,需要定时经常性地练习编程并用不同的语言和技术扩宽你的经验,但是语言是如此之多,很多时候你不知道从哪里开始,也不知道该选择什么语言才最适合你要解决的问题风格。 如果你还没有想好具体的语言,并且想要先试验下的话,我会建议你搜索求职网站,例如 Stack Overflow Careers、Indeed 和 Monster,看看是什么语言最抢手。如果你想或者目前的职位要求的话,你可以牢牢掌握一些特定的语言,然后开始研究和试验。 The TIOBE Index 可用来查看哪些语言更受欢迎 当我开始我的第一份工作的时候——一个基于 web 研究平台的开发者——我进入了学习的阵营:虽然我有足够的技能在面试时通过编程测试,但是这份工作要求我加强 PHP、JavaScript 和 SQL 技能。于是下班后以及周末,我都会磨练自己在那三方面的技能,以便于能够在工作中表现良好,能够拥有更多基于 web 开发的机会,而这些对于我现在能够拥有和打理我自己的 web 开发公司有很大的贡献。 不管你恰巧遇到或选择了什么语言,关键是经常练习。尝试不同的语言,通过一些小例子编码,然后用它们构建小的项目。一旦你找到了能与你产生共鸣的一种或一系列语言以及如何处理问题的方法,坚持下去,并经常性地定期实践练习。 2. 发现问题或任何让你觉得生气的事情。 正如随着我职业生涯的向前迈进,我进入了一家大的临终护理组织,担任 web 开发者。虽然我的工作主要是改善和维护我们的在线计费和 CRM 系统,但是许多医务人员经常抱怨:病人总是报告说系统运行得异常缓慢。这让我很生气,它让员工更生气——因为不得不去修复。 临终护理几乎纯粹运行在微软技术上,并且数据库也不例外——Microsoft SQL Server(MSSQL)。虽然它不是我感觉最舒服的查询语言,但是我依然在家里研究、阅读、练习构建小型的 MSSQL 项目。通过我的努力,我渐渐能够建立一些示例报告来向数据库管理员展示报告可以如何改进。随着时间的推移,我帮助实现的优化促使我得到了晋升,通过修复那 个问题学到的技能帮助我获得了一份数据库管理的工作。 和一种语言一起成长和点燃学习激情的最好办法是,使用你学到的知识来帮助解决令你感到苦恼的问题。不仅要学习语言本身,也要学习语言可以如何应用到实际生活中的问题。 3. 公开发布到 Github 或其他公共代码平台上。 即使你不认为有人会使用它,喜欢它,或者甚至看上一眼,还是要发布你的代码,一旦你觉得它达到生产标准的话。你的项目可能不会改变世界,但它可以让你脱颖而出,让你可以坦然对待别人查看和批评你的工作。此外,它可以让你的简历增色不少。 4. 写博客,展示你正在学习的东西,怎么学习以及为什么。 向世界(以及将来的雇主)展示你正在学习,以及你有主动的学习意愿,就可以让你领先于 95% 以上的同行业开发人员。你也可以练习你的写作技巧,这个过程也能让你学到很多关于自我方面的东西——你如何处理问题,如何分解和解决。你还需要整理一下你 常用的思考方式,如何学习和成长,以及如何取得进步。 5. 在软件开发社区中表现活跃。 解决问题,看别人怎么解决问题,说出自己的声音和意见。我通过 Stack Overflow 和编程社区做到这些。这还不是最宽容的文化,因为你将会遇到一些非常眼尖的开发者咆哮你怎么在伪代码中忘记了后面那个括号,但这能让你与其他的开发者交 流,使得具备接受诚实(有时是残酷)批评的经验,并知道其他人可能会如何处理问题,从而打开思考问题的新思路。 6. 学会如何简明扼要地解释给技术和非技术人员听。 我总是听到大家说沟通是实现职业成功时,要掌握的最难和最重要的事情之一。在早期,我认为这是无稽之谈——只是跟人讲电话,会议期间交谈,发送电子 邮件能有多难?任何有着专业沟通经验的人都会对这种看法嗤之以鼻,我现在也会。你会惊讶地发现误解的快速突然出现,工作流程是如此之复杂,以及项目进程的 拖延。 要真正掌握高效的沟通,你需要对实际工作中你需要工作于什么有一个基本的了解(我强烈推荐 Charles Petzold 的《Code》)并彼此交互。写博客,并与编程社区互动有助于有效地提高沟通能力。 如果你能掌握简练,实事求是,通俗易懂(如果需要的话)的沟通方式,并将复杂的问题和解决方案分解为可理解和很小的块,那么你就能在软件开发领域立于不败之地。你会发现项目经理,其他的程序员,以及执行主管等都会争夺你去他们的团队。 保持健康的心态 专业软件开发人员的成长之路没有一条不充满着荆棘和困难,所以你很容易掉入不健康的自我思考和职业选择的陷阱。通过了解每个人都会有的专业的不安全感,可以在你对自己失去信心的时候更好的激励自己。 1. 要知道,每个人都感觉自己像骗子。 你在你的职业和生活中遇到的每个人都在与骗子综合征做斗争。我们每个人都觉得自己正处在被发现自己是骗子,然后被公开批评无能的边缘。了解这一点能在精神领域帮助你觉得公平,而且还能帮助你认识到,每一个做过值得夸耀的事情的人曾几何时的想法就和你现在一样。 这种心态可以帮助你坚持下来!如果再加上具有建设性的渠道方法——学习新的语言,开发方法,以及解决问题的方法——你的整个职业生涯都将有极大的提高,并且能够快速让你成为技艺大师。 2. 知道自己会陷入困境。 毫无疑问,就是在编程中我终于接受了我是人这个事实——我也有犯迷糊,笨手笨脚,错误频出的时候。没错,你也是如此。你会错过最后期限,太多次点击“全部回复”,滑动捕捉一些严重的错误,或者在应用程序架构中轻易放过一个令人难以置信的 bug。 要想保持快乐和健康,那就得让自己去分析错误,然后从中学习,还要应用所学的东西以便于下次完成得更好。 […]
View Details