Quellcode durchsuchen

feat(happiness): 新增小店入驻银行卡信息及汇付用户开户功能- 添加银行卡信息模型 HappinessStoreCardInfo 及相关字段校验规则
- 在 ApplyController 中新增银行卡信息必填参数校验- 在 HappinessStore 模型中保存银行卡信息并与小店关联
- 集成汇付SDK个人用户开户接口 V2UserBasicdataIndvRequest
- 集成汇付SDK用户业务入驻接口 V2UserBusiOpenRequest- 在 StoreAuditController 审核通过时调用汇付开户及入驻接口
-修复汇付SDK证件结束日期字段设置错误的问题
- 添加汇付请求流水号与日期生成逻辑
- 实现汇付返回结果的成功与失败处理逻辑
- 支持将汇付ID记录到 HappinessStore 模型中

shichen vor 10 Monaten
Ursprung
Commit
dd2c8f9709

+ 2 - 0
addons/Happiness/api/modules/v1/controllers/ApplyController.php

@@ -110,6 +110,8 @@ class ApplyController extends OnAuthController
110 110
                 return $upload_license_image == 1;
111 111
             }],
112 112
             [['id'], 'safe'],
113
+            // 小店入驻新增参数
114
+            [['card_type', 'card_name', 'card_no', 'prov_id', 'area_id', 'branch_code', 'cert_type', 'cert_no', 'cert_validity_type', 'cert_begin_date', 'cert_end_date', 'mp', 'is_settle_default'], 'required']
113 115
         ];
114 116
         $res = \Yii::$app->services->validate->validate($post, $rules);
115 117
         if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());

+ 26 - 0
addons/Happiness/backend/controllers/StoreAuditController.php

@@ -4,6 +4,8 @@ namespace addons\Happiness\backend\controllers;
4 4
 
5 5
 use addons\Happiness\common\enums\HappinessEnum;
6 6
 use addons\Happiness\common\models\HappinessStore;
7
+use addons\Happiness\common\models\HappinessStoreCardInfo;
8
+use addons\HuifuPay\common\service\HuifuService;
7 9
 use common\enums\AddonsEnum;
8 10
 use common\enums\StatusEnum;
9 11
 use common\models\common\Region;
@@ -158,6 +160,30 @@ class StoreAuditController extends BaseController
158 160
         if (false === $res) {
159 161
             return $this->error(HappinessStore::getStaticError());
160 162
         }
163
+
164
+        // 审核通过请求汇付创建用户
165
+        if ($check_status == HappinessEnum::CHECK_ADOPT) {
166
+            $huifuService = new HuifuService($this->mall_id);
167
+            $cardInfo = HappinessStoreCardInfo::getOne(['store_id' => $post['id']],true);
168
+            unset($cardInfo['id'],$cardInfo['store_id'],$cardInfo['created_at'],$cardInfo['updated_at']);
169
+            $huifuRes = $huifuService->userIndv($cardInfo);
170
+            // 错误提示
171
+            if (is_string($huifuRes)) {
172
+                return $this->error($huifuRes);
173
+            }
174
+
175
+            // 记录汇付id
176
+            $storeModel = HappinessStore::findOne($post['id']);
177
+            $storeModel->huifu_no = $huifuRes['huifu_id'];
178
+            $storeModel->save();
179
+
180
+            // 调用用户入驻业务接口
181
+            $userBusiRes = $huifuService->userBusiOpen($cardInfo,$huifuRes['huifu_id']);
182
+            // 错误提示
183
+            if (is_string($userBusiRes)) {
184
+                return $this->error($userBusiRes);
185
+            }
186
+        }
161 187
         return $this->success('操作成功');
162 188
     }
163 189
 }

+ 34 - 0
addons/Happiness/common/models/HappinessStore.php

@@ -270,6 +270,40 @@ class HappinessStore extends BaseActiveRecord
270 270
             return false;
271 271
         }
272 272
 
273
+        // 小店入驻新增参数(斗拱银行卡信息)
274
+        $cardInfoField = ['card_type','card_name','card_no','prov_id','area_id','branch_code','cert_type','cert_no','cert_validity_type','cert_begin_date','cert_end_date','mp','is_settle_default'];
275
+        $cardInfoInsert = [];
276
+        foreach ($cardInfoField as $field) {
277
+            $cardInfoInsert[$field] = $params[$field] ? $params[$field] : 0;
278
+        }
279
+        $cardInfoInsert['store_id'] = $res->id;
280
+
281
+        // $cardInfoInsert = [
282
+        //     'card_type' => 2,
283
+        //     'card_name' => '史晨',
284
+        //     'card_no' => 6212260200076546403,
285
+        //     'prov_id' => 1,
286
+        //     'area_id' => 1,
287
+        //     'branch_code' => '',
288
+        //     'cert_type' => '00',
289
+        //     'cert_no' => '371481199602054512',
290
+        //     'cert_validity_type' => '',
291
+        //     'cert_begin_date' => 20250922,
292
+        //     'cert_end_date' => 20350922,
293
+        //     'mp' => 18600648353,
294
+        //     'is_settle_default' => 'Y',
295
+        //     'store_id' => 23
296
+        // ];
297
+
298
+        $storeCardModel = new HappinessStoreCardInfo();
299
+        $storeCardModel->attributes = $cardInfoInsert;
300
+        $cardInfoRes = $storeCardModel->save();
301
+        if (false === $cardInfoRes){
302
+            $transaction->rollBack();
303
+            self::$static_error = $storeCardModel->getErrorMessage();
304
+            return false;
305
+        }
306
+
273 307
         $transaction->commit();
274 308
         return $res;
275 309
     }

Datei-Diff unterdrückt, da er zu groß ist
+ 80 - 0
addons/Happiness/common/models/HappinessStoreCardInfo.php


+ 12 - 0
addons/HuifuPay/common/BsPaySdk/request/V2UserBasicdataIndvRequest.php

@@ -42,6 +42,10 @@ class V2UserBasicdataIndvRequest extends BaseRequest
42 42
      */
43 43
     private $certBeginDate;
44 44
     /**
45
+     * 个人证件有效期结束日期
46
+     */
47
+    private $certEndDate;
48
+    /**
45 49
      * 手机号
46 50
      */
47 51
     private $mobileNo;
@@ -107,6 +111,14 @@ class V2UserBasicdataIndvRequest extends BaseRequest
107 111
         $this->certBeginDate = $certBeginDate;
108 112
     }
109 113
 
114
+    public function getCertEndDate() {
115
+        return $this->certBeginDate;
116
+    }
117
+
118
+    public function setCertEndDate($certBeginDate) {
119
+        $this->certEndDate = $certBeginDate;
120
+    }
121
+
110 122
     public function getMobileNo() {
111 123
         return $this->mobileNo;
112 124
     }

+ 11 - 0
addons/HuifuPay/common/BsPaySdk/request/V2UserBusiOpenRequest.php

@@ -30,6 +30,8 @@ class V2UserBusiOpenRequest extends BaseRequest
30 30
      */
31 31
     private $upperHuifuId;
32 32
 
33
+    private $cardInfo;
34
+
33 35
     public function getFunctionCode() {
34 36
         return FunctionCodeEnum::$V2_USER_BUSI_OPEN;
35 37
     }
@@ -67,4 +69,13 @@ class V2UserBusiOpenRequest extends BaseRequest
67 69
         $this->upperHuifuId = $upperHuifuId;
68 70
     }
69 71
 
72
+    public function getCardInfo()
73
+    {
74
+        return $this->cardInfo;
75
+    }
76
+
77
+    public function setCardInfo($cardInfo)
78
+    {
79
+        $this->cardInfo = $cardInfo;
80
+    }
70 81
 }

+ 82 - 0
addons/HuifuPay/common/service/HuifuService.php

@@ -28,6 +28,8 @@ use BsPaySdk\request\V2QuickbuckleConfirmRequest;
28 28
 use BsPaySdk\request\V2TradeOnlinepaymentQuickpayConfirmRequest;
29 29
 use BsPaySdk\request\V2TradeOnlinepaymentRefundRequest;
30 30
 use BsPaySdk\request\V2MerchantBusiModifyRequest;
31
+use BsPaySdk\request\V2UserBasicdataIndvRequest;
32
+use BsPaySdk\request\V2UserBusiOpenRequest;
31 33
 use common\enums\AddonsEnum;
32 34
 
33 35
 # 以下配置为开发联调时覆盖SDK的配置项,需在引入SDK的init.php之前配置以覆盖SDK初始配置
@@ -59,6 +61,8 @@ require_once dirname(__FILE__). "/../BsPaySdk/request/V2TradeOnlinepaymentRefund
59 61
 require_once dirname(__FILE__). "/../BsPaySdk/request/V2TradePaymentDelaytransConfirmRequest.php";
60 62
 require_once dirname(__FILE__). "/../BsPaySdk/request/V2MerchantBusiModifyRequest.php";
61 63
 require_once dirname(__FILE__). "/../BsPaySdk/request/V2MerchantBusiOpenRequest.php";
64
+require_once dirname(__FILE__). "/../BsPaySdk/request/V2UserBusiOpenRequest.php";
65
+require_once dirname(__FILE__). "/../BsPaySdk/request/V2UserBasicdataIndvRequest.php";
62 66
 
63 67
 use common\traits\ErrorTrait;
64 68
 use ReflectionClass;
@@ -862,6 +866,84 @@ class HuifuService
862 866
     }
863 867
 
864 868
     /**
869
+     * @param $data
870
+     * @return false|mixed
871
+     * @throws Exception
872
+     * @author 史晨
873
+     * @date 2025/9/25 11:22
874
+     * 个人用户开户
875
+     */
876
+    public function userIndv($data)
877
+    {
878
+        $request = new V2UserBasicdataIndvRequest();
879
+        // 请求流水号
880
+        $request->setReqSeqId(date("YmdHis") . mt_rand());
881
+        // 请求日期
882
+        $request->setReqDate(date("Ymd"));
883
+        // 个人姓名
884
+        $request->setName($data['card_name']);
885
+        // 个人证件类型
886
+        $request->setCertType('00');
887
+        // 个人证件号码
888
+        $request->setCertNo($data['cert_no']);
889
+        // 个人证件有效期类型
890
+        $request->setCertValidityType($data['cert_validity_type']);
891
+        // 个人证件有效期开始日期
892
+        $request->setCertBeginDate($data['cert_begin_date']);
893
+        // 个人证件有效期截止日期
894
+        $request->setCertEndDate($data['cert_end_date']);
895
+        // 手机号
896
+        $request->setMobileNo($data['mp']);
897
+        // 发送请求
898
+        $result = $this->postRequest($request);
899
+        if (!$result || $result->isError()) { //失败处理
900
+            throw new Exception($result->getErrorInfo());
901
+        } else { //成功处理
902
+            $resData = $result->getRspDatas();
903
+            $resData = $resData['data'];
904
+            if ($resData['resp_code'] == '00000000' || $resData['resp_code'] == '00000100') {
905
+                return $resData;
906
+            }
907
+            return $resData['resp_desc'];
908
+        }
909
+    }
910
+
911
+    /**
912
+     * @param $data
913
+     * @param $huifuId
914
+     * @return mixed
915
+     * @throws Exception
916
+     * @author 史晨
917
+     * @date 2025/9/25 15:18
918
+     * 用户业务入驻
919
+     */
920
+    public function userBusiOpen($data,$huifuId)
921
+    {
922
+        $request = new V2UserBusiOpenRequest();
923
+        // 汇付ID
924
+        $request->setHuifuId($huifuId);
925
+        // 请求流水号
926
+        $request->setReqSeqId(date("YmdHis") . mt_rand());
927
+        // 请求日期
928
+        $request->setReqDate(date("Ymd"));
929
+        // 渠道商/商户汇付Id
930
+        $request->setUpperHuifuId($this->config['huifupay_huifu_id']);
931
+        // 结算卡信息
932
+        $request->setCardInfo(json_encode($data));
933
+        $result = $this->postRequest($request);
934
+        if (!$result || $result->isError()) { //失败处理
935
+            throw new Exception($result->getErrorInfo());
936
+        } else { //成功处理
937
+            $resData = $result->getRspDatas();
938
+            $resData = $resData['data'];
939
+            if ($resData['resp_code'] == '00000000' || $resData['resp_code'] == '00000100') {
940
+                return $resData;
941
+            }
942
+            return $resData['resp_desc'];
943
+        }
944
+    }
945
+
946
+    /**
865 947
      * 发起post请求,并记录请求日志
866 948
      *
867 949
      * @param BaseRequest $request