说明:这里只涉及到微信支付和淘宝支付
以官网的接口为准,主要关注【网关】、【接口】、【参数】【加密方式】【签名】【回调】
第一步,了解自己的项目要集成的支付方式
常见的有扫码支付、网页支付、APP支付。
第二步,了解支付商(微信/支付宝)的支付接口
微信和支付宝的接口所需要的参数内容大致是一样的,不同的在于参数名,签名方式不一样
其中扫码支付和网页支付的接口是同一个,因为网页支付是可以通过APP扫码支付和登录支付账号进行支付的;而APP支付的接口是另一个
微信支付开发流程:
关键的配置参数有:【支付网关】、【appid】、【私钥】、【签名方式】、【回调地址】、【商户号】、【签名】
支付参数有:【订单号】、【订单金额】、【订单描述】
微信的签名方式目前规定使用的是MD5;
回调地址:POST请求方式,必须是公网可访问(可以是IP也可以是域名),不能带任何参数、回调的参数要以流的方式进行接收,且为XML格式;
私钥:用于签名,签名的目的就是加密数据,防止交易数据被篡改。
流程
- 打包参数(根据统一下单接口的要求提供必需参数)
所有参数以key=value方式存在,各参数之间&方式连接,最后用私钥进行MD5加密,然后将得到的签名以sgin为key放入到参数的最后面,并转为XML格式字符串。
- 统一下单
(1) 这一步最主要的用途就是得到支付接口所需要的prepay_id
(2) 以POST方式发送http请求,所有参数要转为XML格式串
- 打包参数(根据支付接口的要求提供必需参数)
所有参数以key=value方式存在,各参数之间&方式连接,最后用私钥进行MD5加密,然后将得到的签名以sgin为key放入到参数的最后面。
- 调用支付接口
支付宝支付开发流程:
- 支付宝比微信要简单些,因为支付宝对签名进行了封装,只需要把参数打包,调用方式就进行了签名等必要操作(微信支付也可以按此方式自己进行封装),返回的串可以直接给支付接口。
- 封装的接口有sdkExecute和pageExecute,当支付方式为APP时,调用sdkExecute,当为NATIVE时调用pageExecute
- 签名:使用RSA2
开发时遇到的问题(微信的要仔细些,坑多)
- 因参数名不对,导致失败
微信的一个坑:微信的统一下单与支付接口,某些参数名不一样,而实际表示的内容是一样的。
比如商户号:统一下单中是mch_id,而支付接口中是partnerid
- 因签名加密方式不对,导致失败
微信的一个坑:微信提供的demo中,如果不是沙箱环境,就使用HMACSHA256的加密方式进行签名,而实际生产环境中是要使用MD5的,且两次加密的方式必需一致。MD5加密后的串是32位,HMACSHA256加密后的串是64位,可以通过这个差别来判断出前后签名使用的加密方式是否一致。
- 回调处理业务逻辑
回调时要做的几件事:
- 验证签名
- 签名验证通过后,再进行订单号,商户号,订单金额,appid的一致性验证
参数名不一样:因为我开始是将微信和支付宝的回调处理业务逻辑放在一起的,而微信和支付宝返回的参数名是不一样的,所以最好还是分开处理
订单金额单位不一样:微信是分,支付宝是元。所以在处理时,我统一将单位换算为分,那么在接收订单金额时,支付宝返回的就有可能是带小数点的,在处理时就用到了Double去处理,Double处理后的数据是带了小数点,我当时在做订单金额比较时,先用Integer对数据进行转换后再相减,Integer对带了小数点的数字是转换不了的(而且当时后台程序也没报错),所以这里要注意,后面我统一使用的是Double