Alipay 和 WeChat 的支付 SDK 扩展包 (Laravel 支付)

发布时间:2018-01-02 编辑:小张个人博客 查看次数:6239

概述

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

laravel-pay获取地址

Github: https://github.com/yansongda/pay

gitee: https://gitee.com/yansongda/pay

Laravel 扩展包:https://github.com/yansongda/laravel-pay

欢迎 Star,欢迎 PR!

潜水了这么久,自己学习了很多,是时候回馈社区了!

特点

  • 命名不那么乱七八糟

  • 隐藏开发者不需要关注的细节

  • 根据支付宝、微信最新 API 开发而成

  • 高度抽象的类,免去各种拼 JSON 与 XML 的痛苦

  • 符合 PSR 标准,你可以各种方便的与你的框架集成

  • 文件结构清晰易理解,可以随心所欲添加本项目中没有的支付网关

  • 方法使用更优雅,不必再去研究那些奇怪的的方法名或者类名是做啥用的

  • 以上部分引用了 @overtrue 的部分说明,在此感谢!:satisfied:

运行环境

PHP 5.6+

Composer

支持的支付网关

由于各支付网关参差不齐,所以我们抽象了两个方法 driver()gateway()。两个方法的作用如下:

driver:确定支付平台,如支付宝、微信;

gateway():确定支付网关。通过此方法,确定支付平台下的支付网关。例如,支付宝下有 「电脑网站支付」,「手机网站支付」,「APP 支付」三种支付网关,分别通过传入 webwapapp 确定。

详细思路可以查看源代码。

支付宝

  • 电脑支付

  • 手机网站支付

  • APP 支付

  • 刷卡支付

  • 扫码支付

SDK 中对应的 driver 和 gateway 如下表所示:

drivergateway描述
alipayweb电脑支付
alipaywap手机网站支付
alipayappAPP 支付
alipaypos刷卡支付
alipayscan

扫码支付

alipaytransfer

帐户转账(可用于平台用户提现)

支持的方法

pay(array $config_biz)

说明:支付接口

参数:数组类型,订单业务配置项,包含 订单号,订单金额等

返回:mixed 详情请看「支付网关配置说明与返回值」一节。


refund(array|string $config_biz, $refund_amount = null)

说明:退款接口

参数:$config_biz 为字符串类型仅对支付宝支付有效,此时代表订单号,第二个参数为退款金额。

返回:mixed 退款成功,返回 服务器返回的数组;否则返回 false;


close(array|string $config_biz)

说明:关闭订单接口

参数:$config_biz 为字符串类型时代表订单号,如果为数组,则为关闭订单业务配置项,配置项内容请参考各个支付网关官方文档。

返回:mixed 关闭订单成功,返回 服务器返回的数组;否则返回 false;


find(string $out_trade_no)

说明:查找订单接口

参数:$out_trade_no 为订单号。

返回:mixed 查找订单成功,返回 服务器返回的数组;否则返回 false;


verify($data, $sign = null)

说明:验证服务器返回消息是否合法

参数:$data 为服务器接收到的原始内容,$sign 为签名信息,当其为空时,系统将自动转化 $data 为数组,然后取 $data['sign']

返回:mixed 验证成功,返回 服务器返回的数组;否则返回 false;

安装

composer require yansongda/pay

支付宝支付完整案例

<?php

namespace App\Http\Controllers;

use Yansongda\Pay\Pay;
use Illuminate\Http\Request;

class PayController extends Controller
{
protected $config = [
'alipay' => [
    'app_id' => '2016082000295641',
    'notify_url' => 'http://yansongda.cn/alipay_notify.php',
    'return_url' => 'http://yansongda.cn/return.php',
    'ali_public_key' => '',
    'private_key' => '',
],
];

public function index()
{
$config_biz = [
    'out_trade_no' => time(),
    'total_amount' => '1',
    'subject'      => 'test subject',
];

$pay = new Pay($this->config);

return $pay->driver('alipay')->gateway()->pay($config_biz);
}

public function return(Request $request)
{
$pay = new Pay($this->config);

return $pay->driver('alipay')->gateway()->verify($request->all());
}

public function notify(Request $request)
{
$pay = new Pay($this->config);

if ($pay->driver('alipay')->gateway()->verify($request->all())) {
    // 请自行对 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、其它业务逻辑情况
    file_put_contents(storage_path('notify.txt'), "收到来自支付宝的异步通知\r\n", FILE_APPEND);
    file_put_contents(storage_path('notify.txt'), '订单号:' . $request->out_trade_no . "\r\n", FILE_APPEND);
    file_put_contents(storage_path('notify.txt'), '订单金额:' . $request->total_amount . "\r\n\r\n", FILE_APPEND);
} else {
    file_put_contents(storage_path('notify.txt'), "收到异步通知\r\n", FILE_APPEND);
}

echo "success";
}
}

配置参数

<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
    ],
];
$config_biz = [
    'out_trade_no' => '12',         // 订单号
    'total_amount' => '13',         // 订单金额,单位:元,**微信支付,单位:分**
    'subject' => 'test subject',    // 订单商品标题
];

在代码中使用

<?php

$pay = new Pay($config);
return $pay->driver('alipay')->gateway('web')->pay($config_biz);

错误

使用非跳转接口(如, refund 接口,close 接口)时,如果在调用相关支付网关 API 时有错误产生,会抛出 GatewayException 错误,可以通过 $e->getMessage() 查看,同时,也可通过 $e->raw 查看调用 API 后返回的原始数据,该值为数组格式。

支付网关配置说明与返回值


由于支付网关不同,每家参数参差不齐,为了方便,我们抽象定义了两个参数:$config$config_biz,分别为全局参数,业务参数。但是,所有配置参数均为官方标准参数,无任何差别。

「业务参数」为订单相关的参数,「全局参数」为除订单相关参数以外的全局性参数。

具体参数列表请查看每个支付网关的使用说明。

支付宝-电脑网站支付

最小配置参数

<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
    ],
];
$config_biz = [
    'out_trade_no' => '12',                 // 订单号
    'total_amount' => '13',                 // 订单金额,单位:元
    'subject' => 'test subject',   // 订单商品标题
];


所有配置参数

所有参数均为官方标准参数,无任何差别。点击这里查看官方文档。

<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
        'return_url' => '',         // 同步通知 url,*强烈建议加上本参数*
        'notify_url' => '',         // 异步通知 url,*强烈建议加上本参数*
    ],
];
$config_biz = [
    'out_trade_no' => '',
    'total_amount' => '',                 
    'subject' => '',

    // 订单描述
    'body' => '',

    // 订单包含的商品列表信息,Json格式: {"show_url":"https://或http://打头的商品的展示地址"} ,在支付时,可点击商品名称跳转到该地址      
    'goods_detail' => '',

    // 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。该参数在请求到支付宝时开始计时。
    'timeout_express' => '',                
    
    // 禁用渠道,用户不可用指定渠道支付当有多个渠道时用“,”分隔注:与enable_pay_channels互斥
    'disable_pay_channels' => '',

    // 可用渠道,用户只能在指定渠道范围内支付当有多个渠道时用“,”分隔注:与disable_pay_channels互斥
    'enable_pay_channels' => '',

    // 公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数。支付宝只会在异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝
    'passback_params' => '',

    // 业务扩展参数,详见 [业务扩展参数说明](https://docs.open.alipay.com/#kzcs)
    'extend_params' => '',

    // 商品主类型:0—虚拟类商品,1—实物类商品(默认)注:虚拟类商品不支持使用花呗渠道
    'goods_type' => '',

    // 获取用户授权信息,可实现如免登功能。获取方法请查阅:用户信息授权
    'auth_token' => '',

    /**
     *  PC扫码支付的方式,支持前置模式和跳转模式。
     *
     *  前置模式是将二维码前置到商户的订单确认页的模式。需要商户在自己的页面中以iframe方式请求支付宝页面。具体分为以下几种:
     *  0:订单码-简约前置模式,对应iframe宽度不能小于600px,高度不能小于300px;
     *  1:订单码-前置模式,对应iframe宽度不能小于300px,高度不能小于600px;
     *  3:订单码-迷你前置模式,对应iframe宽度不能小于75px,高度不能小于75px;
     *  4:订单码-可定义宽度的嵌入式二维码,商户可根据需要设定二维码的大小。
     *
     *  跳转模式下,用户的扫码界面是由支付宝生成的,不在商户的域名下。
     *  2:订单码-跳转模式
     */
    'qr_pay_mode' => '',

    // 商户自定义二维码宽度 注:qr_pay_mode=4时该参数生效
    'qrcode_width' => ''
];

返回值

pay()

类型:string

说明:该接口返回跳转到支付宝支付的 Html 代码。


支付宝 - 手机网站支付

最小配置参数

<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
    ],
];
$config_biz = [
    'out_trade_no' => '12',                 // 订单号
    'total_amount' => '13',                 // 订单金额,单位:元
    'subject' => 'test subject',   // 订单商品标题
];


所有配置参数

该网关大部分参数和 「电脑支付」 相同,具体请参考 官方文档


返回值

pay()

类型:string

说明:该接口返回跳转到支付宝支付的 Html 代码。

支付宝 - APP 支付

最小配置参数

<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'notify_url' => '',         // 支付宝异步通知地址
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
    ],
];
$config_biz = [
    'out_trade_no' => '12',                 // 订单号
    'total_amount' => '13',                 // 订单金额,单位:元
    'subject' => 'test subject',   // 订单商品标题
];


所有配置参数

该网关大部分参数和 「电脑支付」 相同,具体请参考 官方文档


返回值

pay()

类型:string

说明:该接口返回用于客户端调用的 orderString 字符串,可直接供 APP 客户端调用,客户端调用方法不在此文档讨论范围内,Android 用户请看这里,Ios 用户请看这里

支付宝 - 刷卡支付

最小配置参数

<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
    ],
];
$config_biz = [
    'out_trade_no' => '12',         // 订单号
    'total_amount' => '13',         // 订单金额,单位:元
    'subject' => 'test subject',    // 订单商品标题
    'auth_code'  => '123456',       // 授权码
];


所有配置参数

该网关大部分参数和 「电脑支付」 相同,具体请参考 官方文档


返回值

pay()

类型:array|bool

说明:该接口成功时返回服务器响应的数组;验签失败返回 false。

支付宝 - 扫码支付

最小配置参数

<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'notify_url' => '',         // 支付宝异步通知地址
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
    ],
];
$config_biz = [
    'out_trade_no' => '12',                 // 订单号
    'total_amount' => '13',                 // 订单金额,单位:元
    'subject' => 'test subject',   // 订单商品标题
];


所有配置参数

该网关大部分参数和 「电脑支付」 相同,具体请参考 官方文档

返回值

pay()

类型:string

说明:该接口返回二维码链接,可以通过其他库转换为二维码供用户扫描。

支付宝 - 帐户转账

最小配置参数

<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
    ],
];
$config_biz = [
    'out_biz_no' => '',                      // 订单号
    'payee_type' => 'ALIPAY_LOGONID',        // 收款方账户类型(ALIPAY_LOGONID | ALIPAY_USERID)
    'payee_account' => '[email protected]',   // 收款方账户
    'amount' => '10',                        // 转账金额
];

所有配置参数

<?php

$config = [
    'alipay' => [
        'app_id' => '',             // 支付宝提供的 APP_ID
        'ali_public_key' => '',     // 支付宝公钥,1行填写
        'private_key' => '',        // 自己的私钥,1行填写
    ],
];
$config_biz = [
    'out_biz_no' => '',                      // 订单号
    'payee_type' => 'ALIPAY_LOGONID',        // 收款方账户类型(ALIPAY_LOGONID | ALIPAY_USERID)
    'payee_account' => '[email protected]',   // 收款方账户
    'amount' => '10',                        // 转账金额
    'payer_show_name' => '未寒',             // 付款方姓名
    'payee_real_name' => '张三',             // 收款方真实姓名
    'remark' => '张三',                      // 转账备注
];

官方文档(https://doc.open.alipay.com/docs/api.htm?apiId=1321&docType=4)

返回值

pay()

类型:array|bool

说明:该接口成功时返回服务器响应的数组;验签失败返回 false。

代码贡献

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

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

LICENSE

MIT

声明:本教程整理自小张个人博客,原文作者 yansongda

出处:小张个人博客

网址:http://blog.023xs.cn/

您的支持是对博主最大的鼓励,感谢您的认真阅读。欢迎转载,但请保留该声明。

顶部

Copyright © 小张个人博客 All Rights Reserved 渝ICP备15006773号-1

联系方式:[email protected] | 本站文章仅供学习和参考

渝公网安备 50024102500267号