您现在的位置是:首页> 编程文章 个人博客模板
使用 yansongda/pay 进行支付宝和微信 App 支付
无痕小Q个人博客 2020-03-06 00:10:48【 主页】 884人已围观
简介现在很多项目 (APP) 都会用到微信或支付宝支付,然而官方文档和乱七八糟的签名会让很多开发者一脸懵逼,所以 github 有很多第三方的包,已经封装好了各种支付,这里以 yansongda/pay 这个包为例。
安装
composer require yansongda/pay -vvv
配置文件 (config/pay.php 这个配置文件自行创建,不用非得跟我一样), 然后在.env 文件中填写对应配置。
<?php
return [
'alipay' => [
// 支付宝分配的 APPID
'app_id' => env('ALI_APP_ID', ''),
// 支付宝异步通知地址
'notify_url' => '',
// 支付成功后同步通知地址
'return_url' => '',
// 阿里公共密钥,验证签名时使用
'ali_public_key' => env('ALI_PUBLIC_KEY', ''),
// 自己的私钥,签名时使用
'private_key' => env('ALI_PRIVATE_KEY', ''),
// optional,默认 warning;日志路径为:sys_get_temp_dir().'/logs/yansongda.pay.log'
'log' => [
'file' => storage_path('logs/alipay.log'),
// 'level' => 'debug'
// 'type' => 'single', // optional, 可选 daily.
// 'max_file' => 30,
],
// optional,设置此参数,将进入沙箱模式
// 'mode' => 'dev',
],
'wechat' => [
// 公众号 APPID
'app_id' => env('WECHAT_APP_ID', ''),
// 小程序 APPID
'miniapp_id' => env('WECHAT_MINIAPP_ID', ''),
// APP 引用的 appid
'appid' => env('WECHAT_APPID', ''),
// 微信支付分配的微信商户号
'mch_id' => env('WECHAT_MCH_ID', ''),
// 微信支付异步通知地址
'notify_url' => '',
// 微信支付签名秘钥
'key' => env('WECHAT_KEY', ''),
// 客户端证书路径,退款、红包等需要用到。请填写绝对路径,linux 请确保权限问题。pem 格式。
'cert_client' => base_path('storage/app/cert/apiclient_cert.pem'),
// 客户端秘钥路径,退款、红包等需要用到。请填写绝对路径,linux 请确保权限问题。pem 格式。
'cert_key' => base_path('storage/app/cert/apiclient_key.pem'),
// optional,默认 warning;日志路径为:sys_get_temp_dir().'/logs/yansongda.pay.log'
'log' => [
'file' => storage_path('logs/wechat.log'),
// 'level' => 'debug'
// 'type' => 'single', // optional, 可选 daily.
// 'max_file' => 30,
],
// optional
// 'dev' 时为沙箱模式
// 'hk' 时为东南亚节点
// 'mode' => 'dev',
],
];
下单获取客户端用以吊起支付的参数
微信
/**
* @Author woann <www.woann.cn>
* @param Request $request
* @return \Illuminate\Http\JsonResponse
* @throws \Illuminate\Validation\ValidationException
* @des 微信下单获取支付参数
*/
public function wechatPay(Request $request)
{
$this->validate(
$request,
[
'order_id' => 'required|digits_between:1,9|integer',
]
);
$order_id = $request->get('order_id');
$order = LevelOrder::find($order_id);
if (!$order || $order->state != 0) {
return returnApi(500,'订单状态异常');
}
//以上为获取订单信息 根据自己业务调整
$data = [
'out_trade_no' => $order->order_no,//订单号
'body' => $order->goods_name,//商品名称
'total_fee' => $order->total * 100//金额单位分
];
$config = config('pay.wechat');获取配置参数
$config['notify_url'] = env('APP_URL').'/notify';//加入回调url
$result = Pay::wechat($config)->app($data);//统一下单
$json = $result->getContent();
$res = json_decode($json);
return returnApi(200,'SUCCESS', $res);//返回支付参数
/* 返回数据示例
{
"code":200,
"msg":"SUCCESS",
"data":{
"appid":"wx1076a204916e103b",
"partnerid":"1571249771",
"prepayid":"wx09151331559233021135325f1455481800",
"timestamp":"1578554011",
"noncestr":"pfCEOneTh3Ic2RdC",
"package":"Sign=WXPay",
"sign":"DCE5402CEA09721C7225F2F5DC563EE3"
}
}
*/
}
支付宝
/**
* @Author woann <www.woann.cn>
* @param Request $request
* @return \Illuminate\Http\JsonResponse
* @throws \Illuminate\Validation\ValidationException
* @des 支付宝支付
*/
public function aliPay(Request $request)
{
$this->validate(
$request,
[
'order_id' => 'required|digits_between:1,9|integer',
]
);
$order_id = $request->get('order_id');
$order = Order::find($order_id);
if (!$order || $order->state != 0) {
return returnApi(500,'订单状态异常');
}
//以上为获取订单信息 根据自己业务调整
$order = [
'out_trade_no' => $order->order_no,//订单号
'total_amount' => $order->total,//金额 单位元
'subject' => $order->name,//商品名称
];
$config = config('pay.alipay');
$config['notify_url'] = env('APP_URL').'/v1/notify';//加入回调url
$alipay = Pay::alipay($config);
$res = $alipay->app($order)->getContent();
return returnApi(200,'SUCCESS',['orderInfo' => $res]);
/* 返回数据示例
{
"code":200,
"msg":"SUCCESS",
"data":{
"orderInfo":"app_id=2021001100636235&format=JSON&charset=utf-8&sign_type=RSA2&version=1.0¬ify_url=https%3A%2F%2Fqiangyibo.enumen.com%2Fv1%2Flevel%2Falipay%2Fnotify×tamp=2020-02-13+10%3A44%3A50&biz_content=%7B%22out_trade_no%22%3A%222020010914545331453%22%2C%22total_amount%22%3A%2259.70%22%2C%22subject%22%3Anull%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%7D&method=alipay.trade.app.pay&sign=cX6uehDLpo8Lw8eat5X0XaoH09hbkZnb%2BNs4hfOokSXd2rhQBUuC45x6b%2FtfjDlNuFgukpPGzF1SlqP%2FFadiOBMYfir%2FZv3D3fEq8ec%2BHhsVk7lrUytyGhLyYgAEVjEA1uJyQAUKfTqDs9FeWgnpi3IiHk8hO4J8zwPjV2YG0RvZnJrEXTgavz6E2gMNkU%2BtaqhICCtVxyq1nbc%2BnYM4k8jT57dEEKC1fn7x1LTU60YPBxun7oKMsn%2BZNYPBycq4KGh9QKh9N7mRreFqT38PwiWFx4zOCwwMUM%2B%2BxxiqaJEg%2BcquTYptF1oxujwHvFB9O25dkxUeUvFUKhFD5MevZQ%3D%3D"
}
}
*/
}
}
回调
微信
public function wechatNotify(Request $request)
{
$config = config('pay.wechat');
$pay = Pay::wechat($config);//实例化支付对象
try{
$data = $pay->verify(); // 是的,验签就这么简单!
//以下根据自己业务进行支付校验
$order = Order::where('order_no', $data->out_trade_no)->first();
if (!$order || $order->state != 0) {
//如果订单状态异常直接退出
return $pay->success();
}
if (($order->total) != $data->total_fee / 100) {
//如果金额不匹配直接退出
return $pay->success();
}
//进行订单状态变更等支付成功操作
//....
return $pay->success();
} catch (\Exception $e) {
}
}
支付宝
public function aliPayNotify(Request $request)
{
$config = config('pay.alipay');
$alipay = Pay::alipay($config);
try{
$data = $alipay->verify(); // 是的,验签就这么简单!
//以下根据自己业务进行支付校验
$order = Order::where('order_no', $data->out_trade_no)->first();
if (!$order || $order->state != 0) {
//如果订单状态异常直接退出
return $alipay->success();
}
if (($order->total) != $data->total_amount) {
return $alipay->success();
}
//进行订单状态变更等支付成功操作
//....
return $alipay->success();
Log::debug('Alipay notify', $data->all());
} catch (\Exception $e) {
// $e->getMessage();
}
return $alipay->success();// laravel 框架中请直接 `return $alipay->success()`
}
阅读量! (884)
点击排行
网站公告
- 欢迎来到我的博客
1:欢迎来到我的博客
2:博客免费api接口现已上线
3:博客会定期更新文章
4:欢迎大家来捧场
站点信息
- 建站时间:2019-8-30
- 网站程序:php,laravel-swoole框架
- 今日流量:71(10分钟统计一次)
- 本月流量:9412
- 浏览总量:388339
- 统计方式:中间件,redis消息队列,定时任务