136 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | ||
| namespace app\service;
 | ||
| use app\model\Order;
 | ||
| use app\model\Sign;
 | ||
| use app\service\util\BlueBrothersClientUtil;
 | ||
| use BlueBrothers\Openapi\Util;
 | ||
| use think\facade\Log;
 | ||
| 
 | ||
| class RechargeService
 | ||
| {
 | ||
|     private $merchantId;
 | ||
|     private $secretKey;
 | ||
|     public function __construct()
 | ||
|     {
 | ||
|         $this->merchantId = env('blue_brother.merchant_id', 23329);
 | ||
|         $this->secretKey = env('blue_brother.merchant_key', '8db16e8cc8363ed4eb4c14f9520bcc32');
 | ||
| 
 | ||
|     }
 | ||
|     /**
 | ||
|      * 直连天下提交充值处理
 | ||
|      * @param string $orderNumber
 | ||
|      * @return true
 | ||
|      * @throws \BlueBrothers\Openapi\OpenapiException
 | ||
|      * @throws \app\exception\BusinessException
 | ||
|      */
 | ||
|     public static function rechargeOrder(string $orderNumber)
 | ||
|     {
 | ||
|         $order = Order::getByOrderNumber($orderNumber);
 | ||
|         if ($order['pay_status'] == Order::PAY_STATUS_PAID && $order['order_status'] == Order::STATUS_WAIT_RECHARGE) { // 直连天下充值
 | ||
|             $rechargeOrder = [
 | ||
|                 'outTradeNo' => $order["order_number"],// 合作商系统内部订单号,同一商户下不可重复, 同微信、支付宝的out_trade_no类似
 | ||
|                 'productId' => $order["product_id"],// 商品编码
 | ||
|                 'number' => 1,
 | ||
|                 'notifyUrl' => config('cmb.recharge_notify_url'),// 异步通知地址
 | ||
|                 'rechargeAccount' => $order["account"],// 手机号,非必传
 | ||
|                 'accountType' => 1,// 充值账号类型,1:手机号,2:QQ号,0:其他
 | ||
|             ];
 | ||
|             $res = BlueBrothersClientUtil::getClient()->RechargeOrder($rechargeOrder);
 | ||
|             if ($res['code'] == 2000) {
 | ||
|                 $order->order_status = Order::STATUS_RECHARGE_ING;
 | ||
|                 $order->save();
 | ||
|             }
 | ||
|         }
 | ||
|         return true;
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 充值回调
 | ||
|      * @param $params
 | ||
|      * @return string
 | ||
|      * @throws \BlueBrothers\Openapi\OpenapiException
 | ||
|      * @throws \app\exception\BusinessException
 | ||
|      */
 | ||
|     public  function rechargeNotify($params)
 | ||
|     {
 | ||
|         Log::info('充值回调:' . json_encode($params));
 | ||
|         $sign = Util::getSign($this->secretKey, $params);
 | ||
|         if ($params['sign'] != $sign) {
 | ||
|             return '';
 | ||
|         }
 | ||
|         $orderNumber = $params['outTradeNo'];
 | ||
|         $status = $params['status'];
 | ||
|         $order = Order::getByOrderNumber($orderNumber);
 | ||
|         if ($order->order_status == Order::STATUS_RECHARGE_SUCCESS) {
 | ||
|             return 'success';
 | ||
|         }
 | ||
|         switch ($status) {
 | ||
|             case '01':
 | ||
|                 $orderStatus = Order::STATUS_RECHARGE_SUCCESS;
 | ||
|                 break;
 | ||
|             case '03':
 | ||
|                 $orderStatus = Order::STATUS_RECHARGE_FAIL;
 | ||
|                 break;
 | ||
|             default:
 | ||
|                 $orderStatus = Order::STATUS_RECHARGE_ING;
 | ||
|                 break;
 | ||
|         }
 | ||
|         if ($status == '01' && $order->order_status == Order::STATUS_RECHARGE_ING) { // 充值成功更新协议扣款时间
 | ||
|             $sign = Sign::getByAgreementId($order->agreement_id);
 | ||
|             $sign->agree_recharge_time = strtotime(date('Y-m-d'));
 | ||
|             $sign->save();
 | ||
|         }
 | ||
|         $order->order_status = $orderStatus;
 | ||
|         $order->save();
 | ||
|         if ($status == '03' && $order->refund_status == 0) { // 充值失败,退款
 | ||
|             CmbService::refund($orderNumber);
 | ||
|         }
 | ||
|         if ($status == '04') { // 执行手动拉取
 | ||
|             $this->queryRechargeOrder($orderNumber);
 | ||
|         }
 | ||
|         return 'success';
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 主动拉取充值订单状态
 | ||
|      * @param string $orderNumber
 | ||
|      * @return string|true
 | ||
|      * @throws \BlueBrothers\Openapi\OpenapiException
 | ||
|      * @throws \app\exception\BusinessException
 | ||
|      */
 | ||
|     public function queryRechargeOrder(string $orderNumber)
 | ||
|     {
 | ||
|         $res = BlueBrothersClientUtil::getClient()->RechargeQuery($orderNumber);
 | ||
|         if ($res['code'] !== '0000') {
 | ||
|             return '查询失败';
 | ||
|         }
 | ||
|         $status = $res['status'];
 | ||
|         switch ($status) {
 | ||
|             case '01':
 | ||
|                 $orderStatus = Order::STATUS_RECHARGE_SUCCESS;
 | ||
|                 break;
 | ||
|             case '03':
 | ||
|                 $orderStatus = Order::STATUS_RECHARGE_FAIL;
 | ||
|                 break;
 | ||
|             default:
 | ||
|                 $orderStatus = Order::STATUS_RECHARGE_ING;
 | ||
|                 break;
 | ||
|         }
 | ||
|         $order = Order::getByOrderNumber($orderNumber);
 | ||
|         if ($order->order_status == Order::STATUS_RECHARGE_SUCCESS) {
 | ||
|             return true;
 | ||
|         }
 | ||
|         if ($status == '01' && $order->order_status == Order::STATUS_RECHARGE_ING) { // 充值成功更新协议扣款时间
 | ||
|             $sign = Sign::getByAgreementId($order->agreement_id);
 | ||
|             $sign->agree_recharge_time = strtotime(date('Y-m-d'));
 | ||
|             $sign->save();
 | ||
|         }
 | ||
|         $order->order_status = $orderStatus;
 | ||
|         $order->save();
 | ||
|         if ($status == '03' && $order->refund_status == 0) {
 | ||
|             CmbService::refund($orderNumber);
 | ||
|         }
 | ||
|         return true;
 | ||
|     }
 | ||
| 
 | ||
| } |