getFindMerchantPaySet($merchant_id); switch ($user_type) { case 1: //普通支付模式 switch ($type) { case 1: //小程序 $this->mch_id = $paySet['config']['xcx_mer_id']; $this->serial_no = $paySet['config']['wx_xcx_serial_no']; $this->apiclient_key = $paySet['config']['xcx_apiclient_key']; $this->appid = $paySet['config']['xcx_appid']; break; case 2: //公众号 $this->mch_id = $paySet['config']['wx_mch_id']; $this->serial_no = $paySet['config']['wx_serial_no']; $this->apiclient_key = $paySet['config']['apiclient_key']; $this->appid = $paySet['config']['wx_appid']; break; } break; case 2: //服务商支付模式 $this->son_mch_id = $paySet['config']['xcx_sub_mchid']; $this->mch_id = $paySet['config']['systemConfig']['mch_id']; $this->serial_no = $paySet['config']['systemConfig']['wx_serial_no']; $this->apiclient_key = $paySet['config']['systemConfig']['wx_apiclient_key']; $this->appid = $paySet['config']['systemConfig']['wx_appid']; break; } } /** * 下载券码 * @param $param * [ * merchant_id * couponList 券列表 * ] * @return mixed */ public function downloadCouponCode($param) { $verifyResult = $this->downloadCouponCodeVerify($param); //参数验证 if ($verifyResult['status'] != 1) { return $verifyResult; } $path = $this->createCodeCatalog($param); //创建目录 $param['path'] = $path; $codeResult = $this->generateCouponCode($param); //生成券码 $store_arr = json_encode($codeResult['data']['store_arr']);//门店集合 $coupon_arr = json_encode($codeResult['data']['coupon_arr']); //券集合 return callBack(statusCode()['success'], "生成成功", ['path' => $path, 'store_arr' => $store_arr, 'coupon_arr' => $coupon_arr]); } /** * 生成券码 * @param $param * [ * merchant_id * couponList 券列表 * path 目录 * ] * @return bool */ public function generateCouponCode($param) { $merchant_id = $param['merchant_id']; $couponList = $param['couponList']; $path = $param['path']; $time = time(); $CreateFile = new CreateFile(); $StoreClass = new Store(); $storeInfo = $StoreClass->getStoreList([ 'merchant_id' => $merchant_id, ]);//所有门店信息 $arr1 = array_column($storeInfo, "id"); $arr2 = array_column($storeInfo, "storetag"); $store_arr = array_combine($arr1, $arr2);//门店新数组 $arr1 = array_column($couponList, "id"); $arr2 = array_column($couponList, "stock_name"); $coupon_arr = array_combine($arr1, $arr2); //券新数组 foreach ($couponList as $value) { if ($value['coupon_type'] == 1) { //所有门店 $storeList = $storeInfo; } else { //指定门店 $storeList = $StoreClass->getAppointStoreInfo([ 'merchant_id' => $merchant_id, 'store_id_gather' => $value['store_id_gather'], 'fields' => "id,storetag" ]); } if (!empty($storeList)) { foreach ($storeList as $val) { $data = [ 'path' => "/pages/index/merCouponDetail/merCouponDetail?store_id=" . $val['id'] . '&genre=4&id=' . $value['id'], 'merchant_id' => $merchant_id, 'file_name' => $path . '/' . $val['id'] . '_' . $value['id'] . '_' . $time . '.jpg' ]; $CreateFile->createWxCode($data); } } } return callBack(statusCode()['success'], '生成成功', ['store_arr' => $store_arr, 'coupon_arr' => $coupon_arr]); } /** * 创建券码目录 * @param $param * [ * merchant_id * ] * @return string */ public function createCodeCatalog($param) { $num = createKey(); $path = "./Uploads/Merchant/PayCoupon/{$param['merchant_id']}/{$num}"; $CreateFileClass = new CreateFile(); $CreateFileClass->createDir($path); return $path; } /** * 下载券码的参数验证 * @param $param * [ * merchant_id * couponList 券列表 * ] * @return mixed */ public function downloadCouponCodeVerify($param) { if (empty($param['merchant_id'])) { return callBack(statusCode()['error'], "缺少身份必要参数"); } if (empty($param['couponList'])) { return callBack(statusCode()['error'], "请选择商家券"); } $AppInfoClass = new AppInfo(); $appInfo = $AppInfoClass->getAppInfo($param['merchant_id']); if (empty($appInfo)) { return callBack(statusCode()['error'], "请先去授权您的小程序再进行此操作"); } return callBack(statusCode()['success'], "验证成功"); } /** * 暂停或者重启代金券 * @param $param * [ * merchant_id * coupon_id 代金券主键id * operation_type 1暂停 2重启 * ] * @return mixed */ public function suspendRestart($param) { if (empty($param['operation_type']) || !in_array($param['operation_type'], [1, 2])) { return callBack(statusCode()['error'], "未知请求源"); } switch ($param['operation_type']) { case 1: //暂停 $verify = $this->commonVerify($param, 3); break; case 2: //重启 $verify = $this->commonVerify($param, 4); break; } if ($verify['status'] != 1) { return $verify; } $coupon = $verify['data']['coupon']; //代金券信息 try { $this->getWxInfo([ 'merchant_id' => $param['merchant_id'], 'type' => $coupon['type'], 'user_type' => $coupon['user_type'] ]); //必要信息 $data = [ 'mch_id' => $this->mch_id, 'serial_no' => $this->serial_no, 'apiclient_key' => $this->apiclient_key, 'stock_id' => $coupon['stock_id'], 'data' => [ 'stock_creator_mchid' => $coupon['mch_id'], ] ]; $wxPayV3Class = new WxPayV3($data); switch ($param['operation_type']) { case 1: $result = $wxPayV3Class->suspend(); break; case 2: $result = $wxPayV3Class->restart(); break; } $result = json_decode($result, true); if (!empty($result['stock_id'])) { switch ($param['operation_type']) { case 1: $save['suspend_status'] = 2; break; case 2: $save['suspend_status'] = 1; break; } $payCouponModel = new PayCouponModel(); $payCouponModel->updateOrder([ 'id' => $param['coupon_id'] ], $save); return callBack(statusCode()['success'], "操作成功"); } else { return callBack(statusCode()['success'], $result['message']); } } catch (\Exception $e) { return callBack(statusCode()['success'], "操作失败"); } } /** * 发放代金券 * @param $param * [ * merchant_id * coupon_id 代金券id * openid 用户openid * service_openid 用户在服务商公众号的openid * ordinary_openid 商户公众号的openid * operator_id 操作人id * uid 小程序用户id * vip_id 会员id * receive_store_id 领取门店 * ] * @return mixed */ public function grantCoupon($param) { $verify = $this->grantCouponVerify($param); if ($verify['status'] != 1) { return $verify; } $coupon = $verify['data']['coupon']; //代金券信息 $this->getWxInfo([ 'merchant_id' => $param['merchant_id'], 'type' => $coupon['type'], 'user_type' => $coupon['user_type'] ]); try { $data = [ 'serial_no' => $this->serial_no, 'apiclient_key' => $this->apiclient_key, 'data' => [ 'stock_id' => $coupon['stock_id'], 'out_request_no' => createOrderTradeNo($param['merchant_id']), 'appid' => $this->appid, 'stock_creator_mchid' => $coupon['mch_id'], ] ]; switch ($coupon['user_type']) { case 1: //普通支付模式 switch ($coupon['type']) { case 1: //小程序 $data['openid'] = $param['openid']; break; case 2: //公众号 $data['openid'] = $param['ordinary_openid']; break; } break; case 2: //服务商模式 $data['openid'] = $param['service_openid']; break; } $data['mch_id'] = $this->mch_id; $WxPayV3Class = new WxPayV3($data); $result = $WxPayV3Class->grant(); $result = json_decode($result, true); if (!empty($result['coupon_id'])) { $payCouponRecordModel = new PayCouponRecordModel(); $where = [ 'merchant_id' => $param['merchant_id'], 'user_coupon_id' => $result['coupon_id'], [ 'openid' => $param['openid'], 'uid' => $param['uid'], '_logic' => "OR" ] ]; $record = $payCouponRecordModel->getFind($where); if (!empty($record)) { return callBack(statusCode()['error'], "已发放成功请勿重复操作"); } else { $coupon_use_rule = json_decode($coupon['coupon_use_rule'], true); $content = [ 'merchant_id' => $param['merchant_id'], 'coupon_id' => $param['coupon_id'], 'operator_id' => $param['operator_id'] ? $param['operator_id'] : 0, 'user_coupon_id' => $result['coupon_id'], 'stock_id' => $coupon['stock_id'], 'stock_name' => $coupon['stock_name'], 'stock_type' => $coupon['stock_type'], 'user_type' => $coupon['user_type'], 'type' => $coupon['type'], 'add_time' => time(), 'uid' => $param['uid'], 'vip_id' => $param['vip_id'], 'openid' => $param['openid'], 'receive_store_id' => $param['receive_store_id'] ? $param['receive_store_id'] : 0, 'coupon_fee' => $coupon_use_rule['fixed_normal_coupon']['coupon_amount'] ]; $record_id = $payCouponRecordModel->addOrder($content); $PayCouponModel = new PayCouponModel(); $PayCouponModel->toSetDec(['id' => $param['coupon_id']], "operation_num", 1); if (!empty($param['vip_id'])) { $arr['starttime'] = $coupon['available_begin_time']; $arr['endtime'] = $coupon['available_end_time']; $arr['coupon_name'] = $coupon['stock_name']; $Mark = new MarkController(); $Mark->payCoupon($param['vip_id'], "", "", $arr); } if (!empty($record_id)) { return callBack(statusCode()['success'], "发放成功"); } else { return callBack(statusCode()['success'], "发放成功,记录添加失败"); } } } else { return callBack(statusCode()['error'], $result['message']); } } catch (\Exception $e) { return callBack(statusCode()['error'], "发放失败"); } } /** * 发放代金券的验证 * @param $param * [ * merchant_id * coupon_id * ] * @return mixed */ public function grantCouponVerify($param) { if (empty($param['merchant_id']) || empty($param['coupon_id'])) { return callBack(statusCode()['error'], "缺少参数"); } $result = $this->commonVerify($param, 2); return $result; } /** * 激活代金券 * @param $param * [ * id * merchant_id * ] * @return mixed */ public function couponActivation($param) { $verify = $this->couponActivationVerify($param); if ($verify['status'] != 1) { return $verify; } try { $coupon = $verify['data']['coupon']; $stock_id = $coupon['stock_id']; $stock_creator_mchid = $coupon['mch_id']; $this->getWxInfo(['merchant_id' => $param['merchant_id'], 'type' => $coupon['type'], 'user_type' => $coupon['user_type']]); $data = [ 'mch_id' => $this->mch_id, 'serial_no' => $this->serial_no, 'apiclient_key' => $this->apiclient_key, 'stock_id' => $stock_id, 'data' => [ 'stock_creator_mchid' => $stock_creator_mchid ] ]; $wxPayV3Class = new WxPayV3($data); $result = $wxPayV3Class->activateCoupon(); $result = json_decode($result, true); if (!empty($result['stock_id'])) { $payCouponModel = new PayCouponModel(); $payCouponModel->updateOrder([ 'id' => $param['id'], ], [ 'activate_status' => 1, 'activate_time' => strtotime($result['start_time']) ]); return callBack(statusCode()['success'], "激活成功"); } else { return callBack(statusCode()['success'], $result['message']); } } catch (\Exception $e) { return callBack(statusCode()['success'], "激活失败"); } } /** * 激活代金券验证 * @param $param * [ * id * merchant_id * ] * @return mixed */ public function couponActivationVerify($param) { if (empty($param['id']) || empty($param['merchant_id'])) { return callBack(statusCode()['error'], '缺少参数'); } $param['coupon_id'] = $param['id']; $result = $this->commonVerify($param, 1); return $result; } /** * 公共参数验证 * @param $param * [ * merchant_id * coupon_id 代金券主键id * ] * @param $type 1激活验证 2发放 3暂停 4重启 * @return mixed */ public function commonVerify($param, $type) { if (empty($param['coupon_id']) || empty($param['merchant_id'])) { return callBack(statusCode()['error'], "缺少必要参数"); } try { $payCouponModel = new PayCouponModel(); $coupon = $payCouponModel->getFind([ 'id' => $param['coupon_id'], 'merchant_id' => $param['merchant_id'], ]); } catch (\Exception $e) { return callBack(statusCode()['error'], '未找到该代金券'); } if (empty($coupon)) { return callBack(statusCode()['error'], '未找到该代金券'); } if ($coupon['status'] == 2) { return callBack(statusCode()['error'], '该代金券已删除'); } switch ($type) { case 1: //激活验证 if ($coupon['activate_status'] == 1) { return callBack(statusCode()['error'], '该代金券已激活'); } break; case 2: //发放 if ($coupon['activate_status'] != 1) { return callBack(statusCode()['error'], '该代金券未激活'); } if ($coupon['suspend_status'] != 1) { return callBack(statusCode()['error'], '该代金券已暂停发放'); } if ($coupon['operation_num'] <= 0) { return callBack(statusCode()['error'], '该代金券暂无库存'); } break; case 3: //暂停 if ($coupon['suspend_status'] == 2) { return callBack(statusCode()['error'], '该代金券已暂停发放'); } break; case 4: //重启 if ($coupon['suspend_status'] == 1) { return callBack(statusCode()['error'], '该代金券重启'); } break; default: return callBack(statusCode()['error'], "未知验证源"); break; } return callBack(statusCode()['success'], "验证成功", ['coupon' => $coupon]); } /** * 图片上传 * @param $param * @return array */ public function wxUpload($param) { $this->getWxInfo([ 'merchant_id' => $param['merchant_id'], 'type' => 1, 'user_type' => 1 ]); $wxUploadClass = new WxUpload(); $result = $wxUploadClass->wxUpload([ 'image' => $_FILES['label_img'], 'mch_id' => $this->mch_id, 'serial_no' => $this->serial_no, 'apiclient_key' => $this->apiclient_key, ]); return $result; } /** * 创建代金券 * @param $param * [ * merchant_id * type 1小程序 2公众号 * data=>[ * stock_name 批次名称必填 * available_begin_time 开始时间必选 * available_end_time 结束时间必选 * stock_type 批次类型 NORMAL 固定面额满减券使用规则 DISCOUNT 折扣券使用规则 EXCHANGE 换购券使用规则 * coupon_use_rule=>[ * available_items 可核销商品编码 * unavailable_items 不参与优惠商品编码 * ], * stock_use_rule=>[ * max_coupons 请设置最大发券数 * max_amount 请设置总消耗金额 * max_coupons_per_user 单个用户可领个数,每个用户最多60张券 * ], * fixed_normal_coupon=>[ NORMAL * coupon_amount 请填写满减面额 * transaction_minimum 请填写满减门槛 * ], * disscount_coupon=>[ * discount_amount_max 请填写最高折扣金额 * discount_percent 请填写折扣百分比 * ] * ] * ] * @return mixed */ public function createCoupon($param) { try { $this->getWxInfo([ 'merchant_id' => $param['merchant_id'], 'type' => $param['data']['type'], 'user_type' => $param['data']['user_type'] ]); $verify = $this->createCouponVerify($param); //参数验证 if ($verify['status'] != 1) return $verify; $add_data = $param; $param_new = $this->createCouponReplace($param); //参数替换 switch ($param['data']['user_type']) { case 1: //普通模式 $param_new['coupon_use_rule']['available_merchants'] = [$this->mch_id];//可核销商户号 break; case 2: $param_new['coupon_use_rule']['available_merchants'] = [$this->son_mch_id];//可核销商户号 break; } $data = [ 'mch_id' => $this->mch_id, 'serial_no' => $this->serial_no, 'apiclient_key' => $this->apiclient_key, 'data' => $param_new ]; $wxPay = new WxPayV3($data); $result = $wxPay->createCoupon(); file_put_contents('./pay_coupon.txt', $result . PHP_EOL, FILE_APPEND); $result = json_decode($result, true); if (!empty($result['stock_id'])) { $add_data['stock_id'] = $result['stock_id']; $add_data['merchant_id'] = $param['merchant_id']; $add_data['out_request_no'] = $param_new['out_request_no']; $add_data['goods_tag'] = $param_new['coupon_use_rule']['goods_tag']; $result = $this->payCouponAdd($add_data); if ($result['status'] == 1) { return callBack(statusCode()['success'], "创建成功"); } else { return callBack(statusCode()['error'], "创建成功,记录失败"); } } else { return callBack(statusCode()['error'], $result['message']); } } catch (\Exception $e) { return callBack(statusCode()['error'], "创建失败"); } } /** * 创建代金券记录表 payCouponAdd * @param $param * [ * merchant_id * store_id * data=>[ * stock_name 批次名称必填 * available_begin_time 开始时间必选 * available_end_time 结束时间必选 * stock_type 批次类型 NORMAL 固定面额满减券使用规则 DISCOUNT 折扣券使用规则 EXCHANGE 换购券使用规则 * coupon_use_rule=>[ * available_items 可核销商品编码 * unavailable_items 不参与优惠商品编码 * ], * stock_use_rule=>[ * max_coupons 请设置最大发券数 * max_amount 请设置总消耗金额 * max_coupons_per_user 单个用户可领个数,每个用户最多60张券 * ], * fixed_normal_coupon=>[ NORMAL * coupon_amount 请填写满减面额 * transaction_minimum 请填写满减门槛 * ], * disscount_coupon=>[ * discount_amount_max 请填写最高折扣金额 * discount_percent 请填写折扣百分比 * ] * ] * ] * @return mixed */ public function payCouponAdd($param) { $data = $param['data']; $content = [ 'merchant_id' => $param['merchant_id'], 'stock_name' => $data['stock_name'], 'comment' => $data['comment'], 'belong_merchant' => $this->mch_id, 'available_begin_time' => strtotime($data['available_time'][0]), 'available_end_time' => strtotime($data['available_time'][1]), 'stock_use_rule' => json_encode($data['stock_use_rule']), 'pattern_info' => json_encode($data['pattern_info']), 'coupon_use_rule' => json_encode($data['coupon_use_rule']), 'no_cash' => $data['no_cash'], 'stock_type' => $data['stock_type'], 'out_request_no' => $param['out_request_no'], 'ext_info' => '', 'stock_id' => $param['stock_id'], 'create_time' => time(), 'mch_id' => $this->mch_id, 'valid_time_type' => $data['valid_time_type'], 'coupon_type' => $data['coupon_type'], 'appoint_type' => $data['appoint_type'] ? $data['appoint_type'] : 1, 'operator_id' => $param['operator_id'], 'type' => $data['type'], 'user_type' => $data['user_type'], 'operation_num' => $data['stock_use_rule']['max_coupons'] ]; if (!empty($param['goods_tag'])) { $content['goods_tag'] = implode(',', $param['goods_tag']); } if (!empty($data['coupon_use_rule']['goodsList'])) { $content['goods_id_gather'] = implode(',', array_column($data['coupon_use_rule']['goodsList'], "goods_id")); $content['store_id_gather'] = implode(',', array_unique(array_column($data['coupon_use_rule']['goodsList'], "store_id"))); if ($data['appoint_type'] == 2) { $content['goods_code_str'] = implode(',', array_unique(array_column($data['coupon_use_rule']['goodsList'], 'goods_code'))); } } try { $payCouponModel = new PayCouponModel(); $couponId = $payCouponModel->addOrder($content); } catch (\Exception $e) { return callBack(statusCode()['error'], '添加失败'); } if ($couponId) { return callBack(statusCode()['success'], '添加成功'); } else { return callBack(statusCode()['error'], '添加失败'); } } /** * 创建代金券参数替换 * @param $param * [ * merchant_id * store_id * data=>[ * stock_name 批次名称必填 * available_begin_time 开始时间必选 * available_end_time 结束时间必选 * stock_type 批次类型 NORMAL 固定面额满减券使用规则 DISCOUNT 折扣券使用规则 EXCHANGE 换购券使用规则 * coupon_use_rule=>[ * available_items 可核销商品编码 * unavailable_items 不参与优惠商品编码 * ], * stock_use_rule=>[ * max_coupons 请设置最大发券数 * max_amount 请设置总消耗金额 * max_coupons_per_user 单个用户可领个数,每个用户最多60张券 * ], * fixed_normal_coupon=>[ NORMAL * coupon_amount 请填写满减面额 * transaction_minimum 请填写满减门槛 * ], * disscount_coupon=>[ * discount_amount_max 请填写最高折扣金额 * discount_percent 请填写折扣百分比 * ] * ] * ] * @return mixed */ public function createCouponReplace($param) { $data = $param['data']; if ($data['no_cash'] == 1) { $data['no_cash'] = true; } else { $data['no_cash'] = false; } $data['available_begin_time'] = $data['available_time'][0] . '.120+08:00'; $data['available_end_time'] = $data['available_time'][1] . '.120+08:00'; switch ($data['stock_type']) { case 1: //NORMAL $data['stock_type'] = 'NORMAL'; $data['coupon_use_rule']['fixed_normal_coupon']['coupon_amount'] = intval($data['coupon_use_rule']['fixed_normal_coupon']['coupon_amount'] * 100); $data['coupon_use_rule']['fixed_normal_coupon']['transaction_minimum'] = intval($data['coupon_use_rule']['fixed_normal_coupon']['transaction_minimum'] * 100); unset($data['coupon_use_rule']['disscount_coupon']); break; case 2: //DISCOUNT $data['stock_type'] = 'DISCOUNT'; $data['coupon_use_rule']['disscount_coupon']['discount_amount_max'] = floatval($data['coupon_use_rule']['disscount_coupon']['discount_amount_max'] * 100); $data['coupon_use_rule']['disscount_coupon']['discount_percent'] = intval($data['coupon_use_rule']['disscount_coupon']['discount_percent']); unset($data['coupon_use_rule']['fixed_normal_coupon']); if (!empty($data['coupon_use_rule']['disscount_coupon']['transaction_minimum'])) { $data['coupon_use_rule']['disscount_coupon']['transaction_minimum'] = intval($data['coupon_use_rule']['disscount_coupon']['transaction_minimum'] * 100); } else { unset($data['coupon_use_rule']['disscount_coupon']['transaction_minimum']); } break; } switch ($data['coupon_type']) { case 2: //单品 if (!empty($data['coupon_use_rule']['goodsList'])) { $available_items = []; //商品编码集合 switch ($data['appoint_type']) { case 1: //指定商品id foreach ($data['coupon_use_rule']['goodsList'] as $val) { $available_items[] = 'S' . $val['store_id'] . 'G' . $val['goods_id']; } $data['coupon_use_rule']['goods_tag'] = [$param['merchant_id']]; //商户id作为优惠标识 break; case 2: //指定商品条码 foreach ($data['coupon_use_rule']['goodsList'] as $val) { $available_items[] = $val['goods_code']; } break; } } $data['coupon_use_rule']['available_items'] = $available_items; break; } if (in_array($data['valid_time_type'], [1, 2, 3])) { //时间 switch ($data['valid_time_type']) { case 1: $time = strtotime(date('Y-m-d', time())); $begin_time = strtotime($data['coupon_use_rule']['coupon_available_time']['fix_available_time']['begin_time']) - $time; $end_time = strtotime($data['coupon_use_rule']['coupon_available_time']['fix_available_time']['end_time']) - $time; $data['coupon_use_rule']['coupon_available_time']['fix_available_time']['begin_time'] = intval($begin_time); $data['coupon_use_rule']['coupon_available_time']['fix_available_time']['end_time'] = intval($end_time); if (!empty($data['coupon_use_rule']['coupon_available_time']['fix_available_time']['available_week_day'])) { $week_day = array_map('int', $data['coupon_use_rule']['coupon_available_time']['fix_available_time']['available_week_day']); unset($data['coupon_use_rule']['coupon_available_time']['fix_available_time']['available_week_day']); $data['coupon_use_rule']['coupon_available_time']['fix_available_time']['available_week_day'] = $week_day; } else { unset($data['coupon_use_rule']['coupon_available_time']['fix_available_time']['available_week_day']); } unset($data['coupon_use_rule']['coupon_available_time']['second_day_available']); unset($data['coupon_use_rule']['coupon_available_time']['available_time_after_receive']); unset($data['coupon_use_rule']['coupon_available_time']['fix_available_time']['valid_time']); break; case 2: unset($data['coupon_use_rule']['coupon_available_time']['fix_available_time']); unset($data['coupon_use_rule']['coupon_available_time']['available_time_after_receive']); break; case 3: $data['coupon_use_rule']['coupon_available_time']['available_time_after_receive'] = intval($data['coupon_use_rule']['coupon_available_time']['available_time_after_receive']); unset($data['coupon_use_rule']['coupon_available_time']['fix_available_time']); unset($data['coupon_use_rule']['coupon_available_time']['second_day_available']); break; } } else { unset($data['coupon_use_rule']['coupon_available_time']); } if (empty($data['pattern_info']['merchant_name'])) { unset($data['pattern_info']); } $data['stock_use_rule']['max_coupons'] = intval($data['stock_use_rule']['max_coupons']); $data['stock_use_rule']['max_amount'] = intval($data['stock_use_rule']['max_amount'] * 100); $data['stock_use_rule']['max_coupons_per_user'] = intval($data['stock_use_rule']['max_coupons_per_user']); $data['belong_merchant'] = $this->mch_id;//批次归属商户号 $data['out_request_no'] = createOrderTradeNo($param['merchant_id']);//随机字符串 unset($data['user_type']); unset($data['appoint_type']); unset($data['type']); unset($data['coupon_type']); unset($data['available_time']); unset($data['valid_time_type']); unset($data['coupon_use_rule']['goodsList']); return $data; } /** * 代金券参数验证 * @param $param * [ * merchant_id * type 1小程序 2公众号 * data=>[ * stock_name 批次名称必填 * available_begin_time 开始时间必选 * available_end_time 结束时间必选 * stock_type 批次类型 NORMAL 固定面额满减券使用规则 DISCOUNT 折扣券使用规则 EXCHANGE 换购券使用规则 * coupon_use_rule=>[ * available_items 可核销商品编码 * unavailable_items 不参与优惠商品编码 * ], * stock_use_rule=>[ * max_coupons 请设置最大发券数 * max_amount 请设置总消耗金额 * max_coupons_per_user 单个用户可领个数,每个用户最多60张券 * ], * fixed_normal_coupon=>[ NORMAL * coupon_amount 请填写满减面额 * transaction_minimum 请填写满减门槛 * ], * disscount_coupon=>[ * discount_amount_max 请填写最高折扣金额 * discount_percent 请填写折扣百分比 * ] * ] * ] * @return array * [ * status * message * ] */ public function createCouponVerify($param) { $reg = "/^\+?[0-9][0-9]*$/"; $reg1 = "/^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d{0,2})$/"; $time = strtotime(date("Y-m-d", time())); $data = $param['data']; if (empty($data['user_type'])) { return callBack(statusCode()['error'], "请选择支付模式"); } if ($data['user_type'] == 1 && empty($data['type'])) { return callBack(statusCode()['error'], "请选择普通支付模式的场景"); } if ($data['user_type'] == 2 && $data['no_cash'] == 2) { return callBack(statusCode()['error'], "服务商模式下暂不支付创建预充值类型"); } if (empty($this->mch_id) || empty($this->serial_no) || empty($this->apiclient_key)) { return callBack(statusCode()['error'], "商户号,Api序列号,或私钥证书有误"); } if (empty($param['merchant_id']) || empty($data)) { return callBack(statusCode()['error'], "缺少必要参数"); } if (empty($data['stock_name']) || strlen($data['stock_name']) > 20) { return callBack(statusCode()['error'], "批次名称必填且不能大于20个字符"); } if (empty($data['available_time'])) { return callBack(statusCode()['error'], "有效时间必选"); } if (empty($data['stock_use_rule']['max_coupons']) || $data['stock_use_rule']['max_coupons'] < 0 || !preg_match($reg, $data['stock_use_rule']['max_coupons'])) { return callBack(statusCode()['error'], "请设置正确最大发券数"); } if (empty($data['stock_use_rule']['max_amount']) || !preg_match($reg1, $data['stock_use_rule']['max_amount']) || $data['stock_use_rule']['max_amount'] < 0 || ($data['stock_type'] == 1 && (($data['stock_use_rule']['max_amount'] * 100) != ($data['stock_use_rule']['max_coupons'] * ($data['coupon_use_rule']['fixed_normal_coupon']['coupon_amount'] * 100))))) { return callBack(statusCode()['error'], "请设置正确总发放金额"); } if (empty($data['stock_use_rule']['max_coupons_per_user']) || $data['stock_use_rule']['max_coupons_per_user'] > 60) { return callBack(statusCode()['error'], "单个用户可领个数,每个用户最多60张券"); } if (!in_array($data['stock_type'], [1, 2, 3])) return callBack(statusCode()['error'], "请选择代金券类型"); switch ($data['stock_type']) { case 1: if (empty($data['coupon_use_rule']['fixed_normal_coupon']['coupon_amount']) || $data['coupon_use_rule']['fixed_normal_coupon']['coupon_amount'] <= 0.01 || !preg_match($reg1, $data['coupon_use_rule']['fixed_normal_coupon']['coupon_amount'])) { return callBack(statusCode()['error'], "请填写满减面额,最低1元"); } if (empty($data['coupon_use_rule']['fixed_normal_coupon']['transaction_minimum']) || $data['coupon_use_rule']['fixed_normal_coupon']['transaction_minimum'] < $data['coupon_use_rule']['fixed_normal_coupon']['coupon_amount'] || !preg_match($reg1, $data['coupon_use_rule']['fixed_normal_coupon']['transaction_minimum'])) { return callBack(statusCode()['error'], "请填写正确满减门槛,必须大于满减面额"); } break; case 2: if (empty($data['coupon_use_rule']['disscount_coupon']['discount_amount_max']) || $data['coupon_use_rule']['disscount_coupon']['discount_amount_max'] < 0 || !preg_match($reg1, $data['coupon_use_rule']['disscount_coupon']['discount_amount_max'])) { return callBack(statusCode()['error'], "请填写正确折扣金额"); } if (empty($data['coupon_use_rule']['disscount_coupon']['discount_percent']) || $data['coupon_use_rule']['disscount_coupon']['discount_percent'] < 0 || !preg_match($reg, $data['coupon_use_rule']['disscount_coupon']['discount_percent'])) { return callBack(statusCode()['error'], "请填写正确折扣"); } break; } if ($data['valid_time_type'] == 1) { if ((empty($data['coupon_use_rule']['coupon_available_time']['fix_available_time']['begin_time']) || empty($data['coupon_use_rule']['coupon_available_time']['fix_available_time']['end_time']))) { return callBack(statusCode()['error'], "请选择生效时间的固定时间段"); } if (strtotime($data['available_time'][0]) <= $time) { return callBack(statusCode()['error'], "该类型的有效时间必须大于当前时间"); } } if ($data['valid_time_type'] == 2 && (strtotime(date('Y-m-d', strtotime($data['available_time'][0])))) <= $time) { return callBack(statusCode()['error'], "该类型的有效时间必须大于当天"); } if ($data['valid_time_type'] == 3 && (empty($data['coupon_use_rule']['coupon_available_time']['available_time_after_receive']) || $data['coupon_use_rule']['coupon_available_time']['available_time_after_receive'] < 30)) { return callBack(statusCode()['error'], "请填写正确生效时间"); } if (!empty($data['pattern_info']) && strlen($data['pattern_info']) > 128) { return callBack(statusCode()['error'], "商户名称长度不能超过128字符"); } switch ($data['coupon_type']) { case 2: //单品券 if (empty($data['coupon_use_rule']['goodsList'])) { return callBack(statusCode()['error'], "请选择单品优惠的商品"); } if (count($data['coupon_use_rule']['goodsList']) > 50) { return callBack(statusCode()['error'], "单品优惠的商品最多50种"); } if ($data['appoint_type'] == 2) { $goodsList = $data['coupon_use_rule']['goodsList']; foreach ($goodsList as $val) { if (empty($val['goods_code'])) { return callBack(statusCode()['error'], '商品条码有误'); } } } break; } return callBack(statusCode()['success'], "验证成功"); } }