feat(merchant): 增加码速达相关功能

- 新增码速达配置选项,包括订单备注状态和售后处理状态- 实现限购数量和金额的 redis 优化处理
- 添加渠道余额获取功能
- 修改订单状态更新逻辑,支持码速达- 优化自动发卡软件设置界面
This commit is contained in:
2025-04-03 11:25:24 +08:00
parent 02659fcf98
commit 31259f4c18
12 changed files with 694 additions and 126 deletions

View File

@ -153,10 +153,16 @@ class Feedov extends Core
$data['msg'] = $result['msg'] = $data['info']; $data['msg'] = $result['msg'] = $data['info'];
} }
if(isset($data['cost']) && $data['cost']){
$data['channel_cost'] = $result['channel_cost'] = $data['cost'];
}
$result['yes'] = 'SUCCESS'; $result['yes'] = 'SUCCESS';
$result['data'] = $data; $result['data'] = $data;
# ['yes' = success,data = array ,msg =1,s_number =32123,channel_cost = 1.2,status = 1]
return $result; return $result;
} }
@ -276,6 +282,8 @@ class Feedov extends Core
$channel_order_id = $response['array']['data']['order_id']; $channel_order_id = $response['array']['data']['order_id'];
} }
#
$this->create($param['order'], $channel_order_id, $param['merchant_order'], $param['cash'], $url, $request, $response, 1, $param['account']); $this->create($param['order'], $channel_order_id, $param['merchant_order'], $param['cash'], $url, $request, $response, 1, $param['account']);
return $response['msg']; return $response['msg'];
} }

View File

@ -256,9 +256,7 @@ class kuaijiaofei extends Core
if($stockArray){ if($stockArray){
$request['tradeMoney']=($stockArray['price']/100)*$param['cash']; $request['tradeMoney']=($stockArray['price']/100)*$param['cash'];
} }
// if($param['cash']==200){
// $request['tradeMoney']=200;
// }
$request['sign'] = $this->_sign($request,array('memberId','productId','memberOrderId','rechargeAccount','faceValue')); $request['sign'] = $this->_sign($request,array('memberId','productId','memberOrderId','rechargeAccount','faceValue'));
$url = $this->host . $this->api; //组装地址 $url = $this->host . $this->api; //组装地址

View File

@ -0,0 +1,250 @@
<?php
namespace app\channel\service\system;
#模板
use app\merchant\service\OrderService;
class Xmoli extends Core
{
protected $host = ''; // 主机,不设置,后台
protected $mid = ''; // 商户id
protected $token = ''; // 密钥
protected $api = '';
# cardbuy为通用写法
public function cardbuy($param)
{
$check = array
(
'account' => 'account',
);
$this->api='api.giftcard/submit';
return $this->submit($param, $check);
}
# 通知处理 主要返回状态 2是成功 3是失败
# 通知处理 主要返回状态 2是成功 3是失败
public function notify($data)
{
$result = array();
$result['cash'] = 1;
$result['status'] = $data['status'] ;
if (isset($data['kami']) && $data['kami']['cardno']) {
# 流水号
$data['s_nubmer'] = $result['s_nubmer'] = $data['kami']['cardno'];
}
$result['yes'] = 'ok';
$result['data'] = $data;
return $result;
}
public function query($order){
$request['appid'] = $this->mid;
$request['api_product'] = 'query';
$request['merchant_order_id'] =$order['order_id'];
$request['signature'] = $this->_sign($request);
$url = $this->host . 'api.giftcard/query';
$response = $this->curl('post', $url, $request);
$log['type'] = 'query_response';
$log['data'] = $response;
$log['config'] = $this->data;
$this->log($log);
$array = $this->json_decode($response);
$result = array();
// var_dump($array);die;
// $result['status'] = 4;
if (isset($array['code']) && $array['code'] == '1') {
if(isset($array['data']['status'])){
if ($array['data']['status'] == 2) {
if(isset($array['data']['card'])){
$kami = $this->decrypt_3des($array['data']['card'],$order['channel_order_id']);
$kami = explode(',', $kami);
$kamidata = [
'cardno' => $kami[0],
'cardpwd' => $kami[1],
'expired' => $kami[2],
];
$this->upOrderResponse($kamidata,$order['merchant_order_id'],$order['response']);
$result['status'] = 7;
$result['kami'] = $kamidata;
}else{
$result['status'] = 4;
}
}elseif($array['data']['status'] == 3){
$result['status'] = 3;
}else{
$result['status'] = 4;
}
}
} else{
$result['status'] = 4;
}
return $result;
}
# 数据响应格式处理
public function response($data)
{
$log['type'] = 'response';
$log['data'] = $data;
$log['config'] = $this->data;
$this->log($log);
#以上不要做任何变动
$array = $this->json_decode($data); //响应数据为json
#如果响应为XML格式
// $array = (array) simplexml_load_string($data);
if (!$array) {
$msg = 'error';
} elseif (isset($array['code']) && $array['code']=='1') { //修改判断逻辑为确定提交成功即可
# 正确
$msg = 'ok';
#如有其他判断以下
// if(isset($array['cards'])){
// $array['kami'] = array
// (
// 'cardno' => $array['cards'][0]['card_no'],
// 'cardpwd' => $array['cards'][0]['card_password'],
// 'expired' => $array['cards'][0]['expired_at'],
//// 'value' => $array['data']['count_money'],
// );
// }
} else {
# 错误
$msg = $array['info'] ?? 'error'; //前面message根据响应内容改成对应的错误提示
}
return array
(
'msg' => $msg,
'data' => $data,
'array' => $array,
);
}
# 查询余额接口
public function account($day)
{
$request['customer_id'] = $this->mid;
$request['timestamp']=time();
$request['sign'] = $this->_sign($request);
$url = $this->host . 'api/customer';
$response = $this->curl('post', $url, $request);
$response = $this->response($response);
$datas = $response['array']['data'];
if(is_array($datas) && isset($datas['balance']) && $datas['balance'] ){
$datas['account'] = $datas['balance']; //此处为余额
}
return $datas;
}
# 提交数据
private function submit($param, $check)
{
#提交处理
$param = $this->param($param, $check);
if (is_string($param) || (is_array($param) && $param['status'] == 1)) {
return $param;
}
$request = $param['detail']; //上面替换剩下的
#结束初步
$request['appid']=$this->mid;
// $request['notify']=$this->getNotify($param['order'], 1); //回调方法默认不用改
$request['order']=$param['order']; //我方系统订单号
$request['proid']=$this->getGid($param['cash']); //此方法为根据面值获取产品id,如无需可注释
$request['num']=1;
// unset($request['cash']);
$request['signature'] = $this->_sign($request);
$url = $this->host . $this->api; //组装地址
// var_dump($url);die;
$response = $this->curl('post', $url, $request);
$response = $this->response($response);
// var_dump($response);die;
$channel_order_id = '';
#如果出现响应有上游订单号,可以如下
if (isset($response["array"]['data']['order'])) {
$channel_order_id = $response["array"]['data']['order'];
}
$this->create($param['order'], $channel_order_id, $param['merchant_order'], $param['cash'], $url, $request, $response, 1, $param['account']);
return $response['msg'];
}
private function _sign($request)
{
$request['token']=$this->token;
ksort($request);
$sign_string = '';
foreach ($request as $k => $v) {
if (strlen($v)) {
$sign_string .= $k . '=' . $v . '&';
}
}
$sign_string = substr($sign_string, 0, -1);
return md5($sign_string);
// unset($request['cash']);
}
public function upOrderResponse($kami,$merchant_order_id,$orderResponse)
{
$orderService = OrderService::instance();
$response = json_decode($orderResponse,true);
$response['kami'] = $kami;
$data = ['response' => json_encode($response)];
$orderService->db()->where(array('merchant_order_id' => $merchant_order_id))->update($data);
}
#3des解密
public function decrypt_3des($encrypted_string, $order_id) {
// 常量定义
// 生成密钥
$key = md5(md5($this->token) . $order_id);
$key= strtolower($key);
// 解密
return openssl_decrypt(base64_decode($encrypted_string), "des-ede3", $key, OPENSSL_RAW_DATA);
}
}

View File

@ -455,6 +455,31 @@ class Notify extends Core
} }
} }
# 渠道僧下卡密,主动查询
public function xmoli()
{
$channelService = \app\channel\service\ChannelService::instance();
$class = \app\merchant\service\OrderService::instance();
$where['cid'] = 9;
$where['status'] = 4;
$data = $class->db()->where($where)->order('id asc')->limit(100)->select()->toArray();
if ($data) {
foreach ($data as $k => $v) {
$class->db()->where(array('id' => $v['id']))->update(array('status' => 6));
// var_dump($v);die;
$result = $channelService->call('query', $v['cid'], $v);
// var_dump($v);die;
$class->db()->where(array('id' => $v['id']))->update(array('status' => 4));
if ($result['status'] == 7) {
return $this->notify($v['order_id'], $result, false, false);
}
}
}
}
# 渠道僧下卡密,主动查询 # 渠道僧下卡密,主动查询
public function piaopiapjinbi() public function piaopiapjinbi()
{ {

View File

@ -493,6 +493,10 @@ class Merchant extends Controller
$this->_form($this->table, 'autoCard','id', [], ['id' => $id]); $this->_form($this->table, 'autoCard','id', [], ['id' => $id]);
} else { } else {
// var_dump(input());die;
// array(12) { ["id"]=> string(2) "12" ["other_param"]=> string(113) "{"maSuDa_uid":"AAHamonFAOWtbFuvBodPfaUg","maSuDa_secret_key":"cmf9467r0xpwziym","autoCardSoftware":"3","ss":"11"}" ["spm"]=> string(10) "m-68-71-74" ["open_type"]=> string(5) "modal" ["autoCardSoftware"]=> string(1) "2" ["maSuDa_uid"]=> string(24) "AAHamonFAOWtbFuvBodPfaUg" ["maSuDa_secret_key"]=> string(16) "cmf9467r0xpwziym" ["maSuDa_message_config"]=> string(1) "1" ["maSuDa_trade_buyer_pay"]=> string(2) "on" ["maSuDa_trade_memo_modified"]=> string(2) "on" ["maSuDa_trade_status"]=> string(1) "1" ["maSuDa_afterSales_status"]=> string(1) "2" }
// array(10) { ["id"]=> string(2) "12" ["other_param"]=> string(113) "{"maSuDa_uid":"AAHamonFAOWtbFuvBodPfaUg","maSuDa_secret_key":"cmf9467r0xpwziym","autoCardSoftware":"3","ss":"11"}" ["spm"]=> string(10) "m-68-71-74" ["open_type"]=> string(5) "modal" ["autoCardSoftware"]=> string(1) "2" ["maSuDa_uid"]=> string(24) "AAHamonFAOWtbFuvBodPfaUg" ["maSuDa_secret_key"]=> string(16) "cmf9467r0xpwziym" ["maSuDa_message_config"]=> string(1) "2" ["maSuDa_trade_status"]=> string(1) "2" ["maSuDa_afterSales_status"]=> string(1) "2" }
$id = input('id'); $id = input('id');
$autoCardSoftware = input('autoCardSoftware'); $autoCardSoftware = input('autoCardSoftware');
@ -511,6 +515,18 @@ class Merchant extends Controller
#消息订阅关闭 #消息订阅关闭
if(!empty(input('maSuDa_message_config')) ){ if(!empty(input('maSuDa_message_config')) ){
$maSuDa_message_config = input('maSuDa_message_config'); $maSuDa_message_config = input('maSuDa_message_config');
$other_param_arr_new['maSuDa_message_config'] = $maSuDa_message_config;
$maSuDa_message_config_array = [];
// if(!empty(input('maSuDa_trade_buyer_pay') )
}
if(!empty(input('maSuDa_afterSales_status')) ){
$other_param_arr_new['maSuDa_afterSales_status'] = input('maSuDa_afterSales_status');;
}
if(!empty(input('maSuDa_trade_status')) ){
$other_param_arr_new['maSuDa_trade_status'] = input('maSuDa_trade_status');
} }
} }

View File

@ -60,12 +60,46 @@
<input type="checkbox" name="maSuDa_trade_buyer_pay" lay-skin="tag" title="付款消息" > <input type="checkbox" name="maSuDa_trade_buyer_pay" lay-skin="tag" title="付款消息" >
<input type="checkbox" name="maSuDa_trade_memo_modified" lay-skin="tag" title="订单备注变更"> <input type="checkbox" name="maSuDa_trade_memo_modified" lay-skin="tag" title="订单备注变更">
<input type="checkbox" name="maSuDa_refund_created" lay-skin="tag" title="退款创建"> <input type="checkbox" name="maSuDa_refund_created" lay-skin="tag" title="退款创建">
<input type="checkbox" name="maSuDa_refund_closed" lay-skin="tag" title="退款申请"> <input type="checkbox" name="maSuDa_refund_closed" lay-skin="tag" title="退款关闭">
</div> </div>
</label> </label>
</div> </div>
<label class="layui-form-item margin-top-20 block relative">
<span class="color-green margin-right-10">订单备注状态</span>
<div>
{foreach ['1'=>'开启备注通知','2'=>'关闭备注通知'] as $k=>$v}
<label class="think-radio">
{if isset($maSuDa_trade_status) and $maSuDa_trade_status eq $k}
<input checked type="radio" name="maSuDa_trade_status" value="{$k}" lay-ignore> {$v|default='2'}
{else}
<input type="radio" name="maSuDa_trade_status" value="{$k}" lay-ignore> {$v|default='2'}
{/if}
</label>
{/foreach}
</div>
<span class="color-desc">如果关闭备注通知,则码速达不会处理任何订单备注</span>
</label>
<label class="layui-form-item margin-top-20 block relative">
<span class="color-green margin-right-10">售后处理状态</span>
<div>
{foreach ['1'=>'开启售后处理','2'=>'关闭售后处理'] as $k=>$v}
<label class="think-radio">
{if isset($maSuDa_afterSales_status) and $maSuDa_afterSales_status eq $k}
<input checked type="radio" name="maSuDa_afterSales_status" value="{$k}" lay-ignore> {$v|default='2'}
{else}
<input type="radio" name="maSuDa_afterSales_status" value="{$k}" lay-ignore> {$v|default='2'}
{/if}
</label>
{/foreach}
</div>
<span class="color-desc">如果需要处理售后,则需要订阅退款超级,退款关闭通知</span>
</label>
</div> </div>

View File

@ -19,7 +19,7 @@
{block name="content"} {block name="content"}
<div class="layui-tab layui-tab-card think-bg-white table-block"> <div class="layui-tab layui-tab-card think-bg-white table-block">
<div class="layui-tab-content think-box-shadow table-block table-block"> <div class="layui-tab-content think-box-shadow table-block table-block">
{include file='merchant/index_search'} {include file='merchant/index_search'}
<table class="layui-table margin-top-10" lay-skin="line"> <table class="layui-table margin-top-10" lay-skin="line">
@ -31,7 +31,7 @@
</th>--> </th>-->
<th class='text-left nowrap' width="">商户信息</th> <th class='text-left nowrap' width="">商户信息</th>
<th class='text-left nowrap' width="" style="display: none;">秘钥</th> <th class='text-left nowrap' width="" style="display: none;">秘钥</th>
<th class='text-left nowrap' width="">授信账户</th> <th class='text-left nowrap' width="">授信账户</th>
<th class='text-left nowrap' width="">余额账户</th> <th class='text-left nowrap' width="">余额账户</th>
<th class='text-left nowrap' width="">订单信息</th> <th class='text-left nowrap' width="">订单信息</th>
<th class='text-left nowrap' width="100%" style="display: none;">创建时间</th> <th class='text-left nowrap' width="100%" style="display: none;">创建时间</th>
@ -46,7 +46,8 @@
<label><input class="list-check-box" value='{$vo.id}' type='checkbox'></label> <label><input class="list-check-box" value='{$vo.id}' type='checkbox'></label>
</td>--> </td>-->
<td class='text-left nowrap'> <td class='text-left nowrap'>
<span class="color-blue"><b>{$vo.name|default=''}</b></span> <span class="color-desc">{$vo.id|default=''}</span> <span class="color-blue"><b>{$vo.name|default=''}</b></span> <span class="color-desc">{$vo.id|default=''}</span>
<br> <br>
{eq name='vo.status' value='0'}<span class="color-red">已禁用</span>{else}<span class="color-green">使用中</span>{/eq} {eq name='vo.status' value='0'}<span class="color-red">已禁用</span>{else}<span class="color-green">使用中</span>{/eq}
<!-- <!--
@ -56,86 +57,113 @@
<br> <br>
默认折扣:<span class="color-red">{$vo.percent|default='0.0'|raw}</span> 默认折扣:<span class="color-red">{$vo.percent|default='0.0'|raw}</span>
</td> </td>
<td class='text-left nowrap' style="display: none;">AppID<span>{$vo.appid|default='<i class="color-desc">未录入</i>'|raw}</span><br>AppSecret<span>{$vo.appsecret|default='<i class="color-desc">未录入</i>'|raw}</span></td>
<td class='text-left nowrap'>授信余额:<span class="color-red">{$vo.credit_surplus|default='0.00'|raw}</span><br>授信额度:<span class="color-blue">{$vo.credit_total|default='0.00'|raw}</span><br>待回款:<span class="color-blue">{$vo.credit_huikuan|default='0.00'|raw}</span></td> <td class='text-left nowrap' style="display: none;">AppID<span>{$vo.appid|default='<i
class="color-desc">未录入</i>'|raw}</span><br>AppSecret<span>{$vo.appsecret|default='<i
class="color-desc">未录入</i>'|raw}</span></td>
<td class='text-left nowrap'>可用余额:<span class="color-red">{$vo.account_surplus|default='0.00'|raw}</span><br>{if $vo.account_baitiao}白条额度:<span class="color-blue">{$vo.account_baitiao|default='0.00'|raw}</span><br>{/if}累计充值:<span class="color-blue">{$vo.account_total|default='0.00'|raw}</span></td> <td class='text-left nowrap'>授信余额:<span
<td class='text-left nowrap'>今日成功订单:<span class="color-red">{$vo.order_yes|default='0.00'|raw}</span><br>今日失败订单:<span class="color-blue">{$vo.order_no|default='0.00'|raw}</span></td> class="color-red">{$vo.credit_surplus|default='0.00'|raw}</span><br>授信额度:<span
class="color-blue">{$vo.credit_total|default='0.00'|raw}</span><br>待回款:<span
class="color-blue">{$vo.credit_huikuan|default='0.00'|raw}</span></td>
<td class='text-left nowrap'>可用余额:<span
class="color-red">{$vo.account_surplus|default='0.00'|raw}</span><br>{if
$vo.account_baitiao}白条额度:<span
class="color-blue">{$vo.account_baitiao|default='0.00'|raw}</span><br>{/if}累计充值:<span
class="color-blue">{$vo.account_total|default='0.00'|raw}</span></td>
<td class='text-left nowrap'>今日成功订单:<span
class="color-red">{$vo.order_yes|default='0.00'|raw}</span><br>今日失败订单:<span
class="color-blue">{$vo.order_no|default='0.00'|raw}</span></td>
<td class='text-left nowrap' style="display: none;"> <td class='text-left nowrap' style="display: none;">
{eq name='vo.status' value='0'}<span class="color-red">已禁用</span>{else}<span class="color-green">使用中</span>{/eq} 维护时间:{$vo.opentime|default='无'}<br> <span>创建时间:{$vo.create_at|format_datetime}</span> {eq name='vo.status' value='0'}<span class="color-red">已禁用</span>{else}<span class="color-green">使用中</span>{/eq}
维护时间:{$vo.opentime|default='无'}<br> <span>创建时间:{$vo.create_at|format_datetime}</span>
</td> </td>
<td class='text-left nowrap'> <td class='text-left nowrap'>
{if isset($type) and $type eq 'all'} {if isset($type) and $type eq 'all'}
<!--{if auth("edit")}--> <!--{if auth("edit")}-->
<a data-dbclick class="layui-btn layui-btn-xs" data-title="编辑商户" data-modal='{:url("edit")}?id={$vo.id}'>编 辑</a> <a data-dbclick class="layui-btn layui-btn-xs" data-title="编辑商户"
data-modal='{:url("edit")}?id={$vo.id}'>编 辑</a>
<!--{/if}--> <!--{/if}-->
<!--{if auth("state") and $vo.status eq 1}--> <!--{if auth("state") and $vo.status eq 1}-->
<a class="layui-btn layui-btn-xs layui-btn-danger" data-confirm="确定要禁用该商户吗?" data-action="{:url('state')}" data-value="id#{$vo.id};status#0" data-csrf="{:systoken('state')}">禁 用</a> <a class="layui-btn layui-btn-xs layui-btn-danger" data-confirm="确定要禁用该商户吗?"
<!-- {elseif auth("state")} --> data-action="{:url('state')}" data-value="id#{$vo.id};status#0" data-csrf="{:systoken('state')}">禁
<a class="layui-btn layui-btn-warm layui-btn-xs" data-confirm="确定要启用该商户吗?" data-action="{:url('state')}" data-value="id#{$vo.id};status#1" data-csrf="{:systoken('state')}">启 用</a> </a>
<!-- {elseif auth("state")} -->
<a class="layui-btn layui-btn-warm layui-btn-xs" data-confirm="确定要启用该商户吗?"
data-action="{:url('state')}" data-value="id#{$vo.id};status#1" data-csrf="{:systoken('state')}">启
</a>
<!-- {/if} --> <!-- {/if} -->
<!--{if auth("resetapi") && !$vo.appid}--> <!--{if auth("resetapi") && !$vo.appid}-->
<a class="layui-btn layui-btn-xs layui-btn-danger" data-confirm="一旦重置KEY接口将立刻不可使用!!!!确定要重置该商户秘钥该吗?" data-action="{:url('resetapi')}" data-value="id#{$vo.id}" data-csrf="{:systoken('resetapi')}">秘 钥</a> <a class="layui-btn layui-btn-xs layui-btn-danger"
data-confirm="一旦重置KEY接口将立刻不可使用!!!!确定要重置该商户秘钥该吗?"
data-action="{:url('resetapi')}" data-value="id#{$vo.id}" data-csrf="{:systoken('resetapi')}">秘
</a>
<!--{/if}--> <!--{/if}-->
<!--{if auth("remove")}--> <!--{if auth("remove")}-->
<!-- <!--
<a class="layui-btn layui-btn-xs layui-btn-danger" data-confirm="确认要删除该账户吗" data-action="{:url('remove')}" data-value="id#{$vo.id}" data-csrf="{:systoken('remove')}">删 除</a> <a class="layui-btn layui-btn-xs layui-btn-danger" data-confirm="确认要删除该账户吗" data-action="{:url('remove')}" data-value="id#{$vo.id}" data-csrf="{:systoken('remove')}">删 除</a>
--> -->
<!--{if auth("pass")}--> <!--{if auth("pass")}-->
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="【{$vo.name}】账户设置" data-modal='{:url("pass")}?id={$vo.id}' data-csrf="{:systoken('pass')}">账户设置</a> <a class="layui-btn layui-btn-xs layui-btn-normal" data-title="【{$vo.name}】账户设置"
<!--{/if}--> data-modal='{:url("pass")}?id={$vo.id}' data-csrf="{:systoken('pass')}">账户设置</a>
<!--{if auth("recharge")}-->
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="渠道设置" data-open='{:url("/merchant/product/setting")}?id={$vo.id}' data-csrf="{:systoken('recharge')}">渠道设置</a>
<!--{/if}-->
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="折扣设置" data-open='{:url("/merchant/percent/index")}?mid={$vo.id}' data-csrf="{:systoken('remove')}">折扣设置</a>
<!--{if auth("info")}-->
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="查看【{$vo.name}】的商户信息" data-modal='{:url("info")}?id={$vo.id}' data-csrf="{:systoken('info')}">查看信息</a>
<!--{/if}-->
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="通道" data-open='{:url("/merchant/project/index")}?mid={$vo.id}' data-csrf="{:systoken('remove')}" style="display: none;">通道</a>
<!--{/if}--> <!--{/if}-->
<div class="margin-top-5"> <!--{if auth("recharge")}-->
<!--{if auth("recharge")}--> <a class="layui-btn layui-btn-xs layui-btn-normal" data-title="渠道设置"
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="【{$vo.name}】账户余额充值" data-modal="{:url('recharge')}?id={$vo.id}" data-csrf="{:systoken('recharge')}">资 金</a> data-open='{:url("/merchant/product/setting")}?id={$vo.id}' data-csrf="{:systoken('recharge')}">渠道设置</a>
<!--{/if}-->
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="查看资金明细" data-open="{:url('/merchant/account/index')}?id={$vo.id}" data-csrf="{:systoken('recharge')}">资金明细</a> <a class="layui-btn layui-btn-xs layui-btn-normal" data-title="折扣设置"
data-open='{:url("/merchant/percent/index")}?mid={$vo.id}'
data-csrf="{:systoken('remove')}">折扣设置</a>
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="返点设置" data-open="{:url('/merchant/rebate/index')}?mid={$vo.id}" data-csrf="{:systoken('recharge')}" style="display: none;">返点设置</a>
<!--{/if}--> <!--{if auth("info")}-->
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="查看【{$vo.name}】的商户信息"
data-modal='{:url("info")}?id={$vo.id}' data-csrf="{:systoken('info')}">查看信息</a>
<!--{/if}-->
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="通道"
data-open='{:url("/merchant/project/index")}?mid={$vo.id}' data-csrf="{:systoken('remove')}"
style="display: none;">通道</a>
<!--{/if}-->
<div class="margin-top-5">
<!--{if auth("recharge")}-->
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="【{$vo.name}】账户余额充值"
data-modal="{:url('recharge')}?id={$vo.id}" data-csrf="{:systoken('recharge')}">资 金</a>
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="查看资金明细"
data-open="{:url('/merchant/account/index')}?id={$vo.id}"
data-csrf="{:systoken('recharge')}">资金明细</a>
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="返点设置"
data-open="{:url('/merchant/rebate/index')}?mid={$vo.id}" data-csrf="{:systoken('recharge')}"
style="display: none;">返点设置</a>
<!--{/if}-->
<!--{if auth("recharge")}--> <!--{if auth("recharge")}-->
<a class="layui-btn layui-btn-xs layui-btn-normal" data-title="查看订单" data-open='{:url("/order/order/index")}?mid={$vo.id}' data-csrf="{:systoken('recharge')}">订单列表</a> <a class="layui-btn layui-btn-xs layui-btn-normal" data-title="查看订单"
data-open='{:url("/order/order/index")}?mid={$vo.id}' data-csrf="{:systoken('recharge')}">订单列表</a>
<!--{/if}--> <!--{/if}-->
<!--{if $vo.merchant_type==7}--> <!--{if $vo.merchant_type==7}-->
<!-- <a class="layui-btn layui-btn-xs layui-btn-danger" data-title="任务设置" data-open='{:url("/merchant/beeTask/setting")}?id={$vo.id}' data-csrf="{:systoken('recharge')}">蜜蜂获单设置</a>--> <!-- <a class="layui-btn layui-btn-xs layui-btn-danger" data-title="任务设置" data-open='{:url("/merchant/beeTask/setting")}?id={$vo.id}' data-csrf="{:systoken('recharge')}">蜜蜂获单设置</a>-->
<!--{/if}-->
<!--{if $vo.merchant_type==3 || $vo.merchant_type==4 || $vo.merchant_type==5 || $vo.merchant_type==6 || $vo.merchant_type==8 || $vo.merchant_type==9}-->
<a class="layui-btn layui-btn-xs layui-btn-danger" data-title="映射产品编码设置" data-open='{:url("/merchant/MerchantMappingProduct/index")}?mid={$vo.id}' data-csrf="{:systoken('recharge')}">映射产品编码设置</a>
<!--{/if}-->
<a class="layui-btn layui-btn-xs layui-btn-green" data-title="IP白名单设置" data-modal='{:url("ipWhite")}?id={$vo.id}' data-csrf="{:systoken('ipWhite')}">设置IP白名单</a>
<a class="layui-btn layui-btn-xs layui-btn-danger" data-title="商户参数设置" data-open='{:url("/merchant/MerchantParams/index")}?mid={$vo.id}' data-csrf="{:systoken('recharge')}">商户参数设置</a>
<!--{if $vo.kami_status==1}-->
<a class="layui-btn layui-btn-xs layui-btn-green" data-title="设置自动发卡软件" data-modal='{:url("autoCard")}?id={$vo.id}&other_param={$vo.other_param}' data-csrf="{:systoken('autoCard')}">设置自动发卡软件</a>
<!--{/if}--> <!--{/if}-->
<a class="layui-btn layui-btn-xs layui-btn-green" data-title="IP白名单设置"
data-modal='{:url("ipWhite")}?id={$vo.id}'
data-csrf="{:systoken('ipWhite')}">设置IP白名单</a>
<a class="layui-btn layui-btn-xs layui-btn-danger" data-title="商户参数设置"
data-open='{:url("/merchant/MerchantParams/index")}?mid={$vo.id}'
data-csrf="{:systoken('recharge')}">商户参数设置</a>
<!--{if $vo.callback_repeat==3}--> <!--{if $vo.callback_repeat==3}-->
@ -145,28 +173,58 @@
<!--{/if}--> <!--{/if}-->
<!--{if auth("state") and $vo.status eq 1 and $vo.merchant_type==7 and $vo.other_status==1}--> <!--{if auth("state") and $vo.status eq 1 and $vo.merchant_type==7 and $vo.other_status==1}-->
<!-- <a class="layui-btn layui-btn-xs layui-btn-danger" data-confirm="确定要暂停拉单吗?" data-action="{:url('otherstate')}" data-value="id#{$vo.id};other_status#0" data-csrf="{:systoken('state')}">禁用蜜蜂拉单</a>--> <!-- <a class="layui-btn layui-btn-xs layui-btn-danger" data-confirm="确定要暂停拉单吗?" data-action="{:url('otherstate')}" data-value="id#{$vo.id};other_status#0" data-csrf="{:systoken('state')}">禁用蜜蜂拉单</a>-->
<!-- {elseif auth("state") and $vo.status eq 1 and $vo.merchant_type==7 and $vo.other_status==0} --> <!-- {elseif auth("state") and $vo.status eq 1 and $vo.merchant_type==7 and $vo.other_status==0} -->
<!-- <a class="layui-btn layui-btn-warm layui-btn-xs" data-confirm="确定要开始拉单吗?" data-action="{:url('otherstate')}" data-value="id#{$vo.id};other_status#1" data-csrf="{:systoken('state')}">启用蜜蜂拉单</a>--> <!-- <a class="layui-btn layui-btn-warm layui-btn-xs" data-confirm="确定要开始拉单吗?" data-action="{:url('otherstate')}" data-value="id#{$vo.id};other_status#1" data-csrf="{:systoken('state')}">启用蜜蜂拉单</a>-->
<!-- {/if} --> <!-- {/if} -->
</div> </div>
<div class="margin-top-5">
<!--{if $vo.kami_status==1}-->
<a class="layui-btn layui-btn-xs layui-btn-green" data-title="设置自动发卡软件"
data-modal='{:url("autoCard")}?id={$vo.id}&other_param={$vo.other_param}'
data-csrf="{:systoken('autoCard')}">设置自动发卡软件</a>
<!--{/if}-->
<!--{if $vo.merchant_type==3 || $vo.merchant_type==4 || $vo.merchant_type==5 || $vo.merchant_type==6 || $vo.merchant_type==8 || $vo.merchant_type==9}-->
<a class="layui-btn layui-btn-xs layui-btn-danger" data-title="映射产品编码设置"
data-open='{:url("/merchant/MerchantMappingProduct/index")}?mid={$vo.id}'
data-csrf="{:systoken('recharge')}">映射产品编码设置</a>
<!--{/if}-->
<!--{if $vo.callback_repeat==3}-->
<a class="layui-btn layui-btn-xs layui-btn-danger" data-csrf="{:systoken('recharge')}"
data-open='{:url("/merchant/callbackRepeat/setting")}?id={$vo.id}'
data-title="指定渠道开启返销">指定渠道开启返销</a>
<!--{/if}-->
</div>
{else} {else}
<!--{if auth("edit")}--> <!--{if auth("edit")}-->
<a data-dbclick class="layui-btn layui-btn-xs" data-title="编辑商户" data-modal='{:url("edit")}?id={$vo.id}'>编 辑</a> <a data-dbclick class="layui-btn layui-btn-xs" data-title="编辑商户"
data-modal='{:url("edit")}?id={$vo.id}'>编 辑</a>
<!--{/if}--> <!--{/if}-->
<!--{if auth("state") and $vo.status eq 0}--> <!--{if auth("state") and $vo.status eq 0}-->
<a class="layui-btn layui-btn-xs layui-btn-warm" data-confirm="确定要恢复该商户吗?" data-action="{:url('state')}" data-value="id#{$vo.id};status#1" data-csrf="{:systoken('state')}">恢 复</a> <a class="layui-btn layui-btn-xs layui-btn-warm" data-confirm="确定要恢复该商户吗?"
data-action="{:url('state')}" data-value="id#{$vo.id};status#1" data-csrf="{:systoken('state')}">恢
</a>
<!--{/if}--> <!--{/if}-->
<!--{if auth("remove")}--> <!--{if auth("remove")}-->
<a class="layui-btn layui-btn-xs layui-btn-danger" data-confirm="确定要永久删除此商户吗?" data-action="{:url('remove')}" data-value="id#{$vo.id}" data-csrf="{:systoken('remove')}">删 除</a> <a class="layui-btn layui-btn-xs layui-btn-danger" data-confirm="确定要永久删除此商户吗?"
data-action="{:url('remove')}" data-value="id#{$vo.id}" data-csrf="{:systoken('remove')}">删
</a>
<!--{/if}--> <!--{/if}-->
{/if} {/if}
</td> </td>
</tr> </tr>
{/foreach} {/foreach}

View File

@ -365,7 +365,7 @@ class Coretb extends Controller
}else{ }else{
# 检测是否超过限制 # 检测是否超过限制
$new_num = $countS + 1; $new_num = $countS + 1;
if($new_num >=$num){ if($new_num >$num){
#超出,需要退款 #超出,需要退款
$tempNum=2; $tempNum=2;
while($tempNum>0){ while($tempNum>0){
@ -388,66 +388,148 @@ class Coretb extends Controller
} }
} }
#查询 param 中json数据 By_OpenUid 出现次数counO create_at data(Y- # 检测是否为限购如果为限购则需要检测是否超过限制如果超过限制则需要退款如果未超过限制则需要发货使用redis进行优化处理
$count = OrderService::instance()->db()->where(['status'=>'2','mid'=>$this->mid])->whereBetween('create_at',[date('Y-m-d 00:00:00',time()),date('Y-m-d 23:59:59',time())])->whereLike('param',"%".$By_OpenUid."%")->count();
if(isset($array['limitbuy_num'])){ if(isset($array['limitbuy_num']) || isset($array['limitbuy_amount'])){
$redis = RedisService::getInstance();
$redis_key = $this->merchant['id'].'_['.$By_OpenUid.']_LimitBuy';
$data = $redis->get($redis_key);
$n_cash = $this->input['cash']??0;
#计算当天还有多少秒
$remainingSeconds = 86400 - (time() + 8 * 3600) % 86400;
if($count>=$array['limitbuy_num']){ if(!$data){
$new_data = [
'buy_num'=>1,
'buy_cash'=>$n_cash
];
$redis->set($redis_key,$new_data,$remainingSeconds);
}else{
$new_num = $data['buy_num']+1;
$new_total_cash = $data['buy_cash']+$n_cash;
$tempNum=2; if(isset($array['limitbuy_num'])){
while($tempNum>0){ if($data['buy_num']>=$array['limitbuy_num']){
$msg = $this->tradeUpdate("该订单买家今日采购了 {$count} 笔,超过限制 {$array['limitbuy_num']} ,停止发货--REAPI 系统自动化",5); $tempNum=2;
while($tempNum>0){
$msg = $this->tradeUpdate("该订单买家今日已采购了 {$data['buy_num']} 笔,本笔超过限制 每天 限制{$array['limitbuy_num']} ,停止发货--REAPI 系统自动化",5);
if($msg=='error'){
$tempNum--;
}else{
$tempNum=0;
}
}
if($is_coop){
$this->noTB('0503', 'submit_coop' ,$this->input['order']);
}
$this->noTB('0503', 'submit' ,$this->input['order']);
if($msg=='error'){
$tempNum--;
}else{ }else{
$tempNum=0; $new_data = [
'buy_num'=>$new_num,
'buy_cash'=>$new_total_cash
];
$redis->set($redis_key,$new_data,$remainingSeconds);
} }
} }
if($is_coop){ if(isset($array['limitbuy_amount'])){
$this->noTB('0503', 'submit_coop' ,$this->input['order']);
} if($new_total_cash>$array['limitbuy_amount']){
$tempNum=2;
while($tempNum>0){
$msg = $this->tradeUpdate("该订单因为同账号累计金额为{$new_total_cash},超过每天限制{$array['limitbuy_amount']},停止发货--REAPI 系统自动化",5);
if($msg=='error'){
$tempNum--;
}else{
$tempNum=0;
}
}
if($is_coop){
$this->noTB('0503', 'submit_coop' ,$this->input['order']);
}
$this->noTB('0503', 'submit' ,$this->input['order']); $this->noTB('0503', 'submit' ,$this->input['order']);
}
}
if(isset($array['limitbuy_amount'])){
$cash = OrderService::instance()->db()->where(['status'=>'2','mid'=>$this->mid])->whereBetween('create_at',[date('Y-m-d 00:00:00',time()),date('Y-m-d 23:59:59',time())])->whereLike('param',"%".$By_OpenUid."%")->sum('cash');
if(!$cash){
$cash = 0;
}
$cash = $cash +$this->input['cash'];
if($cash>=$array['limitbuy_amount']){
$tempNum=2;
while($tempNum>0){
$msg = $this->tradeUpdate("该订单因为同IP累计金额为{$cash},超过限制{$array['limitbuy_amount']},停止发货--REAPI 系统自动化",5);
if($msg=='error'){
$tempNum--;
}else{ }else{
$tempNum=0; $new_data = [
'buy_num'=>$new_num,
'buy_cash'=>$new_total_cash
];
$redis->set($redis_key,$new_data,$remainingSeconds);
} }
} }
if($is_coop){
$this->noTB('0503', 'submit_coop' ,$this->input['order']);
}
$this->noTB('0503', 'submit' ,$this->input['order']);
} }
} }
} }
#查询 param 中json数据 By_OpenUid 出现次数counO create_at data(Y-
// $count = OrderService::instance()->db()->where(['status'=>'2','mid'=>$this->mid])->whereBetween('create_at',[date('Y-m-d 00:00:00',time()),date('Y-m-d 23:59:59',time())])->whereLike('param',"%".$By_OpenUid."%")->count();
// if(isset($array['limitbuy_num'])){
//
// if($count>=$array['limitbuy_num']){
//
// $tempNum=2;
// while($tempNum>0){
// $msg = $this->tradeUpdate("该订单买家今日采购了 {$count} 笔,超过限制 {$array['limitbuy_num']} ,停止发货--REAPI 系统自动化",5);
//
// if($msg=='error'){
// $tempNum--;
// }else{
// $tempNum=0;
// }
// }
//
// if($is_coop){
// $this->noTB('0503', 'submit_coop' ,$this->input['order']);
// }
//
//
// $this->noTB('0503', 'submit' ,$this->input['order']);
// }
// }
//
// if(isset($array['limitbuy_amount'])){
// $cash = OrderService::instance()->db()->where(['status'=>'2','mid'=>$this->mid])->whereBetween('create_at',[date('Y-m-d 00:00:00',time()),date('Y-m-d 23:59:59',time())])->whereLike('param',"%".$By_OpenUid."%")->sum('cash');
// if(!$cash){
// $cash = 0;
// }
// $cash = $cash +$this->input['cash'];
//
//
// if($cash>=$array['limitbuy_amount']){
//
// $tempNum=2;
// while($tempNum>0){
// $msg = $this->tradeUpdate("该订单因为同IP累计金额为{$cash},超过限制{$array['limitbuy_amount']},停止发货--REAPI 系统自动化",5);
//
// if($msg=='error'){
// $tempNum--;
// }else{
// $tempNum=0;
// }
// }
//
// if($is_coop){
// $this->noTB('0503', 'submit_coop' ,$this->input['order']);
// }
//
//
// $this->noTB('0503', 'submit' ,$this->input['order']);
// }
// }
//
//
// }
} }
@ -625,10 +707,10 @@ class Coretb extends Controller
{ {
$orderService = OrderService::instance(); $orderService = OrderService::instance();
$order = $orderService->get($order_id, $merchant_order_id, $this->mid); $order = $orderService->get($order_id, $merchant_order_id, $this->mid);
if (!$order) { // if (!$order) {
$orderLastweekHistoryService = OrderLastweekHistoryService::instance(); // $orderLastweekHistoryService = OrderLastweekHistoryService::instance();
$order = $orderLastweekHistoryService->get($order_id, $merchant_order_id, $this->mid); // $order = $orderLastweekHistoryService->get($order_id, $merchant_order_id, $this->mid);
} // }
// if (!$order) { // if (!$order) {
// $orderLastHistoryService = OrderLastHistoryService::instance(); // $orderLastHistoryService = OrderLastHistoryService::instance();
// $order = $orderLastHistoryService->get($order_id, $merchant_order_id, $this->mid); // $order = $orderLastHistoryService->get($order_id, $merchant_order_id, $this->mid);

View File

@ -23,10 +23,27 @@ use app\channel\service\ProductService as CProductService;
class App extends Controller class App extends Controller
{ {
# 是否检测数据
// protected bool $check = false;
protected $merchant_id; protected $merchant_id;
protected string $host_url = 'https://supplier-api.wanmahui.com/api/openplatform/gateway';
# code码定义
protected $code = array
(
# 成功
1 => 'ok',
# 小于0为失败
0 => '暂时未处理',
1100 => '商品不存在',
);
protected string $uid = '';
protected string $secretKey = '';
# code码定义 # code码定义
# 查询接口 一般用于查询数据,同步执行 # 查询接口 一般用于查询数据,同步执行

View File

@ -0,0 +1,86 @@
<?php
namespace app\private_api\controller\monitorApi;
use app\channel\service\ChannelService;
use app\merchant\service\MerchantService;
/**
* 接口处理
* Class Handle
* @package app\gateway\api
*/
class Channel extends Core
{
# 是否检测数据
protected bool $check = false;
#获取渠道余额
public function AllBalance()
{
$data = ChannelService::instance()->getAll();
$where['is_deleted'] = 0;
$where['status'] = 1;
$data = MerchantService::instance()->db()->field('name,account_surplus,credit_surplus,appid')->where($where)->select()->toArray();
$this->yes($data);
}
protected function maketime($v): float|false|int|string
{
if (!$v) {
return '';
}
if (is_numeric($v)) {
return $v;
}
if (is_array($v)) {
$v = $v[1];
}
if (strstr($v, ' ')) {
$t = explode(' ', $v);
$v = $t[0];
$s = explode(':', $t[1]);
} else {
$s = array(0, 0, 0);
}
if (!isset($s[1])) {
$s[1] = 0;
}
if (!isset($s[2])) {
$s[2] = 0;
}
if (strstr($v, '-')) {
$t = explode('-', $v);
} elseif (strstr($v, '/')) {
$u = explode('/', $v);
$t[0] = $u[2];
$t[1] = $u[0];
$t[2] = $u[1];
}
if (!isset($t)) {
$t = array(0, 0, 0);
}
if (!isset($t[1])) {
$t[1] = 0;
}
if (!isset($t[2])) {
$t[2] = 0;
}
$v = mktime($s[0], $s[1], $s[2], $t[1], $t[2], $t[0]);
return $v;
}
}

View File

@ -48,11 +48,11 @@ class FeedovHfAuto extends Command
$this->redis = RedisService::getInstance(); $this->redis = RedisService::getInstance();
$account_data = $channelService->call('account', 13, ''); $account_data = $channelService->call('account', 23, '');
$balance = $account_data['account']; $balance = $account_data['account'];
$redis_balance = $this->redis->get('channel_account-13'); $redis_balance = $this->redis->get('channel_account-23');
if(!$this->redis->get('channel_account-13')){ if(!$this->redis->get('channel_account-23')){
$this->redis->set('channel_account-13',$balance,24*60*60); $this->redis->set('channel_account-23',$balance,24*60*60);
$stock = intval(bcdiv($balance, '1.002', 3)); // 第三个参数是保留的小数位数,可根据需要调整 $stock = intval(bcdiv($balance, '1.002', 3)); // 第三个参数是保留的小数位数,可根据需要调整
$need_update = true; $need_update = true;

View File

@ -64,8 +64,6 @@ class KamiOrderChanelNotify extends Command
$getMerchantInfo = $MerchantService->get($vo['mid']); $getMerchantInfo = $MerchantService->get($vo['mid']);
if($info['status'] == 4){ if($info['status'] == 4){
if( $vo['status'] == 7){ if( $vo['status'] == 7){
$request_data = []; $request_data = [];
if(empty($info['cardno'])){ if(empty($info['cardno'])){
@ -90,8 +88,6 @@ class KamiOrderChanelNotify extends Command
$result = $kami91server->up($where,$kami); $result = $kami91server->up($where,$kami);
}elseif(isset($vo['channel_callback_msg']) && str_contains($vo['channel_callback_msg'], "kami")){ }elseif(isset($vo['channel_callback_msg']) && str_contains($vo['channel_callback_msg'], "kami")){
$msg = json_decode($vo['channel_callback_msg'],true); $msg = json_decode($vo['channel_callback_msg'],true);
$cardno = $msg['kami']['cardno']; $cardno = $msg['kami']['cardno'];
@ -112,8 +108,6 @@ class KamiOrderChanelNotify extends Command
$result =$kami91server->up($where,$kami); $result =$kami91server->up($where,$kami);
} }