Alipay 和 WeChat 的支付 SDK 扩展包 (Laravel 支付)
发布时间:2018-01-02 编辑:小张个人博客 查看次数:9160
概述
开发了多次支付宝与微信支付后,很自然产生一种反感,惰性又来了,想在网上找相关的轮子,可是一直没有找到一款自己觉得逞心如意的,要么使用起来太难理解,要么文件结构太杂乱,只有自己撸起袖子干了。
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 支付」三种支付网关,分别通过传入 web、wap、app 确定。
详细思路可以查看源代码。
支付宝
电脑支付
手机网站支付
APP 支付
刷卡支付
扫码支付
SDK 中对应的 driver 和 gateway 如下表所示:
driver | gateway | 描述 |
alipay | web | 电脑支付 |
alipay | wap | 手机网站支付 |
alipay | app | APP 支付 |
alipay | pos | 刷卡支付 |
alipay | scan | 扫码支付 |
alipay | transfer | 帐户转账(可用于平台用户提现) |
支持的方法
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' => 'demo@sandbox.com', // 收款方账户 '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' => 'demo@sandbox.com', // 收款方账户 '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。
Copyright © 小张个人博客 All Rights Reserved 渝ICP备15006773号-1
联系方式:1042563239@qq.com | 本站文章仅供学习和参考