git地址: http://packagist.p2hp.com/packages/yansongda/laravel-pay
具体使用说明请传送至 https://github.com/yansongda/pay
快速实现微信公众号支付功能 :https://www.jianshu.com/p/9c322b1a5274
运行环境
安装:
$ composer require yansongda/laravel-pay
配置文件:
$ php artisan vendor:publish --provider="Yansongda\LaravelPay\PayServiceProvider" --tag=laravel-pay
lumen用户请手动复制
随后,请在 config
文件夹中完善配置信息。
.env
文件里面配置
// alipay 配置
ALI_APP_ID=
ALI_PUBLIC_KEY=
ALI_PRIVATE_KEY=
// wechat 配置
WECHAT_APP_ID=
WECHAT_MINIAPP_ID=
WECHAT_APPID=
WECHAT_MCH_ID=
WECHAT_KEY=
使用方法:
微信配置文件: config/pay.php
return [
'wechat' => [
// 公众号 APPID
'app_id' => '',
// 小程序 APPID
'miniapp_id' => env('WECHAT_MINIAPP_ID', ''),
// APP 引用的 appid
'appid' => env('WECHAT_APPID', ''),
// 微信支付分配的微信商户号
'mch_id' => '',
// 微信支付异步通知地址
'notify_url' => '',
// 微信支付签名秘钥
'key' => '',
// 客户端证书路径,退款、红包等需要用到。请填写绝对路径,linux 请确保权限问题。pem 格式。
'cert_client' => public_path('cert/apiclient_cert.pem'),
// 客户端秘钥路径,退款、红包等需要用到。请填写绝对路径,linux 请确保权限问题。pem 格式。
'cert_key' => public_path('cert/apiclient_key.pem'),
// optional,默认 warning;日志路径为:sys_get_temp_dir().'/logs/yansongda.pay.log'
'log' => [
'file' => storage_path('logs/wechat.log'),
'level' => 'debug',
'type' => 'daily', // optional, 可选 daily.
'max_file' => 30,
],
],
];
后台文件
payController.php
/*
* 微信支付 唤起支付
* @return response
*/
public function wechatPay(Request $request)
{
$orderId = $request->input('order_id');
if (!$orderId) {
abort(404);
}
$userId = auth()->guard('home')->user()->id;
$openid = auth()->guard('home')->user()->openid;
$data = Order::where([
'user_id' => $userId,
'id' => $orderId,
'status' => 1,
'pay_status' => 1
])->first();
if ($data) {
$order = [
'out_trade_no' => $data['order_num'],
'body' => 'subject-测试',
'total_fee' => '1',
'openid' => $openid,
];
$config = config('pay.wechat');
$config['notify_url'] = config('app.url') . '/wechat/pay/notify';
$config['return_url'] = config('app.url') . '/wechat/pay/return';
$result = Pay::wechat($config)->mp($order);
$resData = [ //返回信息给前台 ,前台调起来微信支付
'timeStamp' => $result->timeStamp,
'nonceStr' => $result->nonceStr,
'packageStr' => $result->package,
'signType' => $result->signType,
'paySign' => $result->paySign,
];
$data = [
'code' => self::RESPONSE_CODE_SUCCESS,
'msg' => '获取成功',
'data' => $resData,
];
return response()->json($data);
}
return response()->json([
'code' => self::RESPONSE_CODE_ERROR,
'msg' => '获取失败'
]);
}
前台文件:
<!--jquery-->
<script src="/js/jquery.min.js" type="text/javascript" charset="utf-8"></script>
<!--微信的JSSDK-->
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script>
$(function() {
<!--通过config接口注入权限验证配置-->
wx.config({
debug: true, // 开启调试模式
appId: '${configMap.appId}', // 公众号的唯一标识
timestamp: '${configMap.timestamp}', // 生成签名的时间戳
nonceStr: '${configMap.nonceStr}', // 生成签名的随机串
signature: '${configMap.signature}',// 签名
jsApiList: ['chooseWXPay'] // 填入需要使用的JS接口列表,这里是先声明我们要用到支付的JS接口
});
<!-- config验证成功后会调用ready中的代码 -->
wx.ready(function(){
//点击马上付款按钮
$("#payBtn").click(function(){
//弹出支付窗口
wx.chooseWXPay({
timestamp: '${payMap.timeStamp}', // 支付签名时间戳,
nonceStr: '${payMap.nonceStr}', // 支付签名随机串,不长于 32 位
package: '${payMap.packageStr}', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=xxxx)
signType: '${payMap.signType}', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '${payMap.paySign}', // 支付签名
success: function (res) {
// 支付成功后的回调函数
alert("支付成功!");
}
});
})
});
});
</script>
/*
* 微信支付异步通知
* @return string|\Symfony\Component\HttpFoundation\Response
*/
public function wechatNotify()
{
error_reporting(0);
$config = config('pay.wechat');
$pay = Pay::wechat($config);
$data = $pay->verify(); // 是的,验签就这么简单
\Log::info('wechat notify');
\Log::info($data);
if (!$data) {
return '';
}
$orderSn = $data->out_trade_no;
$transactionId = $data->transaction_id;
//$orderSn = "2019080852999750";
//$transactionId=time();
$this->changeOrderStatus($orderSn, $transactionId);
return $pay->success();
}
//=======================================================================
微信退款管理:
新建控制器
use Yansongda\Pay\Pay;
退款方法
public function returnOrder(){
$config = config('pay.wechat');
$result = Pay::wechat($config)->refund([
'out_trade_no' => $orderData->order_num, // 之前的订单流水号
'total_fee' => 1, //原订单金额,单位分
'refund_fee' => 1, // 要退款的订单金额,单位分
'out_refund_no' =>Utils::getOrderNum(), // 退款订单号
'notify_url' => config('app.url') . '/wechat/praise/notify' //
/*
* 微信退款地址
* @return string|\Symfony\Component\HttpFoundation\Response
*/
public function wechatRefundNotify()
{
error_reporting(0);
$config = config('pay.wechat');
$pay = Pay::wechat($config);
$data = $pay->verify(null, true); // 是的,验签就这么简单
\Log::info('refund notify');
\Log::info($data);
if (!$data) {
return '';
}
$orderData = Order::where('order_num', $data['out_trade_no'])->first();
if ($data['return_code'] === 'SUCCESS') {
if ($orderData) {
if (($orderData->pay_status == 2) && ($orderData->status == 4)) {
$orderData->update([
'pay_status' => 3,
'status' => 5,
'refund_status' => 2
]);
}
}
}
return $pay->success();
}
]);
}
larval 微信支付及退款到此结束