收钱吧软POS接口

1 前言

1.1 目标

本文档定义了收银系统客户端应用业务处理与插件接入方式和参数。


2 准备工作

2.1 获取对接资料

联系收钱吧商务获取对接资料(插件和文档),以及测试参数。

2.2 字典解释

术语 说明
商户号 商户在收钱吧开户时收钱吧分配给商户的商户号,一般来说同一个结算主体下的所有门店共用一个商户号
商户门店号 商户系统里的门店编号,一般为商户对外提供的门店编号,商户开户时提供给收钱吧

3 插件结构

名称 修改日期 类型 大小
cashpos.dll 2018/10/6 9:31 应用程序扩展 7,192 KB
cashpos_config.ini 2018/10/11 9:56 配置设置 1KB
CashPosAssistant.exe 2018/9/25 9:22 应用程序 6,580 KB
CashposConsole.exe 2018/9/25 9:22 应用程序 36 KB
CashposUpdate.exe 2018/9/25 9:28 应用程序 96 KB
CashposWrapper.dll 2018/10/12 8:51 应用程序扩展 36 KB

关键文件说明:
CashposConsole.exe:插件exe程序
cashpos.dll:主应用程序
cashpos.lib: 应用程序库文件
libeay32.dll: 系统文件
cashpos_config.ini:商户配置文件
serviceconfig.ini:插件配置文件
EQB290001000001_pri.pem:商户私钥
000000000000000_pub.pem:平台公钥

商户只需要调用CashposWrapper.dll


4 接口协议

4.1 通讯方式

采用动态链接库dll函数调用方式传参和回参

4.2 通用数据

4.2.1 字符集

所有通讯数据统一采用UTF-8字符集。

4.3 接口设计

4.3.1 函数定义

// [IN] path: CashposConsole.exe绝对完整路径
// [IN] request: 调用参数
// [OUT] respond: 返回参数
//
// 返回值:
// -1: CashposConsole.exe路径错误
// 0: CashposConsole.exe启动失败或没有响应字符串
// 1: CashposConsole.exe调用成功,可以获取返回参数
int invokeCashpos(char* path, char* request, char* respond)

4.3.2 传入参数

将所有参数组装成JSON,具体字段参见各功能接口传入参数说明

4.3.3 返回参数

返回参数为JSON字符串,具体字段参见各功能接口返回参数说明。

如果请求错误只返回resultCoderesultDesc

4.3.4 Java调用示例

//继承接口
public interface Cashpos extends Library {
//函数声明
int invokeCashpos(String path, String request, byte[] respond);
}


//调用的类里面声明
private static Cashpos INSTANCE;

static {
    Cashpos INSTANCE = (Cashpos) Native
    .loadLibrary("C:\\..\\CashposWrapper", Cashpos.class);
}

//接收返回值,需要申请空间
byte[] pOutInfo = new byte[1024];
// CashposConsole.exe 完整路径
String path = "C:\\..\\CashposConsole.exe";
//请求参数
String request = "";
//函数调用
int returnCode = Cashpos.INSTANCE.invokeCashpos(path, request, pOutInfo);
//会自动去掉多余空格
String str = Native.toString (pOutInfo);

4.3.5 C#调用示例

[DllImport(".\\cashpos\\CashposWrapper.dll", EntryPoint = "invokeCashpos")]
public static extern int InvokeCashpos(String path, String inputdata, StringBuilder outputdata);

string CashPosRequst =
string CashPosPath =;
StringBuilder respond = new StringBuilder(1024);
int returnCode = InvokeCashpos(CashPosPath, CashPosRequst, respond);

4.3.6 Delphi 调用示例

待续

4.3.7 PowerBuilder 调用示例

// 声明
Public Function Long invokeCashpos(ref String path, ref String request, ref String respond) library 'CashposWrapper.dll'

//CashposConsole.exe 完整路径
string path

//调用参数
string request

//返回参数
string respond= space(1024);

//调用函数
long result = invokeCashpos(path, request, respond)

5 API列表

5.1 收款

用于收银机收款,实现常用条码支付和保险支付。注意金额单位为分,必须为整数。

5.1.1 重要提醒

如果商户调用收钱吧插件返回未支付成功时,商户可以给店员提供选择是否确认收款状态提示,如果店员选择是则调用查询接口,查询订单状态。查询成功进入下一步的业务处理。

5.1.2 传入参数

参数 参数名称 类型 必填 说明
operationCode 功能代码 String(2) 00 收款
merId 商户号 String(15) 商户号,开户后由收钱吧提供
merDepId 商户门店号 String(32) 商户门店号,由商户提供
merTermId 商户终端号 String(32) 固定值:0001
merOrdId 商户订单号 String(32) 商户订单号,商户保证其唯一性
merOrdDate 商户订单日期 String(8) yyyyMMdd,例如:20150422
ordAmt 订单金额 String(10) 单位为分,整数串,例如:100
ordDetail 订单明细 String(600)
(0)
JsonArray格式
订单包含的商品详细列表信息,列表明细参见ordDetail参数说明
addlinfo 商户定制信息 String(128) JSON格式
业务定制参数,特殊应用场景和用法参见附录
deviceId 设备号 String() 收银机的唯一标识码
默认值:商户门店号
limitPay 指定支付方式 String 可指定本单允许商户已开通的哪些支付方式付款,支付方式标记参见附录7.1章节,多个支付方式以竖线分割,例如微信和支付宝
WX|AL

ordDetail参数说明:

注意金额单位为分,必须为整数

参数 参数名称 类型 必填 备注
itemId 商品编号 String(32) 合作商户药品库的药品编号,默认值:“-”中划线
itemName 商品名称 String(256) 药品名称,例如:维力青,默认值:“-”中划线
itemType 商品类型 String(64) 药品剂型,例如:片剂,默认值:“-”中划线
desc 批准文号 String(64) 例如:国药准字H201000141,默认值:“-”中划线
std 规格 String(64) 例如:0.5mg*7s,默认值:“-”中划线
unit 单位 String(64) 例如:盒,默认值:“-”中划线
price 单价 String(10) 单位为分,正整数串,例如:100,默认值:0
quantity 数量 String(12) 最多4位小数,例如:1,默认值:1
drugCode 药品本位码 String(32) 医保支付时必填
ybItemId 医保目录编码 String(32) 医保支付时必填
ybItemName 医保目录名称 String(256) 医保支付时必填

收款调用 JSON 示例:

{
    "merOrdDate": "20191030",
    "addiInfo": "",
    "operationCode": "00",
    "ordAmt": "110",
    "merId": "EQB290002000024",
    "merDepId": "0001",
    "merTermId": "0001",
    "deviceId": "01",
    "merOrdId": "ZF20191030183634",
    "ordDetail": [
        {
            "unit": "-",
            "itemName": "阿咖酚散",
            "price": "200",
            "desc": "-",
            "std": "-",
            "itemType": "-",
            "quantity": "1",
            "itemId": "A6464",
            "ybItemName": "阿咖酚散",
            "ybItemId": "86900373000013",
            "drugCode": "86900373000013"
        },
        {
            "unit": "-",
            "itemName": "中华跌打丸",
            "price": "1",
            "desc": "-",
            "std": "-",
            "itemType": "-",
            "quantity": "1",
            "itemId": "A6896",
            "ybItemName": "中华跌打丸",
            "ybItemId": "86905156000822",
            "drugCode": "86905156000822"
        }
    ]
}  

5.1.3 返回参数

参数 参数名称 类型 必填 说明
resultCode 操作结果 String(4) 0000为接口调用成功,不代表业务处理成功,其它为调用失败
resultDesc 结果描述 String(256) 结果描述
merId 商户号 String(15)
merDepId 商户门店号 String(32)
merTermId 商户终端号 String(32)
merOrdDate 商户订单日期 String(8) yyyyMMdd,例如:20150422
merOrdId 商户订单号 String(32) 商户收款订单号(查询确认收款订单状态)或商户退款订单号(查询确认退款订单状态)
ordStat 订单状态 String(2) 若查询收款订单:
00 – 支付成功
01 – 待支付
02 – 支付处理中
04 – 已过期
99 – 支付失败
仅返回00时表示收款成功;
ordAmt 订单金额 String(10) 单位为分,正整数串,例如:100
ordDate 平台订单日期 String(8) yyyyMMdd,例如:20150422
ordSeq 平台订单流水号 String(32) 该交易在收钱吧系统中的交易流水号。
ordSeq当天唯一,即ordSeq和ordDate联合唯一
例如:WX000001
取前两位区分支付方式(大写)
参见支付方式
chnIdate 渠道日期 String(8) yyyyMMdd,例如:20150422
chnIseq 渠道流水号 String(64)
addlinfo 商户定制信息 String JSON格式
系统默认返回以下字段,如果商户请求时传了该字段也会一起返回,具体业务使用参见附录场景

5.1.3.1 addiInfo 简要说明

addiInfo 返回以下字段(请求时商户不能使用以下参数key):

商家优惠金额 = 订单金额 – 实收金额
如果商家优惠金额大于0,商家系统需要将优惠金额处理(一般是均摊到每个商品)并且改写实收金额

参数 参数名称 类型 必填 备注
settlementAmt 实收金额 String(10) 商家实收金额
paymentDiscount 优惠信息 String 包含商家优惠和平台优惠(JSON格式)

paymentDiscount 说明

参数 参数名称 类型 备注
hongbaoWosai 喔噻红包 String(10) 平台优惠
hongbaoWosaiMch 喔噻商户红包免充值 String(10) 商家优惠
discountWosai 喔噻立减 String(10) 平台优惠
discountWosaiMch 喔噻商户立减免充值 String(10) 商家优惠
discountChannel 支付通道折扣(立减优惠) String(10) 平台优惠
discountChannelMch 折扣(立减优惠)支付通道商户免充值 String(10) 商家优惠
discountChannelMchTopUp 折扣(立减优惠)支付通道商户充值 String(10) 平台优惠
hongbaoChannel 支付通道红包 String(10) 平台优惠
hongbaoChannelMch 支付通道商户红包免充值 String(10) 商家优惠
hongbaoChannelMchTopUp 支付通道商户红包充值 String(10) 平台优惠
收款返回JSON示例
{
    "chnlDate": "20191030",
    "chnlSeq": "7895238025376758",
    "merDepId": "0001",
    "merId": "EQB290002000024",
    "merOrdDate": "20191030",
    "merOrdId": "ZF20191030183634",
    "merTermId": "0001",
    "ordAmt": "110",
    "ordDate": "20191030",
    "ordSeq": "WX016900",
    "ordStat": "00",
    "resultCode": "0000",
    "resultDesc": "处理成功",
    "addiInfo": {
        "paymentDiscount": {
            "discountChannelMch": "100"
        },
        "settlementAmt": "10"
    }
}

5.2 退款

通过收钱吧完成的交易,商户可以通过退款接口将支付款全额退还顾客原付款账户。如果是银行卡付款具体到账时间请以付款银行为准。

5.2.1 重要提醒

收钱吧退款支持单笔收款交易分多次部分退款,多次退款需要使用不同的退款单号。申请退款总金额不能超过原收款订单金额。

商户一般采用全额退款。
一笔退款失败后重新提交,请不要更换退款单号,请使用原商户退款单号,相同退款单号的再次提交,收钱吧判定为同一笔退款需求,不会退出多笔款项;

5.2.2 传入参数

参数 参数名称 类型 必填 说明
operationCode 功能代码 String(2) 02 退款
merId 商户号 String(15) 商户号,开户后由收钱吧提供
merDepId 商户门店号 String(32) 商户门店号,由商户提供
merTermId 商户终端号 String(32) 固定值:0001
merOrdId 原商户收款订单号 String(32) 需要退的原收款订单单号
merOrdDate 原商户收款订单日期 String(8) yyyyMMdd,例如:20150422
ordAmt 原收款订单金额 String(10) 单位为分,整数串,例如:100
ordDate 原平台订单日期 String(8) yyyyMMdd,例如:20150422
ordSeq 原平台订单流水号 String(32) 原平台订单流水号
refundMerOrdDate 商户退款订单日期 String(8) yyyyMMdd,例如:20150422
refundMerOrdId 商户退款订单号 String(32) 商户退款订单号(本次退款交易的唯一单号)
refundOrdDetail 退款商品明细 String(600)(0) JsonArray格式
需要退款的商品详细列表信息,列表明细参见ordDetail参数说明
refundAmt 退款金额 String(10) 单位为分,整数串,例如:100
deviceId 设备号 String(32) 收银机的唯一标识码
默认值:商户门店号

refundOrdDetail 参数说明:

参数 参数名称 类型 必填 备注
itemId 商品编号 String(32) 合作商户药品库的药品编号,默认值:“-”中划线
itemName 商品名称 String(256) 药品名称,例如:维力青,默认值:“-”中划线
itemType 商品类型 String(64) 药品剂型,例如:片剂,默认值:“-”中划线
desc 批准文号 String(64) 例如:国药准字H201000141,默认值:“-”中划线
std 规格 String(64) 例如:0.5mg*7s,默认值:“-”中划线
unit 单位 String(64) 例如:盒,默认值:“-”中划线
price 单价 String(10) 单位为分,正整数串,例如:100,默认值:0
quantity 数量 String(12) 正整数串,例如:1,默认值:0

退款调用 JSON 示例:

{
  "operationCode": "02",
  "merId": "EQB551001000022",
  "merDepId": "0001",
  "merTermId": "0001",
  "merOrdId": "ZF20190222151144",
  "merOrdDate": "20190222",
  "ordAmt": "1",
  "ordDate": "20190222",
  "ordSeq": "WX010896",
  "refundMerOrdDate": "20190222",
  "refundMerOrdId": "TK201902221503452",
  "refundOrdDetail": [
    {
      "unit": "盒",
      "itemName": "健胃消食片",
      "price": "650",
      "desc": "国药准字H20100141",
      "std": "0.8g*8片*4板",
      "itemType": "片剂",
      "quantity": "1",
      "itemId": "syyy0001"
    },
    {
      "unit": "盒",
      "itemName": "三精双黄连口服液",
      "price": "1100",
      "desc": "国药准字H20100142",
      "std": "10ml*10支",
      "itemType": "口服液",
      "quantity": "2",
      "itemId": "syyy0002"
    }
  ],
  "refundAmt": "1",
  "deviceId": "01"
}

5.2.3 返回参数

参数 参数名称 类型 必填 说明
resultCode 操作结果 String(2) 0000为接口调用成功,不代表业务处理成功,其它为调用失败
resultDesc 结果描述 String(256) 结果描述
merId 商户号 String(15) 商户号
merDepId 商户门店号 String(32) 商户门店号
merTermId 商户终端号 String(32) 商户终端号
refundMerOrdId 商户退款订单号 String(32) 商户退款订单号
refundMerOrdDate 商户退款订单日期 String(8) yyyyMMdd,例如:20150422
refundOrdSeq 平台退款订单流水号 String(32) 平台退款订单流水号,该交易在收钱吧系统中的交易流水号,ordSeq当天唯一,即ordSeq和ordDate联合唯一。
refundOrdDate 平台退款订单日期 String(8) yyyyMMdd,例如:20150422
refundOrdStat 退款状态 String(2) 00 – 退款成功,01 – 退款申请成功(审核中),02 – 退款处理中,04 – 已过期,99 – 退款失败,仅返回00时退款成功,其他状态,后续可调用查询接口确认退款状态
refundAmt 退款金额 String(10) 单位为分,正整数串,例如:100

退款返回 JSON 示例:

{
    "resultCode": "0000",
    "resultDesc": "处理成功",
    "merId": "EQB551001000022",
    "merDepId": "0001",
    "merTermId": "0001",
    "refundMerOrdId": "TK201902221503452",
    "refundMerOrdDate": "20190222",
    "refundOrdSeq": "WX010897",
    "refundOrdDate": "20190222",
    "refundOrdStat": "00",
    "refundAmt": "1"
}

5.3 查询

商户可以通过查询订单接口主动查询收款和退款订单状态,完成下一步的业务逻辑。
商户调用查询接口进行成功业务处理,一定要判断商户订单号和收钱吧订单号的唯一性,防止一个单号重复虚假支付。

5.3.1 重要提醒

需要调用查询接口的情况:
1. 商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知;
2. 调用支付接口后,返回系统错误或未知交易状态情况;

5.3.2 传入参数

参数 参数名称 类型 必填 说明
operationCode 功能代码 String(2) 04 查询
merId 商户号 String(15) 商户号,开户后由收钱吧提供
merDepId 商户门店号 String(32) 商户门店号,由商户提供
merTermId 商户终端号 String(32) 固定值:0001
merOrdId 商户订单号 String(32) 商户收款订单号或者商户退款订单号,商户保证其唯一性
merOrdDate 商户订单日期 String(8) yyyyMMdd,例如:20150422
deviceId 设备号 String(32) 收银机的唯一标识码,默认值:商户门店号

查询调用 JSON 示例:

{
    "operationCode": "04",
    "merId": "EQB551001000022",
    "merDepId": "0001",
    "merTermId": "0001",
    "merOrdId": "TK20190222150347",
    "merOrdDate": "20190222",
    "deviceId": "01"
}

5.3.3 返回参数

参数 参数名称 类型 必填 说明
resultCode 操作结果 String(4) 0000为接口调用成功,不代表业务处理成功,其它为调用失败
resultDesc 结果描述 String(256) 结果描述
merId 商户号 String(15)
merDepId 商户门店号 String(32)
merTermId 商户终端号 String(32)
merOrdDate 商户订单日期 String(8) yyyyMMdd,例如:20150422
merOrdId 商户订单号 String(32) 商户收款订单号(查询确认收款订单状态)或商户退款订单号(查询确认退款订单状态)
ordStat 订单状态 String(2) 若查询收款订单:
00 – 支付成功
01 – 待支付
02 – 支付处理中
04 – 已过期
99 – 支付失败
仅返回00时表示收款成功;
若查询退款订单:
00 – 退款成功
01 – 待退款
02 – 退款处理中
04 – 已过期
99 – 退款失败
仅返回00时表示退款成功。
ordAmt 订单金额 String(10) 单位为分,正整数串,例如:100
ordDate 平台订单日期 String(8) yyyyMMdd,例如:20150422
ordSeq 平台订单流水号 String(32) 该交易在收钱吧系统中的交易流水号。
ordSeq当天唯一,即ordSeq和ordDate联合唯一
例如:WX000001
取前两位区分支付方式(大写)
参见支付方式
chnIdate 渠道日期 String(8) yyyyMMdd,例如:20150422
chnIseq 渠道流水号 String(64)
addlinfo 商户定制信息 String JSON格式
系统默认返回以下字段,如果商户请求时传了该字段也会一起返回,具体业务使用参见附录场景

addiInfo 返回以下字段,请求时商户不能使用以下参数 key
商家优惠金额=订单金额-实收金额

参数 参数名称 类型 必填 备注
settlementAmt 实收金额 String(10) 商家实收金额
paymentDiscount 优惠信息 String 包含商家优惠和平台优惠
JSON格式具体字段参见paymentDiscount说明

paymentDiscount 说明:

参数 参数名称 类型 必填 备注
hongbaoWosa 喔噻红包 String(10) 平台优惠
hongbaoWosaMch 喔噻商户红包 免充值值 String(10) 商家优惠
discountWosa 喔噻立减 String(10) 平台优惠
discountWosaMch 喔噻商户立减 免充值值 String(10) 商家优惠
discountChannel 支付通道 折扣(立减优惠) String(10) 平台优惠
discountChannelMch 折扣(立减优惠) 支付通道商户 免充值值 String(10) 商家优惠
discountChannelMchTop 折扣(立减优惠) 支付通道商户 充值值 String(10) 平台优惠
hongbaoChannel 支付通道红包 String(10) 平台优惠
hongbaoChannelMch 支付通道商户红包 免充值值 String(10) 商家优惠
hongbaoChannelMchTop 支付通道商户红包 充值值 String(10) 平台优惠

查询返回 JSON 示例:

{
    "chnlDate": "20191030",
    "chnlSeq": "7895238025376758",
    "merDepId": "0001",
    "merId": "EQB290002000024",
    "merOrdDate": "20191030",
    "merOrdId": "ZF20191030183634",
    "merTermId": "0001",
    "ordAmt": "110",
    "ordDate": "20191030",
    "ordSeq": "WX016900",
    "ordStat": "00",
    "resultCode": "0000",
    "resultDesc": "调用成功",
    "addiInfo": {
        "paymentDiscount": {
            "discountChannelMch": "100"
        },
        "settlementAmt": "10"
    }
}

6 调试说明

6.1 请求出错说明

resultCode 为 0000 时代表调用成功,不代表业务处理成功。
resultCode 不为 0000 时代表请求出错,resultDesc 为错误描述。
请求出错时只返回 resultCode 和 resultDesc。

6.1.1 请求出错的常见原因

(1) 可能是参数传错,或者是必须的参数未传
(2) 解密失败
(3) 验签失败
(4) 注意所有金额单位为分,整数

7 附录

7.1 支付方式

代码 名称 备注
00 收钱吧保险支付
AL 支付宝
WX 微信
UQ 银联云闪付
DC 数字人民币 覆盖人民银行确定所有试点区域,工/建/农/中/交/邮/招7家企业数字人民币钱包
BP 翼支付
CM 移动和包
LK 刷卡拉卡拉
UM 刷卡银联商务
EK 智慧E保 原医卡通/亿保/健保通
PK 普康卡
RH 企健网
YS 钥匙卡
JY 健医在线
WD 直付保 万达医疗合作业务
PA 平安付壹卡会
SB 健保通付
OK 联华OK卡
MB 电子会员卡
YJ 宜捷通
YB 微信医保
UB 银联医保
LP 礼品卡
YP 优势付
RX 瑞祥卡
PJ 平安药诊卡 平安好医生/平安健康
CC 中智企服卡
BM 国药博明健康卡
PW 瓴文医疗 九州通瓴文医疗合作业务
JZ 健世保 健阵医药合作业务
KY 康云通
ZL 智龢健康
HY 惠医保
HT 瀚银通
YI 优寿卡
TC 同昌保险卡
GH 国惠通
JH 建行生活APP
ZH 招行掌上生活APP

8 常见问题处理

8.1掉单

由于网络,收银机系统等原因导致收钱吧侧支付成功,商户未成功,以下称为掉单。
如果商户调用收钱吧时保存了收款时使用的数据,则用调用时的收款单号调用查询接口获取订单信息。

如果商户调用收钱吧未保存收款时使用的数据,则需要店员输入收款时使用的订单号调用查询接口查询订单信息,输入的订单号先判断订单号在商户系统是否存在。

查询成功后,一定要判断商户订单号和收钱吧订单号的在商户系统的唯一性,防止一个单号重复虚假支付。
查询成功后,商户需要将查询的订单信息保存下来,退款时会使用收款订单相关参数。

8.2 退款失败

商户调用收钱吧退款失败,不要更换单号,用同一单号继续调用收钱吧退款。
如果退款失败可以联系收钱吧客服咨询失败原因。

发表评论