mantoufan / yzhanPay

简洁、高效的多用户、多语言、用插件扩展的聚合支付系统,已集成 Alipay China, Alipay Global 和 Paypal

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Introduction

Simple and efficient multi-user, multi-language converged payment system. Provides cash payment and Auto Debit via one URL, supports Alipay China, Alipay Global and Paypal, etc., it can be extended through plug-ins. Admin Panel can view logs, transaction flow, configuration.

简洁、高效的多用户、多语言的聚合支付系统。 通过一个 URL 提供现金付款和订阅支付(Auto Debit),支持支付宝**,支付宝国际版和 Paypal 等,可通过插件扩展。Admin panel 可查看日志、交易流水,配置。

Suitable for cashier, multi-channel collection, multi-channel settlement, four-party payment, payment load balancing and other scenarios.

适合收银台、多渠道收款、多渠道结算、四方支付、支付负载均衡等场景。

What is Converged Payment System

What is Converged payment system

License Agreement

The system shall not be used for any purposes prohibited by laws of mainland China, Hong Kong or the United States.
The system shall not be used for commercial purposes without permission.

本系统不得用于**大陆、香港、美国法律所禁止的用途。
未经许可,不得用于商业用途。

Demo

Checkout Page

Checkout Page

ScreenShoot

  • PC Checkout Page PC Screenshoot
  • Mobile Checkout Page Mobile Screenshoot

Admin Panel

Admin
Account: admin
Password: yzhan

ScreenShoot

Admin Panel

Install

Step 1 Import SQL

source install.sql

Step 2 Update Your Channel Config

  • Get your app_id client_id secret key from Alipay China / Alipay Global / Paypal
  • Find yzhan_channel, update config field

Step 3 Install Dependency

# Front-End: Enter Project Root Directory / 
npm install
# Back-End: Eneter /src/api/
composer require

Step 4 Add scheduled task

Add the URL below to the scheduled task

{Your Website Url}/api/run/{Maximum number of tasks per run}

Examples of setting scheduled tasks:

  • Use BT panel
    Run task on BT panel
  • Use Linux crontab
crontab -e # Edit Crontab
*/1 * * * * wget {Your Website Url}/api/run/{Maximum number of tasks per run} # wget / curl URL every 1 minute

Document

How to Use

Cash payment and Subscription payment are combined into one API:
API Document

How to add a new Plugin

Step 1 Create a Plugin in Admin Panel

Create a Plugin in Admin Panel

Step 2 Create a Json to describe the Plug-in

// JSON doesn't support comments. 
// Please delete comments when copying
{
	"name": "paypal", // Plugin Name
	"version": "1.0.0", // Plugin Version
	"displayname": "Paypal", // Plugin Display Name
	"type": "pay", // Plugin Type, Optional: pay / theme / language
	"payment": "depositcard,paypal", // Payment provided by the plug-in to the user
	"ability": "checkout,subscription", // Payment ability provided by plugin
	"author": "mantoufan", // Plugin author
	"link": "https://github.com/mantoufan", // Plugin Website URL
	"input": [ // Configurable items provided by plugin, it can be configured in Admin Panel
		{ "type":"text", "label":"Client ID", "name":"client_id" },
		{ "type":"text", "label":"Secret", "name":"secret" },
		{ "type":"checkout", "label":"Sandbox", "name":"is_sandbox" }
	],
	"composer": {
		"require": { // Dependent third-party components
			"paypal/paypal-checkout-sdk": "^1.0",
			"andreimosman/paypal-subscriptions-sdk": "^1.0"
		}
	}
}

Step 3 Create a Plugin folder

  • Save JSON as config.json
  • Put it into new folder
  • Rename folder name with plugin name

Step 4 Implement abstract class

  • Create a php named plugin name
  • Implement abstract class in it
abstract class MyPaymentPlugin {
  public function getGateway($channel_id) // Get the configuration and initialize the gateway
  {
      $config = PluginService::GetChannelConfig($channel_id);
      if (empty($config)) {
          $this->export(array('status' => 403));
      }
      if ($config['env'] === 'sandbox') {
          $environment = new SandboxEnvironment($config['client_id'], $config['secret']);
      } else {
          $environment = new ProductionEnvironment($config['client_id'], $config['secret']);
      }
      return new PayPalHttpClient($environment);
  }
  abstract public function checkout($channel_id, $params); // Single Payment -> Pay Channel Cashier
  abstract public function sync($channel_id); // Process sync notifications received by checkout / subscribe
  abstract public function async($channel_id); // Process async notifications received by checkout / subscribe
  abstract public function cancel($channel_id); // Process user cancel, paypal only
  abstract public function subscribe($channel_id, $params); // Subscribe Payment -> Pay Channel Agreement or Auth Page
  abstract public function syncSubscribe($channel_id); // Process sync notifications received by subscribe
  abstract public function asyncSubscribe($channel_id); // Process async notifications received by subscribe
  abstract public function charge($channel_id, $params = array('trade_no' => 0, 'customer_id' => 0, 'subscription_id' => 0, 'note' => '', 'amount' => 0, 'currency' => ''));
  // Subscribe Payment -> Initiate the request to deduct the fee, Alipay Global Only
}

Flow

State Machine

All Trade Status in System

const TRADE_STATUS = array(
    'CREATED' => 'CREATED',
    'CHECKOUT_SUCCEED' => 'CHECKOUT_SUCCEED',
    'CHECKOUT_FAIL' => 'CHECKOUT_FAIL',
    'SUBSCRIPTION_WAIT_REMIND' => 'SUBSCRIPTION_WAIT_REMIND',
    'SUBSCRIPTION_WAIT_CHARGE' => 'SUBSCRIPTION_WAIT_CHARGE',
    'SUBSCRIPTION_CHARGE_SUCCEED' => 'SUBSCRIPTION_CHARGE_SUCCEED',
    'SUBSCRIPTION_CHARGE_FAIL' => 'SUBSCRIPTION_CHARGE_FAIL',
    'CLOSED' => 'CLOSED',
);

State Flow of Single Payment / Cash payment

State of Single Payment / Cash payment

State Flow of Subscription Payment

State of Subscription Payment

Architecture Diagram

Architecture Diagram

Sequence Diagram

Loop Queue

Auto Debit and Reminder

Auto Debit and Reminder Loop Queue

Notity

Notity Loop Queue

Subscription Flow

View big Picture about Subscription Flow Subscription Flow

About

简洁、高效的多用户、多语言、用插件扩展的聚合支付系统,已集成 Alipay China, Alipay Global 和 Paypal


Languages

Language:PHP 63.5%Language:JavaScript 35.0%Language:HTML 1.4%Language:Shell 0.0%Language:SCSS 0.0%