我们开发了一套完整的开源的聚合支付系统 易吉聚合支付系统, 但是考虑到有很多小伙伴并不需要一个完整的聚合支付系统,只是想在自己已有的系统里添加一个聚合支付功能模块。基于这样的需求,我们把 易吉聚合支付系统 里的核心模块(聚合支付模块)独立出来做成一个开源的小项目,并且用 ThinkPHP6 进行了重写,我们把所有聚合支付的功能做成一个应用模块,如果你的项目是用 TP6 开发的,可以直接复制这个应用文件夹到你的项目里使用。如果你的项目不是 TP6 开发的甚至不是 PHP 开发的也没有关系,我们会一步步详细的介绍具体的开发思路和逻辑,你按照我们提供的逻辑用自己熟悉的开发语言实现就可以了。
完成了app\Payment\controller\PaymentAccount.php 里获取支付通道账号的逻辑代码,新增了数据库表
具体的逻辑是:可以给用户指定某个通道分类的具体某个通道使用哪一个具体的通道账号,或者按照随时轮循或条件轮循的规律来获取通道账号。条件轮循分为 指定时间内可以使用这个账号,指定交易金额范围内可以使用这个账号,指定省市的用户可以用这个账号。 具体的大家看代码吧,有问题可以加QQ群:869131049 交流
优化了入口文件的代码,添加了针对不同的接口版本设置用户订单号是否可以重复。分为两种情况,一种是同一用户的用户订单号不可以重复,还有一种是所有用户的用户订单号都不可以重复。
新增了数据库SQL文件
修改了验证支付通道数据传输加密方法(app\Payment\common.php verify_sha1)
新增了 app\Payment\controller\payment.php 代码, 还没有写完,明天接着写。
class Payment
{
public $parameter = "";
public $payment_class_name = ""; //支付通道类名
public $payment_obj = ""; //用来存储实例化的支付通道
public function __construct(&$parameter)
{
$this->parameter = &$parameter;
}
public function index()
{
return (
$this->verifyData()
&& $this->checkPaymentClass()
&& $this->instantiatePaymentObj()
&& $this->checkPaymentObj()
);
}
//验证请求过来的数据是否合法
private function verifyData()
{
if(!verify_sha1($this->parameter['formatdata'])){
$this->parameter['msg'] = '请求数据不合法';
return false;
}
return true;
}
//判断此用户是否可以调用所选通道分类
private function checkPaymentClass()
{
//首先判断通道分类总开关是否半闭
$PaymentChannelClassFind = PaymentChannelClass::where('classbm','=',$this->parameter['formatdata']['tongdao'])
->field('id,status,classname')
->findOrEmpty();
if($PaymentChannelClassFind->isEmpty()){
$this->parameter['msg'] = '通道分类不存在';
return false;
}
if($PaymentChannelClassFind['status'] === 0){
$this->parameter['msg'] = '通道分类['.$this->parameter['formatdata']['tongdao'].']已禁用';
return false;
}
//接下来判断给此用户是否设置了此通分类下的具体支付通道(我太难了,写注释太痛苦了!!!!!)
$UserPaymentChannelClassFind = UserPaymentChannelClass::where([
['user_id','=',$this->parameter['formatdata']['usrid']],
['payment_channel_class_id','=',$PaymentChannelClassFind['id']]
])->field('payment_channel_id')->findOrEmpty();
if($UserPaymentChannelClassFind->isEmpty() || $UserPaymentChannelClassFind['payment_channel_id'] === 0){
$this->parameter['msg'] = "用户在通道分类--".$PaymentChannelClassFind['classname']."--下无可用通道";
return false;
}
// 判断具体的支付通道
$PaymentChannelFind = PaymentChannel::field('payment_codeing,payment_status')->findOrEmpty($UserPaymentChannelClassFind['payment_channel_id']);
if($PaymentChannelFind->isEmpty()){
$this->parameter['msg'] = '支付通道不存在';
return false;
}
if($PaymentChannelFind['payment_status'] == 0){
$this->parameter['msg'] = '支付通道已禁用';
return false;
}
if (preg_match("/[^A-Za-z]/",$PaymentChannelFind['payment_codeing'])){
$return_json['msg'] = '支付通道文件名格式错误';
return false;
}
$this->payment_class_name = $PaymentChannelFind['payment_codeing'];
return true;
}
// 实例化通道类
private function instantiatePaymentObj()
{
$class_name = "app\\Payment\\payment_channel\\".$this->payment_class_name;
if(!class_exists($class_name)){
$return_json['msg'] = '支付通道类文件格不存在';
return false;
}
$this->payment_obj = new $class_name();
return true;
}
//验证域名和状态
private function checkPaymentObj()
{
//判断通道状态
if(!(($this->payment_obj)->checkStatus)){
$this->parameter['msg'] = '支付通道类文件里已禁用';
return false;
}
//验证域名
if(($this->payment_obj)->CheckDomain){
$user_domain = request()->host();
$count = Domain::where([
['user_id','=',$this->parameter['formatdata']['userid']],
['domain','=',$user_domain]
])->count();
if($count <= 0){
$this->parameter['msg'] = '请求域名非法';
return false;
}
}
return true;
}
}
├─app
│ ├─.htaccess
│ ├─AppService.php
│ ├─BaseController.php
│ ├─common.php
│ ├─event.php
│ ├─ExceptionHandle.php
│ ├─middleware.php
│ ├─Payment --------------------------- // 聚合支付应用模块
│ │ ├─check --------------------------- // 存储自定义数据验证类的文件夹
│ │ │ └─CheckIp.php ------------------- // 自定义数据验证类文件
│ │ ├─common.php
│ │ ├─config
│ │ │ └─payment.php ------------------- // 聚合支付应用模块配置文件
│ │ ├─controller
│ │ │ └─Index.php --------------------- // 支付接口入口文件
│ │ │ └─Payment.php --------------------- // 核心通道处理类
│ │ ├─payment_channel //支付通道类文件夹
│ │ │ └─PaymentDemo.php --------------------- // 支付通道类文件
│ │ ├─event.php
│ │ ├─middleware.php
│ │ ├─model
│ │ │ ├─PaymentChannelMerchant.php
│ │ │ ├─PaymentLog.php
│ │ │ ├─PaymentVersion.php
│ │ │ ├─TradeAmount.php
│ │ │ ├─TradeList.php
│ │ │ ├─User.php
│ │ │ ├─UserIp.php
│ │ │ └─UserSecretkey.php
│ │ ├─version ------------------------- // 自定义版本文件夹
│ │ │ ├─DefaultVersion.php ------------ // 自定义版本类文件
│ │ │ ├─VersionAbs.php ---------------- // 抽象类,所有的自定义版本类必须 extends 它
│ │ │ └─VersionApi.php ---------------- // 接口类,所有的自定义版本类必须 implements 它
│ │ └─view
│ ├─provider.php
│ ├─Request.php
│ └─service.php
├─composer.json
├─composer.lock
├─config
├─extend
│ └─.gitignore
├─LICENSE
├─LICENSE.txt
├─public
├─README.md
├─route
│ └─app.php
├─think
├─vendor
└─view
└─README.md
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。