本文禁止"著名机场主"海鸥阅读(不是自己很牛逼吗?不是支付很简单吗?有本事自己搞去,别看我的。)。

现在sspanel主题五花八门,但大多数用的是malio,malio与其他主题不太一样,魔改了很多部分,尤其是对接支付时,原版支付对接教程总是不能适用于malio,但是我们可以采用替换原有的支付方式里的代码,更改为要对接的支付的支付逻辑,达到简便对接的目的。

下面就以番茄支付的相关源码为例子(不是对接番茄支付,倒闭还怎么接),介绍一下malio主题支付系统的相关逻辑,持续更新。

本文也适用于其他主题按照这种替换的模式对接支付,转载请注明来源作者。

我们首先来看Services/Gateway/TomatoPay.php


class TomatoPay extends AbstractPayment{
先从这句开始,这句是声明类TomatoPay继承类AbstractPayment,类AbstractPayment有与支付相关的一些函数。(待补充)

$type = $request->getParam('type');
$price = $request->getParam('price');

获取用ajax提交的数据,type为支付方式,price为价格,我通常在判断支付金额前把price转换为两位小数。



if($price <= 0){
            return json_encode(['errcode'=>-1,'errmsg'=>"非法的金额."]);
        }
这里是判断金额是否合法(大于零),如果金额小于等于零为真,就返回json形式的错误信息,也就是能在前台看到一个有errmsg内容的一个警告提示框。

      $user = Auth::getUser();
        $settings = Config::get("tomatopay")[$type];
        $pl = new Paylist();
        $pl->userid = $user->id;
        $pl->total = $price;
        $pl->tradeno = self::generateGuid();
        $pl->save();
        

这段是获取支付时的价格、订单号等信息,不详细说了。


$fqaccount=$settings['account'];
$fqkey=$settings['token']; 
$fqmchid = $settings['mchid'];
$fqtype = 1;
$fqtrade = $pl->tradeno;
$fqcny = $price;
获取.config.php里的支付配置的account、token、mchid也就是帐号、密钥、商户号,下面是设置支付方式为1,(番茄里支付宝支付传递type参数为1而不是alipay),接着是设置订单号、价格。 这里我贴出来.config.php里的有关内容

$_ENV['tomatopay'] = [
        'wxpay'=>[
            'mchid' => '',   // 商户号
            'account' => '', //您在番茄云支付的登录邮箱
            'token' => "" // 安全验证码
        ],
        'alipay'=>[
            'mchid' => '',   // 商户号
            'account' => '', //您在番茄云支付的登录邮箱
            'token' => "" // 安全验证码
        ],
 ];


这个版本的番茄支付是微信、支付宝可以分别用两个帐号收款,那是怎么分别获取相关配置呢?我把有关源码整合一下,一看就明白了。这里我记得好像有个主题的源码ajax提交的type值为1、2、3不是现在这套的alipay wxpay,所以是if判断支付方式然后在支付方式里设置相关变量。



$type = $request->getParam('type');
 $settings = Config::get("tomatopay")[$type];

下面逻辑是把加密的信息整合成一个数组,然后再加密,吐槽一下data数组根本没用上,应该是想把这个数组按照{key}={value}排序吧,结果直接硬生生拼接变量搞出来了,差评。


        $data = [
            'account' => $settings['account'],
            'mchid' => $settings['mchid'],
            'type' => 1,
            'trade' => $pl->tradeno,
            'cny' => $price,
        ];

        $signs = md5("mchid=".$fqmchid."&account=".$fqaccount."&cny=".$fqcny."&type=1&trade=".$fqtrade.$fqkey);
        $url="https://b.fanqieui.com/gateways/".$type.".php?account=".$fqaccount."&mchid=".$fqmchid."&type=".$fqtype."&trade=".$fqtrade."&cny=".$fqcny."&signs=".$signs;

上面完成后就是返回信息了
参数code为html代码、errcode错误代码为零表示正常、tradeno订单号。这样支付逻辑就完成了,


$result = array('code'=>$url,'errcode'=>0,'tradeno' => $pl->tradeno );
        return $result;
下面是异步通知逻辑,和上面差不多,我大致说一下。security这个数组就是获取服务器异步通知的各种信息,然后排序加密,获取sign值。

foreach ($security as $k=>$v)
{
    $o.= "$k=".urlencode($v)."&";
}
$sign = md5(substr($o,0,-1).$settings['token']);


在验证sign值 验证成功之后最关键的一句话是下面这句,加钱用的。


$this->postPayment($order_data['out_trade_no'], "在线支付");
如果没有验重这个代码的可以参考下面示例代码。

//验重
             $p = Paylist::where('tradeno', '=', $order_data['out_trade_no'])->first();
             $money = $p->total;
             if ($p->status != 1) {
           $this->postPayment($order_data['out_trade_no'], "kfc支付");
        echo 'success';
        }else{
        echo "订单重复";
        }
   

下面还有一句可能是判断是不是同步通知,我没用过番茄支付,虽说开了两个帐户,我记得同步异步通知好像是一个地址?如果是同步通知就跳转到充值页面


      if($ispost==0) header("Location: /user/code");
        
异步同步通知地址是没有写在源码里面的,需要到番茄后台自行设置,所以你按照番茄改的时候记得找一下异步同步通知地址,下面的html代码就不说了,很简单。 *2020/05/18更新* 有人不知道怎么找番茄的异步通知地址,我说一下,在/config/routes.php里就可以看到,在下面代码可以看到get/post皆可,地址可以是http://xxx.com/tomato_back/notify?。

$app->post('/tomato_back/{type}', 'AppServicesPayment:notify');
$app->get('/tomato_back/{type}', 'AppServicesPayment:notify');

个人总评
番茄支付的源码水平一般,逻辑就是典型的易支付逻辑只不过少了几个参数还有多了一个account参数,因为不知道account具体有什么用处所以感觉account参数有点多余,这套可能和我一样的风格能用就行,有些地方代码不够简洁,不过基本各类主题都有适配,厉害⊙▽⊙。

正题开始
以上基本是废话,水水更健康,到底要怎么对接呢?请参照下方示例文件中的代码修改Services/Gatway/Tomatopay.php。示例文件不是直接就能在malio上用,是其他主题的,需要自行小修才能使用,防止某些人倒卖,基本采用拼音方式命名变量,勿喷。


有償代接請聯係[email protected]
对接任何php程序

附件TomatoPay.zip
实用代码http://9shi.me/index.php/archives/62.html