js 调起APP(安卓和IOS)

  分享一段 js 调起APP(android和IOS)的代码:   <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JS调起APP</title> <meta name='apple-itunes-app' content='app-id=1309411684'><!--作用:苹果safari头部,如果已安装显示打开,没安装显示去下载--> </head> <body> <a href="javascript:;" id="openApp">调起APP</a> </body> </html> <script type="text/javascript"> document.getElementById('openApp').onclick = function(e){ if(navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) { window.location.href = "cnchat://";//ios app协议(ios开发人员提供) window.setTimeout(function() { window.location.href = "https://itunes.apple.com/cn/app/%E5%90%B9%E7%89%9B-%E6%A3%8B%E7%89%8C%E4%BA%A4%E5%8F%8B%E8%81%8A%E5%A4%A9%E5%B9%B3%E5%8F%B0/id1309411684?mt=8"; //app store 下载地址 }, 2000) } if(navigator.userAgent.match(/android/i)) { window.location.href = "cn://brotheraides";//android app协议(android开发人员提供) window.setTimeout(function() { window.location.href = "http://www.treeic.com/clients/chuiniu-29-1.3.3-20180124.apk";//android app下载地址 }, 2000) } }; </script>
继续阅读 »
  分享一段 js 调起APP(android和IOS)的代码:   <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JS调起APP</title> <meta name='apple-itunes-app' content='app-id=1309411684'><!--作用:苹果safari头部,如果已安装显示打开,没安装显示去下载--> </head> <body> <a href="javascript:;" id="openApp">调起APP</a> </body> </html> <script type="text/javascript"> document.getElementById('openApp').onclick = function(e){ if(navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) { window.location.href = "cnchat://";//ios app协议(ios开发人员提供) window.setTimeout(function() { window.location.href = "https://itunes.apple.com/cn/app/%E5%90%B9%E7%89%9B-%E6%A3%8B%E7%89%8C%E4%BA%A4%E5%8F%8B%E8%81%8A%E5%A4%A9%E5%B9%B3%E5%8F%B0/id1309411684?mt=8"; //app store 下载地址 }, 2000) } if(navigator.userAgent.match(/android/i)) { window.location.href = "cn://brotheraides";//android app协议(android开发人员提供) window.setTimeout(function() { window.location.href = "http://www.treeic.com/clients/chuiniu-29-1.3.3-20180124.apk";//android app下载地址 }, 2000) } }; </script> 收起阅读 »

Python 3.6 安装 bs4 模块

Python 3.6 安装 bs4 模块时报错:   pip install bs4 Collecting bs4 Could not fetch URL https://pypi.python.org/simple/bs4/: There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777) - skipping Could not find a version that satisfies the requirement bs4 (from versions: ) No matching distribution found for bs4 解决办法:   pip --trusted-host pypi.python.org install bs4
继续阅读 »
Python 3.6 安装 bs4 模块时报错:   pip install bs4 Collecting bs4 Could not fetch URL https://pypi.python.org/simple/bs4/: There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777) - skipping Could not find a version that satisfies the requirement bs4 (from versions: ) No matching distribution found for bs4 解决办法:   pip --trusted-host pypi.python.org install bs4 收起阅读 »

TypeError: unhashable type: 'dict'

  代码:   param = {{"redpacket_id":'1'}} 结果:   TypeError: unhashable type: ‘dict’ python不支持dict的key为list或dict类型,因为list和dict类型是unhashable(不可哈希)的。  
继续阅读 »
  代码:   param = {{"redpacket_id":'1'}} 结果:   TypeError: unhashable type: ‘dict’ python不支持dict的key为list或dict类型,因为list和dict类型是unhashable(不可哈希)的。   收起阅读 »

微信 禁止分享朋友圈

  微信禁用右上角的分享按钮,WeixinJSBridge API以及隐藏分享的子按钮等菜单项: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script> wx.config({ appId: '{$appid}', //微信公众号id timestamp: '{$timestamp}', nonceStr: '{$nonceStr}', signature: '{$signature}', //debug: true, jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage', 'hideMenuItems', ] }); wx.ready(function () { shareWeixin(); }); function shareWeixin(){ wx.hideMenuItems({ menuList: ["menuItem:share:timeline", "menuItem:copyUrl", "menuItem:share:appMessage", "menuItem:share:qq", "menuItem:share:weiboApp", "menuItem:favorite", "menuItem:share:facebook", "menuItem:share:QZone", "menuItem:editTag", "menuItem:delete", "menuItem:copyUrl", "menuItem:originPage", "menuItem:readMode", "menuItem:openWithQQBrowser", "menuItem:openWithSafari", "menuItem:share:email", "menuItem:share:brand"] // 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮 }); } </script>
继续阅读 »
  微信禁用右上角的分享按钮,WeixinJSBridge API以及隐藏分享的子按钮等菜单项: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script> wx.config({ appId: '{$appid}', //微信公众号id timestamp: '{$timestamp}', nonceStr: '{$nonceStr}', signature: '{$signature}', //debug: true, jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage', 'hideMenuItems', ] }); wx.ready(function () { shareWeixin(); }); function shareWeixin(){ wx.hideMenuItems({ menuList: ["menuItem:share:timeline", "menuItem:copyUrl", "menuItem:share:appMessage", "menuItem:share:qq", "menuItem:share:weiboApp", "menuItem:favorite", "menuItem:share:facebook", "menuItem:share:QZone", "menuItem:editTag", "menuItem:delete", "menuItem:copyUrl", "menuItem:originPage", "menuItem:readMode", "menuItem:openWithQQBrowser", "menuItem:openWithSafari", "menuItem:share:email", "menuItem:share:brand"] // 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮 }); } </script> 收起阅读 »

<img> 标签 图片加载失败时候处理方案

 应用场景:   在开发中,经常遇到一种情况,数据库不存在图片地址,或者存在图片地址,但图片已经被删除,这个时候会出现加载失败情况。提供以下解决方案。   解决方案:  在 img 标签 加上onerror="onerror=null;src='test.jpg'" ,即当图片加载失败时会自动加载test.jpg ,例如 <img src="abc.jpg" onerror="onerror=null;src='test.jpg'" />
继续阅读 »
 应用场景:   在开发中,经常遇到一种情况,数据库不存在图片地址,或者存在图片地址,但图片已经被删除,这个时候会出现加载失败情况。提供以下解决方案。   解决方案:  在 img 标签 加上onerror="onerror=null;src='test.jpg'" ,即当图片加载失败时会自动加载test.jpg ,例如 <img src="abc.jpg" onerror="onerror=null;src='test.jpg'" /> 收起阅读 »

php 生成仿微信群组9空格头像

  最近项目是做一款 IM产品,群组头像需要是和微信群组头像一样(用前9个人合成群组头像),服务端使用php,下面附上解决方案:   效果图:     源代码:
继续阅读 »
  最近项目是做一款 IM产品,群组头像需要是和微信群组头像一样(用前9个人合成群组头像),服务端使用php,下面附上解决方案:   效果图:     源代码: 收起阅读 »

Office 不能编辑:提示由于所选内容已被锁定 您无法进行此更改

  Office 突然不能编辑:提示由于所选内容已被锁定 您无法进行此更改。   原因:Office 未激活或者已过试用期   下面提供 office2016的激活办法,是十分简单:   下载下面提供的软件,安装之后,重启office即可。   1、下载完成点击安装,安装完点击红色按钮:       2、点击next进行下一步安装;       3、安装完成,点击红包按钮,等待程序运行完毕即可激活office2016。   下载链接:   链接:http://pan.baidu.com/s/1mif2MDE 密码:kt95    
继续阅读 »
  Office 突然不能编辑:提示由于所选内容已被锁定 您无法进行此更改。   原因:Office 未激活或者已过试用期   下面提供 office2016的激活办法,是十分简单:   下载下面提供的软件,安装之后,重启office即可。   1、下载完成点击安装,安装完点击红色按钮:       2、点击next进行下一步安装;       3、安装完成,点击红包按钮,等待程序运行完毕即可激活office2016。   下载链接:   链接:http://pan.baidu.com/s/1mif2MDE 密码:kt95     收起阅读 »

linux删除邮件

  使用crontab跑定时作业,发现邮箱里面有很多垃圾邮件,想要全部删除可以这样做 cd /var/spool/mail echo ''>root 当然你想crontab 不发送邮件可以在cronab头部加上这一句 MAILTO=''
  使用crontab跑定时作业,发现邮箱里面有很多垃圾邮件,想要全部删除可以这样做 cd /var/spool/mail echo ''>root 当然你想crontab 不发送邮件可以在cronab头部加上这一句 MAILTO=''

cardbin 国内银行卡类型查询接口

    代码如下:   public function card_bin($card_no){ $card_list = array( 'SRCB'=>'深圳农村商业银行', 'BGB'=>'广西北部湾银行', 'SHRCB'=>'上海农村商业银行', 'BJBANK'=>'北京银行', 'WHCCB'=>'威海市商业银行', 'BOZK'=>'周口银行', 'KORLABANK'=>'库尔勒市商业银行', 'SPABANK'=>'平安银行', 'SDEB'=>'顺德农商银行', 'HURCB'=>'湖北省农村信用社', 'WRCB'=>'无锡农村商业银行', 'BOCY'=>'朝阳银行', 'CZBANK'=>'浙商银行', 'HDBANK'=>'邯郸银行', 'BOC'=>'中国银行', 'BOD'=>'东莞银行', 'CCB'=>'中国建设银行', 'ZYCBANK'=>'遵义市商业银行', 'SXCB'=>'绍兴银行', 'GZRCU'=>'贵州省农村信用社', 'ZJKCCB'=>'张家口市商业银行', 'BOJZ'=>'锦州银行', 'BOP'=>'平顶山银行', 'HKB'=>'汉口银行', 'SPDB'=>'上海浦东发展银行', 'NXRCU'=>'宁夏黄河农村商业银行', 'NYNB'=>'广东南粤银行', 'GRCB'=>'广州农商银行', 'BOSZ'=>'苏州银行', 'HZCB'=>'杭州银行', 'HSBK'=>'衡水银行', 'HBC'=>'湖北银行', 'JXBANK'=>'嘉兴银行', 'HRXJB'=>'华融湘江银行', 'BODD'=>'丹东银行', 'AYCB'=>'安阳银行', 'EGBANK'=>'恒丰银行', 'CDB'=>'国家开发银行', 'TCRCB'=>'江苏太仓农村商业银行', 'NJCB'=>'南京银行', 'ZZBANK'=>'郑州银行', 'DYCB'=>'德阳商业银行', 'YBCCB'=>'宜宾市商业银行', 'SCRCU'=>'四川省农村信用', 'KLB'=>'昆仑银行', 'LSBANK'=>'莱商银行', 'YDRCB'=>'尧都农商行', 'CCQTGB'=>'重庆三峡银行', 'FDB'=>'富滇银行', 'JSRCU'=>'江苏省农村信用联合社', 'JNBANK'=>'济宁银行', 'CMB'=>'招商银行', 'JINCHB'=>'晋城银行JCBANK', 'FXCB'=>'阜新银行', 'WHRCB'=>'武汉农村商业银行', 'HBYCBANK'=>'湖北银行宜昌分行', 'TZCB'=>'台州银行', 'TACCB'=>'泰安市商业银行', 'XCYH'=>'许昌银行', 'CEB'=>'中国光大银行', 'NXBANK'=>'宁夏银行', 'HSBANK'=>'徽商银行', 'JJBANK'=>'九江银行', 'NHQS'=>'农信银清算中心', 'MTBANK'=>'浙江民泰商业银行', 'LANGFB'=>'廊坊银行', 'ASCB'=>'鞍山银行', 'KSRB'=>'昆山农村商业银行', 'YXCCB'=>'玉溪市商业银行', 'DLB'=>'大连银行', 'DRCBCL'=>'东莞农村商业银行', 'GCB'=>'广州银行', 'NBBANK'=>'宁波银行', 'BOYK'=>'营口银行', 'SXRCCU'=>'陕西信合', 'GLBANK'=>'桂林银行', 'BOQH'=>'青海银行', 'CDRCB'=>'成都农商银行', 'QDCCB'=>'青岛银行', 'HKBEA'=>'东亚银行', 'HBHSBANK'=>'湖北银行黄石分行', 'WZCB'=>'温州银行', 'TRCB'=>'天津农商银行', 'QLBANK'=>'齐鲁银行', 'GDRCC'=>'广东省农村信用社联合社', 'ZJTLCB'=>'浙江泰隆商业银行', 'GZB'=>'赣州银行', 'GYCB'=>'贵阳市商业银行', 'CQBANK'=>'重庆银行', 'DAQINGB'=>'龙江银行', 'CGNB'=>'南充市商业银行', 'SCCB'=>'三门峡银行', 'CSRCB'=>'常熟农村商业银行', 'SHBANK'=>'上海银行', 'JLBANK'=>'吉林银行', 'CZRCB'=>'常州农村信用联社', 'BANKWF'=>'潍坊银行', 'ZRCBANK'=>'张家港农村商业银行', 'FJHXBC'=>'福建海峡银行', 'ZJNX'=>'浙江省农村信用社联合社', 'LZYH'=>'兰州银行', 'JSB'=>'晋商银行', 'BOHAIB'=>'渤海银行', 'CZCB'=>'浙江稠州商业银行', 'YQCCB'=>'阳泉银行', 'SJBANK'=>'盛京银行', 'XABANK'=>'西安银行', 'BSB'=>'包商银行', 'JSBANK'=>'江苏银行', 'FSCB'=>'抚顺银行', 'HNRCU'=>'河南省农村信用', 'COMM'=>'交通银行', 'XTB'=>'邢台银行', 'CITIC'=>'中信银行', 'HXBANK'=>'华夏银行', 'HNRCC'=>'湖南省农村信用社', 'DYCCB'=>'东营市商业银行', 'ORBANK'=>'鄂尔多斯银行', 'BJRCB'=>'北京农村商业银行', 'XYBANK'=>'信阳银行', 'ZGCCB'=>'自贡市商业银行', 'CDCB'=>'成都银行', 'HANABANK'=>'韩亚银行', 'CMBC'=>'中国民生银行', 'LYBANK'=>'洛阳银行', 'GDB'=>'广东发展银行', 'ZBCB'=>'齐商银行', 'CBKF'=>'开封市商业银行', 'H3CB'=>'内蒙古银行', 'CIB'=>'兴业银行', 'CRCBANK'=>'重庆农村商业银行', 'SZSBK'=>'石嘴山银行', 'DZBANK'=>'德州银行', 'SRBANK'=>'上饶银行', 'LSCCB'=>'乐山市商业银行', 'JXRCU'=>'江西省农村信用', 'ICBC'=>'中国工商银行', 'JZBANK'=>'晋中市商业银行', 'HZCCB'=>'湖州市商业银行', 'NHB'=>'南海农村信用联社', 'XXBANK'=>'新乡银行', 'JRCB'=>'江苏江阴农村商业银行', 'YNRCC'=>'云南省农村信用社', 'ABC'=>'中国农业银行', 'GXRCU'=>'广西省农村信用', 'PSBC'=>'中国邮政储蓄银行', 'BZMD'=>'驻马店银行', 'ARCU'=>'安徽省农村信用社', 'GSRCU'=>'甘肃省农村信用', 'LYCB'=>'辽阳市商业银行', 'JLRCU'=>'吉林农信', 'URMQCCB'=>'乌鲁木齐市商业银行', 'XLBANK'=>'中山小榄村镇银行', 'CSCB'=>'长沙银行', 'JHBANK'=>'金华银行', 'BHB'=>'河北银行', 'NBYZ'=>'鄞州银行', 'LSBC'=>'临商银行', 'BOCD'=>'承德银行', 'SDRCU'=>'山东农信', 'NCB'=>'南昌银行', 'TCCB'=>'天津银行', 'WJRCB'=>'吴江农商银行', 'CBBQS'=>'城市商业银行资金清算中心', 'HBRCU'=>'河北省农村信用社', 'ZYB'=>'中原银行' ); $cardtype_list = array( 'DC'=>'储蓄卡', 'CC'=>'信用卡', 'SCC'=>'准贷记卡', 'PC'=>'预付费卡', ); $url = 'https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo='.$card_no.'&cardBinCheck=true'; $response = curlGet($url); $result = json_decode($response); if($result->validated){ if(isset($card_list[$result->bank]) || isset($cardtype_list[$result->cardType])){ return ['statu'=>true , 'msg'=>'接口调查成功' , 'code'=>0 , 'data'=>[ 'bank'=>$card_list[$result->bank], 'bank_code' => $result->bank, 'card_type'=>$cardtype_list[$result->cardType] ]]; } else { return ['statu'=>false , 'msg' => '未知的银行卡' , 'code'=>103402]; } } else { return ['statu'=>false , 'msg' => '银行卡格式验证失败' , 'code'=>103403]; } }
继续阅读 »
    代码如下:   public function card_bin($card_no){ $card_list = array( 'SRCB'=>'深圳农村商业银行', 'BGB'=>'广西北部湾银行', 'SHRCB'=>'上海农村商业银行', 'BJBANK'=>'北京银行', 'WHCCB'=>'威海市商业银行', 'BOZK'=>'周口银行', 'KORLABANK'=>'库尔勒市商业银行', 'SPABANK'=>'平安银行', 'SDEB'=>'顺德农商银行', 'HURCB'=>'湖北省农村信用社', 'WRCB'=>'无锡农村商业银行', 'BOCY'=>'朝阳银行', 'CZBANK'=>'浙商银行', 'HDBANK'=>'邯郸银行', 'BOC'=>'中国银行', 'BOD'=>'东莞银行', 'CCB'=>'中国建设银行', 'ZYCBANK'=>'遵义市商业银行', 'SXCB'=>'绍兴银行', 'GZRCU'=>'贵州省农村信用社', 'ZJKCCB'=>'张家口市商业银行', 'BOJZ'=>'锦州银行', 'BOP'=>'平顶山银行', 'HKB'=>'汉口银行', 'SPDB'=>'上海浦东发展银行', 'NXRCU'=>'宁夏黄河农村商业银行', 'NYNB'=>'广东南粤银行', 'GRCB'=>'广州农商银行', 'BOSZ'=>'苏州银行', 'HZCB'=>'杭州银行', 'HSBK'=>'衡水银行', 'HBC'=>'湖北银行', 'JXBANK'=>'嘉兴银行', 'HRXJB'=>'华融湘江银行', 'BODD'=>'丹东银行', 'AYCB'=>'安阳银行', 'EGBANK'=>'恒丰银行', 'CDB'=>'国家开发银行', 'TCRCB'=>'江苏太仓农村商业银行', 'NJCB'=>'南京银行', 'ZZBANK'=>'郑州银行', 'DYCB'=>'德阳商业银行', 'YBCCB'=>'宜宾市商业银行', 'SCRCU'=>'四川省农村信用', 'KLB'=>'昆仑银行', 'LSBANK'=>'莱商银行', 'YDRCB'=>'尧都农商行', 'CCQTGB'=>'重庆三峡银行', 'FDB'=>'富滇银行', 'JSRCU'=>'江苏省农村信用联合社', 'JNBANK'=>'济宁银行', 'CMB'=>'招商银行', 'JINCHB'=>'晋城银行JCBANK', 'FXCB'=>'阜新银行', 'WHRCB'=>'武汉农村商业银行', 'HBYCBANK'=>'湖北银行宜昌分行', 'TZCB'=>'台州银行', 'TACCB'=>'泰安市商业银行', 'XCYH'=>'许昌银行', 'CEB'=>'中国光大银行', 'NXBANK'=>'宁夏银行', 'HSBANK'=>'徽商银行', 'JJBANK'=>'九江银行', 'NHQS'=>'农信银清算中心', 'MTBANK'=>'浙江民泰商业银行', 'LANGFB'=>'廊坊银行', 'ASCB'=>'鞍山银行', 'KSRB'=>'昆山农村商业银行', 'YXCCB'=>'玉溪市商业银行', 'DLB'=>'大连银行', 'DRCBCL'=>'东莞农村商业银行', 'GCB'=>'广州银行', 'NBBANK'=>'宁波银行', 'BOYK'=>'营口银行', 'SXRCCU'=>'陕西信合', 'GLBANK'=>'桂林银行', 'BOQH'=>'青海银行', 'CDRCB'=>'成都农商银行', 'QDCCB'=>'青岛银行', 'HKBEA'=>'东亚银行', 'HBHSBANK'=>'湖北银行黄石分行', 'WZCB'=>'温州银行', 'TRCB'=>'天津农商银行', 'QLBANK'=>'齐鲁银行', 'GDRCC'=>'广东省农村信用社联合社', 'ZJTLCB'=>'浙江泰隆商业银行', 'GZB'=>'赣州银行', 'GYCB'=>'贵阳市商业银行', 'CQBANK'=>'重庆银行', 'DAQINGB'=>'龙江银行', 'CGNB'=>'南充市商业银行', 'SCCB'=>'三门峡银行', 'CSRCB'=>'常熟农村商业银行', 'SHBANK'=>'上海银行', 'JLBANK'=>'吉林银行', 'CZRCB'=>'常州农村信用联社', 'BANKWF'=>'潍坊银行', 'ZRCBANK'=>'张家港农村商业银行', 'FJHXBC'=>'福建海峡银行', 'ZJNX'=>'浙江省农村信用社联合社', 'LZYH'=>'兰州银行', 'JSB'=>'晋商银行', 'BOHAIB'=>'渤海银行', 'CZCB'=>'浙江稠州商业银行', 'YQCCB'=>'阳泉银行', 'SJBANK'=>'盛京银行', 'XABANK'=>'西安银行', 'BSB'=>'包商银行', 'JSBANK'=>'江苏银行', 'FSCB'=>'抚顺银行', 'HNRCU'=>'河南省农村信用', 'COMM'=>'交通银行', 'XTB'=>'邢台银行', 'CITIC'=>'中信银行', 'HXBANK'=>'华夏银行', 'HNRCC'=>'湖南省农村信用社', 'DYCCB'=>'东营市商业银行', 'ORBANK'=>'鄂尔多斯银行', 'BJRCB'=>'北京农村商业银行', 'XYBANK'=>'信阳银行', 'ZGCCB'=>'自贡市商业银行', 'CDCB'=>'成都银行', 'HANABANK'=>'韩亚银行', 'CMBC'=>'中国民生银行', 'LYBANK'=>'洛阳银行', 'GDB'=>'广东发展银行', 'ZBCB'=>'齐商银行', 'CBKF'=>'开封市商业银行', 'H3CB'=>'内蒙古银行', 'CIB'=>'兴业银行', 'CRCBANK'=>'重庆农村商业银行', 'SZSBK'=>'石嘴山银行', 'DZBANK'=>'德州银行', 'SRBANK'=>'上饶银行', 'LSCCB'=>'乐山市商业银行', 'JXRCU'=>'江西省农村信用', 'ICBC'=>'中国工商银行', 'JZBANK'=>'晋中市商业银行', 'HZCCB'=>'湖州市商业银行', 'NHB'=>'南海农村信用联社', 'XXBANK'=>'新乡银行', 'JRCB'=>'江苏江阴农村商业银行', 'YNRCC'=>'云南省农村信用社', 'ABC'=>'中国农业银行', 'GXRCU'=>'广西省农村信用', 'PSBC'=>'中国邮政储蓄银行', 'BZMD'=>'驻马店银行', 'ARCU'=>'安徽省农村信用社', 'GSRCU'=>'甘肃省农村信用', 'LYCB'=>'辽阳市商业银行', 'JLRCU'=>'吉林农信', 'URMQCCB'=>'乌鲁木齐市商业银行', 'XLBANK'=>'中山小榄村镇银行', 'CSCB'=>'长沙银行', 'JHBANK'=>'金华银行', 'BHB'=>'河北银行', 'NBYZ'=>'鄞州银行', 'LSBC'=>'临商银行', 'BOCD'=>'承德银行', 'SDRCU'=>'山东农信', 'NCB'=>'南昌银行', 'TCCB'=>'天津银行', 'WJRCB'=>'吴江农商银行', 'CBBQS'=>'城市商业银行资金清算中心', 'HBRCU'=>'河北省农村信用社', 'ZYB'=>'中原银行' ); $cardtype_list = array( 'DC'=>'储蓄卡', 'CC'=>'信用卡', 'SCC'=>'准贷记卡', 'PC'=>'预付费卡', ); $url = 'https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo='.$card_no.'&cardBinCheck=true'; $response = curlGet($url); $result = json_decode($response); if($result->validated){ if(isset($card_list[$result->bank]) || isset($cardtype_list[$result->cardType])){ return ['statu'=>true , 'msg'=>'接口调查成功' , 'code'=>0 , 'data'=>[ 'bank'=>$card_list[$result->bank], 'bank_code' => $result->bank, 'card_type'=>$cardtype_list[$result->cardType] ]]; } else { return ['statu'=>false , 'msg' => '未知的银行卡' , 'code'=>103402]; } } else { return ['statu'=>false , 'msg' => '银行卡格式验证失败' , 'code'=>103403]; } } 收起阅读 »

封装 php redis 缓存类

  封装 php redis 缓存类,源码如下 (需要自己实例化下redis):   <?php class Cache { private static function init(){ return RedisClient::getInstance('redis'); // 上面是我的实例化方式,需要修改为自己实例化redis。 } /* * #desc 根据缓存级别,定义过期时间 * * * */ private static function lifetime($level){ switch ($level) { case 'low': return 300; case 'normal': return 1200; case 'high': return 3600; default: return 1200; } } public static function set($key,$value,$level='normal'){ $redis = self::init(); $value = (is_object($value) || is_array($value)) ? json_encode($value) : $value; //对数组/对象数据进行缓存处理,保证数据完整性 return $redis->set($key,$value,self::lifetime($level)); } public static function get($key){ $redis = self::init(); $value = $redis->get($key); if (is_null($value)) { return false; } $jsonData = json_decode($value, true); return (null === $jsonData) ? $value : $jsonData; } }
继续阅读 »
  封装 php redis 缓存类,源码如下 (需要自己实例化下redis):   <?php class Cache { private static function init(){ return RedisClient::getInstance('redis'); // 上面是我的实例化方式,需要修改为自己实例化redis。 } /* * #desc 根据缓存级别,定义过期时间 * * * */ private static function lifetime($level){ switch ($level) { case 'low': return 300; case 'normal': return 1200; case 'high': return 3600; default: return 1200; } } public static function set($key,$value,$level='normal'){ $redis = self::init(); $value = (is_object($value) || is_array($value)) ? json_encode($value) : $value; //对数组/对象数据进行缓存处理,保证数据完整性 return $redis->set($key,$value,self::lifetime($level)); } public static function get($key){ $redis = self::init(); $value = $redis->get($key); if (is_null($value)) { return false; } $jsonData = json_decode($value, true); return (null === $jsonData) ? $value : $jsonData; } } 收起阅读 »

apache服务器 保护模板文件(.html、.shtml)

 apache服务器实现保护模板文件(.html、.shtml):禁止使用浏览器直接访问模板文件     适用于:thinkphp、phpcms 等开发的网站   比如:   使用phpcms 开发的网站。默认的模板放在:phpcms/templates/default/content/   用户直接使用浏览器访问 www.域名.com/phpcms/templates/default/content/index.html 就得到你的首页模板文件了,然后在copy下 css js 就可以将你的网站完整的趴下来了。   实现代码如下(利用apache的.htaccess文件):   在 phpcms/templates/default/content/ 目录下,新建.htaccess文件,加入以下代码:  <Files *.html> Order Allow,Deny Deny from all </Files> 这样使用浏览器直接访问模板文件,就会提示403
继续阅读 »
 apache服务器实现保护模板文件(.html、.shtml):禁止使用浏览器直接访问模板文件     适用于:thinkphp、phpcms 等开发的网站   比如:   使用phpcms 开发的网站。默认的模板放在:phpcms/templates/default/content/   用户直接使用浏览器访问 www.域名.com/phpcms/templates/default/content/index.html 就得到你的首页模板文件了,然后在copy下 css js 就可以将你的网站完整的趴下来了。   实现代码如下(利用apache的.htaccess文件):   在 phpcms/templates/default/content/ 目录下,新建.htaccess文件,加入以下代码:  <Files *.html> Order Allow,Deny Deny from all </Files> 这样使用浏览器直接访问模板文件,就会提示403 收起阅读 »

php curl 请求 https 接口

  php curl 请求 https 接口:   解决方法,在curl请求时,加入:   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在  完整代码如下:   function curlPost($url, $data = null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 60); $output = curl_exec($ch); curl_close($ch); return $output; }  
继续阅读 »
  php curl 请求 https 接口:   解决方法,在curl请求时,加入:   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在  完整代码如下:   function curlPost($url, $data = null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 60); $output = curl_exec($ch); curl_close($ch); return $output; }   收起阅读 »

php 将数组中的键名作为变量名键值作为变量

php
     php 将数组中的键名作为变量名键值作为变量。   使用场景:   接收表单提交过来的数据,$_POST   <?php /** * php 把数组中的键名所为变量名键值作为变量 */ $arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>5,'e'=>6); //方法一,使用foreach循环实现 foreach($arr as $key=>$value){ $$key=$value; } echo $a; //方法二,其实php早就已经实现了这个功能extract extract($arr); echo $a;
继续阅读 »
     php 将数组中的键名作为变量名键值作为变量。   使用场景:   接收表单提交过来的数据,$_POST   <?php /** * php 把数组中的键名所为变量名键值作为变量 */ $arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>5,'e'=>6); //方法一,使用foreach循环实现 foreach($arr as $key=>$value){ $$key=$value; } echo $a; //方法二,其实php早就已经实现了这个功能extract extract($arr); echo $a; 收起阅读 »

jquery $.ajax 加loading

  使用ajax提升用户体验,代码如下:   $.ajax({ type: "POST", url: "./index.php?g=api", async: false, data: {}, dataType: "json", beforeSend: function(){ $('#uppic_loading').fadeIn(300); //显示loading }, success: function(data) { //成功回掉 }, complete: function () { $('#uppic_loading').fadeOut(300); //隐藏loading } });
继续阅读 »
  使用ajax提升用户体验,代码如下:   $.ajax({ type: "POST", url: "./index.php?g=api", async: false, data: {}, dataType: "json", beforeSend: function(){ $('#uppic_loading').fadeIn(300); //显示loading }, success: function(data) { //成功回掉 }, complete: function () { $('#uppic_loading').fadeOut(300); //隐藏loading } }); 收起阅读 »

mysql设置联合主键

  语法如下:   alter table tablename add primary key (字段1,字段2);
  语法如下:   alter table tablename add primary key (字段1,字段2);

批量检测百度是否收录,检测结果导出txt工具

  安全扫描软件有可能会拦截,软件亲测可用。   1:首先将需要检测的url 复制到工具左侧框内,点击 网址导入列表     2:点击 开始批量检测     3:导出检测结果       软件下载地址:   链接:http://pan.baidu.com/s/1pKFCDQj 密码:ggcf    
继续阅读 »
  安全扫描软件有可能会拦截,软件亲测可用。   1:首先将需要检测的url 复制到工具左侧框内,点击 网址导入列表     2:点击 开始批量检测     3:导出检测结果       软件下载地址:   链接:http://pan.baidu.com/s/1pKFCDQj 密码:ggcf     收起阅读 »

php explode 以换行分割,将字符串转为数组

php
  php explode 以换行(\n)分割,将字符串转为数组:   实例代码:   <?php $str = '8403949297 3809849493 1667598561 3330813175'; $arr = explode("\n",$str); print_r($arr); 注意  "\n" 为双引号。    
继续阅读 »
  php explode 以换行(\n)分割,将字符串转为数组:   实例代码:   <?php $str = '8403949297 3809849493 1667598561 3330813175'; $arr = explode("\n",$str); print_r($arr); 注意  "\n" 为双引号。     收起阅读 »

解决 SourceTree不能安装(跳过atlassian无法注册,免登录跳过初始设置)

  安装 SourceTree 时,需要使用atlassian授权,因为各种原因无法完成授权,现提供跳过 atlassian账号 授权方法。       安装之后,转到用户本地文件夹下的 SourceTree 目录,没有则新建:   %LocalAppData%\Atlassian\SourceTree\ 新建 accounts.json 文件   %LocalAppData%\Atlassian\SourceTree\accounts.json 输入以下内容保存即可    [ { "$id": "1", "$type": "SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity", "Authenticate": true, "HostInstance": { "$id": "2", "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount", "Host": { "$id": "3", "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount", "Id": "atlassian account" }, "BaseUrl": "https://id.atlassian.com/" }, "Credentials": { "$id": "4", "$type": "SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account", "Username": "", "Email": null }, "IsDefault": false } ]     再打开 SourceTree,直接显示主窗口了。  
继续阅读 »
  安装 SourceTree 时,需要使用atlassian授权,因为各种原因无法完成授权,现提供跳过 atlassian账号 授权方法。       安装之后,转到用户本地文件夹下的 SourceTree 目录,没有则新建:   %LocalAppData%\Atlassian\SourceTree\ 新建 accounts.json 文件   %LocalAppData%\Atlassian\SourceTree\accounts.json 输入以下内容保存即可    [ { "$id": "1", "$type": "SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity", "Authenticate": true, "HostInstance": { "$id": "2", "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount", "Host": { "$id": "3", "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount", "Id": "atlassian account" }, "BaseUrl": "https://id.atlassian.com/" }, "Credentials": { "$id": "4", "$type": "SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account", "Username": "", "Email": null }, "IsDefault": false } ]     再打开 SourceTree,直接显示主窗口了。   收起阅读 »

测试mongoDB性能

硬件环境:某网站云服务器 CPU:1核 内存:1G 硬盘:20G 软件环境: 操作系统:CentOS 6.3 64位 web服务器:nginx 1.4.5 php版本:php 5.5.9 mongodb版本:mongodb 2.4.9 mongo客户端:php mongo扩展 1.4.5 执行操作: 查询 (findOne) 写入(insert) 更新(update) 测试执行时间: 执行10次查询+10次写入+10次更新  => 2.8毫秒 执行100次查询+100次写入+100次更新  => 19.5毫秒 执行1000次查询+1000次写入+1000次更新  => 191.6毫秒 执行10000次查询+10000次写入+10000次更新  => 1934.7毫秒 执行100000次查询+100000次写入+100000次更新  => 19473.7毫秒 执行1000000次查询+1000000次写入+1000000次更新  => 用时200913.2毫秒 测试结果: 在上述环境下,php每秒执行5000次mongodb读写更新。测试代码如下: set_time_limit(0); $statrTime = microtime(true); $mongo = new Mongo(); $db = $mongo->selectDB('mongodb1'); $blog_id = $db->selectCollection('blog_id'); $blog = $db->selectCollection('blog'); $options['_id'] = 1; for ($i=1; $i<=1000000; $i++) { $blog_id_item = $blog_id->findOne($options); $autoid = $blog_id_item['autoid'] + 1; $data['_id'] = $autoid; $data['title'] = '标题'.$autoid; $data['content'] = '第'.$autoid.'篇文章内容'; $data['ctime'] = time(); if ($blog->insert($data)) { //新增成功,id+1 $udata['$inc'] = array('autoid'=>1); $blog_id->update($options, $udata); } else { echo 'error .. nothing to do!<br />'; } } $mongo->close(); $endTime = microtime(true); $diffTime = round(($endTime - $statrTime) * 1000, 1); echo '<br />用时'.$diffTime.'毫秒';   如果遇到超时问题,可以修改nginx和php-fpm配置参数: nginx.conf 配置参数 fastcgi_connect_timeout 300s; fastcgi_send_timeout 300s; fastcgi_read_timeout 300s; php-fpm.conf 配置参数 request_terminate_timeout = 300s; 单独读取测试代码:   public function mongoread () { set_time_limit(0); $statrTime = microtime(true); $mongo = new Mongo(); $db = $mongo->selectDB('mongodb1'); $blog = $db->selectCollection('blog'); for ($i=1; $i<=100000; $i++) { $options['_id'] = $i; $blog_item = $blog->findOne($options); } $mongo->close(); $endTime = microtime(true); $diffTime = round(($endTime - $statrTime) * 1000, 1); echo '<br />用时'.$diffTime.'毫秒'; }   测试结果: 读取1000条记录时间 => 用时88.2毫秒 读取10000条记录时间 => 用时857.5毫秒 读取100000条记录时间 => 用时8752.1毫秒 (增加10万条数据后第二次读取用时9138.2毫秒,第三次用时8859.8毫秒) 平均每秒读取11425条记录 单独写入测试代码:   public function mongowrite () { set_time_limit(0); $statrTime = microtime(true); $mongo = new Mongo(); $db = $mongo->selectDB('mongodb1'); $blog = $db->selectCollection('blog2'); for ($i=1; $i<=10000; $i++) { $data['_id'] = $i; $data['title'] = '标题'.$i; $data['content'] = '第'.$i.'篇文章内容'; $data['ctime'] = time(); $blog->insert($data); } $mongo->close(); $endTime = microtime(true); $diffTime = round(($endTime - $statrTime) * 1000, 1); echo '<br />用时'.$diffTime.'毫秒'; }   测试结果: 写入1000条记录时间 => 用时12.5毫秒  写入10000条记录时间 => 用时234.4毫秒 写入100000条记录时间 => 用时3265.6毫秒 (第二次测试用时3180.9毫秒,第二次平均每秒写入31437条记录) 平均每秒写入30622条记录 通过测试可以看出,mongodb写入比读取要更快。        
继续阅读 »
硬件环境:某网站云服务器 CPU:1核 内存:1G 硬盘:20G 软件环境: 操作系统:CentOS 6.3 64位 web服务器:nginx 1.4.5 php版本:php 5.5.9 mongodb版本:mongodb 2.4.9 mongo客户端:php mongo扩展 1.4.5 执行操作: 查询 (findOne) 写入(insert) 更新(update) 测试执行时间: 执行10次查询+10次写入+10次更新  => 2.8毫秒 执行100次查询+100次写入+100次更新  => 19.5毫秒 执行1000次查询+1000次写入+1000次更新  => 191.6毫秒 执行10000次查询+10000次写入+10000次更新  => 1934.7毫秒 执行100000次查询+100000次写入+100000次更新  => 19473.7毫秒 执行1000000次查询+1000000次写入+1000000次更新  => 用时200913.2毫秒 测试结果: 在上述环境下,php每秒执行5000次mongodb读写更新。测试代码如下: set_time_limit(0); $statrTime = microtime(true); $mongo = new Mongo(); $db = $mongo->selectDB('mongodb1'); $blog_id = $db->selectCollection('blog_id'); $blog = $db->selectCollection('blog'); $options['_id'] = 1; for ($i=1; $i<=1000000; $i++) { $blog_id_item = $blog_id->findOne($options); $autoid = $blog_id_item['autoid'] + 1; $data['_id'] = $autoid; $data['title'] = '标题'.$autoid; $data['content'] = '第'.$autoid.'篇文章内容'; $data['ctime'] = time(); if ($blog->insert($data)) { //新增成功,id+1 $udata['$inc'] = array('autoid'=>1); $blog_id->update($options, $udata); } else { echo 'error .. nothing to do!<br />'; } } $mongo->close(); $endTime = microtime(true); $diffTime = round(($endTime - $statrTime) * 1000, 1); echo '<br />用时'.$diffTime.'毫秒';   如果遇到超时问题,可以修改nginx和php-fpm配置参数: nginx.conf 配置参数 fastcgi_connect_timeout 300s; fastcgi_send_timeout 300s; fastcgi_read_timeout 300s; php-fpm.conf 配置参数 request_terminate_timeout = 300s; 单独读取测试代码:   public function mongoread () { set_time_limit(0); $statrTime = microtime(true); $mongo = new Mongo(); $db = $mongo->selectDB('mongodb1'); $blog = $db->selectCollection('blog'); for ($i=1; $i<=100000; $i++) { $options['_id'] = $i; $blog_item = $blog->findOne($options); } $mongo->close(); $endTime = microtime(true); $diffTime = round(($endTime - $statrTime) * 1000, 1); echo '<br />用时'.$diffTime.'毫秒'; }   测试结果: 读取1000条记录时间 => 用时88.2毫秒 读取10000条记录时间 => 用时857.5毫秒 读取100000条记录时间 => 用时8752.1毫秒 (增加10万条数据后第二次读取用时9138.2毫秒,第三次用时8859.8毫秒) 平均每秒读取11425条记录 单独写入测试代码:   public function mongowrite () { set_time_limit(0); $statrTime = microtime(true); $mongo = new Mongo(); $db = $mongo->selectDB('mongodb1'); $blog = $db->selectCollection('blog2'); for ($i=1; $i<=10000; $i++) { $data['_id'] = $i; $data['title'] = '标题'.$i; $data['content'] = '第'.$i.'篇文章内容'; $data['ctime'] = time(); $blog->insert($data); } $mongo->close(); $endTime = microtime(true); $diffTime = round(($endTime - $statrTime) * 1000, 1); echo '<br />用时'.$diffTime.'毫秒'; }   测试结果: 写入1000条记录时间 => 用时12.5毫秒  写入10000条记录时间 => 用时234.4毫秒 写入100000条记录时间 => 用时3265.6毫秒 (第二次测试用时3180.9毫秒,第二次平均每秒写入31437条记录) 平均每秒写入30622条记录 通过测试可以看出,mongodb写入比读取要更快。         收起阅读 »

网站开发:XSS(跨站攻击)的防范利器HTMLPurifier

xss
  在编程开发时安全问题是及其重要的,对于用户提交的数据要进行过滤。   XSS就是需要重视的一点,先说一下什么是XSS:   简单来说就是用户提交数据(例如发表评论,发表日志)时往Web页面里插入恶意javascript代码例如死循环,疯狂的alert,这还不算还可能会修改页面页面上的html元素(例如登录表单的action),这样当用户浏览该页之时,嵌入其中Web里面的代码会被执行,从而达到用户的特殊目的。     在使用PHP开发时,可以使用htmlspecialchars将用户提交过来的数据转换使之原样显示,但是这样一来会造成一些弊端,比如用户上传的图片无法显示,html标签不会起作用,没有任何样式。解决方案就是可以使用UBB标签或者自定义标签来实现,要么就是自己写正则去过滤,但是防不胜防,并且这样在处理起来有些繁琐。下载重点介绍一个开源的HTMLPurifier,这是一个符合W3C标准的HTML过滤器,可以生成标准的HTML代码,并且有很多的自定义配置,设置白名单之后就可以把有用的css留下并且可以过滤掉javascript代码,有效的防止XSS!   实例:   <?php //引入htmlPurifier去除XSS跨站攻击代码 生成安全的html代码 require_once('./htmlpurifier/library/HTMLPurifier.includes.php'); $config = HTMLPurifier_Config::createDefault(); //创建默认配置 $purifier = new HTMLPurifier($config); //实例化 并传入默认配置 ($config为空也可) $safedata = $purifier->purify($_POST['content']); //开始过滤 返回过滤后的字符串 echo '<pre>'; print_r($safedata); ?>   下载HTMLPurifier  
继续阅读 »
  在编程开发时安全问题是及其重要的,对于用户提交的数据要进行过滤。   XSS就是需要重视的一点,先说一下什么是XSS:   简单来说就是用户提交数据(例如发表评论,发表日志)时往Web页面里插入恶意javascript代码例如死循环,疯狂的alert,这还不算还可能会修改页面页面上的html元素(例如登录表单的action),这样当用户浏览该页之时,嵌入其中Web里面的代码会被执行,从而达到用户的特殊目的。     在使用PHP开发时,可以使用htmlspecialchars将用户提交过来的数据转换使之原样显示,但是这样一来会造成一些弊端,比如用户上传的图片无法显示,html标签不会起作用,没有任何样式。解决方案就是可以使用UBB标签或者自定义标签来实现,要么就是自己写正则去过滤,但是防不胜防,并且这样在处理起来有些繁琐。下载重点介绍一个开源的HTMLPurifier,这是一个符合W3C标准的HTML过滤器,可以生成标准的HTML代码,并且有很多的自定义配置,设置白名单之后就可以把有用的css留下并且可以过滤掉javascript代码,有效的防止XSS!   实例:   <?php //引入htmlPurifier去除XSS跨站攻击代码 生成安全的html代码 require_once('./htmlpurifier/library/HTMLPurifier.includes.php'); $config = HTMLPurifier_Config::createDefault(); //创建默认配置 $purifier = new HTMLPurifier($config); //实例化 并传入默认配置 ($config为空也可) $safedata = $purifier->purify($_POST['content']); //开始过滤 返回过滤后的字符串 echo '<pre>'; print_r($safedata); ?>   下载HTMLPurifier   收起阅读 »