美团智能POS机支付接口接入指南
第一章 引言
编写目的
本文档描述ERP接入美团POS调用收银、退款、扫码、打印功能,包括调用方式、数据交互等。为参加项目建设的美团公司以及美团授权的第三方合作方研发、产品、开发等相关人员。该文档未经许可不得外传。
更新说明
- V0.1 初始化文稿
- V0.2 整理支付,退款接口,删除打印接口。打印使用蓝牙打印
- V0.3 添加定义开始收银功能的说明
- V0.4 添加设置打印参数的接口, 针对posCashierErp-1.4.jar
- V1.5 添加预收款,预收款完成,预收款撤销接口。 请确认POSCashier版本是3.3.5之后的版本。
注意事项
- 在联调阶段使用调试POS机,对ERP APP签名无要求;真实商家使用非调试POS机,ERP APP除自身签名外,需要交由美团做硬件厂商签名。
- 美团验券、闪惠功能接入,统一采用美团开放平台接口或SDK。
- 不建议ERP调用收银时指定支付方式,支付方式选择作为收银模块必备功能。
第二章 接入指南
1. 申请AppKey
请联系商务人员申请接入方ID,软件商通过创建项目(接入方式注意选择“调起POS收银台”)获得。项目审核通过后,系统会自动分配,只能是2000--30000之间的号码,否则会无法交易(创建项目操作指南见https://platform.meituan.com/doc/buffetcourse)。
2. 下载SDK
在下载页面下载SDK,包含了一个Library 和一个Demo
目录 | 说明 |
---|---|
posCashierErpLib | Library, 包含一个jar文件,导入到自己的工程中 |
erpDemo | Demo 目录,里面是一些使用的例子 |
3. 在你的代码中使用SDK
- 导入SDK library到直接的工程中
-
在Acitivty或者Framgent中初始化接口对象, 注意只接受activity和fragment作为参数
private ErpApi erpApi;erpApi = ErpApiFactory.createErpApi(this);
-
使用美团Pos功能进行收银 直接在需要收银的地方,调用下面的接口,就可以启动美团的收银功能。 我们推荐用户使用不指定支付类型的方式,美团POS在收银的时候,会提供支付类型选择功能。
//不指定支付类型,支付1分钱 PayReq payReq = new PayReq(); payReq.setCounterNo("款台号"); payReq.setOperator("operator"); payReq.setErpAppkey(erpKey); payReq.setErpOrderId(""); payReq.setTotalFee(1); payReq.setPayType(ERP_PAY_TYPE_NONE); erpApi.pay(payReq);
-
获取收银的的结果 在 onActivityResult 中添加结果解析函数。对于收银功能,返回的的结果会通过解析函数返回一个 PayResp 对象。 PayResp中包含了返回的结果。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { BaseResp resp = erpApi.handleActivityResult(requestCode, resultCode, data); if (resp != null) { if (resp.isSuccess()) { if (resp instanceof PayResp) { //获取支付结果 payResp = (PayResp) resp; } else if (resp instanceof RefundResp) { //获取退款结果 RefundResp refundResp = (RefundResp) resp; } showToast("success:" + resp.toString()); } else { showToast("failed:" + resp.toString()); } } else { super.onActivityResult(requestCode, resultCode, data); } }
-
退款功能的工作流程和收银类似
4. 工作流程说明
以收银为例子
3rd App->>Erp Api: 调用收银函数
Erp Api->>美团POS: 启动POS提供的服务
美团POS->>3rd App: onActivityResult 返回收银结果
3rd App->>Erp Api: 调用结果解析函数handleActivityResult
Erp Api->>3rd App: 返回解析结果PayResp
第三章 接口说明
用户需要使用的接口都在 ErpApi.java 里面,每个接口都有详细的说明,直接看 ErpApi.java 这个文件就能获取详细的信息
3.1 服务返回值处理函数
/**
* 对服务的返回值进行处理
* 放在 onActivityResult(int requestCode, int resultCode, Intent data) 里面
* 用来处理ERP服务返回的数据。
*
* @return BaseResp 返回的数据, 以支付为例,可以通过
* if (resp instanceof PayResp) 来判断是否是支付的结果,然后转换成PayResp获取支付的结果。
*
*/
BaseResp handleActivityResult(int requestCode, int resultCode, Intent data);
BaseResp参数说明
字段名称 | 类型说明 | 描述 |
---|---|---|
isSuccess | boolean | 是否执行成功 |
getCode | int | 返回结果-1:成功;-2:异常,;-3:取消(注意:没有采用Activity.RESULT_CANCELED);-4:打印时纸张异常(缺纸、卡纸) |
getMessage | String | 返回的结果说明信息,一般用在执行失败的情况 |
3.2 支付接口
/**
* 支付接口
*
* 在onActivityResult 返回数据, 返回的数据,用{@link #handleActivityResult(int, int, Intent)} 进行解析
* @param payReq 指定支付的参数 参数的含义参考 {@link com.sankuai.poscashier.erp.model.PayReq}
* 返回值会解析成 PayResp的类型。{@link com.sankuai.poscashier.erp.model.PayResp}
*/
void pay(PayReq payReq);
输入PayReq参数说明:
字段名称 | 字段类型 | 是否必须 | 描述 | ||
---|---|---|---|---|---|
totalFee | long | Y |
支付金额(单位“分”) 兼容int类型,推荐用long |
||
payType | int | N | default:0,支付宝:1,微信:2,银行卡:3,applyPay:4; 建议直接使用默认值0,在收银台选择支付方式 | ||
erpOrderId | String | Y | erp订单id,不允许有重复,辅助对账用 | ||
erpAppkey | String | Y | 接入方ID,软件商通过创建项目(接入方式注意选择“调起POS收银台”)获得。项目审核通过后,系统会自动分配,只能是2000--30000之间的号码,否则会无法交易(创建项目操作指南见https://platform.meituan.com/doc/buffetcourse)。 | ||
operator | String | N | 支付时的外部操作员 | ||
counterNo | String | N | 款台号 |
在onActivityResult中返回的值PayResp说明:
字段 | 类型 | 描述 |
---|---|---|
payType | int | 支付类型支付类型 payType, 值参考支付类型定义 |
traceNo | String | 流水号 |
batchNo | String | 批次号 |
referNo | String | 参考号 |
cardNo | String | 银行卡支付的卡号 |
buyerId | String | 微信支付宝支付的时候,获取用户ID |
cardId | String | 内,外卡的标记 |
orderId | String | 美团内部的订单号,撤销和预收款完成的时候需要使用,建议记录下来,可以使用orderID退款 |
3.3 退款,预收款撤销接口
/**
* 退款,预收款撤销接口
*
* @param refundReq 退货的参数 {@link com.sankuai.poscashier.erp.model.RefundReq}
* 在onActivityResult 返回数据, 返回的数据,用{@link #handleActivityResult(int, int, Intent)} 进行解析
* 返回值会解析成 RefundResp的类型。{@link com.sankuai.poscashier.erp.model.RefundResp}
*/
void refund(RefundReq refundReq);
退款参数RefundReq说明
字段 | 类型 | 是否必须 | 描述 |
---|---|---|---|
amount | long | Y | 退款金额 以分为单位 |
payType | int | Y | 支付类型,参考支付类型定义 |
batchNo | String | Y | 批次号(来源于支付接口) |
traceNo | String | Y | 流水号(来源于支付接口) |
orderId | String | N | 订单号,来源于支付接口。如果有订单号,强烈建议使用订单号来退款,订单号退款可以避免对本地数据的依赖。如果有了这个字段,batchNo和traceNo可以不传。退款的是会根据订单号从服务器获取订单详情,然后根据详情来退款。注意:预收款撤销,目前只支持使用orderId |
operator | String | N | 操作员打印签购单的时候使用,可以为null,如果是null,就不会打印对应的字段 |
counterNo | String | N | 款台号 打印签购单的时候使用,可以为null,如果是null,就不会打印对应的字段 |
在onActivityResult中返回的值RefundResp说明: 同BaseResp的说明
3.4 扫码接口
/**
* 扫码接口
* 扫码支持前置、后置摄像头,默认采用前置摄像头。暂不对ERP APP开放,可在扫码页面切换。
* 在onActivityResult 返回数据
*/
public abstract void scan();
3.5 其他接口
/**
* 判断是否是美团POS机
*/
public static boolean ErpUtil.isMTPos();
3.6 设置打印参数
/**
* 设置参数
*
* 主要是针对一些特殊的自定义需求,大部分ERP对接都用不到.
* 在这里目前可以使设置操作员号和款台号,在打印小票的时候会打印出这两个字段。 这个地方设置的参数会一直保存在
* pos机中,需要使用方去控制什么时候清除、修改数据。 比如设置了操作员号和款台号之后,打印会一直打印这两个字段,
* 直到使用方主动去清除数据,或者修改数据。
*
* @param setParameterReq
*/
void setParameter(SetParameterReq setParameterReq );
3.7 预收款
/**
* 预收款
*
* @param preAuthReq 参数含义 {@link com.sankuai.poscashier.erp.model.PreAuthReq}
* 返回值会解析成PreAuthResp的格式
*/
void preAuth(PreAuthReq preAuthReq);
输入PreAuthReq参数说明:
字段 | 类型 | 是否必须 | 描述 |
---|---|---|---|
totalFee | long | Y | 支付金额(单位“分”) |
payType | int | Y | 支付宝:1,微信:2, 目前只支持支付宝和微信 |
erpOrderId | String | Y | erp订单id,不允许有重复,辅助对账用 |
erpAppkey | String | Y | erp app唯一标识 |
在onActivityResult中返回的值PreAuthResp说明:
字段 | 类型 | 描述 |
---|---|---|
payType | int | 支付类型支付类型 payType, 值参考支付类型定义 |
traceNo | String | 流水号 |
batchNo | String | 批次号 |
referNo | String | 参考号 |
orderId | String | 美团内部的订单号,撤销和预收款完成的时候需要使用,请记录下来 |
buyerId | String | 微信支付宝支付的时候,获取用户ID |
3.8 预收款完成
/**
* 预收款完成
*
* @param preAuthCompleteReq {@link com.sankuai.poscashier.erp.model.PreAuthCompleteReq}
* 返回值会解析成 PreAuthCompleteResp
*/
void preAuthComplete(PreAuthCompleteReq preAuthCompleteReq);
输入PreAuthCompleteReq参数说明:
字段 | 类型 | 是否必须 | 描述 |
---|---|---|---|
totalFee | long | Y | 预收款完成的金额(单位分) |
orderId | String | Y | 美团的订单号,在预收款的时候返回的值 |
erpAppkey | String | Y | 接入方ID |
在onActivityResult中返回的值PreAuthCompleteResp说明:
字段 | 类型 | 描述 |
---|---|---|
payType | int | 支付类型支付类型 payType, 值参考支付类型定义 |
traceNo | String | 流水号 |
batchNo | String | 批次号 |
referNo | String | 参考号 |
orderId | String | 美团内部的订单号 |
buyerId | String | 微信支付宝支付的时候,获取用户ID |
totalFee | long | 预收款完成的金额(单位分) |
3.9 预收款撤销
这个和退款是同一个接口,请参考退款接口
第四章 其他说明
如何把launcher上的收银台启动项替换成自己的Activity
第三方开发的收银APP,只要在对应的Activity做如下声明:
<intent-filter>
<action android:name="com.sankuai.poscashier.action.CASHIER"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
点击“开始收银”启动收银台的时候,就会优先启动第三方声明的Activity
###支付类型定义
名称 | 值 | 说明 |
---|---|---|
ERP_PAY_TYPE_NONE | 0 | 没有指定支付类型 |
ERP_PAY_TYPE_ALI | 1 | 支付宝支付 |
ERP_PAY_TYPE_WEIXIN | 2 | 微信支付 |
ERP_PAY_TYPE_BANK | 3 | 银行卡支付 |
ERP_PAY_TYPE_APPLE | 4 | Apple apy |
内卡,外卡定义说明
国际信用卡公司中文 | 国际信用卡公司英文 | 3位代码 |
---|---|---|
银联卡 | ChinaunionPay | CUP |
威士卡 | VISA | VIS |
万事达卡 | Master Card | MCC |
万事达卡 | Maestro Card | MAE |
JCB卡 | JCB | JCB |
大来卡 | Dinner Club | DCC |
运通卡 | American Express | AMX |
如何获取设备sn
设备sn其实就是 android.os.Build.SERIAL 这个值