可能是我用过的最优雅的 Alipay 和 WeChat 的支付 SDK 扩展包了

Overview

Logo

scrutinizer Linter Status Tester Status Stable Version Total Downloads License

前言

v3 版与 v2 版在底层有很大的不同,基础架构做了重新的设计,更易扩展,使用起来更方便。

开发了多次支付宝与微信支付后,很自然产生一种反感,惰性又来了,想在网上找相关的轮子,可是一直没有找到一款自己觉得逞心如意的,要么使用起来太难理解,要么文件结构太杂乱,只有自己撸起袖子干了。

欢迎 Star,欢迎 PR!

hyperf 扩展包请 传送至这里

laravel 扩展包请 传送至这里

yii 扩展包请 传送至这里

特点

  • 多租户支持
  • Swoole 支持
  • 灵活的插件机制
  • 丰富的事件系统
  • 命名不那么乱七八糟
  • 隐藏开发者不需要关注的细节
  • 根据支付宝、微信最新 API 开发而成
  • 高度抽象的类,免去各种拼json与xml的痛苦
  • 文件结构清晰易理解,可以随心所欲添加本项目中没有的支付网关
  • 方法使用更优雅,不必再去研究那些奇怪的的方法名或者类名是做啥用的
  • 内置自动获取微信公共证书方法,再也不用再费劲去考虑第一次获取证书的的问题了
  • 符合 PSR2、PSR3、PSR4、PSR7、PSR11、PSR14 等各项标准,你可以各种方便的与你的框架集成

运行环境

  • PHP 7.3+
  • composer

详细文档

https://pay.yansongda.cn

支持的支付方法

yansongda/pay 100% 兼容 支付宝/微信 所有功能(包括服务商功能),只需通过「插件机制」引入即可。

同时,SDK 直接支持内置了以下插件,详情请查阅文档。

支付宝

  • 电脑支付
  • 手机网站支付
  • APP 支付
  • 刷卡支付
  • 扫码支付
  • 账户转账
  • 小程序支付
  • ...

微信

  • 公众号支付
  • 小程序支付
  • H5 支付
  • 扫码支付
  • APP 支付
  • ...
  • 刷卡支付,微信v3版暂不支持,计划后续内置支持v2版,或直接使用 Pay v2 版本
  • 普通红包,微信v3版暂不支持,计划后续内置支持v2版,或直接使用 Pay v2 版本
  • 分裂红包,微信v3版暂不支持,计划后续内置支持v2版,或直接使用 Pay v2 版本

安装

composer require yansongda/pay:~3.0.0 -vvv

深情一撇

支付宝

<?php

namespace App\Http\Controllers;

use Yansongda\Pay\Pay;

class AlipayController
{
    protected $config = [
        'alipay' => [
            'default' => [
                // 必填-支付宝分配的 app_id
                'app_id' => '2016082000295641',
                // 必填-应用私钥 字符串或路径
                'app_secret_cert' => '89iZ2iC16H6/6a3YcP+hDZUjiNGQx9cuwi9eJyykvcwhD...',
                // 必填-应用公钥证书 路径
                'app_public_cert_path' => '/Users/yansongda/pay/cert/appCertPublicKey_2016082000295641.crt',
                // 必填-支付宝公钥证书 路径
                'alipay_public_cert_path' => '/Users/yansongda/pay/cert/alipayCertPublicKey_RSA2.crt',
                // 必填-支付宝根证书 路径
                'alipay_root_cert_path' => '/Users/yansongda/pay/cert/alipayRootCert.crt',
                'return_url' => 'https://yansongda.cn/alipay/return',
                'notify_url' => 'https://yansongda.cn/alipay/notify',
                // 选填-服务商模式下的服务商 id,当 mode 为 Pay::MODE_SERVICE 时使用该参数
                'service_provider_id' => '',
                // 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
                'mode' => Pay::MODE_NORMAL,
            ],       
        ],   
        'logger' => [ // optional
            'enable' => false,
            'file' => './logs/alipay.log',
            'level' => 'info', // 建议生产环境等级调整为 info,开发环境为 debug
            'type' => 'single', // optional, 可选 daily.
            'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
        ],
        'http' => [ // optional
            'timeout' => 5.0,
            'connect_timeout' => 5.0,
            // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
        ],
    ];

    public function web()
    {
        $result = Pay::alipay($this->config)->web([
            'out_trade_no' => ''.time(),
            'total_amount' => '0.01',
            'subject' => 'yansongda 测试 - 1',
        ]);
        
        return $result;
    }

    public function returnCallback()
    {
        $data = Pay::alipay($this->config)->callback(); // 是的,验签就这么简单!

        // 订单号:$data->out_trade_no
        // 支付宝交易号:$data->trade_no
        // 订单总金额:$data->total_amount
    }

    public function notifyCallback()
    {
        $alipay = Pay::alipay($this->config);
    
        try{
            $data = $alipay->callback(); // 是的,验签就这么简单!

            // 请自行对 trade_status 进行判断及其它逻辑进行判断,在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。
            // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
            // 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
            // 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email);
            // 4、验证app_id是否为该商户本身。
            // 5、其它业务逻辑情况
        } catch (\Exception $e) {
            // $e->getMessage();
        }

        return $alipay->success();
    }
}

微信

<?php

namespace App\Http\Controllers;

use Yansongda\Pay\Pay;

class WechatController
{
    protected $config = [
        'wechat' => [
            'default' => [
                // 必填-商户号,服务商模式下为服务商商户号
                'mch_id' => '',
                // 必填-商户秘钥
                'mch_secret_key' => '',
                // 必填-商户私钥 字符串或路径
                'mch_secret_cert' => '',
                // 必填-商户公钥证书路径
                'mch_public_cert_path' => '',
                // 必填
                'notify_url' => 'https://yansongda.cn/wechat/notify',
                // 选填-公众号 的 app_id
                'mp_app_id' => '2016082000291234',
                // 选填-小程序 的 app_id
                'mini_app_id' => '',
                // 选填-app 的 app_id
                'app_id' => '',
                // 选填-合单 app_id
                'combine_app_id' => '',
                // 选填-合单商户号 
                'combine_mch_id' => '',
                // 选填-服务商模式下,子公众号 的 app_id
                'sub_mp_app_id' => '',
                // 选填-服务商模式下,子 app 的 app_id
                'sub_app_id' => '',
                // 选填-服务商模式下,子小程序 的 app_id
                'sub_mini_app_id' => '',
                // 选填-服务商模式下,子商户id
                'sub_mch_id' => '',
                // 选填-微信公钥证书路径, optional,强烈建议 php-fpm 模式下配置此参数
                'wechat_public_cert_path' => [
                    '45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatPublicKey.crt',
                ],
                // 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SERVICE
                'mode' => Pay::MODE_NORMAL,
            ]
        ],
        'logger' => [ // optional
            'enable' => false,
            'file' => './logs/wechat.log',
            'level' => 'info', // 建议生产环境等级调整为 info,开发环境为 debug
            'type' => 'single', // optional, 可选 daily.
            'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
        ],
        'http' => [ // optional
            'timeout' => 5.0,
            'connect_timeout' => 5.0,
            // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
        ],
    ];

    public function index()
    {
        $order = [
            'out_trade_no' => time(),
            'total_fee' => '1', // **单位:分**
            'body' => 'test body - 测试',
            'openid' => 'onkVf1FjWS5SBIixxxxxxx',
        ];

        $pay = Pay::wechat($this->config)->mp($order);

        // $pay->appId
        // $pay->timeStamp
        // $pay->nonceStr
        // $pay->package
        // $pay->signType
    }

    public function notifyCallback()
    {
        $pay = Pay::wechat($this->config);

        try{
            $data = $pay->callback(); // 是的,验签就这么简单!
        } catch (\Exception $e) {
            // $e->getMessage();
        }
        
        return $pay->success();
    }
}

代码贡献

由于测试及使用环境的限制,本项目中只开发了「支付宝」和「微信支付」的相关支付网关。

如果您有其它支付网关的需求,或者发现本项目中需要改进的代码,欢迎 Fork 并提交 PR!

赏一杯咖啡吧

pay

LICENSE

MIT

You might also like...
AWS SDK with readable code and async responses

AsyncAws client If you are one of those people that like the Amazon PHP SDK but hate the fact that you need to download Guzzle, PSR-7 and every AWS AP

Supercharge your app or SDK with a testing library specifically for Guzzle

Full Documentation at guzzler.dev Supercharge your app or SDK with a testing library specifically for Guzzle. Guzzler covers the process of setting up

Official repository of the AWS SDK for PHP (@awsforphp)

AWS SDK for PHP - Version 3 The AWS SDK for PHP makes it easy for developers to access Amazon Web Services in their PHP code, and build robust applica

Mailgun's Official SDK for PHP

Mailgun PHP client This is the Mailgun PHP SDK. This SDK contains methods for easily interacting with the Mailgun API. Below are examples to get you s

CloudConvert PHP SDK

cloudconvert-php This is the official PHP SDK v3 for the CloudConvert API v2. For API v1, please use v2 branch of this repository. Install To install

Notion PHP SDK
Notion PHP SDK

Notion PHP SDK This is an unofficial PHP SDK for the new public Notion API. It's work in progress as we didn't get the change to be included to the pr

The 1Password Connect PHP SDK provides your PHP applications access to the 1Password Connect API hosted on your infrastructure and leverage the power of 1Password Secrets Automation

1Password Connect PHP SDK The 1Password Connect PHP SDK provides your PHP applications access to the 1Password Connect API hosted on your infrastructu

多平台通知 SDK(Bark、Chanify、钉钉群机器人、飞书群机器人、Server 酱、企业微信群机器人、息知)。

notify 简体中文 | ENGLISH Multi platform notification SDK(Bark、Chanify、DingTalk、FeiShu、ServerChan、WeWork、XiZhi). - 多平台通知 SDK(Bark、Chanify、钉钉群机器人、飞书群机器人、Se

The official Symfony SDK for Sentry (sentry.io)

sentry-symfony Symfony integration for Sentry. Benefits Use sentry-symfony for: A fast Sentry setup Easy configuration in your Symfony app Automatic w

Fully unit tested Facebook SDK v5 integration for Laravel & Lumen
Fully unit tested Facebook SDK v5 integration for Laravel & Lumen

Laravel Facebook SDK A fully unit-tested package for easily integrating the Facebook SDK v5 into Laravel and Lumen 5.0, 5.1, 5.2, & 5.3. This is packa

可能是基于 hyperf 的最优雅的支付宝、微信支付 SDK 了
可能是基于 hyperf 的最优雅的支付宝、微信支付 SDK 了

当前组件整体处于 beta 阶段 运行环境 php = 7.3 composer hyperf = 2.1 安装 composer require yansongda/hyperf-pay:~1.0.0 说明 发布配置文件 php bin/hyperf.php vendor:publish ya

Get started with the Microsoft Graph SDK for PHP

If you want to play around with the PHP library, you can get up and running quickly with the PHP Connect Sample. This sample will start you with a little Laravel project that helps you with registration, authentication, and making a simple call to the service.

爱发电非官方简易 PHP SDK

afdian-php-sdk 爱发电非官方简易 PHP SDK by Akkariin 这是一个简单的 SDK,可以用于查询爱发电的订单和赞助者信息 Installation 将项目 clone 到本地即可 git clone https://github.com/ZeroDream-CN/afdi

A Laravel package to help integrate Shopware PHP SDK much more easier

Shopware 6 Laravel SDK A Laravel package to help integrate Shopware PHP SDK much more easier Installation Install with Composer composer require sas/s

Minter Blockchain PHP SDK

About This is a pure PHP SDK for working with Minter blockchain Installation Minter Api Methods: getBalance getNonce send getAddresses getStatus getVa

The official PHP SDK for Webmarketer (app.webmarketer.io)
The official PHP SDK for Webmarketer (app.webmarketer.io)

PHP SDK for Webmarketer The official PHP SDK for Webmarketer (app.webmarketer.io). Install To add this package, your project must meet several require

SDK for latest version of Telegram bots API

SDK for latest version of Telegram bots API (from April 24, 2020) Using Examples Installing composer require "DiyorbekUz/Telelib: dev-master" Init bot

A Laravel Statistics SDK

laravel-statistics shanjing laravel-statistics是一个基于 laravel 开发而成的统计工具,只需很少的代码即可快速构建出一个功能完善的统计模块。开箱即用,对后端开发者非常友好。 功能特性 简洁优雅 API 当缺失对应日期的数据时,自动补充 0 作为默认

A PHP SDK for the GlobalSmartOTP API.
A PHP SDK for the GlobalSmartOTP API.

GlobalSmartOTP PHP SDK A PHP SDK for the GlobalSmartOTP API. Requirements PHP 7.4 or higher cURL Installation $ git clone [email protected]:GlobalSmartOT

Comments
  • 微信小程序获取接收回调,提示无效签名

    微信小程序获取接收回调,提示无效签名

    包版本号

    V3

    问题描述

    按照文档要求,填写完参数后,支付是没问问题的,但是接收回调报错了

    你的代码

    $this->config=[ 'wechat'=>[ 'default'=>[ // 必填-商户号,服务商模式下为服务商商户号 // 可在 https://pay.weixin.qq.com/ 账户中心->商户信息 查看 'mch_id'=>'1635******', // 必填-商户秘钥 // 即 API v3 密钥(32字节,形如md5值),可在 账户中心->API安全 中设置 'mch_secret_key'=>'a4ef6c30a1e643**', // 必填-商户私钥 字符串或路径 // 即 API证书 PRIVATE KEY,可在 账户中心->API安全->申请API证书 里获得 // 文件名形如:apiclient_key.pem 'mch_secret_cert'=>'cert/apiclient_key.pem', // 必填-商户公钥证书路径 // 即 API证书 CERTIFICATE,可在 账户中心->API安全->申请API证书 里获得 // 文件名形如:apiclient_cert.pem 'mch_public_cert_path'=>'cert/apiclient_cert.pem', // 必填-微信回调url // 不能有参数,如?号,空格等,否则会无法正确回调 'notify_url'=>'https://www.xxxx/order/notice', // 选填-公众号 的 app_id // 可在 mp.weixin.qq.com 设置与开发->基本配置->开发者ID(AppID) 查看 // 'mp_app_id'=>'2016082000291234', // 选填-小程序 的 app_id 'mini_app_id'=>$this->appid, // 选填-app 的 app_id // 'app_id'=>'', // 选填-合单 app_id // 'combine_app_id'=>'', // 选填-合单商户号 // 'combine_mch_id'=>'', // 选填-服务商模式下,子公众号 的 app_id // 'sub_mp_app_id'=>'', // 选填-服务商模式下,子 app 的 app_id // 'sub_app_id'=>'', // 选填-服务商模式下,子小程序 的 app_id // 'sub_mini_app_id'=>'', // 选填-服务商模式下,子商户id // 'sub_mch_id'=>'', // 选填-微信平台公钥证书路径, optional,强烈建议 php-fpm 模式下配置此参数 // 前面是证书序列号,后面是通过CertificateDownloader.php生成的 'wechat_public_cert_path'=>[ 'A50704F9844FE6A673FD'=>'cert/wechatpay_861FC4F0C6D78FE76453.pem', ], // 选填-默认为正常模式。可选为:MODE_NORMAL, MODE_SERVICE 'mode'=>Pay::MODE_NORMAL, ] ], ];

    // 接收通知 public function notice() {

    	Pay::config($this->config);
    	$result=Pay::wechat()->callback();
    }
    

    报错详情

    [5003]InvalidResponseException in Functions.php line 171

    if (empty($sign)) { throw new InvalidResponseException(Exception::INVALID_RESPONSE_SIGN, '', ['headers' => $message->getHeaders(), 'body' => $body]); }

    opened by yearspark 0
  • 支付宝h5支付参数里面的链接被转义

    支付宝h5支付参数里面的链接被转义

    包版本号

    "yansongda/pay": "~3.2.0" "yansongda/hyperf-pay": "^1.2",

    问题描述

    支付宝h5支付回调地址和返回地址在转json的时候被转义收不到回调:http://127.0.0.1:9504/api/v1/notifies/41/alipay

    你的代码

    return $this->pay->alipay()->wap([ 'out_trade_no' => $order->order_no, 'total_amount' => bcdiv($order->total_fee, 100, 2), 'subject' => $order->desc, 'return_url' => sprintf('%s/success', get_domain()), 'notify_url' => sprintf('%s/api/v1/notifies/%d/alipay', get_domain(), $order->id), 'time_expire' => $order->expired_at->toDateTimeString(), ]);

    报错详情

    sdk 日志

    nginx/apache 日志

    涉及到 异步通知、同步通知 的问题,请贴出来

    opened by 1551820051 0
  • feat: thinkphp container 兼容

    feat: thinkphp container 兼容

    • [x] 没有 set 方法,可以用 bind 等代替?
    • [x] bind 后,执行 force 时,再次 bind 不生效,需要在 bind 前 delete 下
    • [x] Pay 中如果未提前 bindget 时 必定失败,并不会自动注入新增
    • [ ] Pipeline 中如果未提前 bindget 时 必定失败,并不会自动注入新增
    opened by yansongda 0
Releases(v3.2.11)
Owner
yansongda
Coding My Life
yansongda
Laravel mercado pago es un paquete que te ayuda a implementar el sdk de mercado pago para php en laravel

Introducción Laravel mercado pago es un paquete que te ayuda a implementar el sdk de mercado pago para php en laravel. ?? Instalación Para instalar ut

null 7 Sep 23, 2022
Video Chat application built using Metered Video SDK, with PHP Laravel Backend and JavaScript Front-End

Group Video Chat App with PHP Laravel and JavaScript Powered by Metered Video SDK Overview This application is a highly scalable group video calling a

null 2 Aug 18, 2022
Easy-to-use SDK for implementing Neshan APIs in your Laravel projects.

Neshan Laravel SDK Easy-to-use SDK for implementing Neshan APIs in your Laravel projects. Install The easiest way to install is by using Composer: com

null 1 Oct 22, 2022
A Laravel package for the Adapty SDK.

Laravel Adapty A Laravel package for the Adapty SDK. Please feel free to contribute... Installation You can install the package via composer: composer

Melih Berat ŞANLI 2 Sep 20, 2022
Social OAuth Authentication for Laravel 5. drivers: facebook, github, google, linkedin, weibo, qq, wechat and douban

Social OAuth Authentication for Laravel 5. drivers: facebook, github, google, linkedin, weibo, qq, wechat and douban

安正超 330 Nov 14, 2022
Alipay driver for the Omnipay PHP payment processing library

Omnipay: Alipay Alipay driver for the Omnipay PHP payment processing library Omnipay is a framework agnostic, multi-gateway payment processing library

Loki Else 571 Nov 9, 2022
Shopware PHP SDK is a simple SDK implementation of Shopware 6 APIs

Shopware PHP SDK is a simple SDK implementation of Shopware 6 APIs. It helps to access the API in an object-oriented way.

Thuong Le 77 Dec 19, 2022
Zoho CRM API SDK is a wrapper to Zoho CRM APIs. By using this sdk, user can build the application with ease

Archival Notice: This SDK is archived. You can continue to use it, but no new features or support requests will be accepted. For the new version, refe

null 81 Nov 4, 2022
Unofficial Firebase Admin SDK for PHP

Firebase Admin PHP SDK Table of Contents Overview Installation Documentation Support License Overview Firebase provides the tools and infrastructure y

kreait 1.9k Jan 3, 2023
A simple twitter SDK to interact with Twitter api (1.1)

Twitter SDK Installation composer require lyrixx/twitter-sdk Usage Create a twitter application then <?php require __DIR__.'/vendor/autoload.php';

Grégoire Pineau 37 Aug 28, 2020