1.在 大白象下载wechat包
composer require "overtrue/laravel-wechat:~3.0" -vvv (考虑运行环境,下个低点得版本,通用)
2.生成配置文件
php artisan vendor:publish --provider="Overtrue\LaravelWechat\ServiceProvider"
3.修改配置文件 config/wechat.php
<?php
use EasyWeChat\Foundation\Application;
return [
...
/*
* 账号基本信息,请从微信公众平台/开放平台获取
*/
'app_id' => env('WECHAT_APPID', '你的微信公众号id'), // AppID应用id
'secret' => env('WECHAT_SECRET', 'your-app-secret'), // AppSecret
'token' => env('WECHAT_TOKEN', 'your-token'), // Token
'aes_key' => env('WECHAT_AES_KEY', ''), // EncodingAESKey
........
/*
* 微信支付的配置
*/
'payment' => [
'merchant_id' => env('WECHAT_PAYMENT_MERCHANT_ID', 'your-mch-id'),//微信相关的支付账号 =》商户账号
'key' => env('WECHAT_PAYMENT_KEY', 'key-for-signature'),//微信相关的支付密码=》支付密钥
//'cert_path' => env('WECHAT_PAYMENT_CERT_PATH', 'path/to/your/cert.pem'), // XXX: 绝对路径!!!!
//'key_path' => env('WECHAT_PAYMENT_KEY_PATH', 'path/to/your/key'), // XXX: 绝对路径!!!!
// 'device_info' => env('WECHAT_PAYMENT_DEVICE_INFO', ''),
// 'sub_app_id' => env('WECHAT_PAYMENT_SUB_APP_ID', ''),
// 'sub_merchant_id' => env('WECHAT_PAYMENT_SUB_MERCHANT_ID', ''),
// ...
],
...
/**
* Guzzle 全局设置
* 这个是为了那个证书的调用但是有没有的原因 也就是 添加guzzle配置关闭SSL认证
* 更多请参考: http://docs.guzzlephp.org/en/latest/request-options.html
*/
'guzzle' => [
'timeout' => 3.0, // 超时时间(秒)
'verify' => false, // 关掉 SSL 认证
],
];
4.需要下载一个二维码生成器我们还是在大白象
composer require "endroid/qrcode:~2.5" -vvv
easywechat参考文档:https://www.easywechat.com/docs/3.x/overview
二维码参考文档:https://github.com/endroid/qr-code/tree/2.x
public function wxPay()
{
//订单ID
$id = \request()->get("id");
//把订单找出来
$orderModel = Order::find($id);
//0.配置
$options = config("wechat");
//dd($options);
$app = new Application($options);
$payment = $app->payment;
//1.生成订单
$attributes = [
'trade_type' => 'NATIVE', // JSAPI,NATIVE,APP...
//JSAPI 公众号支付 NATIVE 扫码支付 APP APP支付
'body' => '名字',
'detail' => '详情',
'out_trade_no' => $orderModel->order_code,
'total_fee' => $orderModel->total * 100, // 单位:分
'notify_url' => 'http://www.XXX.com', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
// 'openid' => '当前用户的 openid', // trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识,
// ...
];
$order = new \EasyWeChat\Payment\Order($attributes);
//2. 统计下单
$result = $payment->prepare($order);
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS') {
//2.1 拿到预支付链接
$codeUrl = $result->code_url;
$qrCode = new QrCode($codeUrl);
$qrCode->setSize(250);//大小
// Set advanced options
$qrCode
->setMargin(10)//外边框
->setEncoding('UTF-8')//编码
->setErrorCorrectionLevel(ErrorCorrectionLevel::HIGH)//容错级别
->setForegroundColor(['r' => 0, 'g' => 0, 'b' => 0])//码颜色
->setBackgroundColor(['r' => 255, 'g' => 255, 'b' => 255])//背景色
->setLabel('微信扫码支付', 16, public_path("font/msyh.ttf"), LabelAlignment::CENTER)
->setLogoPath(public_path("images/logo.png"))//LOGO设置图片
->setLogoWidth(100);//LOGO大小
// Directly output the QR code
header('Content-Type: ' . $qrCode->getContentType());//响应类型
exit($qrCode->writeString());
} else {
return $result;
}
}
5.异步通知
public function ok()
{
//0.配置
$options = config("wechat");
$app = new Application($options);
//1.回调
$response = $app->payment->handleNotify(function ($notify, $successful) {
// 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
// $order = 查询订单($notify->out_trade_no);
$order=Order::where("order_code",$notify->out_trade_no)->first();
if (!$order) { // 如果订单不存在
return 'Order not exist.'; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
}
// 如果订单存在
// 检查订单是否已经更新过支付状态
if ($order->status==1) { // 假设订单字段“支付时间”不为空代表已经支付
return true; // 已经支付成功了就不再更新了
}
// 用户是否支付成功
if ($successful) {
// 不是已经支付状态则修改为已经支付状态
//$order->paid_at = time(); // 更新支付时间为当前时间
$order->status = 1;
}
$order->save(); // 保存订单
return true; // 返回处理完成
});
return $response;
}
6.返回状态
public function status()
{
$id = \request()->get("id");
$order = Order::find($id);
return $order;
***:
如果在线上linux里面生成是没有问题的,但是如果是在window10本地测试你的用户不是admin就要注意权限的问题
,很有可能会出一个bug,The directory "C:\Window" is not writable
解决方案:
在该项目的
vendor\overtrue\wechat\src\Foundation\Application.php找(registerBase()这个方法)
强行修改一下返回的文件缓存就可以了
return new FilesystemCache(storage_path("app/public"));
ps:到线上可根据自己注释或者改回去
网友评论