美团智能POS机支付接口接入指南

第一章 引言

编写目的

本文档描述ERP接入美团POS调用收银、退款、扫码、打印功能,包括调用方式、数据交互等。为参加项目建设的美团公司以及美团授权的第三方合作方研发、产品、开发等相关人员。该文档未经许可不得外传。

更新说明

  • V0.1 初始化文稿
  • V0.2 整理支付,退款接口,删除打印接口。打印使用蓝牙打印
  • V0.3 添加定义开始收银功能的说明
  • V0.4 添加设置打印参数的接口, 针对posCashierErp-1.4.jar
  • V1.5 添加预收款,预收款完成,预收款撤销接口。 请确认POSCashier版本是3.3.5之后的版本。

注意事项

  1. 在联调阶段使用调试POS机,对ERP APP签名无要求;真实商家使用非调试POS机,ERP APP除自身签名外,需要交由美团做硬件厂商签名。
  2. 美团验券、闪惠功能接入,统一采用美团开放平台接口或SDK。
  3. 不建议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

  1. 导入SDK library到直接的工程中
  2. 在Acitivty或者Framgent中初始化接口对象, 注意只接受activity和fragment作为参数

     private ErpApi erpApi;erpApi = ErpApiFactory.createErpApi(this);
    
  3. 使用美团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);
    
  4. 获取收银的的结果 在 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);
             }
         } 
    
  5. 退款功能的工作流程和收银类似

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 这个值

相关文章