支付整理
今天整理一下支付流程
有多种支付方式,大体流程大同小异,存在前台同步回调,后台异步回调。
app中对接的支付宝支付,微信支付,云闪付等。
wap站端。
pc端除了微信支付我熟悉其他支付方式略知一二。
wap端,支付方式包括,支付宝(当然微信内被屏蔽,需要复制支付链接重定向),微信(微信端,微信H5支付),快钱,云闪付(非本人开发),通联聚合支付(微信浏览器的微信支付其底层用的是通联微信支付),大额支付(快钱大额支付)。
首先介绍一下大概我的理解
为什么我们系统的微信支付改为通联聚合支付,我的理解是,因我们直接跟微信结算手续费率高,降低成本,如果我们跟通联进行结算费率低,
通联的聚合支付就是,把原先的支付宝、微信和云闪付等平台支付方式进行套壳。其底层还是相关平台支付。
微信支付分为两种,微信内(判断是否是微信浏览器),手机端微信外H5支付。
支付宝手机端:
封装表单提交
form id='alipaysubmit' name='alipaysubmit' action='https://mapi.alipay.com/gateway.do?_input_charset=utf-8' method='post'
input支付宝需要的参数 -->
input订单号或者请求单号(用于同步或异步回调关联订单用)
document.forms['alipaysubmit'].submit();
后端返回拼装好的submit请求,前台直接$("#zfbHtmlText").html(data.data.zfbHtmlText);进而完成提交表单。
微信(微信浏览器内):
重定向授权路径,里面包含redirect_uri回调地址
topay获取微信回调信息。
注意:参数回调需要加解密校验,否则存在漏洞
跳转到接受参数页面,如jsp页面。
jsp中内嵌javascript
function callpay(){
try{
WeixinJSBridge.invoke('getBrandWCPayRequest',{
"appId" : $("#appid").val(),
"timeStamp" : $("#timeStamp").val(),
"nonceStr" : $("#nonceStr").val(),
"package" : $("#package").val(),
"signType" : "MD5",
"paySign" : $("#sign").val()
},function(res){
if (res.err_msg == "get_brand_wcpay_request:ok") {
} else if (res.err_msg == "get_brand_wcpay_request:cancel") {
}
})
} catch (e) {
alert(e);
}
}
$(document).ready(function() {
if (typeof(WeixinJSBridge) == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', callpay, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', callpay);
document.attachEvent('onWeixinJSBridgeReady', callpay);
}
}else{
callpay();
}
});
微信支付(H5):
重定向到支付平台,完成支付后,同步回调合作平台。
快钱支付:
重定向到支付平台,可选择银行卡,或者信用卡支付,可设置信用卡不可支付参数。
完成支付后,同步回调合作平台。
通联微信集合支付,返回payinfo参数,直接作为微信内嵌函数参数如:
WeixinJSBridge.invoke('getBrandWCPayRequest',payinfo,function(res){
if (res.err_msg == "get_brand_wcpay_request:ok") {
} else if (res.err_msg == "get_brand_wcpay_request:cancel") {
} else {
}
})
优化支付回调接口,可以使用AOP,在回调方法上增加回调日志(消息队列日志的数据库存储)。