第三方支付对接流程

Posted by zhida.liao on May 22, 2016

第三方支付

1、简单加密

目的是为了保证上传的参数信息没有被篡改,主要分成三部分

  • 接口参数 : 需要和第三方对接的参数
  • 加密类型 : 使用什么类型加密,一般为MD5
  • 加密密文 : 使用接口参数和第三方生成的Code值(固定salt),进行MD5加密成密文

Md5作为数字签名 H(A)=P 已知A P,在特殊情况下可以伪造A1 满足H(A1)=p

2、生成加密的密钥Key

随机生成16位的加密密钥Key,用于对上一步的内容进行对称加密

3、使用证书加密密钥Key

对随机生成的密钥key进行加密。防止在传输过程中被截获破解。

使用了三种加密算法:
  • 摘要算法:验证原文是否被篡改
  • 对称加密算法:使用密钥对原文进行加密(AES)
  • 非对称加密算法:对密钥进行分发

两方的处理步骤

发送方
  • 入参 + H(入参+分配的code)= P 得到键值对 ParamMap
  • AES ( ParamMap + 随机生成的Key ) 进行对称加密得到 DecodeString
  • 随机生成的Key + 私钥证书加密, 得到 EnCodeKey
  • Http发送请求, 将 DecodeString 和 EnCodeKey发送给第三方支付公司
接收方
  • 证书加密的随机数,使用私钥解密得到 Akey
  • AES(AKey) = sourceCode(“入参”,”P”)
  • 验证:H(sourceCode + code) = P

一般的接口调用校验流程

  • 请求参数按照参数名字符升序排列,如果有重复参数名,那么重复的参数再按照参数值的字符升序排列。
  • 所有参数(除了sign和sign_type)按照上面的排序用&连接起来,格式是:a=v1&b=v2。
  • 将上面参数组成的字符串加上安全校验码组成待签名的数据,安全校验码通过平台分配,假设安全校验码为123456789,那计算sign的原串为a=v1&b=v2123456789

伪代码

H (user=tom&pass=123&key=abc) = P
API post ("user=tom&pass=123","P")

key只有两方内部保存,确保传递的参数没有被第三方篡改。