laravel--支付宝支付和微信支付
由于个人用户不能认证支付宝支付,所以,我们学习的话,只能是使用沙箱环境
https://opendocs.alipay.com/open/200/105311
支付宝也提供了相关API文档,不过也是要我们自己去组装起来使用的,
https://opendocs.alipay.com/apis
去安装扩展包
找到laravel的扩展包
安装命令
composer require yansongda/laravel-pay:~3.0.0
安装完成后,再去发布配置文件
php artisan vendor:publish --provider="YansongdaLaravelPayPayServiceProvider" --tag=laravel-pay
发布完成后,会多出来一个配置文件
下一步,我们去配置吧
打开支付宝开放平台,进入沙箱应用去开启这个
然后,可以去下载生成秘钥的工具
https://opendocs.alipay.com/open/291/105971
值得注意的是,我安装的是3.0版本的yansongda/pay,与2.x版本的区别还是挺大的,光是配置,就发生了很大的改变,使用的都是RSA2密钥(证书模式)
与之相对应的
必须得这样的一个问题,2.x和3.x的区别就在这里
配置好后,就可以去使用它的API了
我在项目中去使用
//支付宝支付
if ($request->input('type') == 'aliyun') {
$order = [
'out_trade_no' => $order->order_no,
'total_amount' => $order->amount / 100,
'subject' => $order->goods->first()->title . '等' . $order->goods()->count() . '商品',
];
return Pay::alipay()->scan($order);
}
成功后会返回响应的支付资源
但是返回的这个并不是可以直接使用的,
“qr_code”: “https://qr.alipay.com/bax06122avdovvu30uty0034”
这个链接是还需要去生成二维码才可以去扫码
可以去草料测试,
既然支付成功了,那么就要去接收支付宝返回的回调了
但是,既然要接收回调,我的域名也要被外部访问,但是,我使用的是本地环境,外部是不允许访问了,还好,homestead提供了解决这个问题的方案
有时,您可能希望跟您的同事共享您的工作内容。Vagrant 内置了一个通过 vagrant share 的方法实现之;但是,若您在
Homestead.yaml 文件中配置了多站点则无法正常工作。
我现在的homestead是使用的多站点,所以,
要解决这个问题,Homestead 包含了自己的 share 命令。通过 vagrant ssh 进入到您的 Homestead 机器,然后运行 share homestead.test 以实现之。这将从您的 Homestead.yaml 配置文件共享 homestead.test 站点。
比如,我的本地域名是api.test,那么就执行share api.test
这样外部就可以访问了
竟然可以访问了,就需要把他配置在回调里面
我的方法是,创建一个支付的控制器,在控制器里面写一个方法,专门接受回调
/*
* 回调
*/
public function notifyAliyun(Request $request)
{
$alipay = Pay::alipay();
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、其它业务逻辑情况
Log::info('回调数据' . $data);
} catch (Exception $e) {
// $e->getMessage();
}
return $alipay->success();
}
路由
/*
* 支付回调
*/
//支付成功后接受支付宝返回回调
$api->any('pay/notify/aliyun', [AppHttpControllersApiPayController::class, 'notifyAliyun']);
然后在configpay.php里面
'notify_url' => 'http://6a95-112-96-52-100.ngrok.io/api/pay/notify/aliyun',
这样就可以接受回调了
接收回调成功
然后就可以去做他的逻辑判断了
这个就是验签了
public function notifyAliyun(Request $request)
{
$alipay = Pay::alipay();
try {
$data = $alipay->callback(); // 是的,验签就这么简单!
Log::info('回调数据' . $data);
} catch (Exception $e) {
// $e->getMessage();
}
return $alipay->success();
}
然后就是逻辑判断了
// 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
// 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
// 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email);
// 4、验证app_id是否为该商户本身。
// 5、其它业务逻辑情况
//判断支付状态
// 对 trade_status 进行判断及其它逻辑进行判断,在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。
if ($data->trade_status == 'TRADE_SUCCESS' || $data->trade_status == 'TRADE_FINISHED') {
//查询订单
// 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
$order = Order::where('order_no', $data->out_trade_no)->first();
//更新订单数据
$order->update([
'status' => 2,//更改状态为已支付
'pay_time' => $data->gmt_payment,//支付时间
'pay_type' => '支付宝',//设置支付类型
'trade_no' => $data->trade_no,//支付单号,不是在数据中的单号,在退款的时候用到
]);
}
完整代码:
/*
* 回调
*/
public function notifyAliyun(Request $request)
{
$alipay = Pay::alipay();
try {
$data = $alipay->callback(); // 是的,验签就这么简单!
// 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
// 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
// 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email);
// 4、验证app_id是否为该商户本身。
// 5、其它业务逻辑情况
//判断支付状态
// 对 trade_status 进行判断及其它逻辑进行判断,在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。
if ($data->trade_status == 'TRADE_SUCCESS' || $data->trade_status == 'TRADE_FINISHED') {
//查询订单
// 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
$order = Order::where('order_no', $data->out_trade_no)->first();
//更新订单数据
$order->update([
'status' => 2,//更改状态为已支付
'pay_time' => $data->gmt_payment,//支付时间
'pay_type' => '支付宝',//设置支付类型
'trade_no' => $data->trade_no,//支付单号,不是在数据中的单号,在退款的时候用到
]);
}
Log::info('回调数据' . $data);
} catch (Exception $e) {
// $e->getMessage();
}
return $alipay->success();
}
如果日志无报错的话,就可以正常更新订单数据了,阿里的支付宝支付大概流程就差不多这样了
接下来的是微信支付,由于微信支付需要商务号才能测试,使用,我个人是没有办法测试的了,所以,只能是写好代码就可以了
微信支付和支付宝支付差不多,首先先去配置好环境
'wechat' => [
'default' => [
// 公众号 的 app_id
'mp_app_id' => '',
// 小程序 的 app_id
'mini_app_id' => '',
// app 的 app_id
'app_id' => '',
// 商户号
'mch_id' => '',
// 合单 app_id
'combine_app_id' => '',
// 合单商户号
'combine_mch_id' => '',
// 商户秘钥
'mch_secret_key' => '',
// 商户私钥
'mch_secret_cert' => '',
// 商户公钥证书路径
'mch_public_cert_path' => '',
// 微信公钥证书路径
'wechat_public_cert_path' => [
'' => '',
],
//接收回调数据地址
'notify_url' => 'http://6a95-112-96-52-100.ngrok.io/api/pay/notify/wechat',
'mode' => Pay::MODE_NORMAL,
],
],
也需要去创建一个接收数据的控制器方法
/*
* 微信支付成功之后的回调
*/
public function notifyWechat()
{
$wechat = Pay::wechat();
return $wechat->success();
}
路由
//微信支付成功后接受支付宝返回回调
$api->any('pay/notify/wechat', [AppHttpControllersApiPayController::class, 'notifyWechat']);
完整代码
/*
* 微信支付成功之后的回调
*/
public function notifyWechat()
{
$wechat = Pay::wechat();
try {
$data = $wechat->callback(); // 是的,验签就这么简单!
//判断支付状态
if ($data->return_code == 'SUCCESS') {
//查询订单
$order = Order::where('order_no', $data->out_trade_no)->first();
//更新订单数据
$order->update([
'status' => 2,//更改状态为已支付
'pay_time' => now(),//支付时间
'pay_type' => '微信',//设置支付类型
'trade_no' => $data->transaction_id,//支付单号,不是在数据中的单号,在退款的时候用到
]);
}
Log::info('wechat回调数据' . $data);
} catch (Exception $e) {
// $e->getMessage();
}
return $wechat->success();
}
版权声明:
作者:linrux
链接:https://www.tot7.cn/technology/php/77.html
来源:Code林
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论