laravel安装laravel-wechat 实现微信授权登录
一.下载laravel-wechat
https://packagist.org/packages/overtrue/laravel-wechat
二. 使用composer安装laravel-wechat
composer require "overtrue/laravel-wechat:~4.0"
三.配置
在 config/app.php 注册 ServiceProvider 和 Facade (Laravel 5.5 + 无需手动注册)
'providers' => [ | |
// ... | |
Overtrue\LaravelWeChat\ServiceProvider::class, | |
], | |
'aliases' => [ | |
// ... | |
'EasyWeChat' => Overtrue\LaravelWeChat\Facade::class, | |
], | |
创建配置文件:
php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider
1.修改应用根目录下的 config/wechat.php 中对应的参数即可。
WECHAT_LOG_LEVEL=info //日志级别 最好和laravel同级 | |
WECHAT_LOG_FILE=/var/log/coupon/report.log //日志保存文件 最好和laravel 统一 | |
WECHAT_OFFICIAL_ACCOUNT_APPID=申请的appid | |
WECHAT_OFFICIAL_ACCOUNT_SECRET=申请的appsecret | |
WECHAT_OFFICIAL_ACCOUNT_TOKEN= | |
WECHAT_OFFICIAL_ACCOUNT_AES_KEY= |
easyWeChat 微信公众号验证 token
namespace Modules\Easywechat\Http\Controllers; | |
use EasyWeChat\Factory; | |
use Illuminate\Contracts\Support\Renderable; | |
use Illuminate\Http\Request; | |
use Illuminate\Routing\Controller; | |
class EasywechatController extends Controller | |
{ | |
/** | |
* 公众号token验证 | |
* | |
* @return string | |
*/ | |
public function serve() | |
{ | |
$app = app('wechat.official_account'); | |
$app->server->push(function ($message) { | |
return "欢迎关注 overtrue!"; | |
}); | |
return $app->server->serve(); | |
} | |
/** 公众号模板消息发送 | |
* @param $data | |
* @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException | |
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException | |
* @throws \GuzzleHttp\Exception\GuzzleException | |
*/ | |
public function confirm_receipt($data) | |
{ | |
$config = config('wechat.official_account.default'); | |
$app = Factory::officialAccount($config); | |
$app->template_message->send([ | |
'touser' => $data['openid'], //用户openid | |
'template_id' => env('CONFIRM_RECEIPT', '45445'), //发送的模板id | |
'data' => [ | |
'first' => '您已确认收货,请知晓!', | |
'keyword1' => $data['order_no'], | |
'keyword4' => $data['name'], | |
], | |
]); | |
} | |
//公众号授权 | |
public function officialAccounts() | |
{ | |
$app = app('wechat.official_account'); | |
$oauth = $app->oauth; | |
// 指定回调 URL,比如设置回调 URL 为当前页面 | |
// $redirectUrl = $oauth->scopes(['snsapi_userinfo'])->redirect(); | |
$redirectUrl = $oauth->scopes(['snsapi_userinfo'])->redirect(); | |
return \redirect($redirectUrl); | |
// return $this->success(compact('redirectUrl')); | |
} | |
//公众号授权回调 | |
public function officialAccountToNotify(Request $request) | |
{ | |
$code = $request->code ? $request->code : null; | |
if (empty($code)) { | |
return $this->fail('请重新授权登录'); | |
} | |
$app = app('wechat.official_account'); | |
$oauth = $app->oauth; | |
// 获取 OAuth 授权用户信息 | |
$userinfo = $oauth->userFromCode($code); | |
$user = User::where('openid', $userinfo["openid"]); | |
$data = $userinfo['raw']; | |
if ($user->doesntExist()) { | |
$data['avatar'] = $data['headimgurl']; | |
$data['name'] = $data['nickname']; | |
$data['password'] = Hash::make('8888888'); | |
$data['enable_status'] = 0; | |
unset($data['headimgurl']); | |
unset($data['privilege']); | |
$userinfo = User::create($data); | |
} else { | |
$userinfo = $user->first(); | |
} | |
$access_token = $userinfo->createToken('user')->accessToken; | |
return $this->success(['access_token' => 'Bearer ' . $access_token]); | |
} | |
/** | |
*小程序 微信授权登录 | |
* @param Request $request | |
* @return array | |
*/ | |
public function wxappLogin(Request $request) | |
{ | |
$app = app('wechat.mini_program'); | |
$data = $app->auth->session($request->code); | |
if (isset($data['errcode'])) { | |
return $this->fail('code已过期或不正确'); | |
} | |
$userInfo = $app->encryptor->decryptData($data['session_key'], $request->iv, $request->encryptedData); | |
$user = User::where('openid', $data["openid"]); | |
if ($user->doesntExist()) { | |
$userInfo['openid'] = $data["openid"]; | |
$userInfo['avatar'] = $userInfo['avatarUrl']; | |
$userInfo['nickname'] = $userInfo['nickName']; | |
$userInfo['name'] = $userInfo['nickName']; | |
$userInfo['password'] = Hash::make('8888888'); | |
$userInfo['enable_status'] = 0; | |
unset($userInfo['nickName']); | |
unset($userInfo['avatarUrl']); | |
unset($userInfo['watermark']); | |
// return $this->success($userInfo); | |
$userinfo = User::create($userInfo); | |
} else { | |
$userinfo = $user->first(); | |
} | |
$access_token = $userinfo->createToken('user')->accessToken; | |
return $this->success(['access_token' => 'Bearer ' . $access_token]); | |
// return $this->success(['c' => $this->wxapp_config, 'b' => $app, 'f' => $data, 'userInfo' => ]); | |
} | |
} |
laravel使用EasyWeChat 统一下单
use EasyWeChat\Factory; | |
private $app; | |
public function __construct() | |
{ | |
$config = config('wechat.payment.default'); | |
$this->app = Factory::payment($config); | |
} | |
public function payment(PayRequest $request){ | |
$isContract = true; | |
$result = $this->app->order->unify([ | |
'body' => '用户下单', | |
'out_trade_no' => $order_no, | |
'total_fee' => 10, | |
// 'spbill_create_ip' => '123.12.12.123', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址 | |
'notify_url' => config('wechat.payment.default.notify_url'), // 支付结果通知网址,如果不设置则会使用配置里的默认地址 | |
'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型 | |
'openid' => Auth::user()->openid, | |
], $isContract); | |
//注意 | |
1、如果支付时出现报错,timestame 参数问题。这是 easywechat 底层文件出错了。 | |
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){ | |
$config['timeStamp'] = $config['timestamp']; | |
unset($config['timestamp']); | |
return $this->success( $config); | |
}else{ | |
return $this->fail('支付失败'); | |
} | |
2、如果签名失败 | |
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){ | |
$prepayId = $result['prepay_id']; | |
$jssdk =$this->app->jssdk; | |
$config = $jssdk->sdkConfig($prepayId); | |
$config['timeStamp'] = $config['timestamp']; | |
unset($config['timestamp']); | |
return $this->success( $config); | |
}else{ | |
return $this->fail('支付失败'); | |
} | |
} |
申请退款
退款方式 分为两种
第一种:根据微信订单号退款
// 参数分别为:微信订单号、商户退款单号、订单金额、退款金额、其他参数 | |
$app->refund->byTransactionId(string $transactionId, string $refundNumber, int $totalFee, int $refundFee, array $config = []); | |
// Example: | |
$result = $app->refund->byTransactionId('transaction-id-xxx', 'refund-no-xxx', 10000, 10000, [ | |
// 可在此处传入其他参数,详细参数见微信支付文档 | |
'refund_desc' => '商品已售完', | |
]); |
使用
第二种:根据商户订单号退款
// 参数分别为:商户订单号、商户退款单号、订单金额、退款金额、其他参数 | |
$app->refund->byOutTradeNumber(string $number, string $refundNumber, int $totalFee, int $refundFee, array $config = []); | |
// Example: | |
$result = $app->refund->byOutTradeNumber('out-trade-no-xxx', 'refund-no-xxx', 20000, 1000, [ | |
// 可在此处传入其他参数,详细参数见微信支付文档 | |
'refund_desc' => '退运费', | |
]); |