ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件第1145行:protected function parseSql($sql,$parse) {// 分析表达式if(true === $parse) { $options = $this->_parseOptions(); $sql = $this->db->parseSql($sql,$options);}elseif(is_array($parse)){ // SQL预处理 $sql = vsprintf($sql,$parse);}else{ $sql = strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));}$this->db->setModel($this->name);return $sql;}改为:protected function parseSql($sql,$parse) {// 分析表达式if(true === $parse) { $options = $this->_parseOptions(); $sql = $this->db->parseSql($sql,$options);}elseif(is_array($parse)){ // SQL预处理 $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码 $sql = vsprintf($sql,$parse);}else{ $sql = strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));}$this->db->setModel($this->name);return $sql;}
一、网页反作弊出现背景 出于商业利益的驱使,很多网站站长会针对搜索引擎排名进行分析,并采取一些手段来提升排名。这种行为本身无可厚非,很多优化行为都是符合搜索引擎排序规则的,但与此同时也存在很多恶意的优化行为。所以网页反作弊,也是目前所有商业搜索引擎需要解决的重要难点。 快排科技(vx:seokuaipai)孔宇今天来谈一下目前一些常见的互联网网页作弊方法、反作弊的整体思路,以及引申出的淘宝搜索反作弊机制与传统网页搜索反作弊的异同。 二、网页作弊类型内容作弊: 从大的分类来说,主要的作弊方法包括:内容作弊、链接作弊、隐藏作弊及近几年兴起的web2.0作弊方法。笔者认为,内容作弊与现阶段业务息息相关,因此会在本文着重讲下此类型及相关的反作弊思路。 内容作弊的目的是通过精心更改或者调控网页内容,使得网页在搜索引擎排名中获得与其网页不相称的高排名。常见的作弊方式包括:关键词重复、无关查询词作弊、图片alt标签文本作弊、网页标题作弊、网页重要标签作弊及网页元信息作弊。通过这几种常见的作弊手段,作弊者的作弊意图不外乎以下几种: 1、增加目标作弊词词频来影响排名; 2、增加主题无关内容或者热门查询吸引流量; 3、关键位置插入目标作弊词影响排名。 Google在2011年2月高调宣布针对低质量网页内容调整排序算法,据报道此算法影响了大约11.8%的网页排名,而这项调整措施是专门针对以Demand Media(创建于2006年5月,雇员500人,它的业务比较庞杂,包括域名注册、内容广告交易等。它的一个主要业务是,它有包括65个社会化媒体组成的网站群。)网站为代表的内容农场作弊手法的。 内容农场的运营者廉价雇佣大量自由职业者,支持他们付费写作,但内容普遍质量低下,很多文章都是通过复制黏贴完成。但重点是,他们会研究搜索引擎的热门搜索词等,并有机的将这些词汇添加到写作内容当中去。这样,普通搜索引擎用户在搜索时,会被吸引进内容农场网站,通过大量低质量内容吸引流量,内容农场可以赚取广告费用。 与传统的作弊方法相比,内容农场不采用机器拼接内容等机械方式,而是通过雇佣人员写作,这种作弊方式搜索引擎往往难以给出是否作弊的明确界定,但又严重影响搜索结果质量,所以是一种很难处理的作弊手法。 三、网页反作弊技术的整体思路: 目前搜索引擎作弊手段五花八门且层出不穷,作为应对方的搜索引擎,也相应调整技术思路,所以如果整理一下反作弊思路,则会发现技术方法很多,理清思路着实不易。尽管如此,如果对大多数反作弊思路深入分析,会发现整体思路上还是有规律可循。从基本思路角度看,可以将反作弊手段大致划分为以下3种:信任传播模型、不信任传播模型和异常发现模型。 1、信任传播模型:在海量的网页数据中,通过一定的技术手段或人工半人工手段,从中筛选出部分完全值得信任的页面(可以理解为我们日常所说的白名单),算法以这些白名单内的页面作为出发点,赋予白名单内页面节点较高的信任度分值,其他页面是否作弊,要根据其与白名单内节点链接关系来确定。白名单内节点通过链接关系将信任度分值向外扩散传播,如果某个节点最后得到的信任度分值高于一定的值,则认为没有问题,如果低于这个值则会被判为作弊。 2、不信任传播模型:从大的技术框架来讲,与信任传播模型极其相似。最大的区别在于:初始页面自己不是值得信任的页面节点,而是确认存在作弊行为的页面集合(即我们日常所说的黑名单)。赋予黑名单内页面节点不信任分值,通过链接将这种不信任关系传播出去,如果最后页面节点的不信任分值大于设定的那个值,则被判为作弊。 3、而异常发现模型:简单的譬如分析网页内容来发现词频、链接等的异常,复杂点的像分析网站用户行为异常等。异常发现模型往往和信任传播模型和不信任传播模型进行组合处理。 事实上,纯粹技术手段目前是无法彻底解决作弊的问题,因此现在一般都是用户在浏览搜索结果甚至是上网浏览时举报作弊网页,搜索引擎公司内部会有专门的团队来审核与主动发现可疑页面,经过审核确认的网页则可以放入黑名单或者白名单当中。综上所述,必须将人工手段与技术手段相互结合,才能取得较好的反作弊效果。 四、通用链接反作弊方法: 1、TrustRank 算法 (属于信任传播模型) 2、BadRank 算法 (属于不信任传播模型,据传是Google采用的反链接作弊算法。 注意:不要链接给作弊页面) 3、SpamRank (属于异常发现模型) SpamRank 的基本假设是: 3.1、对于正常页面来说,其支持者页面的 PangRank 值应该满足 Power-Law 分布,即 PR值有大有小。 3.2、作弊网页不同,一般具有如下3个特点: Ⅰ、支持者页面数量非常巨大 Ⅱ、支持者页面的 PangRank 值得分都较低 Ⅲ、支持者页面的 PangRank 值都落在一个较小浮动范围内五、专用链接反作弊技术: 1、识别链接农场: 、网页出链的统计分布规则,作弊网页出链不符合 Power-Law 分布 Ⅱ、网页入链的统计分布规则,作弊网页入链不符合 Power-Law 分布 Ⅲ、URL名称统计特征,作弊网页的网址较长,包含更多的点画线和数字等 Ⅳ、很多作弊网页的URL地址尽管不同,但是对应同一个IP地址 Ⅴ、网页特征会随时间变化,比如入链的增长率、出链的增长率等 Ⅵ、链接农场的结构特征,农场内的网页之间链接关系非常密切 2、识别 Google 轰炸: 判断锚文字是否和被指向页面有语义关系 六、识别内容作弊: 1、重复出现关键词,判断文本内一定大小的窗口中是否连续出现同一个关键词 2、标题关键词作弊 3、统计正常页面中句子长度的规律、停用词的分布规律、词性的分布规律等七、反隐藏作弊: 常见的隐藏作弊方式包括页面隐藏和网页重定向。 1、识别页面隐藏 对网页做2次抓取,第1次数正常的搜索引擎爬虫抓取,第2次模拟人工访问网页的方式抓取。这种方法成本非常高。 2、识别网页重定向 Strider 系统给出了根据网页重定向来识别到底哪些是作弊网页的解决方案。 八:石榴算法简介: 2013年5月17日下午,百度网页搜索反作弊团队在百度站长平台发布公告称:将于一星期后正式推出新的算法“石榴算法”。新算法前期将重点整顿含有大量妨碍用户正常浏览的恶劣广告的页面。百度称此举是为了尊重搜索的用户,净化互联网生态环境! 发布时间:2013年5月17日 打击对象:针对大量妨碍用户正常浏览的恶劣广告的页面、低质量内容页面。石榴算法针对的尤其以弹出大量低质弹窗广告、混淆页面主体内容的垃圾广告页面为代表。与之前百度绿萝算法相对应,这正是百度搜索引擎提高用户体验,提高搜索质量的有力手段。2013年5月17日下午,百度网页搜索反作弊团队在百度站长平台发布公告称:将于一星期后正式推出新的算法“石榴算法”。新算法前期将重点整顿含有大量妨碍用户正常浏览的恶劣广告的页面。百度称此举是为了尊重搜索的用户,净化互联网生态环境! 整改建议:有弹窗广告?且在主体内容位置显示?赶紧撤掉吧、短期利益是获得了、长期就不讨好了、就如一次借钱忘了还、感觉像是赚到了、实则不然、你的信誉度在他人心中逐渐在减弱……这类型的页面评分也会被降分
互联网的迅速发展以及各个行业对也互联网越来越重视,使建设优化网站也越来越火热。大家对网站的各种设计、内容、优化要求越来越高,网站优化离不开关键词。网络优化的目的就是要让网站排名达到想要的效果。下面小编浅析一下怎样能让网站站排名提升,以及网站优化的思路方向。一、怎样能让网站排名提升1、 首先,一个合理的网站构架是做好网站优化的基础。网站的构造搭建可以让搜索引擎更好的抓取网站的内容,提升网站的收录,给客户带来不错的体验度。2、 网站关键词选取,首先重要的是网站优化关键词的选取,新站一定不能选取那些太过热门的关键词。也不能选择太冷的关键词,词太热做不上来。太冷做上来也用处不大,所以关键词的选取时要特别注意。3、页面内容,内容对于页面排名也是非常重要的,首先对于目录页来说相关性是很重要的。如果能够做到一个目录之下的文章相关性很高质量很高目录页往往就能够获得不错的排名,对于文章页来说想要获得好排名非常重要的一点就是文章的质量一定要高。就是有良好的可读性能够满足用户的需求,这样的文章受到用户的喜欢同时就会获得比较好的排名。4、原创性文章,内容为王。原创新文章的收录情况要比直接抄来的信息好的很多,而且要长期不断的保持性在网站里更新文章。5、优质外链,外链的质量和数量应认真做好。通常,我们要坚持每天稳定的增加外链。在数量和质量上,优先考虑质量。二、网站优化的思路方向1、网站优化从用户的角度:经过网站的优化设计,用户可以更加方便的浏览网站的信息、使用网站的服务。这对用户体验度的提升起着非常重要的作用。网站设计对用户优化的具体表现以用户需求为导向的网站优化设计。方便的网站导航,网页加载速度尽可能的快。网页布局合理并且适合保存、打印、转发,网站信息丰富、有效,有助于用户产生信任。2、从搜索引擎优化推广的角度来说:网站主页搜索引擎优化,一般企业网站的页面类型很少。这是比较利于咱们进行优化操作的。主页的优化主要从网站定位(title)、网站界面优化、代码优化、栏目优化几个方面着手。网站定位的中心内容,中心内容必须在title中杰出展现,网站界面的布局也要优先展现中心内容。这样查搜索引擎才干快速精确的抓取到网站的中心内容,对网站做出比较有利的评分。3、网站优化的执行力:很多人不会掌握这个执行力,导致网站被K或者网站排名直没有的情况。在我们网站出现降权或者网站没有排名的时候,那么我们需要拿出我们的seo计划。按照计划去及时执行,比如说网站被降权了。当我们还没有分析出网站什么原因降权的,几天内对网站评估
send.asp '''''''''' @Description: 快钱网关接口范例' @Copyright (c) 上海快钱信息服务有限公司' @version 2.0'''''''''merchant_id ="879905060103109788" '''商户编号merchant_key ="99billKeyForTest" '''商户密钥orderid = "0226001" '''订单编号amount = "0.02" '''订单金额curr = "1" '''货币类型,1为人民币isSupportDES = "2" '''是否安全校验,2为必校验,推荐 merchant_url = "" '''支付结果返回地址pname = "" '''支付人姓名commodity_info = "" '''商品信息merchant_param = "" '''商户私有参数pemail="" '''传递email到快钱网关页面pid="" '''代理/合作伙伴商户编号 '''生成加密串,注意顺序ScrtStr="merchant_id=" & merchant_id& "&orderid=" &orderid & "&amount="& amount &"&merchant_url=" & merchant_url& "&merchant_key="& merchant_keymac=ucase(md5(ScrtStr)) %> 快钱99bill 订单编号: 订单金额: 支付人: 商品名称: ion="https://www.99bill.com/webapp/receiveMerchantInfoAction.do"> "> "> "> "> "> "> "> "> "> "> "> "> 可以支持银行卡、快钱账户、银行或邮局汇款方式支付.还可参加积分换礼活动!http://www.99bill.com/index/hd/99bill_hd2.html"target="_blank" >>>>详情点击 receive.asp '''''''''' @Description: 快钱网关接口范例' @Copyright (c) 上海快钱信息服务有限公司' @version 2.0'''''''''merchant_key="99billKeyForTest" '''商户密钥 merchant_id =request("merchant_id") '''获取商户编号orderid = request("orderid") '''获取订单编号amount = request("amount") '''获取订单金额dealdate = request("date") '''获取交易日期succeed = request("succeed") '''获取交易结果,Y成功,N失败mac = request("mac") '''获取安全加密串merchant_param =request("merchant_param") '''获取商户私有参数 couponid =request("couponid") '''获取优惠券编码couponvalue = request("couponvalue") '''获取优惠券面额 '''生成加密串,注意顺序ScrtStr = "merchant_id=" & merchant_id& "&orderid=" &orderid & "&amount="& amount & "&date="& dealdate &"&succeed=" & succeed& "&merchant_key="& merchant_keymymac=md5(ScrtStr) v_result="失败"if ucase(mac)=ucase(mymac) then ifsucceed="Y" then '''支付成功 v_result="成功" ''' '''#商户网站逻辑处理# ''' else '''支付失败 endif else '''签名错误 end if %> 快钱99bill 订单编号: 订单金额: 支付结果:
一般人都会选择支付宝,但支付宝需要存600元。所以就放弃了,选择快钱支付,快钱可以支持20几家银行卡,使用起来也算挺方便吧。 下面是以申请快钱支付接口为例。 申请条件:要求需要有个人网站和ICP备案号,且在信产部备案网站名称要和快钱使用名称相同,否则申请的时候不会过的。 1.到快钱网站https://www.99bill.com/ 注册一个帐号,按向导操作: 2.用注册帐号进行登陆,接下来就是验证操作。 A.手机验证,会把密码发到手机上面。 B.银行卡验证,建议直接选用工行卡,可以省去10元验证费。三工作日发给你验证信息。 C.身份验证 上述信息都验证通过了,才可以申请人民币网关。进入“快钱工具”,选择人民币网关,自助开通。按向导填写信息,快钱工作人员审核通过后,就会发邮件通知,里面包括快钱人民币网关密钥。 这些都申请好,就可以到自己网站平台就配置,配置如下: 1.用管理员帐号登陆进入域名主机代理平台系统,选择系统设置 2.在左列菜单,选“在线支付接口” 选“快钱”,并启用。接下来配置比较关键,系统版本选“V2.0版本” 接口地址推荐使用: https://www.99bill.com/gateway/recvMerchantInfoAction.htm; 返回地址:http://你的域名/control/onlinepay/99bill/result.asp; 商户编号:登陆快钱网站查看,把自己“用户编号”填入即可(注意不要有空格); 支付密钥:快钱发给你的人民币网关密钥,填入; 扣除手续费,看你自己啦,快钱是要收取1%手续费; 扣除下级平台手续费:就是你下级平台的客户使用该接口时是否要收手续费。 这些都配置好,点保存。 3.转入前台,进入支付方式,进行测试是否设置成功 4.进入快印支付接口 5.确定,弹出支付窗口 6.输入金额,确定,进入订单信息,选择相应支付方式: 7.支付成功 8.返回快钱画面 9.到前台管理中心,查询帐号余额,是否充值成功,到此设置完毕。 如有其它问题,可以到快钱网站咨询在线客服,会有人帮忙解答。 另外快钱会快递一份书面协议让你填,填完回传给快钱公司,确认后,才能开通提现功能,你才以提钱哦! 像支付宝等接口,需要到他们官方网站申请一个支付接口,然后在系统后台进行相应设置调试。
[支付宝参数设置案例]:t1 = "https://www.alipay.com/cooperate/gateway.do?"t4 = "images/alipay_bwrx.gif"t5 = "推荐使用支付宝付款"service = "trade_create_by_buyer"agent = "商户号"partner = "商户号"sign_type = "MD5"subject = "订单号:"&dingdan body = "seadori商城"out_trade_no = 变量 '客户网站订单号,(现取系统时间,可改成网站自己的变量)price = 变量 'price商品单价 0.01~50000.00discount = "0" '商品折扣show_url = "www.domain.com" '商品展示地址(可以直接写网站首页网址)quantity = "1" '商品数量payment_type = "1" '支付类型,(1代表商品购买)logistics_type = "POST" '物流种类(快递)logistics_fee = "0.00" '物流费用logistics_payment = "BUYER_PAY" '物流费用承担(买家付)logistics_type_1 = "EMS"logistics_fee_1 = "0.00"logistics_payment_1 = "BUYER_PAY" '物流费用承担(买家付)seller_email = "xxx@xxxl.net" '(必须填)key = "xxxxxx" '(必须填)notify_url= "http://domain/alipay/Alipay_Notify.asp" [网银在线参数设置案例]:key = "XXXX" v_mid = "商户号" v_amount="金额变量" v_moneytype = "CNY" 选择人民币 style="0" v_url="http://www.damain.com/Receive.asp" remark1="" remark2=""下面参数直接调用上面的定义, 不用修改。"> "> "> "> "> "> "> "> "> [快钱参数设置案例]merchant_id = "XXXXX" '''商户编号 merchant_key = "XXXXX" '''商户密钥 orderid = 变量 '''订单编号 amount = 变量 '''订单金额 curr = "1" '''货币类型,1为人民币 isSupportDES = "2" '''是否安全校验,2为必校验,推荐 merchant_url = "http://www.domaini.com/99bill/receive.asp" '''支付结果返回地址 pname = request("pname") '''支付人姓名 commodity_info = "xxx商品" '''商品信息 merchant_param = "" '''商户私有参数 (不用填写) [比较]:(1)快钱和玩银在线一般只使用3个文件, SEND, RECEIVE, MD5 SEND 文件发送参数,RECEIVE文件返回参数结果,MD5进行加密验证。 而支付宝一般有一个INDEX(可以调用到网站的支付页面),INDEX调用网站的变量参数,然后发送到PAYTO文件,INDEX和PAYTO文件组合起来相当于SEND的功能,而其他的都相同。 (2)支付宝大部分是安全支付平台,顾客收到货后支付宝才会给商户顾客支付的额度,而快钱和网银在线,钱杀直接到商户的帐里面。 3家公司的费率都是1%,而没有初装费或者年费, 不过过不了多久,肯定会有这类收费的。 所有支付系统都是有交易失败的情况的, 支付宝的失败率最少, 然后是网银,然后是快钱。 支付宝对客户来说是最为安全的,因为可以保证不被商家欺骗,但交易过程会慢很多;网银是中国B2C支付系统中最成熟的,很多大公司都用网银,网银对商家来说是最合适的;快钱和网银基本上一样, 只是快钱对快钱普通用户有费率优惠,快钱使用者以快钱帐户购买商家产品的时候会比网银占一点便宜,而且快钱也可以象网银那样, 不需要快钱帐户直接进行银行支付的。但快钱的系统交易失败率并不低。 想起以前用过的中国移动和中国联通的支付系统,一:手机支付接口开发调试的时候比较麻烦,特别是联通的, 是非常复杂的,有些公司开发手机支付接口花费1~2个月, 移动和联通的技术支持也非常差,很多情况都不会理睬,而最重要的是,他们的费率是20~40%, 这和网银的1%比起来,是晕死人的事情,不过在中国, 手机用户远比网上银行用户多,而中国的移动公司是垄断形的,这也是中国手机花费高的原因,要知道独裁政治和垄断企业是走到一起的。 [统合]很多网站一般在支付结果页面只集成一个支付渠道。因为多个支付渠道集成在一个页面的时候会有一些问题出现。(1)在一个支付页面内集成不同支付渠道的时候: 一般只支持一个接口。多个接口的时候调用的MD5,PAYTO等文件的定义不同,在一个页面头文件里无法引用多个文件。 可以不调用MD5,只调用PAYTO来实现3个支付系统全部运作, 但这个风险是很大的,没有进行MD5的加密,客户支付的钱不能保证到商户的帐户里面。这是有安全隐患的。PAYTO里面引用的MD5和外部SEND引用的MD5几乎是一样的问津, 但不同支付渠道对MD5引用的路径会不同,肯定是有安全隐患的。(2)在一个页面放多个按钮, 点击按钮跳转到SEND,INDEX等页面进行支付。 这个方法是最为方便的,但后面打开的SEND和INDEX等页面必须调用前面支付页面里的参数变量。 调用前一页参数的方法我在其他文章里详细说明过,在此不进行说明。
首先请你到招行去申请成为网上特约商户,此时会给你开一个基本帐户,这个基本帐户对应一个对公帐户。个人消费用户使用的是一卡通,一卡通基本帐户也对应有一个网上使用支付卡帐号在支付的过程中流程是如此的:例如:你要买一个20块钱的东西首先从基本一卡通帐户划10MONEY到你的网上支付卡中在商户网页上确认支付商户将引导您进入银行页面在银行页面中确认支付会将您的支付卡中的20MEONY支付到商户的对公帐户此时的对公帐户上的钱钱并不算归商户所有商户利用自己的系统看到你的定单,然后到银行给商户提供的系统中去看是否已经到帐,如果钱已经到帐而且可以进行此笔交易的话则将钱划到商户的基本帐户,此时钱才归商户所有。如果商户没有此商品或者此笔交易不能进行或者商户在银行规定的时间内没有对此帐进行处理那么到时间后此笔钱将划回用户自己的支付卡中,用户可以在支付卡和自己的基本帐号中自由转钱。在交易过程可以用明码,也可以用银行给的文件进行二次开发对商户和银行进行身份的确认,相对来说还是很简单的。由此看来最主要的仅仅是商户的开发页来引导用户和银行系统之间进行会话,这个过程也相对来说非常简单,下面附招商银行的接口部分原文……3. 网上支付方式网上支付方式分为两种,分别称为方式1和方式2。3.1. 网上支付方式1为了确保网上交易中资金的安全性,用户需要在一卡通中为网上交易开设一个专门的网上交易专户,对应有一张网上支付卡,并有一个对应的网上交易密码。用户需要用招商银行网上个人银行或者电话银行在一卡通和网上支付卡之间转钱。在网上交易过程中,用户先处于商户的网页中。当用户查看完购物篮并决定购买时,商户WEB系统将要求用户输入送货地址、联系电话等信息。然后,商户WEB系统根据购物篮内容生成相应定单,并生成支付网页回送用户浏览器。定单一般包括:定单号、交易日期、货品数量和单价及总计价、送货地址、联系电话等。支付网页包括:定单内容和选择招商银行网上支付卡支付按钮。当用户在支付网页中选择招商银行网上支付卡付款时,支付网页向银行WEB系统发出支付命令。银行WEB系统处理完支付请求后,将回送用户支付结果页面。支付命令格式如下:https://CMBHost/netpayment/BaseHttp.dll?PrePayC?BranchID=xxxx&CoNo=xxxxxx&BillNo=xxxxxx&Amount=xxx.xx&Date=YYYYMMDD用中心分行网址替换CMBHost。参数说明:BranchID: 商户开户分行号,请咨询开户的招商银行分支机构;CoNo: 商户号,6位长数字,由银行在商户开户时确定;BillNo: 定单号,6位长数字,由商户系统生成,一天内不能重复;Amount: 定单总金额,格式为:xxxx.xx元;Date: 交易日期,格式:YYYYMMDD。支付页面提交的FORM格式示例如下:POST>定单号000023金 额818.66日 期19981010方式1的特点是商户WEB系统通过支付页面把控制引导到银行WEB系统,银行WEB系统处理完支付请求后回送支付结果页面给用户,控制没有再回到商户WEB系统。商户在和银行结帐时(见5.2.节)可以知道定单的付款情况。如果商户系统需要立刻核实定单付款情况,可以使用一个直联定单状态查询接口向银行WEB系统查询某个定单的状态。有关直联定单状态查询接口请见3.3.节。3.2. 网上支付方式2某些商户在用户完成支付过程后希望控制能够从银行WEB系统自动转回商户WEB系统,并且商户WEB系统能够知道用户的付款情况。比如,出售信息产品的商户,在支付成功的情况下,商户的结果页除包含支付成功通知信息外,还可以包含用户购买的信息产品。为了解决这个问题,要求商户WEB系统必须提供一个支付结果通知命令。银行WEB系统在收到支付网页发出的支付命令后,先执行扣款操作,然后调用商户WEB系统的支付结果通知命令,把支付结果通知商户WEB系统,同时取得商户WEB系统生成的支付结果页面(由支付结果通知命令生成)。最后,银行WEB系统把由商户WEB系统的支付结果通知命令生成的支付结果页返回用户的浏览器。这就是支付方式2。支付结果通知命令格式型如:http://www.merchant.com/path/ProcResult.dll?Succeed=..&BillNo=..&Amount=..&Date=..&Msg=..&signature=..其中,path和ProcResult.dll由商户任意确定,并且支付命令中可包含多个path,即可有path1/path2/path3。参数说明:Succeed: 取值Y(成功)或N(失败);BillNo: 定单号(由支付命令送来);Amount: 实际支付金额(由支付命令送来);Date: 交易日期(由支付命令送来);Msg: 银行通知用户的支付结果消息,在支付成功时为“付款请求已被银行接受。”,在支付失败时是失败原因;Signature: 银行用自己的Private Key对通知命令的签名。注意:(1)商户系统如果对银行通知命令的真实性有较高要求,必须用银行提供的开发包中的函数,结合银行的Public Key(可从网上下载或向银行索取)验证。具体用法请参考附录3。(2)商户系统也可以进一步判断该命令发出方的IP地址为招商银行网站的IP地址,以防止用户伪造。如果商户系统对银行通知命令的真实性要求不是很高,只验证IP也可,这样可降低商户系统开发的复杂性。(3)在Succeed为Y时,商户在支付结果通知命令中必须判断Amount的值,该值为用户的实际支付金额,以此金额为准。不能以之前系统产生定单时的金额为准!这是为了防止用户在得到支付页面后修改支付金额。 支付方式2的支付命令格式有别于支付方式1,其格式为:https://CMBHost/netpayment/BaseHttp.dll?PrePayC1?BranchID=xxxx&CoNo=..&BillNo=..& Amount=..&Date=..&MerchantUrl=..用中心分行网址替换CMBHost。前五个参数同支付过程1,第六个参数MerchantUrl为支付结果通知命令中参数部分之前的部分,也就是http://www.merchant.com/path/ProcResult.dll。在方式2中,若用户付款后银行WEB系统或者商户WEB系统出现故障,则可能出现用户已付款但是商户WEB系统不知道的情况,或者出现用户已付款但是用户浏览器未接收到结果页的情况。如果这种异常情况会引起付款纠纷,则该商户必须由银行设置为非立即结帐商户,由商户利用结帐功能中的撤消定单功能解决这类付款纠纷。和方式1比较,方式2在用户完成支付操作后控制又回到商户的系统(用户处于商户WEB系统生成的支付结果页中),增加了银行WEB系统调用商户WEB系统的支付结果通知命令的过程。方式2比方式1复杂,并且商户WEB系统必须处理异常情况。但是方式2功能较强,使支付过程变得平滑无缝。在商户的Web系统向银行返回结果网页时,网页中应当有e="CMBNETPAYMENT" content="China Merchants Bank">,供银行判断是否为有效返回网页,以避免商户服务器失控后自动返回未知的信息而使消费者迷惑。不管是商户停机、网络中断或者Web服务器失控,银行都将屏蔽商户系统的问题,并用正常的网页替代商户网页返回给消费者,使消费者能继续正确操作。一旦发生这种情况,银行将通过电话银行中心以电话与商户管理服务器的人员联系,提醒其系统发生故障。考虑到方式2比较复杂,并且需要连接商户端程序,我们提供了测试接口以方便商户开发程序时测试。使用该测试接口模拟真实的数据流程,但无须真实的商户代码和支付卡号,银行系统也不记录交易数据(商户不能查询或结帐使用该测试接口产生的交易数据)。测试接口的使用方法和真实接口一致,只需由真实接口的PrePayC1改为测试接口的TestPrepayC1。注意:为防止用户利用测试接口扰乱商户正式运行的服务器,银行的测试接口通知信息中,BillNo始终为“000000”。https://CMBHost/netpayment/BaseHttp.dll?PrePayC1?BranchID=xxxx&CoNo=..&BillNo=..& Amount=..&Date=..&MerchantUrl=..改为https://CMBHost/netpayment/BaseHttp.dll?TestPrePayC1? BranchID=xxxx&CoNo=..&BillNo=..& Amount=..&Date=..&MerchantUrl=..。建议:一般销售实物的网站应尽量采用方式1。在方式2中,持卡人付款完毕,银行立即从商户网站取得返回页面,如果商户网站或者通讯线路出现任何问题,持卡人将看到不可理解的信息,从而诱导持卡人作进一步的误操作。
函数 语法 功能 Len Len(string|varname) 返回字符串内字符的数目,或是存储一变量所需的字节数。 Trim Trim(string) 将字符串前后的空格去掉 Ltrim Ltrim(string) 将字符串前面的空格去掉 Rtrim Rtrim(string) 将字符串后面的空格去掉 Mid Mid(string,start,length) 从string字符串的start字符开始取得length长度的字符串,如果省略第三个参数表示从start字符开始到字符串结尾的字符串 Left Left(string,length) 从string字符串的左边取得length长度的字符串 Right Right(string,length) 从string字符串的右边取得length长度的字符串 LCase LCase(string) 将string字符串里的所有大写字母转化为小写字母 UCase UCase(string) 将string字符串里的所有大写字母转化为大写字母 StrComp StrComp(string1,string2[,compare]) 返回string1字符串与string2字符串的比较结果,如果两个字符串相同,则返回0,如果小于则返回-1,如果大于则返回1 InStr InStr(string1,string2[,compare]) 返回string1字符串在string2字符串中第一次出现的位置 Split Split(string1,delimiter[,count[,start]]) 将字符串根据delimiter拆分成一维数组,其中delimiter用于标识子字符串界限。如果省略,使用空格("")作为分隔符。count返回的子字符串数目,-1指示返回所有子字符串。start为1执行文本比较;如果为0或者省略执行二进制比较。 Replace Replace(expression,find,replacewith[,compare[,count[,start]]]) 返回字符串,其中指定数目的某子字符串(find)被替换为另一个子字符串(replacewith)。 补充: Asc Asc函数提取字符串第一个字母的ANSI字符码。 用法为:result = Asc(string) 其中result是字符码,string是任意有效的字符串表达式。如果string为Empty,则产生一个实时错误。 AscB AscB函数提取字符串的第一个字节。 用法为:result = AscB(string) 其中result是Byte字类,string是任意有效的字符串表达式。如果string为Empty,则产生一个实时错误。 AscW AscW函数提取字符串第一个字母的Unicode字符码。 用法为:result = AscW(string) 其中result是Unicode,string是任意有效的字符串表达式。如果string为Empty,则产生一个实时错误。 InStr InStr函数识别某个记号在字符串中的首字母位置。 用法为:newstart = InStr([start, ]source, token[, compare]) 其中newstart时记号在字符串中的位置(如果没有的话则为0),start是查找的起始位置,source是要查找的字符串,token是要定位的字符串,compare是比较类型(0表示二进制比较,1表示忽略大小写的文本比较)。 InStrB InStrB函数是InStr的字节版,识别某个记号在字符串中的首字节位置。 用法为:newstart = InStrB([start, ]source, token[, compare]) 其中newstart时记号在字符串中的首字节位置(如果没有的话则为0),start是查找的起始位置,source是要查找的字符串,token是要定位的字符串,compare是比较类型(0表示二进制比较,1表示忽略大小写的文本比较)。 LCase LCase函数把字符串变为小写形式。 用法为:result = LCase(string) 其中result是小写字符串,string是任意有效的字符串表达式。 Left Left函数从字符串的起始处提取指定数目的字符。 用法为:result = Left(string,length) 其中result是字符串变量,string是有效的字符串表达式,length是表示返回多少字符的数值型表达式。 LeftB LeftB函数从字符串的起始处提取指定数目的字节。 用法为:result = LeftB(string,length) 其中result是字符串变量,string是有效的字符串表达式,length是表示提取的字节数的数值型表达式。 Len Len函数确定字符串的大小或存储这个变量需要多少字符。 用法为:result = Len(string | varname) 其中,result是字符串中的字符数或存储这个变量所需的字节数,string是任意有效的字符串表达式,varname是变量名。 LenB Len函数确定字符串的大小或存储这个变量需要多少字节。 用法为:result = LenB(string | varname) 其中,result是字符串中的字节数或存储这个变量所需的字节数,string是任意有效的字符串表达式,varname是变量名。 LTrim LTrim函数复制字符串并去掉前面的空格。 用法为:result = LTrim(string) 其中,result是去掉空格后的字符串,string是要去掉空格的有效字符串表达式。 Mid Mid函数从字符串的某个位置复制指定数目的字符。 用法为:result = Mid(string,start[,length]) 其中,result是结果字符串,string是要从中复制字符的表达式,start是string中复制的起始位置,length是要复制的字符数。 MidB Mid函数从字符串的某个位置复制指定数目的字节。 用法为:result = Mid(string,start[,length]) 其中,result是结果字符串,string是要从中复制字节的表达式,start是string中复制的起始位置,length是要复制的字节数。 Right Right函数从字符串的尾部提取指定数目的字符。 用法为:result = Right(string,length) 其中result是字符串变量,string是有效的字符串表达式,length是表示返回多少字符的数值型表达式。 RightB RightB函数从字符串的起始处提取指定数目的字节。 用法为:result = RightB(string,length) 其中result是字符串变量,string是有效的字符串表达式,length是表示提取的字节数的数值型表达式。 RTrim RTrim函数复制字符串并去掉尾部的空格。 用法为:result = RTrim(string) 其中,result是去掉空格后的字符串,string是要去掉空格的有效字符串表达式。 String String函数构造含有多个相同字符的字符串。 用法为:result = String(number, character) 其中,result是字符串变量,number是返回字符串的长度,character是用来构造返回字符串的字符码。 Trim Trim函数复制字符串并去掉首尾的空格。 用法为:result = Trim(string) 其中,result是去掉空格后的字符串,string是要去掉空格的有效字符串表达式。 UCase UCase函数把字符串变为大写形式。 用法为:result = UCase(string) 其中result是大写字符串,string是任意有效的字符串表达式。
asp数据批量导入的原理是使用excel保存许多数据,然后将这个excel使用无组件上传到服务器上,然后打开excel,将里面的数据写入到数据库中。 这里我写的是将excel中的数据读出来,然后写入到数据库中 具体代码: 连接excel数据库 path="./" Dim xlsconn,strsource,xlbook,xlsheet,i Dim myConn_Xsl,xlsrs,sql,objCmd Set xlsconn = server.CreateObject("adodb.connection") Set xlsrs = Server.CreateObject("Adodb.RecordSet") filename="商品" file2="商品列表" source=server.mappath(path&filename&".xls") myConn_Xsl="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &source& ";Extended Properties=Excel 8.0" xlsconn.open myConn_Xsl sql = "Select * from ["&file2&"$]" xlsrs.open sql,xlsconn,1,1 If xlsrs.eof Then else i=1 response.write "" Do While not xlsrs.eof goods_name=xlsrs("商品名") goods_images=xlsrs("图片") cat_id=xlsrs("商品分类") %> sql="insert into goods(goods_name,goods_images,cat_id) values("&goods_name&","&goods_images&","&cat_id&")" conn.execute(sql) i=i+1 xlsrs.MoveNext Loop response.write "" End If xlsrs.close Response.write "共导入" & i-1 & "条记录." & vbCrLf set xlsconn=nothing set objCmd=Nothing % >
最近在研究批量导入数据的问题,这个其实没有什么难点,只是如果一次性数据全部导入的话,要是数据量小的话,还可以,要是几万条,肯定会出现延时问题。我研究了一下,结合一个朋友的建议,写了一个小导入程序,供大家参考! Dim ResultNum 定义每次插入记录数 Dim Page 定义循环次数 ResultNum = 100 定义每次插入200条记录 Page = Trim(Request.QueryString("Page")) If Page = "" Then Page = 1 End If Page = Cint(Page) PageTmp = Page-1 计算当前记录数用 Set Rs = Server.CreateObject("Adodb.RecordSet") Sql = "Select Count(ID) As Cnt From [Sheet1$]" Rs.Open Sql,Conn,1,1 Cnt = Rs("Cnt") Rs.Close PageSize = Cnt/ResultNum+1 统计总页数 If Page > PageSize Then Set Rs = Nothing Conn.Close Set Conn = Nothing Response.Write("已经到记录末尾!") Response.End() End If Sql = "Select * From [Sheet1$] Where Id Between "&(PageTmp*ResultNum+1)&" And "&Page*ResultNum&"" Rs.Open Sql,Conn,1,1 If Rs.Eof And Rs.Bof Then %> 暂无商品! Else %> 正在插入条到条数据,请稍后…… Connstr1 = "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=;Extended properties=Excel 5.0;Data Source="& Server.MapPath("db/pdlfood.xls") Set Conn1 = Server.CreateObject("Adodb.Connection") Conn1.Open Connstr1 Do While Not Rs.Eof Set Rs1 = Server.CreateObject("Adodb.RecordSet") Sql1 = "Select * From [Sheet1$] Where FoodCode = "&Rs("FoodCode")&" " Rs1.Open Sql1,Conn1,1,3 If Rs1.Eof And Rs1.Bof Then Rs1.AddNew Rs1("FoodCode") = Rs("FoodCode") Rs1("FoodName") = Rs("FoodName") Rs1.Update Else 不做处理 End If Rs1.Close Set Rs1 = Nothing Rs.MoveNext Loop Conn1.Close Set Conn1 = Nothing End If Rs.Close Set Rs = Nothing Conn.Close Set Conn = Nothing Response.Write("location.href(?Page="&(Page+1)&");") %>