diff --git a/app/Controller/CallBackController.php b/app/Controller/CallBackController.php index 32b1d8f..0876caf 100644 --- a/app/Controller/CallBackController.php +++ b/app/Controller/CallBackController.php @@ -2,15 +2,59 @@ namespace App\Controller; +use App\Constants\HttpEnumCode; +use App\Exception\BusinessException; use App\Services\BaseService; use App\Utils\Log; +use Extend\Wechat\WechatPay; +use Hyperf\HttpMessage\Stream\SwooleFileStream; +use Hyperf\HttpMessage\Stream\SwooleStream; +use Psr\Http\Message\ResponseInterface; -class CallBackController extends BaseService +class CallBackController extends AbstractController { - // 微信支付回调 - public function wxPayCallBack(){ - $request_params = $this->request->all(); - Log::getInstance()->info(json_encode($request_params,JSON_UNESCAPED_UNICODE)); + /** + * 患者端微信支付回调 + * @return ResponseInterface + * @throws \Throwable + */ + public function patientWxPayCallBack(): ResponseInterface + { + try { + // 处理支付结果事件 + $WechatPay = new WechatPay(1); + $app = $WechatPay->createApp(); + $server = $app->getServer(); + + $server->handlePaid(function ($message) { + Log::getInstance()->info("微信患者端支付回调数据:" . json_encode($message,JSON_UNESCAPED_UNICODE)); + dump($message); + // $message 为微信推送的通知结果,详看微信官方文档 + + // 微信支付订单号 $message['transaction_id'] + // 商户订单号 $message['out_trade_no'] + // 商户号 $message['mchid'] + // 具体看微信官方文档... + // 进行业务处理,如存数据库等... + }); + + // 处理退款结果事件 + $server->handleRefunded(function ($message) { + Log::getInstance()->info("微信患者端退款回调数据:" . json_encode($message,JSON_UNESCAPED_UNICODE)); + // 同上,$message 详看微信官方文档 + // 进行业务处理,如存数据库等... + }); + + return $server->serve(); + }catch (\Exception $e) { + return $this->response->withStatus(500)->withBody(new SwooleStream(strval(json_encode(['code' => 'ERROR', 'message' => $e->getMessage()], JSON_UNESCAPED_UNICODE)))); + } + } + + // 医生端微信支付回调 + public function doctorWxPayCallBack(): ResponseInterface + { + return $this->response->json([]); } // im回调 diff --git a/config/config.php b/config/config.php index e82f5bb..f182fbe 100644 --- a/config/config.php +++ b/config/config.php @@ -37,17 +37,18 @@ return [ "doctor" => [ "app_id" => env('DOCTOR_WECHAT_APP_ID', 'wxc83296720404aa7b'), "secret" => env('DOCTOR_WECHAT_APP_SECRET', '817665d3763637fe66d56548f8484622'), + "notify_url" => env('DOCTOR_WECHAT_NOTIFY_URL', 'callback/wxpay/doctor'), ], "patient" => [ "app_id" => env('PATIENT_WECHAT_APP_ID', 'wx70a196902e0841b6'), "secret" => env('PATIENT_WECHAT_APP_SECRET', '2671d2f4285180ddec5a5a2b16ed50f2'), + "notify_url" => env('PATIENT_WECHAT_NOTIFY_URL', 'callback/wxpay/patient'), + ], + "pay" => [ + "mch_id" => env('PATIENT_WECHAT_MCH_ID', '1636644248'), + "v3_api_secret" => env('PATIENT_WECHAT_APIv3_SECRET', 'gdxz292sjSOadN3m2pCda03NfCsmNadY'), ] ], - "pay" => [ - "mch_id" => env('PATIENT_WECHAT_MCH_ID', '1636644248'), - "app_id" => env('PATIENT_WECHAT_APP_ID', 'wx70a196902e0841b6'), - "v3_api_secret" => env('PATIENT_WECHAT_APIv3_SECRET', 'gdxz292sjSOadN3m2pCda03NfCsmNadY'), - ] ], "alibaba" => [// 阿里 "dysms" => [// 阿里云大鱼短信 diff --git a/config/routes.php b/config/routes.php index a90ba99..1ceb2b6 100644 --- a/config/routes.php +++ b/config/routes.php @@ -373,9 +373,12 @@ Router::addGroup('/system', function () { // 回调 Router::addGroup('/callback', function () { // 支付回调 - Router::addGroup('/pay', function () { - // 微信支付回调 - Router::post('/wx', [CallBackController::class, 'wxPayCallBack']); + Router::addGroup('/wxpay', function () { + // 患者端微信支付回调 + Router::post('/patient', [CallBackController::class, 'patientWxPayCallBack']); + + // 医生端微信支付回调 + Router::post('/doctor', [CallBackController::class, 'doctorWxPayCallBack']); }); // im回调 diff --git a/extend/Wechat/WechatPay.php b/extend/Wechat/WechatPay.php index cba82eb..2cc2d85 100644 --- a/extend/Wechat/WechatPay.php +++ b/extend/Wechat/WechatPay.php @@ -6,6 +6,7 @@ use App\Constants\HttpEnumCode; use App\Exception\BusinessException; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use EasyWeChat\Kernel\Exceptions\InvalidConfigException; +use EasyWeChat\OfficialAccount\Message; use EasyWeChat\Pay\Application; use Hyperf\Utils\ApplicationContext; use Psr\SimpleCache\CacheInterface; @@ -16,6 +17,7 @@ use Psr\SimpleCache\CacheInterface; class WechatPay { protected array $config;// 系统配置 + protected array $pay_config;// 支付系统配置 /** * @param string $user_type @@ -30,6 +32,8 @@ class WechatPay $this->config = config("we_chat.applets.pharmacist"); } + $this->pay_config = config("we_chat.applets.pay"); + if (empty($this->config)){ throw new BusinessException("系统配置错误", HttpEnumCode::SERVER_ERROR); } @@ -91,11 +95,11 @@ class WechatPay $app = $this->createApp(); $options = [ - "mchid" => config("we_chat.pay.mch_id"), // <---- 商户号 + "mchid" => $this->pay_config['mch_id'], // <---- 商户号 "out_trade_no" => $out_trade_no, // 商户系统内部订单号 "appid" => $this->config['app_id'], "description" => "问诊服务", - "notify_url" => "https://dev.hospital.applets.igandanyiyuan.com/callback/pay/wx", + "notify_url" => env('DOMAIN_NAME_DEV') . $this->config['notify_url'], "amount" => [ "total" => $total,//订单总金额,单位为分。 "currency" => "CNY" @@ -151,4 +155,6 @@ class WechatPay throw new BusinessException($e->getMessage(), HttpEnumCode::SERVER_ERROR); } } + + } \ No newline at end of file diff --git a/hospital-deploy.sh b/hospital-deploy.sh index d8a8068..966aa98 100644 --- a/hospital-deploy.sh +++ b/hospital-deploy.sh @@ -7,6 +7,8 @@ cd /data/www/hospital-applets-api || exit echo " APP_NAME=gdxz APP_ENV=dev +DOMAIN_NAME_DEV=https://dev.hospital.applets.igandanyiyuan.com/ +DOMAIN_NAME_PROD=https://dev.hospital.applets.igandanyiyuan.com/ # [mysql] DB_DRIVER=mysql @@ -34,11 +36,13 @@ JWT_ALGO=HS256 # [WECHAT] PATIENT_WECHAT_APP_ID=wx70a196902e0841b6 PATIENT_WECHAT_APP_SECRET=2671d2f4285180ddec5a5a2b16ed50f2 +PATIENT_WECHAT_NOTIFY_URL=callback/wxpay/patient # [DOCTOR] # [WECHAT] DOCTOR_WECHAT_APP_ID=wxc83296720404aa7b DOCTOR_WECHAT_APP_SECRET=817665d3763637fe66d56548f8484622 +DOCTOR_WECHAT_NOTIFY_URL=callback/wxpay/doctor # [AMQP] AMQP_HOST=42.193.16.243