详解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里做的事:

  1. $PAY = cache_read('pay.php'); 读取支付配置
  2. $MOD['pay_online'] or dheader('?action=card'); 检测是否开启了在线支付,检测是否设置了最小额度:

        if($MOD['mincharge']) {
            $mincharge = intval($MOD['mincharge']);
        } else {
            $mincharge = 0;
            if($amount) $auto = 1;
        }

    默认 $auto为开启,及自动支付

  3. $PAYLIST = get_paylist(); 获取支付配置
  4. include template('charge', $module); 记在charge模板
  5. 模板中:

    {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}

    即未设置最小额度的情况下会自动提交(这个设计是啥脑回路?不是自动判断下金额大于最小额度也可以提交的吗?)

  6. form提交传递参数$action=confirm auto=1 reason=trade|61
  7. 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

  1. $parameter组合好支付需要的所有参数
  2. $alipay = new alipay_service($parameter, $security_code, $sign_type); $URI = $alipay->create_url(); 调用alipay_service类生成支付url
  3. <meta http-equiv="refresh" content="0;url=<?php echo $URI;?>"> 自动跳转到支付界面

支付回调

支付成功后回回调设置的notify_url即后台配置的回调。默认为:/api/pay/alipay/notify.php. 调用alipay_notify类

  1. notify_verify方法验证回调秘钥是否匹配
  2. 如果验证通过则继续验证金额是否匹配,如果匹配则进入 /api/pay/success.inc.php 输出 success 告诉阿里回调ok
  3. success.inc.php中 money_add money_record 如果reason为trade则继续更新订单状态,发送短信等。

总结:
使用js实现自动跳转。读取后台的支付配置,使用阿里的sdk生成支付url,自动跳转到支付界面。支付成功后回调。

致知网络科技© 2020-2025 鲁ICP备20031360号-2