版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
laravel5.7的微信(Alipay )与支付宝(WeChat )支付
先composer一下包(两个,第一个做支付宝的第二个做微信的不要问我问啥,我就想这样)
composer require yansongda/laravel-pay
overtrue/laravel-wechat
配置文件:
php artisan vendor:publish --provider="Yansongda\LaravelPay\PayServiceProvider" --tag=laravel-pay
然后呢你config文件夹里面配置(pay.php)
<?php
return [
//旧版支付宝接口配置(临时新增)
'temp_alipay' => [
// 支付宝分配的 APPID
'app_id' => '***',
//合作身份者id,以2088开头的16位纯数字
'partner_id' => '***',
//卖家支付宝帐户
'seller_id' => '****',
//安全检验码,以数字和字母组成的32位字符
'key' => '****',
//异步通知连接
'notify_url' => '******,
//同步返回地址
'return_url' => '',
//商户私钥文件地址,绝对路径
'private_key_path' => storage_path('alipay/rsa_private_key.pem'),
//阿里公钥文件地址,绝对路径
'public_key_path' => storage_path('alipay/rsa_public_key.pem'),
],
//新版支付宝接口配置
'alipay' => [
// 支付宝分配的 APPID
'app_id' => env('ALI_APP_ID', ''),
// 支付宝异步通知地址
'notify_url' => env('ALI_PAY_NOTIFY_URL', ''),
// 支付成功后同步通知地址
'return_url' => env('ALI_PAY_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/pay/alipay.log'),
// 'level' => 'debug'
'type' => 'daily', // optional, 可选 daily.
// 'max_file' => 30,
],
// optional,设置此参数,将进入沙箱模式
// 'mode' => 'dev',
],
];
然后在config(wechat.php)
/*
* 微信支付
*/
'payment' => [
'default' => [
'sandbox' => env('WECHAT_PAYMENT_SANDBOX', false),
'app_id' => env('WECHAT_PAYMENT_APPID', '...'),
'mch_id' => env('WECHAT_PAYMENT_MCH_ID', '....'),
'key' => env('WECHAT_PAYMENT_KEY', '...'),
'cert_path' => storage_path('wxpay/apiclient_cert.pem'),
// XXX: 绝对路径!!!!
'key_path' => storage_path('wxpay/apiclient_key.pem'),
// XXX: 绝对路径!!!!
'notify_url' => env('WECHAT_PAYMENT_NOTIFY_URL', '.....'),
// 默认支付结果通知地址
],
// ...
],
根据上面的常量这时候需要配置.env的文件 对应是啥上面都有(自己查)
#微信支付相关配置
WECHAT_PAYMENT_SANDBOX=
WECHAT_PAYMENT_APPID=
WECHAT_PAYMENT_MCH_ID=
WECHAT_PAYMENT_KEY=
WECHAT_PAYMENT_NOTIFY_URL=
#支付相关
#alipay 配置
ALI_APP_ID=
ALI_PUBLIC_KEY=
ALI_PRIVATE_KEY=
ALI_PAY_RETURN_URL=
ALI_PAY_NOTIFY_URL=
然后呢就是还是代码上线(啦啦啦)
Controller:
public function payInit(PayInitRequest $request, Order $order)
{
$user = Auth::guard(self::GUARD_TYPE)->user();
//这就是一个判断(可以没有)
$checkAbilityResult = $this->orderService->checkPayInitAbility($user, $order->id, $order->extra->phone);
if (!$checkAbilityResult['status']) {
return $this->failed($checkAbilityResult['message']);
}
if ($order->applet_user_id != $user->getAuthIdentifier()) {
return $this->failed('非法订单');
}
if ($order->pay_status == Order::PAY_STATUS_PAYED) {
return $this->failed('该订单已支付');
}
if ($order->status == Order::STATUS_OFF) {
return $this->failed('该订单已关闭,请重新下单');
}
if ($order->pay_fee <= 0) {
return $this->failed('订单异常,请联系客服');
}
//到这结束(下面的是有用的)
$pay_type = $request->post('pay_type');
if (!in_array($pay_type, Order::PAY_TYPES)) {
return $this->failed('请选择正确的支付方式');
}
$initResult = $this->orderService->payInit($user, $order, $pay_type);
if (!$initResult['status']) {
return $this->failed($initResult['message']);
}
$result = [
'pre_pay' => $initResult['data']
];
return $this->success($result);
}
Service:
<?php
use App\Libs\Alipay\WapSdk;
use App\Modules\Applet\Order\Services\Interfaces\OrderInterface;
use App\Services\BaseService;
use App\Modules\Api\Oss\Services\Interfaces\AliOssInterface;
use App\Services\Traits\OrderHandleTrait;
use Illuminate\Support\Facades\DB;
use EasyWeChat;
use Log;
use Pay;
use Yansongda\Pay\Gateways\Alipay;
use Exception;
class OrderService extends BaseService implements OrderInterface
{
use OrderHandleTrait;
/**
* @var EasyWeChat\Payment\Application
*/
protected $wxPayment;
/**
* @var Alipay
*/
protected $aliPay;
/**
* OrderService constructor.
*
*/
public function __construct()
{
$this->wxPayment = EasyWeChat::payment();
$this->aliPay = Pay::alipay();
}
/**
* 支付初始化
*
* @param AppletUser $user
* @param Order $order
* @param string $pay_type
*
* @return array|mixed
*/
public function payInit($user, $order, $pay_type)
{
switch ($pay_type) {
case Order::PAY_TYPE_ALI:(支付宝)
(列子)
// $options = [
// 'out_trade_no' => $order->order_sn,
// 'total_amount' => $order->pay_fee * 0.01,
// 'subject' => $order->name,
// 'http_method' => 'GET'
// ];
// $result = $this->aliPay->wap($options);
// return $result->getContent();
$wap = new WapSdk(config('pay.temp_alipay'));
$pay_url = $wap->setOutTradeNo($order->order_sn)
->setTotalFee($order->pay_fee * 0.01)
->setSubject($order->name)
->setBody($order->name)
->setAppPay('Y')
->setExterInvokeIp(request()->ip())
->getPayLink();
$data = [
'pay_url' => $pay_url
];
break;
case Order::PAY_TYPE_WECHAT: (微信)
(列子)
// $unifyResult:
//{
// "return_code": "SUCCESS",
// "return_msg": "OK",
// "appid": "wx2421b1c4390ec4sb",
// "mch_id": "10000100",
// "nonce_str": "IITRi8Iabbblz1J",
// "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeSs6o",
// "sign": "7921E432F65EB8ED0CE9755F0E86D72F2",
// "result_code": "SUCCESS",
// "prepay_id": "wx201411102639507cbf6ffd8b0779950874",
// "trade_type": "JSAPI"
//}
try {
$unifyResult = $this->wxPayment->order->unify([
'body' => $order->name,
'out_trade_no' => $order->order_sn,
'total_fee' => $order->pay_fee,
'trade_type' => 'JSAPI',
'openid' => $user->openid,
]);
} catch (Exception $e) {
return $this->baseFailed('获取支付配置失败');
}
if ($unifyResult['return_code'] != 'SUCCESS') {
return $this->baseFailed('获取微信支付配置失败:通信失败');
}
if ($unifyResult['result_code'] != 'SUCCESS') {
Log::error('订单:' . $order->order_sn . ' 用户获取微信支付配置失败。err_code:' . $unifyResult['err_code'] . ' err_code_des: ' . $unifyResult['err_code_des']);
return $this->baseFailed('获取微信支付配置失败');
}
$prepayId = $unifyResult['prepay_id'];
$data = $this->wxPayment->jssdk->bridgeConfig($prepayId, false);
break;
default:
return $this->baseFailed('未知的支付方式');
}
$old_status_fmt = $order->statusFormat();
try {
$order->status = Order::STATUS_WAITE_PAY;
$order->save();
} catch (Exception $e) {
return $this->baseFailed('获取支付配置失败');
}
$this->orderHandleLog($user, $order, $old_status_fmt, '学员拉起支付');
return $this->baseSucceed($data);
}
}
退款
Service:
se App\Services\Traits\OrderHandleTrait;
use EasyWeChat;
use Yansongda\LaravelPay\Facades\Pay;
use Yansongda\Pay\Gateways\Alipay;
use Exception;
use OrderHandleTrait;
/**
* @var EasyWeChat\Payment\Application
*/
protected $wxPayment;
/**
* @var Alipay
*/
protected $aliPayment;
/**
* PayNotifyService constructor.
*/
public function __construct()
{
$this->wxPayment = EasyWeChat::payment();
$this->aliPayment = Pay::alipay();
}
/**
* 退款业务
*
* @param $user
* @param OrderRefund $refund
*
* @return bool|string
* @throws Exception
*/
public function refund($user, $refund)
{
if (!$refund->order) {
return false;
}
if (!in_array($refund->order->status, [
Order::STATUS_REFUND_APPLY_BEFORE_AUDIT,
Order::STATUS_REFUND_APPLY_WITH_AUDIT_FAILURE,
Order::STATUS_REFUND_AFTER_AUDIT,
Order::STATUS_REFUND_AFTER_STUDY
])) {
return false;
}
if (!in_array($refund->status, [OrderRefund::STATUS_WAITE, OrderRefund::STATUS_HANDLE])
|| $refund->student_confirm != OrderRefund::CONFIRMED
|| $refund->school_confirm != OrderRefund::CONFIRMED) {
return false;
}
$result = false;
if ($refund->refund_money > 0) {
switch ($refund->order->pay_type) {
case Order::PAY_TYPE_ALI:
// $result = $this->aliRefund($refund->order->order_sn, $refund->refund_sn, $refund->order->pay_fee,
// $refund->refund_money);
$result = $this->tempAliRefund($refund->order->order_sn, $refund->refund_sn, $refund->refund_money);
break;
case Order::PAY_TYPE_WECHAT:
//一年前的订单无法退款
if ($refund->order->paid_at->getTimestamp() < strtotime('-1 year')) {
throw new Exception('交易时间超过一年的订单无法提交微信退款');
}
$result = $this->wxRefund($refund->order->order_sn, $refund->refund_sn, $refund->order->pay_fee,
$refund->refund_money);
break;
}
} else {
$result = '';
}
if ($result === false) {
return false;
}
return $result;
}
/**
* 微信退款
*
* @param string $order_sn
* @param string $refund_sn
* @param int $payed_fee
* @param int $refund_fee
*
* @return bool|string
*/
private function wxRefund($order_sn, $refund_sn, $payed_fee, $refund_fee)
{
try {
$result = $this->wxPayment->refund->byOutTradeNumber($order_sn, $refund_sn, $payed_fee, $refund_fee, [
'refund_desc' => '学员报名订单退款',
]);
if ($result['return_code'] !== 'SUCCESS') {
return false;
}
if (array_get($result, 'result_code') !== 'SUCCESS') {
return false;
}
return $result['refund_id'];
} catch (Exception $e) {
return false;
}
}
/**
* 新版本支付宝退款
*
* @param $order_sn
* @param $refund_fee
*
* @return bool
*/
private function aliRefund($order_sn, $refund_fee)
{
$params = [
'out_trade_no' => $order_sn,
'refund_amount' => $refund_fee * 0.01,
];
try {
$result = $this->aliPayment->refund($params);
if ($result->trade_status != 'TRADE_SUCCESS') {
return false;
}
return true;
} catch (Exception $e) {
return false;
}
}
/**
* 旧版支付宝退款
*
* @param string $order_sn
* @param string $refund_sn
* @param int $refund_fee
*
* @return bool
*/
private function tempAliRefund($order_sn, $refund_sn, $refund_fee)
{
$refund = new RefundSdk(config('pay.temp_alipay'));
try {
$refund_result = $refund->refund($order_sn, $refund_fee * 0.01, $refund_sn, '学员报名订单退款');
if (!$refund_result) {
return false;
}
return $refund_result['trade_no'];
} catch (Exception $e) {
return false;
}
}
剩下的你就调用就完事了