feat: 新增商户上报

This commit is contained in:
wangsongsole 2024-02-06 13:52:12 +08:00
parent c58c1c4f79
commit a783378148
3 changed files with 203 additions and 140 deletions

View File

@ -970,8 +970,13 @@ export const resendCardCode = (data) => {
} }
/* 设置开发信息 */ /* 设置开发信息 */
export const setResellMerchant = (data) => { export const setResellMerchant = (id, data) => {
return req("post", baseurl + "/reseller/resellMerchant/set", data) return req("put", baseurl + `/reseller/merchant/${id}`, data)
}
/* 获取开发信息密钥 */
export const generateRsaKey = () => {
return req("get", baseurl + "/reseller/merchant/generateRsaKey")
} }
/* 设置分销商通知地址 */ /* 设置分销商通知地址 */

View File

@ -35,13 +35,13 @@ const Column = [
type: "normal", type: "normal",
width: "20%" width: "20%"
}, },
// { {
// title: "商户编号", title: "商户编号",
// name: "merchant", name: "merchant",
// prop: "merchant[merchant_id]", prop: "merchant[merchant_id]",
// type: "normal", type: "normal",
// width: "20%" width: "20%"
// }, },
{ {
title: "分销商名称", title: "分销商名称",
prop: "name", prop: "name",
@ -240,7 +240,7 @@ export default class acclist extends React.Component {
}, },
{ {
path: "distributor-merchant", path: "distributor-merchant",
name: "开放信息" name: "更新商户"
} }
] ]
} }
@ -311,11 +311,18 @@ export default class acclist extends React.Component {
} }
onMenuItemClick(e, key, row) { onMenuItemClick(e, key, row) {
if (key == 1) { switch (Number(key)) {
//重置密码 case 1:
this.setState({ pwdVisible: true, resellid: row.id }) this.setState({ pwdVisible: true, resellid: row.id })
} else if (key == 2) { break
case 2:
this.setState({ logVisible: true }) this.setState({ logVisible: true })
break
case 3:
this.openInformation(row)
break
default:
break
} }
} }
@ -486,15 +493,6 @@ export default class acclist extends React.Component {
> >
编辑 编辑
</a> </a>
{/* <a
className="grid-link"
onClick={(e) => {
this.openInformation(rowData)
}}
>
开放信息
</a> */}
<a <a
className="grid-link" className="grid-link"
onClick={(e) => { onClick={(e) => {
@ -517,6 +515,7 @@ export default class acclist extends React.Component {
}} }}
> >
<MenuItem key="1">重置密码</MenuItem> <MenuItem key="1">重置密码</MenuItem>
<MenuItem key="3">更新商户</MenuItem>
{/* <MenuItem key="2"> 日志</MenuItem> */} {/* <MenuItem key="2"> 日志</MenuItem> */}
</Menu> </Menu>
</DropdownContent> </DropdownContent>

View File

@ -1,33 +1,39 @@
import FormItem from "@/components/form-item/main" import FormItem from "@/components/form-item/main"
import Form from "@/components/form/main" import Form from "@/components/form/main"
import Ipt from "@/components/input/main" import Ipt from "@/components/input/main"
import { omit } from "lodash-es" import { cloneDeep, omit } from "lodash-es"
import { useEffect, useRef, useState } from "react" import { useEffect, useRef, useState } from "react"
import { Button, Card, Checkbox, CopyButton, Input, Notify, Radio, RadioGroup } from "zent" import { Button, Card, Checkbox, Input, Notify, Radio, RadioGroup } from "zent"
import { setResellMerchant } from "@/assets/api" import { setResellMerchant, generateRsaKey } from "@/assets/api"
import "./index" import "./index"
export default function Merchant() { export default function Merchant() {
const [state, setState] = useState({ const [state, setState] = useState({
reseller_id: "", loading: false,
merchant_id: "", reseller_id: 0 /* 分销商id */,
marketing_notify_url: [""], merchant_id: "", // *
custom_rsa_public_key: "", pos_id: "", //id *
encrypt_type: 2, app_id: "", //appid *
subscribe_event: [], store_id: "", //api mode 1 2* id
loading: false public_key: "", // *
private_key: "", // *
merchant_public_key: "", // *
secret_key: "", //api mode 1 2*
notify_url: "", // *
subscribe_event: [], //
status: 1, // 1 2 *
api_mode: 2 // 1-RSA+ 2- *
}) })
const fromRef = useRef() const fromRef = useRef()
const rules = { const rules = {
merchant_id: [ merchant_id: [{ type: "required", message: "请输入商户编号" }],
{ type: "required", message: "请输入商户编号" }, public_key: [{ type: "required", message: "请输入公钥" }],
{ private_key: [{ type: "required", message: "请输入私钥" }],
type: "regExp", app_id: [{ type: "required", message: "请输入应用ID" }],
message: "请输入正确的商户号", pos_id: [{ type: "required", message: "请输入平台ID" }],
reg: /^[A-Za-z0-9]+$/ store_id: [{ type: "required", message: "请输入店铺ID" }],
} secret_key: [{ type: "required", message: "请输入偏移量" }],
], merchant_public_key: [{ type: "required", message: "请输入商户公钥" }],
custom_rsa_public_key: [{ type: "required", message: "请输入商户侧RSA公钥" }], notify_url: [
marketing_notify_url: [
{ type: "required", message: "请输入商户回调通知网关地址" }, { type: "required", message: "请输入商户回调通知网关地址" },
{ {
type: "regExp", type: "regExp",
@ -39,35 +45,43 @@ export default function Merchant() {
useEffect(() => { useEffect(() => {
const { merchant, id } = JSON.parse(sessionStorage.getItem("merchant")) const { merchant, id } = JSON.parse(sessionStorage.getItem("merchant"))
setState({ ...state, reseller_id: id, ...merchant }) const cloneState = cloneDeep(state)
for (let key in cloneState) {
cloneState[key] = merchant[key]
}
setState({ ...state, reseller_id: id, ...cloneState })
}, []) }, [])
/* 获取密钥 */
function getKey() {
generateRsaKey().then(({ data }) => {
setState({ ...state, ...data })
})
}
/* 提交 */ /* 提交 */
function submit() { function submit() {
const valid = fromRef.current.validator() const valid = fromRef.current.validator()
if (valid) { if (valid) {
setState({ loading: true }) setState({ loading: true })
const data = omit(state, [ const data = omit(state, ["reseller_id", "loading"])
"create_time", setResellMerchant(state.reseller_id, data)
"id", .then(({ code, message }) => {
"status",
"update_time",
"rsa_private_key",
"rsa_public_key",
"loading"
])
setResellMerchant(data).then(({ code, message }) => {
if (code === 200) { if (code === 200) {
Notify.success(message) Notify.success("保存成功")
let clr = null let clr = setTimeout(() => {
clr = setTimeout(() => {
window.history.go(-1) window.history.go(-1)
setState({ loading: false })
clearTimeout(clr) clearTimeout(clr)
}, 1000) }, 1000)
} else { } else {
setState({ loading: false })
Notify.success(message) Notify.success(message)
} }
})
.catch(({ message }) => {
setState({ loading: false }) setState({ loading: false })
Notify.success(message)
}) })
} }
} }
@ -77,7 +91,7 @@ export default function Merchant() {
<Card style={{ width: "100%" }} title={"更新信息"}> <Card style={{ width: "100%" }} title={"更新信息"}>
<div className="adddistributor merchantForm"> <div className="adddistributor merchantForm">
<Form model={state} rules={rules} ref={fromRef}> <Form model={state} rules={rules} ref={fromRef}>
<FormItem labelname="商户编号" required=""> <FormItem labelname="商户编号" prop="merchant_id">
<Ipt <Ipt
onChange={(value) => setState({ ...state, merchant_id: value })} onChange={(value) => setState({ ...state, merchant_id: value })}
onClearItem={() => setState({ ...state, merchant_id: "" })} onClearItem={() => setState({ ...state, merchant_id: "" })}
@ -91,12 +105,112 @@ export default function Merchant() {
alignment={"left"} alignment={"left"}
/> />
</FormItem> </FormItem>
<FormItem labelname="商户回调通知网关地址" prop="marketing_notify_url"> <FormItem labelname="平台ID" prop="pos_id">
<Ipt <Ipt
onChange={(value) => setState({ ...state, marketing_notify_url: value })} onChange={(value) => setState({ ...state, pos_id: value })}
onClearItem={() => setState({ ...state, marketing_notify_url: "" })} onClearItem={() => setState({ ...state, pos_id: "" })}
countShow={false} countShow={false}
value={state.marketing_notify_url} value={state.pos_id}
placeholder={"请输入平台ID"}
labelWidth={"0px"}
maxLength={20}
height={"36px"}
width={"520px"}
alignment={"left"}
/>
</FormItem>
<FormItem labelname="APP-ID" prop="app_id">
<Ipt
onChange={(value) => setState({ ...state, app_id: value })}
onClearItem={() => setState({ ...state, app_id: "" })}
countShow={false}
value={state.app_id}
placeholder={"请输入APPID"}
labelWidth={"0px"}
maxLength={20}
height={"36px"}
width={"520px"}
alignment={"left"}
/>
</FormItem>
{state.api_mode === 2 ? (
<FormItem labelname="店铺ID" prop="store_id">
<Ipt
onChange={(value) => setState({ ...state, store_id: value })}
onClearItem={() => setState({ ...state, store_id: "" })}
countShow={false}
value={state.store_id}
placeholder={"请输入店铺ID"}
labelWidth={"0px"}
maxLength={20}
height={"36px"}
width={"520px"}
alignment={"left"}
/>
</FormItem>
) : null}
{state.api_mode === 2 ? (
<FormItem labelname="偏移量" prop="secret_key">
<Ipt
onChange={(value) => setState({ ...state, secret_key: value })}
onClearItem={() => setState({ ...state, secret_key: "" })}
countShow={false}
value={state.secret_key}
placeholder={"请输入偏移量"}
labelWidth={"0px"}
maxLength={20}
height={"36px"}
width={"520px"}
alignment={"left"}
/>
</FormItem>
) : null}
<FormItem labelname="私钥" prop="private_key">
<Input
type="textarea"
onChange={({ target }) => setState({ ...state, private_key: target.value })}
value={state.private_key}
placeholder={"请输入私钥"}
labelWidth={"0px"}
width={"520px"}
alignment={"left"}
/>
</FormItem>
<FormItem labelname="公钥" prop="public_key">
<Input
type="textarea"
onChange={({ target }) => setState({ ...state, public_key: target.value })}
value={state.public_key}
placeholder={"请输入公钥"}
labelWidth={"0px"}
width={"520px"}
alignment={"left"}
/>
</FormItem>
<FormItem labelname="" required="">
<Button type="primary" onClick={getKey}>
重新获取密钥
</Button>
</FormItem>
<FormItem labelname="商户公钥" prop="merchant_public_key">
<Input
type="textarea"
onChange={({ target }) => setState({ ...state, merchant_public_key: target.value })}
value={state.merchant_public_key}
placeholder={"请输入商户公钥"}
labelWidth={"0px"}
width={"520px"}
alignment={"left"}
/>
</FormItem>
<FormItem labelname="商户回调通知网关地址" prop="notify_url">
<Ipt
onChange={(value) => setState({ ...state, notify_url: value })}
onClearItem={() => setState({ ...state, notify_url: "" })}
countShow={false}
value={state.notify_url}
placeholder={"请输入网关地址"} placeholder={"请输入网关地址"}
labelWidth={"0px"} labelWidth={"0px"}
height={"36px"} height={"36px"}
@ -104,77 +218,22 @@ export default function Merchant() {
alignment={"left"} alignment={"left"}
/> />
</FormItem> </FormItem>
{state.rsa_public_key ? ( <FormItem labelname="商户状态">
<FormItem labelname="营销系统RSA公钥" prop="rsa_public_key">
<div className="phonet">
<Ipt
countShow={false}
value={state.rsa_public_key}
disabled
labelWidth={"0px"}
height={"36px"}
width={"520px"}
alignment={"left"}
/>
<CopyButton
text={state.rsa_public_key}
onCopySuccess={() => {
Notify.clear()
Notify.success("复制成功!")
}}
>
<Button type="info">复制RSA公钥</Button>
</CopyButton>
</div>
</FormItem>
) : null}
{state.rsa_private_key ? (
<FormItem labelname="营销系统RSA私钥" prop="rsa_private_key">
<div className="phonet">
<Ipt
countShow={false}
value={state.rsa_private_key}
disabled
labelWidth={"0px"}
height={"36px"}
width={"520px"}
alignment={"left"}
/>
{state.rsa_private_key ? (
<CopyButton
text={state.rsa_private_key}
onCopySuccess={() => {
Notify.clear()
Notify.success("复制成功!")
}}
>
<Button type="info">复制RSA私钥</Button>
</CopyButton>
) : null}
</div>
</FormItem>
) : null}
<FormItem labelname="商户侧RSA公钥" prop="custom_rsa_public_key">
<Input
type="textarea"
autoSize
onChange={({ target }) =>
setState({ ...state, custom_rsa_public_key: target.value })
}
value={state.custom_rsa_public_key}
placeholder={"请输入商户侧RSA公钥"}
labelWidth={"0px"}
width={"520px"}
alignment={"left"}
/>
</FormItem>
<FormItem labelname="加密算法" prop="encrypt_type">
<RadioGroup <RadioGroup
onChange={({ target }) => setState({ ...state, encrypt_type: target.value })} onChange={({ target }) => setState({ ...state, status: target.value })}
value={state.encrypt_type} value={state.status}
> >
<Radio value={2}>RSA</Radio> <Radio value={1}>正常</Radio>
<Radio value={1}>定制算法</Radio> <Radio value={2}>禁用</Radio>
</RadioGroup>
</FormItem>
<FormItem labelname="对接类型" prop="api_mode">
<RadioGroup
onChange={({ target }) => setState({ ...state, api_mode: target.value })}
value={state.api_mode}
>
<Radio value={2}>兴业银行模式</Radio>
<Radio value={1}>RSA模式</Radio>
</RadioGroup> </RadioGroup>
</FormItem> </FormItem>
<FormItem labelname="订阅事件" prop="subscribe_event" required=""> <FormItem labelname="订阅事件" prop="subscribe_event" required="">