feat(merchant): 添加自定义回调类功能并优化通知逻辑

- 在商户表单中添加自定义回调类输入框
- 优化卡密通知加密逻辑
-改进订单状态更新和回调信息处理
- 修复了一些通知相关的bug
This commit is contained in:
2025-06-05 11:15:35 +08:00
parent 839a01e114
commit b2b2fad0c5
3 changed files with 120 additions and 94 deletions

View File

@ -569,10 +569,10 @@ class MerchantService extends Service
$url = urldecode($url);
} else {
$url = $merchant['notify_url'];
if (strstr($url, '|')) {
if (str_contains($url, '|')) {
$temp = explode('|', $url);
$url = $temp[0];
if (strstr($product_key, 'zsycz')) {
if (str_contains($product_key, 'zsycz')) {
$url = $temp[1];
}
}
@ -658,84 +658,102 @@ class MerchantService extends Service
} else {
$token = $merchant['appid'] . '|' . $merchant['appsecret'];
}
// var_dump($result);die;
#优化:卡密加密通知
if(str_ends_with($product_key, '_cardbuy') && $param['status'] == 2){
#暂时优化
if ($type == 1) {
$orderService = OrderService::instance();
} elseif($type == 5) {
$orderService = OrderLastHistoryService::instance();
}elseif($type == 6) {
$orderService = OrderTwoHistoryService::instance();
}elseif($type == 7) {
$orderService = OrderLastweekHistoryService::instance();
}else {
$orderService = OrderHistoryService::instance();
}
$order_infos = $orderService->get('', $result['merchant_order_id'], $merchant['id']);
if($merchant['kami_status'] == 1 && $merchant['merchant_type'] == 1 && $param['status'] == 2){
$ksorderService = OrderService::instance();
$ksdata = $ksorderService->get('', $result['merchant_order_id'], $merchant['id']);
if(isset($ksdata['response']) && $ksdata['response']){
$responseK = json_decode($ksdata['response'],true);
if(isset($responseK['kami'])) {
$cardno = $responseK['kami']['cardno'];
$cardpwd = $responseK['kami']['cardpwd'];
$expire_time= $responseK['kami']['expired'];
$kami = [
'cardno' =>$cardno,
'cardpwd' =>$cardpwd,
'expire_time' =>$expire_time,
];
if($merchant['id'] != 7){
$kami=implode(',',$kami);
$param['card'] = null;
if($order_infos){
if(isset($order_infos['response']) && $order_infos['response']) {
$responseArray = json_decode($order_infos['response'], true);
if (isset($responseArray['kami'])) {
$kami = [
'cardno' => $responseArray['kami']['cardno'] ?? null,
'cardpwd' => $responseArray['kami']['cardpwd'] ?? null,
'expire_time' => $responseArray['kami']['expired'] ?? null
];
#手动兼容
if ($merchant['id'] != 7) {
$kami = implode(',', $kami);
}
} elseif (isset($order_infos['channel_callback_msg']) && str_contains($order_infos['channel_callback_msg'], "kami")) {
$msgArray = json_decode($order_infos['channel_callback_msg'], true);
$kami = [
'cardno' => $msgArray['kami']['cardno'] ?? null,
'cardpwd' => $msgArray['kami']['cardpwd'] ?? null,
'expire_time' => $msgArray['kami']['expired'] ?? null,
];
if ($merchant['id'] != 7) {
$kami = implode(',', $kami);
}
}
if(isset($kami)){
if($merchant['id'] != 7){
$secret=strtolower(md5(md5($token).$param['order_id']));
$str=openssl_encrypt($kami, 'DES-EDE3', $secret, OPENSSL_RAW_DATA);
$param['card'] = base64_encode($str);
}else{
$param['card'] = json_encode($kami);
}
}
}elseif(isset($ksdata['channel_callback_msg']) && str_contains($ksdata['channel_callback_msg'], "kami")) {
$msgK = json_decode($ksdata['channel_callback_msg'], true);
$cardno = $msgK['kami']['cardno'];
$cardpwd = $msgK['kami']['cardpwd'];
$expire_time = $msgK['kami']['expired'];
$kami = [
'cardno' => $cardno,
'cardpwd' => $cardpwd,
'expire_time' => $expire_time,
];
if($merchant['id'] != 7){
$kami=implode(',',$kami);
}
}
if($merchant['id'] != 7){
$seacret=strtolower(md5(md5($token).$param['order_id']));
// $v=substr($seacret, 0,strlen($seacret)/2);
$str=openssl_encrypt($kami, 'DES-EDE3', $seacret, OPENSSL_RAW_DATA);
$param['card'] = base64_encode($str);
}else{
$param['card'] = json_encode($kami);
}
}
}
$param = $this->getParam($param, $token, $sign_type);
switch ($merchant['merchant_type'])
{
case "5":
#分析是否为快手店铺
$param = array();
$orderkshd = '';
$params = array();
// if(!isset($orderService)){
// #暂时优化
// if ($type == 1) {
// $orderService = OrderService::instance();
// } elseif($type == 5) {
// $orderService = OrderLastHistoryService::instance();
// }elseif($type == 6) {
// $orderService = OrderTwoHistoryService::instance();
// }elseif($type == 7) {
// $orderService = OrderLastweekHistoryService::instance();
// }else {
// $orderService = OrderHistoryService::instance();
// }
// }
// $ks_order_data = $orderService->get('', $result['merchant_order_id'], $merchant['id']);
$params['orderId'] = $result['merchant_order_id'];
$params['mobile'] = $result['account'];
$ksorderService = OrderService::instance();
$ksdata = $ksorderService->get($orderkshd, $result['merchant_order_id'], $merchant['id']);
$param['orderId'] = $result['merchant_order_id'];
$param['mobile'] = $result['account'];
$tdtime = strtotime($ksdata['create_at']);
$tdtime = date('YmdHis',$tdtime);
$tdtime = substr($tdtime,2);
\dever\Log::write('gateway', 'test1', $ksdata);
#快手订单状态转换
if($result['status'] == 2){
#成功
$param['status'] = 'SUCCESS';
$param['bizType'] = '20';
$params['status'] = 'SUCCESS';
$params['bizType'] = '20';
} elseif ($result['status'] == 3) {
# 失败...
$param['status'] = 'FAILED';
$param['bizType'] = '20';
$param['failCode'] = '4013024';
$param['failMsg'] = '上游通道充值失败';
$params['status'] = 'FAILED';
$params['bizType'] = '20';
$params['failCode'] = '4013024';
$params['failMsg'] = '上游通道充值失败';
} else {
# 其他终止...
return;
@ -745,35 +763,28 @@ class MerchantService extends Service
$merchant['agentId'] = $agentId[0];
}
if (str_ends_with($merchant['agentId'], "_KC")) {
$param['bizType'] = '10';
$params['bizType'] = '10';
$merchant['agentId'] = substr($merchant['agentId'], 0, -3);
}
$param = json_encode($param);
$signtime = time();
$param = json_encode($params);
$signTime = time();
$sign = 'access_token='.$merchant['access_token'].'&appkey='.$merchant['agentId'].'&method=integration.virtual.topup.mobile.order.callback&param='.$param.'&signMethod=MD5&timestamp='.$signtime.'&version=1';
$signmd5 = md5($sign);
$param = urlencode($param);
$geturl = '?access_token='.$merchant['access_token'].'&appkey='.$merchant['agentId'].'&method=integration.virtual.topup.mobile.order.callback&param='.$param.'&signMethod=MD5&timestamp='.$signtime.'&version=1&sign='.$signmd5;
$sign = 'access_token='.$merchant['access_token'].'&appkey='.$merchant['agentId'].'&method=integration.virtual.topup.mobile.order.callback&param='.$param.'&signMethod=MD5&timestamp='.$signTime.'&version=1';
$signMd5 = md5($sign);
$param = urlencode($params);
$geturl = '?access_token='.$merchant['access_token'].'&appkey='.$merchant['agentId'].'&method=integration.virtual.topup.mobile.order.callback&param='.$param.'&signMethod=MD5&timestamp='.$signTime.'&version=1&sign='.$signMd5;
break;
case "8":
#天猫游戏直充
// $ksdata = OrderService::instance()->get($result['order_id'], $result['merchant_order_id']);
// var_dump($result);die;
if($result['status'] == 2){
#成功
$apiParams['coop_order_status'] = 'SUCCESS';
// $rsp_info = '';
} elseif ($result['status'] == 3) {
# 失败...
$apiParams['coop_order_status'] = 'FAILED';
$apiParams['failed_code'] = '0503';
$apiParams['failed_reason'] = '充值失败';
@ -782,8 +793,6 @@ class MerchantService extends Service
return;
}
// $taobao=new \app\openapi\controller\Taobao($this->app);
// $msg = $taobao ->notify($url,$param['merchant_order_id'] ,$merchant,$apiParams)
$check = true;

View File

@ -124,6 +124,15 @@
</label>
</div>
<div class="layui-col-xs4" id="diy_notify" style="display: none;">
<label class="relative block">
<span class="font-w7">自定义回调类</span>
<input name="diy_notify" value='{$vo.diy_notify|default=""}' placeholder="请输入自定义回调类" class="layui-input">
<span class="color-desc">输入自定义回调类名</span>
</label>
</div>
</div>
<div class="layui-row layui-col-space15">
@ -378,6 +387,8 @@
</div>
</div>
<div class="hr-line-dashed"></div>
{notempty name='vo.id'}<input type='hidden' value='{$vo.id}' name='id'>{/notempty}
<div class="layui-form-item text-center">

View File

@ -64,29 +64,35 @@ class KamiOrderStatusStandardUp extends Command
foreach ($data->toArray() as $vo) {
$count++;
// $orderService = OrderService::instance();
if(isset($vo['response'])){
$callJson = $vo['response'];
if(isset($callJson) && is_string($callJson)) {
$callArray = json_decode($callJson, true);
if(is_array($callArray)) {
if(isset($callArray['kami'])) {
$callArray = $callArray['kami'];
$callArray['s_number']=$callArray['cardno'];
$callJson = json_encode($callArray);
#修复存在回调信息的订单,无需更新回调信息,只更新订单状态
if(empty($vo['channel_callback_msg'])){
if(isset($vo['response'])){
$callJson = $vo['response'];
if(isset($callJson) && is_string($callJson)) {
$callArray = json_decode($callJson, true);
if(is_array($callArray)) {
if(isset($callArray['kami'])) {
$callArray = $callArray['kami'];
$callArray['s_number']=$callArray['cardno'];
$callJson = json_encode($callArray);
}
}
}
}
if(!isset($callJson) || !is_string($callJson)) {
$callJson = '{}';
}
#回调时间更新
$channel_callback_at = date('Y-m-d H:i:s');
$orderService->db()->where(['id' => $vo['id']])->update(['status' => 2,'merchant_callback_error' =>2,'channel_callback_msg'=>$callJson,'channel_callback_at'=>$channel_callback_at]);
}else{
$orderService->db()->where(['id' => $vo['id']])->update(['status' => 2,'merchant_callback_error' =>2]);
}
if(!isset($callJson) || !is_string($callJson)) {
$callJson = '{}';
}
#回调时间更新
$channel_callback_at = date('Y-m-d H:i:s');
$orderService->db()->where(['id' => $vo['id']])->update(['status' => 2,'merchant_callback_error' =>2,'channel_callback_msg'=>$callJson,'channel_callback_at'=>$channel_callback_at]);