| 
									
										
										
										
											2023-08-10 14:59:52 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace app\api\controller; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use app\api\logic\PayLogic; | 
					
						
							|  |  |  | use app\common\basics\Api; | 
					
						
							|  |  |  | use app\common\enum\OrderEnum; | 
					
						
							|  |  |  | use app\common\enum\PayEnum; | 
					
						
							|  |  |  | use app\common\model\Client_; | 
					
						
							|  |  |  | use app\common\model\order\OrderTrade; | 
					
						
							|  |  |  | use app\common\model\order\Order; | 
					
						
							|  |  |  | use app\common\model\order\OrderLog; | 
					
						
							|  |  |  | use app\common\server\AliPayServer; | 
					
						
							|  |  |  | use app\common\server\JsonServer; | 
					
						
							|  |  |  | use app\common\model\Test; | 
					
						
							|  |  |  | use app\common\server\WeChatPayServer; | 
					
						
							|  |  |  | use app\common\server\WeChatServer; | 
					
						
							|  |  |  | use app\common\model\integral\IntegralOrder; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Class Pay | 
					
						
							|  |  |  |  * @package app\api\controller | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class Pay extends Api | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     public $like_not_need_login = ['notifyMnp', 'notifyOa', 'notifyApp', 'aliNotify']; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @notes 支付入口 | 
					
						
							|  |  |  |      * @return \think\response\Json | 
					
						
							|  |  |  |      * @throws \think\db\exception\DataNotFoundException | 
					
						
							|  |  |  |      * @throws \think\db\exception\DbException | 
					
						
							|  |  |  |      * @throws \think\db\exception\ModelNotFoundException | 
					
						
							|  |  |  |      * @author suny | 
					
						
							|  |  |  |      * @date 2021/7/13 6:13 下午 | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function unifiedpay() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $post = $this->request->post(); | 
					
						
							|  |  |  |         if(!isset($post['pay_way'])) { | 
					
						
							|  |  |  |             return JsonServer::error('请选择支付方式'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ($post['from'] == 'order') { | 
					
						
							|  |  |  |             // 更新支付方式
 | 
					
						
							|  |  |  |             $order = Order::findOrEmpty($post['order_id']); | 
					
						
							|  |  |  |             $order->pay_way = $post['pay_way']; | 
					
						
							|  |  |  |             $order->save(); | 
					
						
							|  |  |  |             $pay_way = $order['pay_way']; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ($post['from'] == 'trade') { | 
					
						
							|  |  |  |             $order = Order::where('trade_id', $post['order_id'])->findOrEmpty(); | 
					
						
							|  |  |  |             // 更新支付方式
 | 
					
						
							|  |  |  |             Order::where('trade_id', $post['order_id'])->update(['pay_way' => $post['pay_way']]); | 
					
						
							|  |  |  |             $pay_way = $post['pay_way']; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ($post['from'] == 'recharge') { | 
					
						
							|  |  |  |             $pay_way = isset($post['pay_way']) ? $post['pay_way'] : PayEnum::WECHAT_PAY; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // 积分订单
 | 
					
						
							|  |  |  |         if ($post['from'] == 'integral') { | 
					
						
							|  |  |  |             $order = IntegralOrder::findOrEmpty($post['order_id']); | 
					
						
							|  |  |  |             IntegralOrder::where('id', $post['order_id'])->update(['pay_way' => $post['pay_way']]); | 
					
						
							|  |  |  |             $pay_way = $post['pay_way']; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // order,trade方式金额为0直接走余额支付
 | 
					
						
							|  |  |  |         if (isset($order) && $order['order_amount'] == 0) { | 
					
						
							|  |  |  |             $result = PayLogic::balancePay($post['order_id'], $post['from']); | 
					
						
							|  |  |  |             return $result; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         switch ($pay_way) { | 
					
						
							|  |  |  |             case OrderEnum::PAY_WAY_BALANCE://余额支付 | 
					
						
							|  |  |  |                 $result = PayLogic::balancePay($post['order_id'], $post['from']); | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case OrderEnum::PAY_WAY_WECHAT://微信支付 | 
					
						
							| 
									
										
										
										
											2023-08-30 14:38:10 +08:00
										 |  |  |                 // openid为空 且在小程序或公众号中支付时 必填openid
 | 
					
						
							|  |  |  |                 if (empty($post['openid']) && in_array($this->client, [Client_::mnp, Client_::oa])) { | 
					
						
							| 
									
										
										
										
											2023-08-21 17:14:07 +08:00
										 |  |  |                     //微信支付时必须传openid过来
 | 
					
						
							|  |  |  |                     return JsonServer::error('缺少openid'); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2023-08-30 14:38:10 +08:00
										 |  |  |                 $result = PayLogic::wechatPay($post['order_id'], $post['from'], $this->client, $post['openid'] ?? ''); | 
					
						
							| 
									
										
										
										
											2023-08-10 14:59:52 +08:00
										 |  |  |                 break; | 
					
						
							|  |  |  |             case OrderEnum::PAY_WAY_ALIPAY://支付宝支付 | 
					
						
							|  |  |  |                 $result = PayLogic::aliPay($post['order_id'], $post['from'],$this->client); | 
					
						
							|  |  |  |                 $data = [ | 
					
						
							|  |  |  |                     'code' => 10001, | 
					
						
							|  |  |  |                     'msg' => '发起成功', | 
					
						
							|  |  |  |                     'data' => $result, | 
					
						
							|  |  |  |                     'show' => 0, | 
					
						
							|  |  |  |                 ]; | 
					
						
							|  |  |  |                 return json($data); | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $result; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @notes 小程序回调 | 
					
						
							|  |  |  |      * @throws \EasyWeChat\Kernel\Exceptions\Exception | 
					
						
							|  |  |  |      * @author suny | 
					
						
							|  |  |  |      * @date 2021/7/13 6:13 下午 | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function notifyMnp() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $config = WeChatServer::getPayConfig(Client_::mnp); | 
					
						
							|  |  |  |         return WeChatPayServer::notify($config); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @notes 公众号回调 | 
					
						
							|  |  |  |      * @throws \EasyWeChat\Kernel\Exceptions\Exception | 
					
						
							|  |  |  |      * @author suny | 
					
						
							|  |  |  |      * @date 2021/7/13 6:13 下午 | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function notifyOa() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $config = WeChatServer::getPayConfig(Client_::oa); | 
					
						
							|  |  |  |         return WeChatPayServer::notify($config); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @notes APP回调 | 
					
						
							|  |  |  |      * @throws \EasyWeChat\Kernel\Exceptions\Exception | 
					
						
							|  |  |  |      * @author suny | 
					
						
							|  |  |  |      * @date 2021/7/13 6:14 下午 | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function notifyApp() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $config = WeChatServer::getPayConfig(Client_::ios); | 
					
						
							|  |  |  |         return WeChatPayServer::notify($config); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @notes 支付宝回调 | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      * @author suny | 
					
						
							|  |  |  |      * @date 2021/7/13 6:14 下午 | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function aliNotify() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $data = $this->request->post(); | 
					
						
							|  |  |  |         $result = (new AliPayServer())->verifyNotify($data); | 
					
						
							|  |  |  |         if (true === $result) { | 
					
						
							|  |  |  |             echo 'success'; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             echo 'fail'; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |