1、引入easy wechat :
composer require “overtrue/laravel-wechat:~4.0”
laravel 5.8以上
composer require “overtrue/laravel-wechat:~5.0”
2、发布生成配置文件
php artisan vendor:publish --provider=“Overtrue\LaravelWeChat\ServiceProvider”
3、配置微信配置文件,在config/wechat.php
把微信支付打开注释,配置app_id,mch_id,key
/*
* 微信支付
*/
'payment' => [
'default' => [
'sandbox' => env('WECHAT_PAYMENT_SANDBOX', false),
'app_id' => env('WECHAT_PAYMENT_APPID', 'XXXXX'),
'mch_id' => env('WECHAT_PAYMENT_MCH_ID', 'XXXX'),
'key' => env('XXXXX'),
'cert_path' => env('WECHAT_PAYMENT_CERT_PATH', 'path/to/cert/apiclient_cert.pem'), // XXX: 绝对路径!!!!
'key_path' => env('WECHAT_PAYMENT_KEY_PATH', 'path/to/cert/apiclient_key.pem'), // XXX: 绝对路径!!!!
'notify_url' => 'http://XXXXXXX/wechat/notify', // 默认支付结果通知地址
],
// ...
],
4、创建路由
//微信支付
Route::get(‘wechat/place/order’,‘Wechat\WechatController@placeOrder’); //生成微信支付订单
Route::post(‘wechat/notify’,‘Wechat\WechatController@notify’); //微信支付回调
5、创建controller
<?php
namespace App\Http\Controllers\Wechat;
use App\Http\Controllers\Controller;
use EasyWeChat\Factory;
class WechatController extends Controller
{
// 请求微信接口的公用配置, 所以单独提出来
private function payment()
{
$config = [
// 必要配置, 这些都是之前在 .env 里配置好的
'app_id' => config('wechat.payment.default.app_id'),
'mch_id' => config('wechat.payment.default.mch_id'),
'key' => config('wechat.payment.default.key'), // API 密钥
'notify_url' => config('wechat.payment.default.notify_url'), // 通知地址
];
// 这个就是 easywechat 封装的了, 一行代码搞定, 照着写就行了
//var_dump($config);die;
$app = Factory::payment($config);
return $app;
}
/***
* @author lifang
* @info 订单支付
*/
public function placeOrder()
{
$sOrderSn = orderSn();
$app = $this->payment();
//订单金额是要查询出来的,所以这里要处理订单金额,测试暂时使用1fen
$nPrice = 1;
$total_fee = env('APP_DEBUG') ? 1 : $nPrice;
//第一次验签
$result = $app->order->unify([
'trade_type' => 'MWEB', // 原生支付即扫码支付,商户根据微信支付协议格式生成的二维码,用户通过微信“扫一扫”扫描二维码后即进入付款确认界面,输入密码即完成支付。
'body' => '订单支付', // 这个就是会展示在用户手机上巨款界面的一句话, 随便写的
'out_trade_no' => $sOrderSn,
'total_fee' => $total_fee,
'spbill_create_ip' => request()->ip(), // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
'notify_url' => config('wechat.payment.default.notify_url'),
// 'sign' => config('wechat.payment.default.key'),
'nonce_str' => 'sdas12',
// 'openid' => '123'
]);
//第二次验签
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
$result = $app->jssdk->appConfig($result['prepay_id']);//第二次签名
return [
'code' => 'success',
'msg' => $result
];
} else {
// Log::error('微信支付签名失败:'.var_export($result,1));
return false;
}
}
/**
* 微信测评支付回调方法,修改订单状态
* @return mixed
*/
public function notify()
{
$payment = EasyWeChat::payment();
$response = $payment->handlePaidNotify(function ($message, $fail) {
if ($message['return_code'] === 'SUCCESS' && $message['result_code'] === 'SUCCESS') {
// \Log::debug($message);
//业务逻辑
// PcOrder::where('out_trade_no', $message['out_trade_no'])->update(['status' => 1, 'pay_time' => time()]);//更改订单状态
//支付后,微信会在此处返回支付状态,就是$message,回调里面打印不出来,可通过写入日志里面查看,支付成功后更改订单状态。当然你也可以进行其他操作。
return true;
} else {
// \Log::debug('我不买了');
return $fail('失败');
}
});
return $response;
}
// 实例化 easyweachat 类
protected function app()
{
//$url = get_domain();
$config = [
'app_id' => config('wechat.payment.default.app_id'),
'secret' => config('wechat.payment.default.mch_id'),
//'token' => 'TestToken',
'response_type' => 'array',
'oauth' => [
// 'scopes' => ['snsapi_userinfo'],
'scopes' => ['snsapi_login'],
'callback' => 'http://39.106.113.193:8081' . '/api/login/oauth?pid=' . 123,
],
];
$wechat_app = Factory::officialAccount($config);
return $wechat_app;
}
}
这里需要说一下,网页支付是不需要open_id的,如果需要根据实际情况去请求open_id,trade_type这个参数是支付类型,关注一下,多看看微信的官方文档https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1 看清楚参数,以免在使用中镐头发。
6、请求成功
我这里因为商户长时间没有支付和收款被微信禁用了,申请恢复支付功能了,所以返回的还在审核中,一般情况下是没有问题的。在业务逻辑中加上你的业务流程就可以了。