百科定义为支付网关(Payment Gateway)是银行金融网络系统和Internet网络之间的接口,是由银行操作的将Internet上传输的数据转换为金融机构内部数据的一组服务器设备,或由指派的第三方处理商家支付信息和顾客的支付指令。其实简而言之就是提供一个网关适配器,来桥接买家-商户-银行,实现支付功能,买家可以根据个人喜好自由选择支付中使用的银行卡,而网关根据对应银行卡的请求对应的银行进行相应的支付,将支付结果告知商户和买家,帮商户实现交易支付入账、查询、退款等功能。
健壮的支付网关应该提供支付,查询,对账,退款四个功能。
首先看看一笔普通的支付流程
1.买家选购商品下单后生成订单
2.用户点击支付将请求参数提交给网关
3.网关验证签名通过后,向对应银行渠道或者第三方支付渠道提交支付申请
4.将银行处理后的支付结果同步通知给买家确认扣款支付成功,同时异步通知给商户该笔订单支付成功
5.商户确认收到通知后网关进行记账,商户根据业务需求执行订单后续操作
关于签名:
可以看出网关通讯中签名至关重要,是一道桥接的屏障,一把开启支付大门的钥匙。所以各大支付渠道根据各自的业务有对签名特殊和个性的需求,也就致使对接各个支付渠道时候要适配这种区别才能顺利接入,接入的速度也就会受这些所影响。
下面看下主流的签名方式:
1.MD5签名
开户后商户会有自己的商户号和MD5时候使用的私钥,参数加密后需要将私钥拼接到对应的请求参数串后面,形成最终的请求参数字符串,然后对其进行MD5加密,产生32为的签名字符串。
这里有必要说下请求参数串,一般都是将请求参数数组里的每一个值按从a 到z 的顺序排序,若遇到相同首字母,则看第二个字母,以此类推。排序完成之后,再把所有数组值以“&” 字符连接起来,如:
待签名字符串:bank_code=WAP_ZFB&buy_way=9&order_no=E20150102&pay_time=111111&phone=13635749989&input_cha=GBK¬ify_url=http://***
在PHP 中有现成的函数ksort 可以实现这种字符串
ksort()PHP ksort() 函数用于对数组单元按照键名从低到高进行排序,如果成功则返回 TRUE,失败则返回 FALSE。本函数会保留原来的键名,因此常用于关联数组。
2.NC请求获取方式
NC(Netsafe Client),是指企业提供前置机用于生成签名和验证签名的一套更安全的银企互联的桥接系统。
系统1是采用非NC方式的,系统2采用NC方式