You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							121 lines
						
					
					
						
							3.6 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							121 lines
						
					
					
						
							3.6 KiB
						
					
					
				
								<?php
							 | 
						|
								
							 | 
						|
								namespace App\Http\Controllers\Api;
							 | 
						|
								use App\Http\Controllers\Controller;
							 | 
						|
								use App\Models\AdminSetting;
							 | 
						|
								use App\Models\Agent;
							 | 
						|
								use App\Models\MiniProgramUploadLog;
							 | 
						|
								use EasyWeChat\Factory;
							 | 
						|
								use Illuminate\Http\Request;
							 | 
						|
								use Illuminate\Support\Facades\DB;
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * 小程序授权等相关
							 | 
						|
								 * Class MiniProgramController
							 | 
						|
								 * @package App\Http\Controllers\Api
							 | 
						|
								 */
							 | 
						|
								class MiniProgramController extends Controller
							 | 
						|
								{
							 | 
						|
									// 第三方平台授权事件通知
							 | 
						|
									public function authEvent(Request $request)
							 | 
						|
									{
							 | 
						|
										DB::table('mini_program_events')
							 | 
						|
											->insert([
							 | 
						|
												'type' => 0,
							 | 
						|
												'response' => json_encode($request->all()),
							 | 
						|
												'event' => 'all',
							 | 
						|
												'created_at' => now(),
							 | 
						|
											]);
							 | 
						|
								
							 | 
						|
										$setting = AdminSetting::val(['service_appid', 'service_appsecret', 'service_token', 'service_aeskey']);
							 | 
						|
										$config = [ // 第三方平台信息
							 | 
						|
											'app_id'   => $setting['service_appid'],
							 | 
						|
											'secret'   => $setting['service_appsecret'],
							 | 
						|
											'token'    => $setting['service_token'],
							 | 
						|
											'aes_key'  => $setting['service_aeskey'],
							 | 
						|
										];
							 | 
						|
								
							 | 
						|
										$openPlatform = Factory::openPlatform($config);
							 | 
						|
										$server = $openPlatform->server;
							 | 
						|
								
							 | 
						|
										// 处理授权成功事件:Guard::EVENT_AUTHORIZED
							 | 
						|
										// 处理授权更新事件:Guard::EVENT_UPDATE_AUTHORIZED
							 | 
						|
										// 处理授权取消事件:Guard::EVENT_UNAUTHORIZED
							 | 
						|
										$server->push(function ($message) {
							 | 
						|
											DB::table('mini_program_events')
							 | 
						|
												->insert([
							 | 
						|
													'type' => 0,
							 | 
						|
													'response' => json_encode($message),
							 | 
						|
													'event' => $message['InfoType'] ?? '',
							 | 
						|
													'created_at' => now()
							 | 
						|
												]);
							 | 
						|
								
							 | 
						|
											if (isset($message['InfoType'], $message['status'], $message['msg'], $message['info']) && $message['status'] == 0 && $message['msg'] == 'OK') {
							 | 
						|
												//注册成功授权通知
							 | 
						|
												if ($message['InfoType'] == 'notify_third_fasteregister') {
							 | 
						|
													Agent::where(['company_name' => $message['info']['name'], 'credit_codes' => $message['info']['code']])
							 | 
						|
														->update(['appid' => $message['appid']]);
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										});
							 | 
						|
								
							 | 
						|
										return $server->serve();
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									public function msgEvent(Request $request)
							 | 
						|
									{
							 | 
						|
										$appid = $request->route('appid', '');
							 | 
						|
								
							 | 
						|
										DB::table('mini_program_events')
							 | 
						|
											->insert([
							 | 
						|
												'type' => 1,
							 | 
						|
												'response' => json_encode($request->all()),
							 | 
						|
												'appid' => $appid,
							 | 
						|
												'event' => 'all',
							 | 
						|
												'created_at' => now(),
							 | 
						|
											]);
							 | 
						|
								
							 | 
						|
										$setting = AdminSetting::val(['service_appid', 'service_appsecret', 'service_token', 'service_aeskey']);
							 | 
						|
										$config = [
							 | 
						|
											'app_id'   => $setting['service_appid'],
							 | 
						|
											'secret'   => $setting['service_appsecret'],
							 | 
						|
											'token'    => $setting['service_token'],
							 | 
						|
											'aes_key'  => $setting['service_aeskey'],
							 | 
						|
										];
							 | 
						|
								
							 | 
						|
										$openPlatform = Factory::openPlatform($config);
							 | 
						|
										$refreshToken = $openPlatform->getAuthorizer($appid)['authorization_info']['authorizer_refresh_token'] ?? null;
							 | 
						|
										if (!$refreshToken) {
							 | 
						|
											return $this->error('获取refresh_token失败');
							 | 
						|
										}
							 | 
						|
										$server = $openPlatform->miniProgram($appid, $refreshToken)->server;
							 | 
						|
								
							 | 
						|
										//接收事件 https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/audit_event.html
							 | 
						|
										$server->push(function ($message) use ($appid) {
							 | 
						|
											DB::table('mini_program_events')
							 | 
						|
												->insert([
							 | 
						|
													'type' => 1,
							 | 
						|
													'response' => json_encode($message),
							 | 
						|
													'event' => $message['MsgType'] ?? '',
							 | 
						|
													'created_at' => now()
							 | 
						|
												]);
							 | 
						|
								
							 | 
						|
											//审核结果通知
							 | 
						|
											if (isset($message['MsgType'], $message['Event']) && $message['MsgType'] == 'event') {
							 | 
						|
												$auditArr = [
							 | 
						|
													'weapp_audit_success' => 0, //成功
							 | 
						|
													'weapp_audit_fail' => 1, //拒绝
							 | 
						|
													'weapp_audit_delay' => 4, //审核延后
							 | 
						|
												];
							 | 
						|
												$log = MiniProgramUploadLog::query()
							 | 
						|
													->where('appid', $appid)
							 | 
						|
													->orderBy('id', 'desc')
							 | 
						|
													->first();
							 | 
						|
												$log->is_success = $auditArr[$message['Event']] ?? -1;
							 | 
						|
												$log->save();
							 | 
						|
											}
							 | 
						|
										});
							 | 
						|
								
							 | 
						|
										return $server->serve();
							 | 
						|
									}
							 | 
						|
								}
							 |