# 配置拉取
机具注册到主体,由主体管理员绑定对应商户后,通过此接口查看机具配置
# 请求方法
POST(application/json)
# 请求地址
https://payapi.weixiao.qq.com/configv2
注:若私有化部署,接口地址域名变更私有化域名
# 参数说明
无
# 响应说明
{
"code": 0,
"message": "",
"data": {
"risk_model": [
{
"order_amount": "50000",
"amount": "50000",
"order_num": "20",
"level": "0"
},
{
"order_amount": "50000",
"amount": "50000",
"order_num": "5",
"level": "1"
},
{
"order_amount": "5000",
"amount": "10000",
"order_num": "1",
"level": "2"
}
],
"identity": [],
"merchant": {
"name": "测试商户",
"id": "1013957946_1941239759",
"free_rule": "(EnName NOT LIKE 'wb[_]%' AND EnName NOT LIKE 'wf[_]%' AND EnName NOT LIKE '%[0-9]%') OR (EnName LIKE 'TXLS%' )",
"free_durings": "[{\"begin\":\"07:00:00\",\"end\":\"10:10:00\"}]"
},
"pos": {
"can_pay": "0",
"offline_can_pay": "1",
"max_offline_time": "172800",
"max_order_amount": "50000",
"max_offline_amount": "100000000",
"refund_latest_time": "1607616000",
"preferred_offline_num": "4000",
"max_time_out_order_num": "50",
"quota_order_amount": "0",
"wallet_offline_pay_switch": 1
},
"code_rule": {
"secret": "RQyjkKSCTCPOBJMI",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSq/Tsn95Z5Bxxxxxxxxxxmj7pRo\npu5n1W23Qi5W+rDQswIDAQAB\n-----END PUBLIC KEY-----\n",
"prev_public": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGn6xxxxxxxxxIKxrLYmhTwIDAQAB\n-----END PUBLIC KEY-----\n",
"next_public": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGxxxxxxxxwO\njU/GAVX8pKF+Ac/zGwIDAQAB\n-----END PUBLIC KEY-----\n",
"prev_rule": "{\"version\":\"v003\",\"f\":{\"s\":\"10\",\"l\":\"4\",\"v\":{\"identity_type\":{\"s\":\"0\",\"l\":\"8\"},\"entrusts\":{\"s\":\"8\",\"l\":\"1\"},\"risk\":{\"s\":\"9\",\"l\":\"4\"},\"channel\":{\"s\":\"13\",\"l\":\"4\"},\"ars\":{\"s\":\"17\",\"l\":\"1\"}}},\"u\":{\"s\":\"14\",\"d\":\"|\",\"v\":{\"card_number\":\"0\",\"remark\":\"1\"}}}",
"rule": "{\"version\":\"v003\",\"f\":{\"s\":\"10\",\"l\":\"4\",\"v\":{\"identity_type\":{\"s\":\"0\",\"l\":\"8\"},\"entrusts\":{\"s\":\"8\",\"l\":\"1\"},\"risk\":{\"s\":\"9\",\"l\":\"4\"},\"channel\":{\"s\":\"13\",\"l\":\"4\"},\"ars\":{\"s\":\"17\",\"l\":\"1\"}}},\"u\":{\"s\":\"14\",\"d\":\"|\",\"v\":{\"card_number\":\"0\",\"remark\":\"1\"}}}",
"next_rule": "{\"version\":\"v003\",\"f\":{\"s\":\"10\",\"l\":\"4\",\"v\":{\"identity_type\":{\"s\":\"0\",\"l\":\"8\"},\"entrusts\":{\"s\":\"8\",\"l\":\"1\"},\"risk\":{\"s\":\"9\",\"l\":\"4\"},\"channel\":{\"s\":\"13\",\"l\":\"4\"},\"ars\":{\"s\":\"17\",\"l\":\"1\"}}},\"u\":{\"s\":\"14\",\"d\":\"|\",\"v\":{\"card_number\":\"0\",\"remark\":\"1\"}}}"
},
"timestamp": "1607686466",
"md5": "92009a514b8e69b56b0222a8d6df5e82"
}
}
# 响应参数
参数名 | 类型 | 必填 | 描述 |
---|---|---|---|
data | object | Y | 业务数据 |
code | int | Y | 业务状态 0 为成功 10001 机具未注册 10002 未绑定商户 |
message | string | Y | 业务提示 |
# data
参数名 | 类型 | 必填 | 描述 |
---|---|---|---|
risk_model | list | Y | 风控模型(离线策略) |
identity | list | Y | 身份类型支付策略(离线策略) |
pos | object | Y | 机具配置策略 |
merchant | object | Y | 商户信息 |
code_rule | object | Y | 离线解码规则 |
timestamp | int | Y | 配置更新时间 |
md5 | string | Y | 配置的md5值(在代扣下单接口中需要提交这个值) |
card | object | Y | 实体卡相关配置 |
update | int | Y | 是否有可用更新(0:没有;1:有更新) |
# risk_model
风控模型,系统会根据特定规则,给当前机具下发0-9档规则,等级对应数据中的level。
风控规则跟着风险等级,不同的等级,对应的离线支付单笔限额、离线支付总额、离线支付总笔数都是不一样的。
若当前机具网络状态是离线,机具需要通过码里面的risk
(若无则为0)来判定当前的风控等级,若当前消费者的离线未上传订单笔数和汇总金额超出了对应的等级的订单笔数和汇总金额限制,则提示交易失败,订单金额限制类似。
参数名 | 类型 | 必填 | 描述 |
---|---|---|---|
amount | int | Y | 汇总金额限制 |
order_amount | int | Y | 订单金额限制 |
order_num | int | Y | 订单笔数限制 |
level | int | Y | 风控等级 |
offline | int | Y | 是否支持离线消费。0:不支持,1:支持 |
上述amount、order_amount、order_num几个参数都是以单一消费者为单位进行限制,一个消费者的消费参数达到限制后不能继续消费。同时当前机具未上传的离线消费的总金额不能超过pos数据的max_offline_amount字段指定的金额。
配置下发的risk_model数据,每条规则以字符串拼接的方式给到,机具需要自行拆分对应的字段。
机具离线情况下,应该首先根据配置参数pos.offline_can_pay
判断是否可离线消费,再根据当前消费用户的风控级别取risk_model配置里面的offline字段的值判断当前用户是否可以进行离线消费。
risk_model单条数据格式:level,offline,order_number,amount,order_amount
risk_model内容示例:
{ "risk_model":[ "0,1,20,50000,20000", "1,1,5,50000,20000", "2,0,1,10000,5000" ] }
# merchant
参数名 | 类型 | 必填 | 描述 |
---|---|---|---|
id | string | Y | 商户id |
name | string | Y | 商户名称 |
# identity
[
{
"type": "1",
"time_limit": [
"20190402,06301930,21302300",
"20190403,00002359",
"20190404,00002359",
"20190405,00002359",
"20190406,04002359",
"20190407,04002359",
"20190408,00002359"
]
},
{
"type": "7",
"time_limit": [
"20190402,00002359",
"20190403,00002359",
"20190404,00002359",
"20190405,00002359",
"20190406,04002359",
"20190407,04002359",
"20190408,00002359"
]
},
{
"type": "13",
"time_limit": [
"20190402,00002359",
"20190403,00002359",
"20190404,00002359",
"20190405,00002359",
"20190406,04002359",
"20190407,04002359",
"20190408,00002359"
]
}
]
消费时间段限制,后台会下发未来7天的时间段限制,格式为20190402,06301930,21302300
,表示当前身份类型在20190402当天的06:30到19:30和21:30到23:00这两个时间段内不能消费。机具需要根据解码获取到的用户身份类型,判断当前用户是否在不允许消费的时间段内,如果在,则拒绝消费。同时要注意,消费时间段可以有多个。
参数名 | 类型 | 必填 | 描述 |
---|---|---|---|
type | int | Y | 身份类型 |
time_limit | list | Y | 消费时间段限制(离线策略) |
# pos
can_pay 当前机具是否允许发起支付及允许消费的方式。 可用二进制进位的方式进行理解:
0: 不允许消费 // 0000 1: 只允许刷码消费 // 0001 2: 只允许刷卡消费 // 0010 3: 允许刷码消费和刷卡消费 // 0011
一般情况下,can_pay的值为0、1、3, 当can_pay的值为2或者3的时候,需要解析配置参数card里面的内容。
offline_can_pay: 是否允许离线支付,当这个参数为0时,机具不允许发起离线订单逻辑
max_offline_amount: 机具最大离线订单总金额,当前机具所有未完成的订单总金额不能大于这个值
max_order_amount: 机具单笔订单最大金额,在线离线都适用。
refund_latest_time: 订单最晚可退款时间,订单下单时间大于当前参数,则可以发起退款。
preferred_offline_num: 优先离线笔数,机具在设置允许离线情况下参数生效,如果未上传订单数小于参数,则优先离线消费。
quota_order_amount: 定额消费金额,若该值不为0,代表机具已开始定额消费,不允许随机消费,适用场景(校园小巴刷码等),若不支持定额消费, 忽略该字段即可
can_mix_pay:聚合支付开关,目前用于控制微信原生码、支付宝原生码支付
wallet_offline_pay_switch: 余额、补贴离线支付开关
当前机具支付配置信息
参数名 | 类型 | 必填 | 描述 |
---|---|---|---|
can_pay | int | Y | 是否允许支付 0:不允许,1:只允许刷码;2:只允许刷卡;3:允许刷码和刷卡 |
offline_can_pay | int | Y | 是否允许离线支付 0 不允许;1 允许 |
max_offline_amount | int | Y | 机具最大离线订单总额 |
max_order_amount | int | Y | 单笔订单最大金额 |
refund_latest_time | int | Y | 订单最晚可退款时间 |
preferred_offline_num | int | Y | 优先离线订单笔数 |
quota_order_amount | int | Y | 机具定额消费额(单位:分)0 表示不开启 |
can_mix_pay | int | Y | 是否允许聚合支付 0-不能消费;1-支持全部;2-只支持支付宝;4-只支持微信 |
pay_query_timeout | int | Y | 免密支付查询的超时时间 |
confirm_pay_query_timeout | int | Y | 非免密支付查询的超时时间 |
wallet_offline_pay_switch | int | Y | 是否支持余额、补贴离线支付,0-不支持;1-支持 |
# code_rule
参数名 | 类型 | 必填 | 描述 |
---|---|---|---|
secret | string | Y | totp密钥 |
public_key | string | Y | rsa当前公钥 |
prev_public | string | Y | rsa上个公钥 |
next_public | string | Y | rsa下个公钥 |
prev_rule | string | Y | 上个解码规则 |
rule | string | Y | 当前解码规则 |
next_rule | string | Y | 下个解码规则 |
# card (pos.can_pay的值为2或者3时才取值)
{
"card": {
"type": 1,
"rule": null,
"max_daily_amount": 1000000,
"category": 1,
"partitions": "6,7,8,9",
"rule_tass": {
"secret": "efa6cab5b836d347920910432f1b7b0dc7503dc8f7ad0c31307a2b27418d7379",
"secret_fm": "9cabc9bacd46a7339f0961302d1e0b0d0066f51dd9372c2c4b87b19054fadd19",
"m1_secret_fm": "9cabbec3b332a534e30e67395f1d020e65135d1e7f77c65d39afd14127f016ab"
}
}
}
参数名 | 类型 | 必填 | 描述 |
---|---|---|---|
type | int | Y | 卡类型,0为旧卡,直接读取物理卡号;1为新卡,需要拿rule里的秘钥去解卡判断有效性。 |
rule | object | Y | 解卡规则 |
max_daily_amount | int | Y | 每日最大消费金额 |
category | int | Y | 学校使用的卡类型 1: M1 卡 ; 其他默认为 CPU 卡 |
partitions | string | Y | M1 卡使用的扇区 |
rule_tass | object | Y | CPU/M1卡初始密钥 |
# rule_tass
参数 | 说明 |
---|---|
m1SecretFm | M1 卡初始秘钥 |
secretFm | CPU 卡初始秘钥 |
secret | 国密CPU 卡初始秘钥(一般不使用) |
# rule
参数 | 说明 |
---|---|
public_key | 公钥 |
secret | 私钥 |