paulwong

#

如何医治牙龈出血

如何医治牙龈出血啊。。。谢谢啊,狂急!!!!
悬赏分:0 - 解决时间:2005-11-22 12:37
提问者: 小哈纳斯 - 魔法学徒 一级 

http://www.234.com.tw/perio/topicList.cfm?kid=61

最佳答案
这里是我以前答复两个患者的资料,对你有作用:

一 关于青年人牙龈出血

⑴ 我想你是牙龈出血。若是其它原因出血,你肯定早住医院而不会在这里轻松发贴了。

⑵ 这个臭味是来自血的腐败。既然牙龈会出血,也表明你有牙周的问题,这些渗血部位的牙垢及食物残渣也会发出难闻的气味。

⑶ 治疗一般应到专门的口腔门诊。看来你是第一次涉及口腔的保健,治疗的流程应该是这样的:

   先消除炎症:常规是口服利菌沙,灭滴灵,维生素C,维生素K。治疗约1周后,牙龈炎症消除,就应着手解决根本问题了。

   再清除牙垢:这是引起牙周炎的原因。牙垢很硬,堆积在牙龈周围,不断地刺激和损伤着牙龈,使成创面出血。而出血又可进一步形成牙垢,如此成恶性循环。

⑷ 在我们三甲医院,这个费用偏高些,约100元。它包括消炎和约两次的除垢(洗牙)。在县市级的医院应该便宜些。

⑸ 消炎7天加除垢2天。若同时治疗龋齿,还加2天。

⑹ 当然,你也可只做消炎一步,除垢待以后有时间再做。如此,你到大的药房去,买前3种药自己服。买3-5天的量。约花20元。

⑹ 这3-5天内,你要睡眠良好,尽量避免感冒发热,那会引起血管通透性趋增,使出血严重一些,不利于治疗消炎。

⑺ 平时多食富含维生素C的水果蔬菜很重要!!!
好,暂就说这么多。对顽固性的牙龈出血(例如出了多年血),或是这样治疗仍不见效,请再设问,我们来为你确定新的治疗方案。

二 关于老是治不好的牙龈出血(先用一法!!!!)

楼上解释的对。但我要教你最重要的东西,就是怎样解决这个问题。当然,解决之后,你要补我的专家号,呵呵。(我有个熟人有40年牙龈出血的经历,可是它近年突然好了。你想知道原因吗?我给了他一个新招。)


   ⑴ 连服维生素C7天,每天100-300mg。(这个量不算多,意义你明白。)

   ⑵ 这7天内保持好睡眠,目的是调节好人的生理状态,使不容易感冒什么的,避免因发烧造成的微血管通透性能趋增,使容易出血。

   ⑶ 本条最重要:去药房买“阿奇霉素分散片”,买大厂出的,我建议买天津药业悦来牌的。每盒6片×0.25g,请单次口服4片,并详细阅读一下说明书。记住:只吃一次即可。若有严重的不良反应(极少有!!),带着这个药的说明书去看门诊,医生会处置。如果没有不良反应,可在48小时后把另2片吃了,仅此而已。

   该药是目前极有名的药,4年前从国外进来现已完全本土化,真的是国外科学家对人类的大贡献!也不算贵,约20-30元1盒6片。主要用途是对付非淋菌性性病。

   它是广谱抗菌药,更是☆靶向制剂☆。你明白这个吗?我说个白话以便你能听懂:这个药可跟随人的巨嗜细胞走。而巨嗜细胞又跟着炎症走,所以疗效显著。

   ⑷ 一般的牙科医生,都会建议你用利君沙和灭滴灵,外加维生素C和K。但我想你是老牙龈出血,这种药用过多次,不会太奏效,阿奇霉素毒副作用比上述两种都小,更重要的是你没用过,致病菌没有抗药性。

   ⑸ 炎症消除、出血停止之后,建议你去做一次牙垢清除。多年的出血肯定会导致牙根周围有比较多的牙垢,这些牙垢年复一年刺激着周围的牙龈,不但是细菌的温床,也使牙龈面持续受到创伤,牙龈出血还会卷土重来。

   ⑹ 此次牙龈炎症消除之后,口腔气味也会比以前好转,但牙根的一部分将暴露的比以前利害(以前被肿胀的牙龈包裹),产生龋齿的可能性将增加。因此要注意好口腔清洁。

回答者: ccd2093 - 举人 四级 11-14 08:51
提问者对于答案的评价:
非常感谢~~

posted @ 2015-11-19 08:47 paulwong 阅读(395) | 评论 (0)编辑 收藏

javax.crypto.IllegalBlockSizeException: Data must not be longer than 256 bytes 解决办法

如果用RSA加密数据的话,会有数据长度的要求,否则会抛异常:
javax.crypto.IllegalBlockSizeException: Data must not be longer than 256 bytes

推荐的做法:

  1. 随机生成一个密钥,用作对称密钥UUID
  2. 用此对称密钥,用对称加密法AES加密数据
  3. 用RSA的公钥加密此对称密钥
  4. 发送加密后的对称密钥和加密数据
  5. 用RSA私钥解密加密后的对称密钥
  6. 用解密密后的对称密钥,解密数据
  7. 完成
AESSecurityUtil.java
import java.security.Key;
import java.util.UUID;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class AESSecurityUtil {

    // 加密算法
    /** 指定加密算法为RSA */
    private static final String ALGORITHM = "AES";

    // 加密密钥
    
// private static final byte[] keyValue = new byte[] { 'T', 'h', 'e',
    
// 'B','e', 's', 't', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y' };
    
// 16位的加密密钥
//    private byte[] keyValue;

    /**
     * 用来进行加密的操作
     * 
     * 
@param Data
     * 
@return
     * 
@throws Exception
     
*/
    public static String encrypt(String keyString, String data)
            throws Exception {
        Key key = generateKey(keyString);
        Cipher c = Cipher.getInstance(ALGORITHM);
        c.init(Cipher.ENCRYPT_MODE, key);
        byte[] encVal = c.doFinal(data.getBytes());
        String encryptedValue = new BASE64Encoder().encode(encVal);
        return encryptedValue;
    }

    /**
     * 用来进行解密的操作
     * 
     * 
@param encryptedData
     * 
@return
     * 
@throws Exception
     
*/
    public static String decrypt(String keyString, String encryptedData) throws Exception {
        Key key = generateKey(keyString);
        Cipher c = Cipher.getInstance(ALGORITHM);
        c.init(Cipher.DECRYPT_MODE, key);
        byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
        byte[] decValue = c.doFinal(decordedValue);
        String decryptedValue = new String(decValue);
        return decryptedValue;
    }
    
    public static String generateKeyString()
    {
        //必须长度为16
        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16);
    }

    /**
     * 根据密钥和算法生成Key
     * 
     * 
@return
     * 
@throws Exception
     
*/
    private static Key generateKey(String keyString) throws Exception {
        Key key = new SecretKeySpec(keyString.getBytes(), ALGORITHM);
        return key;
    }
    
    public static void main(String [] args) throws Exception
    {
        String keyString = generateKeyString();
//        String keyString = "1234567890123456";
        System.out.println("密钥:" + keyString);
        
        String source = "恭喜发财!";// 要加密的字符串
        System.out.println("准备用密钥加密的字符串为:" + source);
        
        String cryptograph = encrypt(keyString, source);// 生成的密文
        System.out.print("用密钥加密后的结果为:" + cryptograph);
        System.out.println();

        String target = decrypt(keyString, cryptograph);// 解密密文
        System.out.println("用密钥解密后的字符串为:" + target);
        System.out.println();
    }

}


CryptoUtil.java
import com.tcl.project7.boss.common.crypto.CryptoData;
import com.tcl.project7.boss.common.util.JsonManager;
import com.tcl.project7.boss.common.util.file.FileUtil;
import com.tcl.project7.boss.gameapplication.yearendactivities.bigwheelgame.player.valueobject.BigWheelGameRequest;

public class CryptoUtil {
    
    public static CryptoData encrypt(String data) throws Exception
    {
        //1、产生AES密钥
        String keyString = AESSecurityUtil.generateKeyString();
        
        //2、用AES法加密数据
        String cryptograph = AESSecurityUtil.encrypt(keyString, data);
        
        //3、用RSA加密AES密钥
        String finalKey = RSASecurityUtil.encrypt(keyString);
//        System.out.print("用RSA加密AES密钥为:" + finalKey);
//        System.out.print("加密数据:" + cryptograph);
        
        CryptoData cryptoData = new CryptoData();
        cryptoData.setKey(finalKey);
        cryptoData.setContent(cryptograph);
        
        //4、返回数据
        return cryptoData;
    }
    
    public static String decrypt(String keyString, String data) throws Exception
    {
        //1、解密密钥
        String decryptKeyString = RSASecurityUtil.decrypt(keyString);
        
        //2、解密内容
        String decryptData = AESSecurityUtil.decrypt(decryptKeyString, data);
        
        //3、返回
        return decryptData;
        
    }
    
    public static void main(String [] args) throws Exception
    {
        String aFilePath = "DATA/TESTING-FILE/TOCRYPTO/tocrypto.txt";
        String source = FileUtil.getContents(aFilePath);
        
        CryptoData cryptoData = encrypt(source);
        System.out.print(cryptoData);
        
        String target = decrypt(cryptoData.getKey(), cryptoData.getContent());
        System.out.print(target);
        
        BigWheelGameRequest bigWheelGameRequest = JsonManager.getBean(target, BigWheelGameRequest.class);
        System.out.print(bigWheelGameRequest);
    }

}


CryptoData.java
import java.io.Serializable;

public class CryptoData implements Serializable{

    private static final long serialVersionUID = -4774469372648172844L;
    
    private String key;
    
    private String content;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String toString() {
        return "CryptoData [key=" + key + ", content=" + content + "]";
    }

}

posted @ 2015-11-18 15:27 paulwong 阅读(14708) | 评论 (0)编辑 收藏

JSON转JAVA BEAN


import java.io.IOException;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class ColumnControllerTest {
    
    private Logger logger = LoggerFactory.getLogger(ColumnControllerTest.class);
    
    
    @Test
    public void testTest()
    {
        ObjectMapper mapper = new ObjectMapper();
        /*AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
        // make deserializer use JAXB annotations (only)
        mapper.getDeserializationConfig().setAnnotationIntrospector(introspector);
        // make serializer use JAXB annotations (only)
        mapper.getSerializationConfig().setAnnotationIntrospector(introspector);
*/
        mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        
        String userStr = "{\"username\":\"paul\",\"email\":\"paul@paul.com\"}";
        try {
            TypeReference<TestUser> temp = new TypeReference<TestUser>(){};
            TestUser testUser = mapper.readValue(userStr, temp);
            System.out.println(testUser.toString());
            
            String result = mapper.writeValueAsString(testUser);
            System.out.println(result);
            
        } catch (JsonParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

posted @ 2015-11-18 13:30 paulwong 阅读(474) | 评论 (0)编辑 收藏

不得不承认Zeroc Ice是RPC王者: 完爆Dubbo,Thrift,谷歌RPC

     摘要: ice-dubbo-thrift-grpc性能测试对比,本次测试过程中还发现了一个支付宝的秘密,附件文档中会详细说明。测试说明    本测试只是个人为了对rpc进行技术选型,测试可能不够严谨,对某些rpc的参数可能也不是最优,如果你知道更优的参数配置或者改进意见等,欢迎反馈给我magicdoom@gmail.com。另外代码有些地方只是为了测试方便,不作为平时编程的范例。所有测...  阅读全文

posted @ 2015-11-13 16:19 paulwong 阅读(14393) | 评论 (2)编辑 收藏

Tengine

简介

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站
的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如
淘宝网天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、
易用的Web平台。

从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和维护
着它。Tengine团队的核心成员来自于淘宝搜狗等互联网企业。Tengine是社区合作
的成果,我们欢迎大家参与其中,贡献自己的力量。

特性

动态

邮件列表

posted @ 2015-11-06 12:56 paulwong 阅读(472) | 评论 (0)编辑 收藏

SPRING IO

Spring起初只专注ioc和aop,现在已发展成一个庞大体系。比如security、mvc等。
如此一来,不同模块或者与外部进行集成时,依赖处理就需要各自对应版本号。
比如,较新spring与较老的quartz,它们集成就会遇到问题,给搭建和升级带来不便。

因此Spring IO Platform应运而生,只要项目中引入了它,外部集成时依赖关系无需版本号

<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-core</artifactId> 
</dependency>

Spring IO Platform只是一个pom文件,记录了spring与其他开源项目对应的版本。
省去了版本号,也就省去了处理依赖时的问题,因为Spring IO Platform中有最优的版本。

posted @ 2015-10-30 14:05 paulwong 阅读(522) | 评论 (0)编辑 收藏

一篇不错的Docker入门介绍

看到这标题你可能会想,网上不是已经有很多Docker的入门介绍了么?同一个主题被讲过很多次,还有没有必要必要再讲?可是,我体内这混杂的的高傲与固执虽然让人厌恶,但却让我广受大家的欢迎,这也让我觉得我应该来一发(篇),哈哈。 

举一个我遇到的场景,ELK三剑客,即Elasticsearch、Logstash和Kibana。我可以选择把它们直接安装在我的MacBook上,这是我主力开发机,但是在上面已经装好一个Elasticsearch了。我不想破坏现在已有的环境。要解决这个问题,用2015年时下最热门的解决方案就是Docker了。如果过去一年关于Docker的各种热闹你都错过了,那么请继续往下看。 

Docker做的事情就是将的软件隔离起来,让它们即使出了问题也不会互相影响。这并不是什么横空出世的新思想。你很可能会说内核控制的进程不就这样玩么?每一个进程都有自己的内存空间,并且在一个进程自身看来,内存空间与所处在的计算机的内存空间是一样的。然而内核欺骗了进程,在背后将内存地址重新映射到了真实的内存空间中。想想今天高速运转处理器,任何地方见到的系统都能同时运行多个进程。今天的文明社会比人类历史任何一个时间点制造的谎言数量级都要很多的量级。 

扯远了,Docker将进程的隔离模型的进行了扩展,让隔离性变得更强。Docker是在Linux内核的基础上打造的一系列工具。整个文件系统被抽象了,网络被虚拟化了,其它进程被隐藏了,并且从理论上,不可能逃脱容器去对在一个机器上的其他进程搞破坏。实际中,每个人对于怎么才能逃脱容器,至少去收集一点运行容器的机器的相关信息,持开放的态度。跟虚拟机比较起来,容器的隔离性还是较弱。 

 

上面箭头:提升单机性能;下面箭头:提升隔离性

但换个角度看,进程比容器性能更好,容器性能比虚拟机性能更佳。原因很简单,隔离性更高,在每一个上下文中就需要运行更多的东西,从而拖慢速度。选择一个隔离性的过程,实际就是决定你对要运行进程的信任有多少的过程 - 它会不会去干扰其他的进程?如运行的进程都是自己的亲儿子,那你对他们会有一个很高的信任度,对他们用最少的隔离,运行在一个进程中就行了。如果是SAP,那么你很可能需要尽可能高的隔离性:将电脑装在封存在箱子里,绑在火箭上发射到月球。 

Docker另一个很好的特性是,容器可以作为一个整体交付。他们不会像虚拟机那么臃肿。这大大的提高了部署的简易度。在这个微服务流行的世界里,你可以很容易将你的服务捆在一起,用镜像来发布。你甚至可以将build的结果指定成一个Docker镜像。 

Docker将会怎样改变软件开发和部署的过程仍然有待观察。尽管我觉得Docker是一种带有破坏性的技术,但影响还在几年之后才会到来。虽然我会认为Docker会让很多系统管理员丢掉工作,但是实际上Docker却会改变他们的工作。每个人现在都需要一点变革,赶上时代的脚步。 

又扯远了,说说OSX上的Docker。 

细心的你可能注意到,我之前说Docker是运行在Linux内核之上的。然而OSX没有Linux内核,那怎么运行Docker呢。为了解决这个问题,我们需要用虚拟机来运行Docker。我们可以用一个叫boot2docker的工具来做这件事情,但是最近被docker-machine取代了。 

我的机上有一个比较老的Docker,但是我觉得想试试Docker Compose,因为我运行着很多的服务。Docker Compose能让很多的容器协作起来运行一个整体的环境。为了遵循保证隔离服务的宗旨,每一个服务都运行在单独的容器中。因而,一个典型的web应用中,可以把web服务器运行在一个容器里面,数据库运行在另外一个容器里面,然后这些容器可以放在同一个机器上。 

我从Docker官网上下载了安装包,并且跟着安装指南http://docs.docker.com/mac/step_one/安装。装好Docker后,我让docker-machine在Virtual Box上创建了新的虚拟机。 

 

一起看起来很顺利,然后启动随处可见的hello-world镜像。 

很惊讶这个镜像的并不完全,完全没有发现任何一个地方有“hello world”的输出。然而好在,不是每一个Docker镜像都实现地这般草率。这个hello world的例子比较无聊,看看能不能找到更加有意思的。我们想从容器中服务一个页面,我打算使用Nginx,已经有一个现成的Nginx的容器了,因此我创建了个新的Dockerfile。Dockerfile包含了一系列如何指导Docker从一系列镜像中创建出一个容器的指令。这里提到的容器包含以下内容: 
Java代码 
  1. FROM nginx  
  2. COPY *.html /usr/share/nginx/html/  

第一行设置了我们容器的基础镜像。第二行将本地的带有html后缀的文件拷贝到Nginx容器中WEB服务器的目录里。为了使用这个Dockerfile文件,我们需要创建一个Docker的镜像: 
Java代码 
  1. /tmp/nginx$ docker build -t nginx_test .  
  2. Sending build context to Docker daemon 3.072 kB  
  3. Step 0 : FROM nginx  
  4. latest: Pulling from library/nginx  
  5. 843e2bded498: Pull complete  
  6. 8c00acfb0175: Pull complete  
  7. 426ac73b867e: Pull complete  
  8. d6c6bbd63f57: Pull complete  
  9. 4ac684e3f295: Pull complete  
  10. 91391bd3c4d3: Pull complete  
  11. b4587525ed53: Pull complete  
  12. 0240288f5187: Pull complete  
  13. 28c109ec1572: Pull complete  
  14. 063d51552dac: Pull complete  
  15. d8a70839d961: Pull complete  
  16. ceab60537ad2: Pull complete  
  17. Digest: sha256:9d0768452fe8f43c23292d24ec0fbd0ce06c98f776a084623d62ee12c4b7d58c  
  18. Status: Downloaded newer image for nginx:latest  
  19. ---> ceab60537ad2  
  20. Step 1 : COPY *.html /usr/share/nginx/html/  
  21. ---> ce25a968717f  
  22. Removing intermediate container c45b9eb73bc7  
  23. Successfully built ce25a968717f   

Docker build命令开始将拉取已经构建好的Nginx容器。然后将我们的文件拷贝到容器里面,并且显示容器的hash值,这让它们很容易辨认。要运行这个容器我们可以运行: 
Java代码 
  1. /tmp/nginx$ docker run --name simple_html -d -p 3001:80 -p 3002:443 nginx_test  

这条命令让Docker运行nginxtest的容器,并且取名为simple_html。-d选项是为了让Docker在后台运行这条命令,并且最终-p选项是为了转发端口,这里需要将本地的3001端口映射到容器的80端口 - 即正常的web服务器端口。现在我们可以连接到web服务上了。如果我们打开chrome,访问localhost:3001就会看到: 

 

居然不行,问题在于Docker没有意识到自己运行在虚拟机的环境里面,因此我们需要将vm的端口映射到我们本地机器上: 
Java代码 
  1. Docker container:80 -> vm host:3001 -> OSX:3001  

这个从虚拟机管理器里面可以轻松的搞定: 

 

现在我们可以看到页面了: 

 

这就是我们放在容器中的文件。好极了!现在我准备好尝试更复杂一点的容器了。 

小贴士: 

我注意到在虚拟机里面同时并行的运行Docker会整个让系统hang住。我怀疑同时跑两个虚拟工具可能让某个地方卡住产生了冲突的结果。我相信docker-machine的并行的支持正在在积极的解决中,0.5版本可能会看到。直到这之前,你可以参考:http://kb.parallels.com/en/123356并且看看:https://github.com/Parallels/docker-machine中对docker-machine的fork版本。 

原文链接:Yet another intro to docker (翻译:钟最龙 校对:宋喻) 

译文来自:DockOne.io

posted @ 2015-10-30 12:49 paulwong 阅读(494) | 评论 (0)编辑 收藏

糖果CMS,一个像糖果一样的CMS 糖果CMS

一个JAVA的内容管理系统
http://www.oschina.net/p/tg-cms

posted @ 2015-10-27 18:24 paulwong 阅读(523) | 评论 (0)编辑 收藏

REDIS监控

http://git.oschina.net/hellovivi/RedisFlag

posted @ 2015-10-19 12:39 paulwong 阅读(512) | 评论 (1)编辑 收藏

深度技术揭秘,支付宝,财付通,到底每天都是怎样工作的?

为了可以更好地解释支付结算系统对账过程,我们先把业务从头到尾串起来描述一下场景,帮助大家理解:一个可能得不能再可能的场景,请大家深刻理解里面每个角色做了什么,获取了哪些信息:  某日阳光灿烂,支付宝用户小明在淘宝上看中了暖脚器一只,价格100元。犹豫再三后小明使用支付宝网银完成了支付,支付宝显示支付成功,淘宝卖家通知他已发货,最近几日注意查收。
  小明:持卡人,消费者,淘宝和支付宝的注册会员,完成了支付动作,自己的银行账户资金减少,交易成功。
  银行:收单银行,接受来自支付宝的名为“支付宝BBB”的100元订单,并引导持卡人小明支付成功,扣除小明银行卡账户余额后返回给支付宝成功通知,并告诉支付宝这笔交易在银行流水号为“银行CCC”
  支付宝:支付公司,接收到淘宝发来的订单号为“淘宝AAA”的商户订单号,并形成支付系统唯一流水号:“支付宝BBB”发往银行系统。然后获得银行回复的支付成功信息,顺带银行流水号“银行CCC”
  淘宝:我们支付公司称淘宝这类电商为商户,是支付系统的客户。淘宝向支付系统发送了一笔交易收单请求,金额为100,订单号为:“淘宝AAA”,支付系统最后反馈给淘宝这笔支付流水号为“支付BBB”
  以上流程貌似大家都达到了预期效果,但实际上仍然还有一个问题:
  对支付公司(支付宝)而言,虽然银行通知了它支付成功,但资金实际还要T+1后结算到它银行账户,所以目前只是一个信息流,资金流还没过来。
  Tips:插一句话,对支付系统内部账务来说,由于资金没有能够实时到账,所以此时小明的这笔100元交易资金并没有直接记入到系统资产类科目下的“银行存款”科目中,而是挂在“应收账款”或者“待清算科目”中。大白话就是,这100元虽然答应给我了,我也记下来了,但还没收到,我挂在那里。
  对商户(淘宝)而言,虽然支付公司通知了它支付成功,他也发货了,但资金按照合同也是T+1到账。如果不对账确认一下,恐怕也会不安。
  倒是对消费者(小明)而言:反正钱付了,你们也显示成功了,等暖脚器呀等暖脚器~
  基于支付公司和商户的困惑,我们的支付结算系统需要进行两件事情:一是资金渠道对账,通称对银行帐;二是商户对账,俗称对客户帐。对客户帐又分为对公客户和对私客户,通常对公客户会对对账文件格式、对账周期、系统对接方案有特殊需求,而对私客户也就是我们一般的消费者只需要可以后台查询交易记录和支付历史流水就可以了。
  我们先聊银行资金渠道对账,由于支付公司的资金真正落地在商业银行,所以资金渠道的对账显得尤为重要。
  在一个银行会计日结束后,银行系统会先进行自己内部扎帐,完成无误后进行数据的清分和资金的结算,将支付公司当日应入账的资金结算到支付公司账户中。于此同时,目前多数银行已经支持直接系统对接的方式发送对账文件。于是,在某日临晨4点,支付宝系统收到来自银行发来的前一会计日对账文件。根据数据格式解析正确后和前日支付宝的所有交易数据进行匹配,理想情况是一一匹配成功无误,然后将这些交易的对账状态勾对为“已对账”。
  Tips:此时,对账完成的交易,会将该笔资金从“应收账款”或者“待清算账款”科目中移动到“银行存款”科目中,以示该交易真正资金到账。
  以上太理想了,都那么理想就不要对账了。所以通常都会出一些差错,那么我总结了一下常见的差错情况:
  1.支付时提交到银行后没有反馈,但对账时该交易状态为支付成功
  这种情况很正常,因为我们在信息传输过程中,难免会出现掉包和信息不通畅。消费者在银行端完成了支付行为,银行的通知信息却被堵塞了,如此支付公司也不知道结果,商户也不知道结果。如果信息一直没法通知到支付公司这边,那么这条支付结果就只能在日终对账文件中体现了。这时支付公司系统需要对这笔交易进行补单操作,将交易置为成功并完成记账规则,有必要还要通知到商户。
  此时的小明:估计急的跳起来了……付了钱怎么不给说支付成功呢!坑爹!
  TIPS:通常银行系统会开放一个支付结果查询接口。支付公司会对提交到银行但没有回复结果的交易进行间隔查询,以确保支付结果信息的实时传达。所以以上情况出现的概率已经很少了。
  2.我方支付系统记录银行反馈支付成功,金额为100,银行对账金额不为100
  这种情况已经不太常见了,差错不管是长款和短款都不是我们想要的结果。通常双方系统通讯都是可作为纠纷凭证的,如果银行在支付结果返回时确认是100元,对账时金额不一致,可以要求银行进行协调处理。而这笔账在支付系统中通常也会做对应的挂账处理,直到纠纷解决。
  3.我方支付系统记录银行反馈支付成功,但对账文件中压根不存在
  这种情况也经常见到,因为跨交易会计日的系统时间不同,所以会出现我们认为交易是23点59分完成的,银行认为是第二天凌晨0点1分完成。对于这种情况我们通常会继续挂账,直到再下一日的对账文件送达后进行对账匹配。
  如果这笔交易一直没有找到,那么就和第二种情况一样,是一种短款,需要和银行追究。
  以上情况针对的是一家银行资金渠道所作的流程,实际情况中,支付公司会在不同银行开立不同银行账户,用以收单结算(成本会降低),所以真实情况极有可能是:
  临晨1点,工行对账文件丢过来(支行A)
  临晨1点01分,工行又丢一个文件过来(支行B)
  临晨1点15分,农行对账文件丢过来
  。 。 。
  临晨5点,兴业银行文件丢过来
  。。。
  不管什么时候,中国银行都必须通过我方业务员下载对账文件再上传的方式进行对账,所以系统接收到中行文件一般都是早上9点05分……
  对系统来说,每天都要处理大量并发的对账数据,如果在交易高峰时段进行,会引起客户交互的延迟和交易的失败,这是万万行不得的所以通常支付公司不会用那么傻的方式处理数据,而是在一个会计日结束后,通常也是临晨时段,将前一日交易增量备份到专用对账服务器中,在物理隔绝环境下进行统一的对账行为,杜绝硬件资源的抢占。
  以上是银行资金渠道入款的对账,出款基本原理一致,不过出款渠道在实际业务过程中还有一些特别之处,由于大家不是要建设系统,我就不赘述了。
  谈完了资金渠道的对账,我们再来看看对客户帐。
  前面提到了,由于资金落在银行,所以对支付公司来说,对银行帐非常重要。那么同理,由于资金落在支付公司,所以对商户来说,对支付公司账也一样重要。能否提供高品质甚至定制化的服务,是目前支付公司走差异化路线的一个主要竞争点。
  之前说过,银行与支付公司之间的通讯都是可以作为纠纷凭证的。原理是对支付报文的关键信息进行密钥加签+md5处理,以确保往来报文“不可篡改,不可抵赖”。
  同理,支付公司和商户之间也会有类似机制保证报文的可追溯性,由此我们可以知道,一旦我方支付系统通知商户支付结果,那么我们就要为此承担责任。由此我们再推断一个结论:
  即便某支付订单银行方面出错导致资金未能到账,一旦我们支付系统通知商户该笔交易成功,那么根据协议该结算的资金还是要结算给这个商户。自然,我们回去追究银行的问题,把账款追回。
  没经过排版的小知识点---------------------------------------------------
  一、对支付系统而言,最基本的对账功能是供商户在其后台查询下载某一时间段内的支付数据文件,以供商户自己进行对账。
  这个功能应该是个支付公司就有,如果没有就别混了。
  二、对大多数支付系统而言,目前已经可以做到对账文件的主动投送功能。
  这个功能方便了商户系统和支付系统的对接,商户的结算人员无须登录支付平台后台下载文件进行对账,省去了人工操作的麻烦和风险。
  对大型支付系统而言,商户如果跨时间区域很大,反复查询该区域内的数据并下载,会对服务器造成比较大的压力。各位看官别笑,觉得查个数据怎么就有压力了。实际上为了这个查询,我最早就职的一家支付公司重新优化了所有SQL语句,并且因为查询压力过大服务器瘫痪过好几次。
  现在比较主流的做法是把商户短期内查询过、或者经常要查询的数据做缓存。实在不行就干脆实时备份,两分钟同步一次数据到专用数据库供商户查询,以避免硬件资源占用。甚至……大多数支付公司都会对查询范围跨度和历史事件进行限制,比如最多只能查一个月跨度内,不超过24个月前的数据……以避免服务嗝屁。
  对账这块大致就这样了,再往细的说就说不完了,
  风险控制,在各行各业都尤其重要。
  金融即风险,控制好风险,才有利润。
  虽然第三方支付严格意义上说并非属于金融行业,但由于涉及资金的清分和结算,业务主体又是资金的收付,所以风险控制一样非常重要。
  对支付公司来说,风控主要分为合规政策风控以及交易风控两种。
  前者主要针对特定业务开展,特定产品形态进行法规层面的风险规避,通常由公司法务和风控部门一起合作进行。例如,一家公司要开展第三方支付业务,现在要获得由人民银行颁发的“支付业务许可证”。遵守中国对于金融管制的所有条规,帮助人行监控洗钱行为……这些法规合规风险,虽然条条框框,甚至显得文绉绉,但如果没人解读没人公关,业务都会无法开展。
  当然,这块也不是本题所关注的重点,提问者关注的,应当是业务进行过程中的交易风控环节。
  现在随着各支付公司风险控制意识的加强,风控系统渐渐被重视起来。除了上述提到的合规风控相关功能,风控系统最讲技术含量,最讲业务水平,最考究数据分析的业务就是交易风控环节。
  对一笔支付交易而言,在它发生之前、发生过程中及发生过程后,都会被风控系统严密监控,以确保支付及客户资产安全。而所有的所有秘密,都归结到一个词头上:规则。风控系统是一系列规则的集合,任何再智能的风控方案,都绕不开规则二字。
  我们先看看,哪些情况是交易风控需要监控处理的:
  1.钓鱼网站
  什么是钓鱼呢?
  用我的说法,就是利用技术手段蒙蔽消费者,当消费者想付款给A的时候,替换掉A的支付页面,将钱付给B,以达成非法占用资金的目的。
  还有更低级的,直接就是发小广告,里面带一个类似http://tiaobao.com的网址,打开后和淘宝页面一摸一样,上当客户直接付款给假冒网站主。
  第一种情况风控系统是可以通过规则进行简单判定的,虽然有误杀,但不会多。
  通常使用的规则是判断提交订单的IP地址和银行实际支付完成的IP地址是否一致,如果不一致,则判断为钓鱼网站风险交易,进入待确认订单。
  但第二种情况,亲爹亲娘了,支付公司真的没办法。当然遇到客户投诉后可能会事后补救,但交易是无法阻止了。
  2.盗卡组织利用盗卡进行交易
  大家都知道,信用卡信息是不能随便公布给别人的,国内大多信用卡虽然都设置了密码,但银行仍然会开放无磁无密支付接口给到商户进行快速支付之用。
  所谓无磁无密,就是不需要磁道信息,不需要密码就可以进行支付的通道。只需要获取到客户的CVV,有效期,卡号三个核心信息,而这三个信息是在卡上直接有的,所以大家不要随便把卡交给别人哦~
  碰到类似的这种交易,风控系统就不会像钓鱼网站这样简单判断了。
  过去我们所有的历史交易,都会存库,不仅会存支付相关信息,更会利用网页上的控件(对,恶心的activex或者目前用的比较多的flash控件)抓取支付者的硬件信息,存储在数据库中。
  当一笔交易信息带着能够搜集到的硬件信息一同提交给风控系统时,风控系统会进行多种规则判定。
  例如:当天该卡是否交易超过3次
  当天该IP是否交易超过3次
  该主机CPU的序列号是否在黑名单之列
  等等等等,一批规则跑完后,风控系统会给该交易进行加权评分,标示其风险系数,然后根据评分给出处理结果。
  通过硬件信息采集以及历史交易记录回溯,我们可以建立很多交易风控规则来进行监控。所以规则样式的好坏,规则系数的调整,就是非常重要的用以区别风控系统档次高低的标准。
  例如,我听说著名的风控厂商RED,有一个“神经网络”机制,灰常牛逼。
   
  其中有一个规则我到现在还记忆犹新:
  某人早上八点在加利福尼亚进行了信用卡支付,到了下午一点,他在东亚某小国家发起了信用卡支付申请。系统判断两者距离过长,不是短短5小时内能够到达的,故判定交易无效,支付请求拒绝。
  规则非常重要,当然,数据也一样重要。我们不仅需要从自己的历史记录中整合数据,同时还要联合卡组织、银行、风控机构,购买他们的数据和风控服务用来增加自己的风控实力。
  SO,风控是一个不断积累数据、分析数据、运营数据、积累数据的循环过程。
  好的风控规则和参数,需要经过无数次的规则修改和调整,是一个漫长的过程。
  不知道大家做互联网,有没有利用GA做过AB测试,同样的,风控系统也需要反复地做类似AB测试的实验,以保证理论和实际的匹配。
  最后给大家说一个小小的概念:
  所谓风控,是指风险控制,不是风险杜绝。
  风控的目标一定不是把所有风险全部杜绝。
  合理的风控,目标一定是:利润最大化,而不是风险最小化
  过于严格的风控规则,反而会伤害公司利益(看看销售和风控经常打架就知道了)
  不光是交易的风控,我们日常制定规则,法规,公司流程,也一定要秉着这个出发点进行规划。

posted @ 2015-09-09 23:09 paulwong 阅读(901) | 评论 (0)编辑 收藏

仅列出标题
共119页: First 上一页 37 38 39 40 41 42 43 44 45 下一页 Last