详解destoon支付过程
2020-12-20 11:32:28
提交支付
/member/order.php?itemid=61&action=update&step=pay
对应的模板中,点击“立即支付”按钮时,触发js事件:
function check() {
if(money > 0.00) {
Go('charge.php?action=pay&reason=trade|61&amount='+money+'&bank='+$('#bank').val());
return false;
}
从而跳转到 /member/charge.php
进行支付
/member/charge.php?action=pay&reason=trade|61&amount=0.01&bank=alipay
charge.php里做的事:
$PAY = cache_read('pay.php');
读取支付配置$MOD['pay_online'] or dheader('?action=card');
检测是否开启了在线支付,检测是否设置了最小额度:if($MOD['mincharge']) { $mincharge = intval($MOD['mincharge']); } else { $mincharge = 0; if($amount) $auto = 1; }
默认 $auto为开启,及自动支付
$PAYLIST = get_paylist();
获取支付配置include template('charge', $module);
记在charge模板模板中:
{if $PAYLIST} {loop $PAYLIST $k $v} <tr> <td><input type="radio" name="bank" value="{$v[bank]}" id="bank-{$v[bank]}"{if $v[bank]==$bank} checked{/if}/></td> <td><label for="bank-{$v[bank]}" class="c_p"><img src="{DT_PATH}api/pay/{$v[bank]}/logo.gif" alt=""/></label></td> <td>{if $v[percent]>0}手续费 {$v[percent]}%{/if}</td> </tr> {/loop} {else} <tr> <td class="f_red"><br/>抱歉,系统未设置支付平台,暂时无法在线支付</td> </tr> {/if}
页面会默认选中bank参数传递的支付方式即:alipay
但是某些情况下页面是自动跳转的,原因第2步中auto开启的情况下会执行下面的js:{if $auto}$('body').hide();Dd('dform').submit();{/if}
即未设置最小额度的情况下会自动提交(这个设计是啥脑回路?不是自动判断下金额大于最小额度也可以提交的吗?)
- form提交传递参数$action=confirm auto=1 reason=trade|61
- confirm方法中:finance_charge表中记录此次地支付信息,并用cookie记录orderid和支付银行,回调的时候会用到;包含支付文件发起支付
$db->query("INSERT INTO {$DT_PRE}finance_charge (username,bank,amount,fee,sendtime,reason) VALUES ('$_username','$bank','$amount','$fee','$DT_TIME','$reason')");
$orderid = $db->insert_id();
set_cookie('pay_id', $orderid);
set_cookie('pay_bank', $bank);
include DT_ROOT.'/api/pay/'.$bank.'/send.inc.php';
进入支付界面
/api/pay/alipay/send.inc.php
- $parameter组合好支付需要的所有参数
$alipay = new alipay_service($parameter, $security_code, $sign_type); $URI = $alipay->create_url();
调用alipay_service类生成支付url<meta http-equiv="refresh" content="0;url=<?php echo $URI;?>">
自动跳转到支付界面
支付回调
支付成功后回回调设置的notify_url即后台配置的回调。默认为:/api/pay/alipay/notify.php. 调用alipay_notify类
- notify_verify方法验证回调秘钥是否匹配
- 如果验证通过则继续验证金额是否匹配,如果匹配则进入 /api/pay/success.inc.php 输出 success 告诉阿里回调ok
- success.inc.php中 money_add money_record 如果reason为trade则继续更新订单状态,发送短信等。
总结:
使用js实现自动跳转。读取后台的支付配置,使用阿里的sdk生成支付url,自动跳转到支付界面。支付成功后回调。